OpenMP - for循环中的变量声明
我正在尝试将普通代码调整为并行代码。当我做一个并行的for循环时,其中有一些变量在内部声明,这些变量是私有的还是共享的?OpenMP - for循环中的变量声明
我应该在定义编译指示时将它们中的每一个定义为私有吗?
顺便说一句,最后一个问题。我可以使用迭代器初始参数的for-pragma对不对?像for(iter=xlist.begin() ; ...)
我使用最新版本的codeblocks和mingw。
在并行区域内声明的任何内容(无论是否为循环)都是私有的,在下面的@ejd评论中列出了一些例外。由于该变量尚不存在,因此无法在#pragma
行上将其列为私有。
因此,例如在下面,即使有default(none)
,即使您可以,我们也不需要指定共享tid
;它位于并行部分内部,因此它对每个线程都是私有的。 (还要注意,你并不真的需要指定我为私有,作为一个OMP的循环指数必然是私有的。)
$ more foo.c
#include <stdio.h>
#include <omp.h>
int main(int argc, char *argv[]) {
int i;
#pragma omp parallel for default(none) private(i)
for(i=0;i<10;i++){
int tid = omp_get_thread_num();
printf("Thread %d gets iteration %d\n", tid, i);
}
return 0;
}
gpc-f103n084-$ !g
gcc -o foo foo.c -fopenmp
$ ./foo
Thread 1 gets iteration 2
Thread 1 gets iteration 3
Thread 3 gets iteration 6
Thread 3 gets iteration 7
Thread 0 gets iteration 0
Thread 0 gets iteration 1
Thread 4 gets iteration 8
Thread 4 gets iteration 9
Thread 2 gets iteration 4
Thread 2 gets iteration 5
如果你只在循环块需要他们,要并行循环,将它们留在循环块内。如果你在并行构造之外声明它们并将它们声明为私有,那么每个线程都将拥有自己的副本。所以没关系。
非常感谢。顺便提一下,最后一个问题。我可以使用迭代器初始参数的for-pragma对不对?像“for(iter = xlist.begin(); ...)” – serkank 2011-06-07 21:35:58
这取决于您的编译器支持的OpenMP规范。我认为你可以在OpenMP 3.0中为迭代器使用for pragma。 – 2011-06-07 21:41:15
是的,但我想也许我应该在定义pragma之前声明它们并在之后使用它们。我怀疑可能有非法使用,因为我从未在我读过的教程中看到过这样的例子。 – serkank 2011-06-07 21:23:44
不,实际上,让它们在平行部分内部定义是好的,它使事情变得更清晰。任何对特定循环索引都是本地的东西都是必要的东西,可以有用地将其私有到相应的线程。 – 2011-06-07 21:27:03
非常感谢,它真的有很大的帮助。非常感谢你 – serkank 2011-06-07 21:27:49