OpenMP - for循环中的变量声明

时间:2011-06-07 21:17:11

标签: variables openmp

我正在尝试将普通代码调整为并行代码。当我使for循环并行时,其中有一些变量声明,那些变量是私有还是共享?

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


顺便说一下,最后一个问题。我可以使用for-pragma和迭代器的初始参数太对了吗?比如for(iter=xlist.begin() ; ... )

我使用最新版本的代码块和mingw。

2 个答案:

答案 0 :(得分:8)

在并行区域内声明的任何内容(无论是否为循环)都是私有的,下面在@ejd的注释中列出了例外情况。您无法在#pragma行上将其列为私有,因为该变量尚不存在。

因此,例如在下面,即使使用default(none),我们也不需要指定tid的共享即使您可以;它位于并行部分内部,因此它对每个线程都是私有的。 (另请注意,您并不需要将i指定为私有,因为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 :(得分:3)

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