2013-03-17 39 views
1

這是我的主要獵手的一部分。我想打破平行OMP爲儘快剛過條件滿足,B設定爲假:C++打破omp並行

#pragma omp parallel for 
for(long l = 1; l <= n; l++) { 
if (m % p[l] == 0) { 
b = false; 
*// Break omp parallel for*} 
} 

我試圖做循環來實現這一目標,但我無法弄清楚。有人可以爲我修改這個嗎?

回答

1

我相信唯一的辦法是添加一個失敗變量,但它不會給你任何性能提升;

#pragma omp parallel for 
for(long l = 1; l <= n; l++) { 
    if (b) { 
     if (m % p[l] == 0) { 
      b = false; 
     } 
    } 
} 

更好的可能是將循環拆分成段,如果它真的會很長;

#pragma omp parallel for 
for(long l = 1; l < n/2; l++) { 
    if (m % p[l] == 0) { 
     b = false; 
    } 
} 
if (b) { 
    #pragma omp parallel for 
    for(long l = n/2; l <= n; l++) { 
     if (m % p[l] == 0) { 
      b = false; 
     } 
    } 
} 

簡單地將其分割成你認爲最好的數量。

對於更復雜的答案,使用手冊線程(但允許break荷蘭國際集團),看到這樣的回答:https://stackoverflow.com/a/9813239/1180785

+0

還有我不知道你的●變量是正確的;你確定它應該是基於1而不是基於0的嗎?這是一個素數計算器嗎? – Dave 2013-03-17 22:47:04

+0

是的,我通過do循環嘗試了第一個建議。但無論條件(失敗變量)是否滿足,它仍然等待完成'l'。我看到了同樣的文章,但是我的關卡非常複雜,以便跟蹤正在發生的事情...... – Flashbond 2013-03-17 22:51:38

+0

基本上,其他答案將平行分割爲其組成部分;一個線程分割並在每個線程上循環。它不如內置功能,但在這種情況下,缺點不會顯而易見。我提出的第一個建議不會給你帶來任何好處,不(我說的太多了);它只會在你的循環體更復雜時纔有用。我認爲第二塊代碼對你來說是一個很好的妥協;很容易理解,並且如果您正確地分割它,將會避免大部分等待。 – Dave 2013-03-17 22:56:15