我在尝试使用OpenMP并行化嵌套循环时遇到了问题 - 它只是用于游戏并习惯的演示代码。
int* myresults = new int[1000]
#pragma omp parallel
{
#pragma omp for
for(int z=0; z<=mainCount;z++)
{
results[n++] = myfunc(z,0); //compute something
for(int i=0;i<=secondCount;i+=5)
{
results[n++]=myfunc(z,i);
}
}
}
我的问题是我的结果数组的索引。我假设,因为OpenMP正在并行化第一个for循环,他使用results[]
的位置两次或更多,因为results[n++]
将产生未定义的行为(因为它无法保证n向右递增),我是正确的吗?
如何正确索引和存储我的结果?
答案 0 :(得分:1)
n
,{p> myfunc(z,0)
会增加1 + secondCount/5
次,myfunc(z,i)
会增加n
次。这意味着z * (2 + secondCount/5)
应该在外循环的每次迭代开始时#pragma omp parallel for private(n)
for (int z = 0; z <= mainCount; z++)
{
n = z * (2 + secondCount/5);
results[n++] = myfunc(z, 0);
for (int i = 0; i <= secondCount; i += 5)
results[n++] = myfunc(z, i);
}
。您应该像这样重写代码:
{{1}}