1

我需要做這樣的事情OpenMP並行內同步進行

#pragma omp parallel{ 

#pragma omp for 
for_1(){ 

    for_2(){ 
    do_something(); 
    } 
    #pragma omp barrier //wait for all threads to finish after the inner for 

    continue_with_something_else_in parallel(); 

} 

} 

編譯器告訴我,我不能把一個障礙存在。有誰知道我該如何解決這個問題?

+2

編譯器是正確的(就像往常一樣)。如果不同的線程在for循環中執行不同次數的迭代,他們會遇到不同數量的障礙 - 這將如何工作?你可以考慮使用'flush'來確保所有的線程都有一個共享變量的共同視圖,但是鑑於並行for循環中的東西應該是獨立的,我對任何需要它們的算法持懷疑態度內部for循環之後的內存公共視圖,同樣,並非所有線程都會執行相同的次數。你究竟想要做什麼? –

+0

好吧,我現在明白了。事情是修改一些共享數組的內部,並且在屏障之後,所有線程都需要使用這些數組的值。 – Atirag

+0

所以也許flush命令可以工作? – Atirag

回答

0

也許這個鏈接將幫助您:

http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Fcompiler%2Fref%2Fruompbar.htm

從我看到:

的OMP屏障指令必須塊或複合語句中出現。例如:

if (x!=0) { 
    #pragma omp barrier /* valid usage */ 
} 
if (x!=0) 
    #pragma omp barrier /* invalid usage */ 
+0

嗯這是什麼意思?屏障是在平行的,但當我編譯時,我得到這個錯誤 錯誤:障礙區域可能不緊密嵌套在工作共享,關鍵,有序,主或明確的任務區域 – Atirag

+0

編譯器說的一切:屏障區域可能不在工作分擔任務中。 #pragma omp for是一項工作分享任務。看看我發佈在「#pragma omp for」的鏈接 –

+0

我想我現在明白了。謝謝! – Atirag

1

我知道這是一個古老的職位,但因爲我發現其他人可能太...

解決方法:

#pragma omp parallel 
{ 

#pragma omp for schedule(static) 
    for_1() { 
     for_2() { 
     do_something(); 
     } 
    } 
    // note implicit barrier after for construct 

#pragma omp for shedule(static) 
    for_1() { 
     continue_with_something_else_in parallel(); 
    } 

} 

說明:

OpenMP的安排for在「塊」中循環並將它們分配給線程,這意味着在一次循環迭代中具有barrier將是有問題的,因爲臨時如果同一線程正在等待也可能會被分配一些其他循環迭代,所以它會在死鎖狀態下等待自己。

但是,如果您使用schedule(static),則OpenMP標準確保單個parallel主體中的相同線程被分配相同的循環迭代並且可以有效地共享內存,這正是我所做的。