嵌套循环中的 OpenMP 数组索引

OpenMP array indexing in nested loop

本文关键字:数组 索引 OpenMP 嵌套循环      更新时间:2023-10-16

我在尝试使用 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 正确递增),我说得对吗?

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

n

增一次myfunc(z,0)1 + secondCount/5倍递增myfunc(z,i)。这意味着应在外部循环的每次迭代开始时z * (2 + secondCount/5) n。你应该像这样重写你的代码:

#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);
}