gpt4 book ai didi

c++ - OpenMP 并行化

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:42 24 4
gpt4 key购买 nike

我正在编写一个用于科学目的的 C++ 程序。 该程序运行良好并且返回了良好的结果,因此我决定使用 OpenMP 提高其性能。我要优化的循环如下:

        //== #pragma omp parallel for private(i,j)
for (k=0; k < number; k++)
{

for (i=0; i < L; i++)
{
for (j=0; j < L; j++)
{
red[i][j] = UNDEFINED;
}
}


Point inicial = {L/2, L/2, OCCUPIED};
red[L/2][L/2] = OCCUPIED;
addToList(inicial, red, list, L,f);
oc.push_back(inicial);

while (list.size() > 0 && L > 0)
{
punto = selectPoint(red, list, generator, prob, p);

if (punto.state == OCCUPIED)
{
addToList(punto, red, list, L,f);

oc.push_back(punto);
}
else
{
out.push_back(punto);
}


}

L = auxL;

oc.clear();
out.clear();
list.clear();

}

f = f*1.0/(number*1.0);

if (f > 0.5)
{
inta = inta;
intb = p;
p = (inta + intb) / 2.0;
}
else if (f < 0.5)
{
intb = intb;
inta = p;
p = (inta + intb) / 2.0;
}

cout << p << endl;


}

上面评论了我对 OpenMP 的尝试。如您所见,我已声明 ij为私有(private) 因为它们是在并行部分之前声明的。我也试过制作 L私有(private)的,没有结果。到处都是段错误和坏指针。我认为问题在于 while 循环嵌套在里面。我的问题是:omp parallel for吗?在这种情况下正确吗?还是我应该尝试只优化那个 while 循环?是std::vector干扰 OpenMP?

注:list , ocoutstd::vector<Point> , 和 Point是一个具有三个 int 属性的简单结构。 addToList是一个内部没有循环的函数。

最佳答案

您可能想要查看 OpenMP 教程。查看 OpenMP 代码时,您需要想象并行发生的情况。拿

oc.push_back(inicial); 

两个线程可以同时尝试这样做吗?是的。 std::vector 是否支持并行?没有。

上面的代码充满了这些东西。


如果你想在你的 OpenMP 代码中使用数据结构,你需要 to use locks .根据我个人的经验,当发生这种情况时,重构算法远比实际使用它们要好得多。虽然 OpenMP + 锁是可能的,但这通常表明该想法存在问题(= 可能是主观观点)。

关于c++ - OpenMP 并行化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30505420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com