我正在嘗試將普通代碼調整爲並行代碼。當我做一個並行的for循環時,其中有一些變量在內部聲明,這些變量是私有的還是共享的?OpenMP - for循環中的變量聲明
我應該在定義編譯指示時將它們中的每一個定義爲私有嗎?
順便說一句,最後一個問題。我可以使用迭代器初始參數的for-pragma對不對?像for(iter=xlist.begin() ; ...)
我使用最新版本的codeblocks和mingw。
我正在嘗試將普通代碼調整爲並行代碼。當我做一個並行的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