【发布时间】:2015-08-10 21:27:30
【问题描述】:
我正在编写一个具有科学目的的 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 的尝试。如您所见,我已将 i 和 j 声明为私有,因为它们是在并行部分之前声明的。我还尝试将L 设为私有,但没有任何结果。到处都是分段错误和坏指针。
我认为问题在于 while 循环嵌套在里面。我的问题是:omp parallel for 在这种情况下是否正确?还是我应该尝试只优化那个while循环? std::vector 是否会干扰 OpenMP?
注意:list、oc 和 out 是 std::vector<Point>,Point 是一个具有三个 int 属性的简单结构。 addToList 是一个内部没有循环的函数。
【问题讨论】:
标签: c++ openmp scientific-computing