c++ - 如何正确并行化嵌套的 for 循环

标签 c++ c for-loop nested openmp

我正在使用 OpenMP 并行化嵌套 for 循环的标量:

double P[N][N];
double x=0.0,y=0.0;

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction(x,y);
        y+=1;
    }
    x+=1;
}

在此循环中,重要的是矩阵 P 在标量和并行版本中必须相同:

我所有可能的尝试都没有成功......

最佳答案

这里的问题是您添加了迭代到迭代的依赖关系:

x+=1;
y+=1;

因此,就目前的代码而言,它不可并行化。尝试这样做会导致不正确的结果。 (正如您可能看到的那样)

幸运的是,在您的情况下,您可以直接计算它们而无需引入这种依赖性:

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}

现在您可以尝试在上面添加一个 OpenMP pragma,看看它是否有效:

#pragma omp parallel for
for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}

关于c++ - 如何正确并行化嵌套的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8338218/

相关文章:

c# - 如何防止 for 循环中覆盖数组条目?

c++ - 返回类成员引用变量导致运行时错误

c - 两个整数符号相同

c - 花时间在表格 hh :mm:ss and get hours minutes and seconds as an int 中给出

C数组地址混淆

Java使用List存储List

python - 如何从字符串形成字典?

c++ - 遍历作为 QList<int> 的 QVariant?

c++ - C++可变参数模板参数方法传递给没有可变参数的方法

c++ - 在 Awesomium 中加载本地内容