[英]c openmp parallel for inside a parallel region
我的問題是這樣的一個。 但我想做一些不同的事情......
例如,在我的並行區域內,我想在 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)線程正在運行?
您在此處擁有的內容 - 嵌套 parallelism ,一個並行部分在另一個中 - 由大多數當前啟用 OpenMP 的編譯器支持,但默認情況下通常是關閉的。 您需要將OMP_NESTED
環境變量設置為TRUE
,或者在您的程序中調用omp_set_nested(1)
。 參見,例如,這個答案。
要在評論中回答您的后續問題,您不需要在 OpenMP 並行 for 循環末尾設置障礙; 除非你使用nowait
子句,否則在你的for
循環結束時已經有一個隱式的同步障礙。 你不能有內部的for循環的障礙; 如果循環迭代沒有被線程平均划分會發生什么? 您最終會“卡住”一些線程,等待其他線程都無法到達的障礙。
是的,正確的方法是您選擇的方法:第二個 for 循環將被每 4 個線程拆分,以便 8 個線程可以同時執行最內部的循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.