2017-05-16 32 views
0

我有以下一段代碼,我想在openmp中編寫代碼。將順序代碼轉換爲openMP並行結構

我的代碼抽象如下所示

我將N=100重複同樣之中p=10片第一次開始,我爲每一個作品的分配迭代存儲在矢量

Nvec[1]={0,1,..,9} 
Nvec[2]={10,11,..,19} 
Nvec[p]={N-9,..,N} 

然後我環路上迭代

for(k=0;k<p;k++){\\loop on each piece of Nvec 
    for(j=0;j<2;j++){\\here is a nested loop 
     for(i=Nvec[k][0];i<Nvec[k][p];i++){ 
      \\then I loop between the first and 
      \\last value of the array corresponding to piece k 
    } 
} 

現在,您可以看到代碼是連續的,總數爲2*100=200 iterations,我想使用OpenMp並行化它的絕對條件來保持迭代順序!

我嘗試以下

#pragma omp parallel for schedule(static) collapse(2) 
{ 
for(j=0;j<2;j++){ 
    for(i=0;i<n;i++){ 
     \\loop code here 
    } 
} 
} 

此設置不保留迭代的順序,在連續的版本。 在順序版本中,每個塊都完全用j=0進行處理,然後完全用j=1進行處理。

在我的openMP版本中,每個線程都需要大量的迭代,並完全使用j=0來處理它。在某種程度上,所有線程都會對待j=0j=1個案。每個工人p=10進程200/10=20 iterations,問題是所有迭代都是j=0 or j=1

我怎樣才能確保每個線程得到的迭代塊,執行與j=0所有迭代,然後j=1在迭代的同一塊循環代碼?

編輯

正是我想要的的20次迭代

worker 1 
j:0 
i:1--->10 
j:1 
i:1--->10 
worker p 
j:0 
i:90--->99 
j:1 
i:90--->99 

上述OpenMP的代碼做

worker 1 
j:0 
i:1--->20 
worker p 
j:1 
i:80--->99 
+3

你是否可以不改變循環的順序,即使'i'的外循環和'j'的內循環? –

+0

是的,在這種情況下,每次迭代'i'都連續得到'j = 0'和'j = 1'。我有興趣在相同的迭代中對塊**中的所有迭代擁有'j = 0',然後**'j = 1'。相對於我的問題,該命令對於速度很重要。 – Marouen

回答

1

它實際上是簡單的每塊什麼 - 只是使外j -loop非 - 共享:

#pragma omp parallel 
for (int j = 0; j < 2; j++) { 
    #pragma omp for schedule(static) 
    for (int i = 0; i < 10; i++) { 
     ... 
    } 
} 

如果您使用static計劃,則OpenMP保證,每個工作人員將得到j=0j=1的相同範圍i

注意:將parallel構造移到外部循環僅僅是一種優化,可以避免線程管理開銷。代碼的工作方式類似,只需在兩個循環之間放置一個parallel for即可。

+0

太好了,謝謝!有什麼方法可以保證動態時間表中的訂單? – Marouen

+0

@Marouen你是什麼意思「保證訂單」。當然,動態的時間表不能保證連續循環的指數平均分配。這會打敗整個目的。 – Zulan

+1

默認時間表是依賴於實現的,而不是「靜態的」。 –