我有以下一段代碼,我想在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=0
或j=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
你是否可以不改變循環的順序,即使'i'的外循環和'j'的內循環? –
是的,在這種情況下,每次迭代'i'都連續得到'j = 0'和'j = 1'。我有興趣在相同的迭代中對塊**中的所有迭代擁有'j = 0',然後**'j = 1'。相對於我的問題,該命令對於速度很重要。 – Marouen