【发布时间】:2017-10-15 20:44:00
【问题描述】:
我有以下一段代码,我想用 openmp 编写。
我的代码抽象地如下所示
我首先将N=100 迭代平均分配给p=10pieces,然后将分配的迭代存储在一个向量中
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 的worker 进程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。我有兴趣在同一迭代中为块 thenj=1中的所有迭代使用j=0。相对于我的问题,顺序对于速度目的很重要。
标签: c multithreading multiprocessing openmp