c++ - 我如何在这个循环中使用 openMP?

标签 c++ multithreading openmp

我想知道使用 openMP 使这个循环并行是否可行。

粗略地说,存在竞争条件的问题。我不确定如何处理由外循环生成的内循环中的 n 以及其中 D=A[n] 的竞争条件。您认为尝试将其平行化是否可行?

for(n=0; n < 10000000; ++n) {   

    for (n2=0; n2< 100; ++n2) {
        A[n]=A[n]+B[n2][n+C[n2]+200];

        }

    D=D+A[n];

}

最佳答案

是的,假设没有任何指针是别名,这确实是可并行的。

int D = 0;  //  Or whatever the type is.

#pragma omp parallel for reduction(+:D) private(n2)
for (n=0; n < 10000000; ++n) {   

    for (n2 = 0; n2 < 100; ++n2) {
        A[n] = A[n] + B[n2][n + C[n2] + 200];
    }

    D += A[n];
}

它实际上可以进行如下优化:

int D = 0;  //  Or whatever the type is.

#pragma omp parallel for reduction(+:D) private(n2)
for (n=0; n < 10000000; ++n) {   

    int tmp = A[n]
    for (n2 = 0; n2 < 100; ++n2) {
        tmp += B[n2][n + C[n2] + 200];
    }

    A[n] = tmp;
    D += tmp;
}

关于c++ - 我如何在这个循环中使用 openMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662888/

相关文章:

c++ - 使用派生类对象数组初始化基类指针

c++ - 比较两个constexpr指针不是constexpr吗?

java - 当服务器被杀死时,我的线程是否可能没有被杀死

c++ - 如何提高我的 OpenMP 代码的性能?

c++:如何用美元符号将 double 格式化为货币?

c++ - 如果一个函数类型只依赖于它自己的模板参数,它是否依赖于它?

openmp - 如何使用OpenMP在中间的所有线程中创建 `omp parallel for`(同步(`barrier`)

c - 如何使用 OpenMP 在顺序循环中嵌套并行循环

python-3.x - 如何在Python中使用线程调用HTTP API

java - 不同线程之间的数据共享