C++ 如何将openMP用于此循环?
我想知道使用openMP使这个循环并行是否可行 当然,比赛条件也有问题。我不确定如何处理由outerloop生成的内环中的n,以及其中D=A[n]的竞争条件。你认为尝试将其与之平行是可行的吗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
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