OpenMP中的嵌套循环
问题描述:
我需要运行一个短的外部循环和一个长的内部循环.我想并行化后者而不是前者.原因是内部循环运行后,有一个要更新的数组.我正在使用的代码如下
I need to run a short outer loop and a long inner loop. I would like to parallelize the latter and not the former. The reason is that there is an array that is updated after the inner loop has run. The code I am using is the following
#pragma omp parallel{
for(j=0;j<3;j++){
s=0;
#pragma omp for reduction(+:s)
for(i=0;i<10000;i++)
s+=1;
A[j]=s;
}
}
这实际上挂了.下面的方法很好,但是我宁愿避免启动新的并行区域的开销,因为在此之前要先创建另一个并行区域.
This actually hangs. The following works just fine, but I'd rather avoid the overhead of starting a new parallel region since this was preceded by another.
for(j=0;j<3;j++){
s=0;
#pragma omp parallel for reduction(+:s)
for(i=0;i<10000;i++)
s+=1;
A[j]=s;
}
正确(最快)的方法是什么?
What is the correct (and fastest) way of doing this?
答
以下示例应可正常使用:
The following example should work as expected:
#include<iostream>
using namespace std;
int main(){
int s;
int A[3];
#pragma omp parallel
{ // Note that I moved the curly bracket
for(int j = 0; j < 3; j++) {
#pragma omp single
s = 0;
#pragma omp for reduction(+:s)
for(int i=0;i<10000;i++) {
s+=1;
} // Implicit barrier here
#pragma omp single
A[j]=s; // This statement needs synchronization
} // End of the outer for loop
} // End of the parallel region
for (int jj = 0; jj < 3; jj++)
cout << A[jj] << endl;
return 0;
}
编译和执行的示例是:
> g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> g++ -fopenmp -Wall main.cpp
> export OMP_NUM_THREADS=169
> ./a.out
10000
10000
10000