2011-06-07 146 views
2

我正在尝试将普通代码调整为并行代码。当我做一个并行的for循环时,其中有一些变量在内部声明,这些变量是私有的还是共享的?OpenMP - for循环中的变量声明

我应该在定义编译指示时将它们中的每一个定义为私有吗?


顺便说一句,最后一个问题。我可以使用迭代器初始参数的for-pragma对不对?像for(iter=xlist.begin() ; ...)

我使用最新版本的codeblocks和mingw。

回答

8

在并行区域内声明的任何内容(无论是否为循环)都是私有的,在下面的@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 
+1

是的,但我想也许我应该在定义pragma之前声明它们并在之后使用它们。我怀疑可能有非法使用,因为我从未在我读过的教程中看到过这样的例子。 – serkank 2011-06-07 21:23:44

+0

不,实际上,让它们在平行部分内部定义是好的,它使事情变得更清晰。任何对特定循环索引都是本地的东西都是必要的东西,可以有用地将其私有到相应的线程。 – 2011-06-07 21:27:03

+0

非常感谢,它真的有很大的帮助。非常感谢你 – serkank 2011-06-07 21:27:49

2

如果你只在循环块需要他们,要并行循环,将它们留在循环块内。如果你在并行构造之外声明它们并将它们声明为私有,那么每个线程都将拥有自己的副本。所以没关系。

+0

非常感谢。顺便提一下,最后一个问题。我可以使用迭代器初始参数的for-pragma对不对?像“for(iter = xlist.begin(); ...)” – serkank 2011-06-07 21:35:58

+0

这取决于您的编译器支持的OpenMP规范。我认为你可以在OpenMP 3.0中为迭代器使用for pragma。 – 2011-06-07 21:41:15