C++ 如何将openMP用于此循环?

C++ 如何将openMP用于此循环?,c++,multithreading,openmp,C++,Multithreading,Openmp,我想知道使用openMP使这个循环并行是否可行 当然,比赛条件也有问题。我不确定如何处理由outerloop生成的内环中的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]; } (n=0;n

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

当然,比赛条件也有问题。我不确定如何处理由outerloop生成的内环中的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];

}
(n=0;n<10000000;++n){ 对于(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;//或者随便什么类型的。
#pragma omp并行用于缩减(+:D)私有(n2)
对于(n=0;n<10000000;++n){
对于(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;
}
int D=0;//或者随便什么类型的。
#pragma omp并行用于缩减(+:D)私有(n2)
对于(n=0;n<10000000;++n){
int tmp=A[n]
对于(n2=0;n2<100;+n2){
tmp+=B[n2][n+C[n2]+200];
}
A[n]=tmp;
D+=tmp;
}

请注意,内部循环中的
n2
n
没有任何关系--您可以用100行显式编写的行替换该内部循环,而不会出现任何问题…
(+:D)
看起来像一个笑脸。。。啊,看不见。我不想用
D
:)但是我想还有很多其他的你可以使用:
(+:P)
(+:O)
+:XD
…哈哈。您还可以使用
(+:vI)
。谢谢你的帮助,这其实很简单。不幸的是,在这种情况下,我的程序使用omp执行的时间更长。我认为n2应该是私有的@是的,你是对的。它需要是私有的或在循环中声明。不知道我是怎么忽略它的。固定的D