2011-06-07 490 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