2013-04-05 55 views
0

我的問題就是這樣的one。但我想做一些不同的...c openmp並行平行區內

例如,在我的平行區域內我想運行我的代碼在4個線程。當每個線程進入for循環時,我想在8個線程上運行我的代碼。像

#pramga omp parallel num_threads(4) 
{ 
    //do something on 4 threads 
    #pragma omp parallel for num_threads(2) 
    for(int i=0;i<2;i++){ 
     //do something on 8 threads in total 
    } 
} 

這樣,是有辦法「分裂」每個(4)運行的線程分爲兩個(新)線程,以便裏面的for循環更多(8)線程正在運行?

+0

這裏有什麼 - 嵌套的並行機制,一個平行部分在另一個平行部分 - 被大多數當前支持OpenMP的編譯器支持,但默認情況下通常是關閉的。您需要將'OMP_NESTED'環境變量設置爲'TRUE',或者在程序中調用'omp_set_nested(1)'。看到,例如,[這個答案](http://stackoverflow.com/a/8303151/463827) – 2013-04-05 11:36:50

+0

是的,這工作正常!謝謝 ! – PinkFloyd 2013-04-05 12:18:27

+0

@Jonathan Dursi:Vakh要求你重寫你的評論作爲答案。那麼也許你可以提供一個補充信息。就在我的for循環結束之前,我想同步到線程。但如果我添加一個「障礙」,編譯器會說:障礙區域可能沒有緊密嵌套在工作共享,關鍵,有序,主控或顯式任務區域內。我怎麼解決這個問題 ? – PinkFloyd 2013-04-08 10:29:02

回答

3

這裏有什麼 - nested parallelism,其中一個平行部分在另一個平行部分 - 大多數當前支持OpenMP的編譯器都支持,但默認情況下通常是關閉的。您需要將OMP_NESTED環境變量設置爲TRUE,或者在您的程序調用omp_set_nested(1)中。參見,例如,this answer

要在註釋中回答您的後續問題,您不需要在OpenMP並行for循環結束時出現障礙;除非您使用nowait clause,否則在for循環結束時已經存在明確的同步障礙。並且你不能在的for循環中有的障礙;如果循環迭代沒有被線程均分,會發生什麼?你最終會遇到一些線程「卡住」在其他線程無法達到的障礙。

1

是的,正確的方法是你選擇的一個:第二個for循環將被每4個線程拆分,使得8個線程可能同時執行最內部循環。

+0

thx但它似乎並沒有工作...當我看着CPU的使用情況,我總是看到其中4個正在運行,但從來沒有8 ...爲什麼?如果我並行外部循環上8 cpus所有這些都運行,但多數民衆贊成不是我想要做的...我需要有不同的區域與4和8(2x4)線程... – PinkFloyd 2013-04-05 09:51:27

+0

而且你有8 cpu上你的電腦,對吧?你確定8個線程完成的工作足夠長,以便它出現在監控中嗎? – 2013-04-05 10:06:47

+0

我有48個cpus ...不是一個笑話...是的,它應該持續足夠長的時間才能看到頂部(linux)命令...但是我今天下午會更精確地檢查它,然後我會讓你知道 – PinkFloyd 2013-04-05 10:19:06