0

我在尝试使用 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 正在并行化他使用results[]两次或更多位置的第一个 for 循环,因为results[n++]会产生未定义的行为(因为不能保证 n 正确递增),我正确吗?

如何正确索引和存储我的结果?

4

1 回答 1

1

n增加一次myfunc(z,0)1 + secondCount/5myfunc(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);
}
于 2012-06-04T06:26:41.360 回答