【问题标题】:Translating sequential code into openMP parallel construct将顺序代码转换为 openMP 并行结构
【发布时间】: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=0j=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=0j=1。我有兴趣在同一迭代中为块 then j=1 中的所有迭代使用j=0。相对于我的问题,顺序对于速度目的很重要。

标签: c multithreading multiprocessing openmp


【解决方案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 处理相同范围的is。

注意:将parallel 构造移动到外部循环仅仅是为了避免线程管理开销的优化。如果您只是在两个循环之间放置一个parallel for,则代码的工作方式类似。

【讨论】:

  • 太好了,谢谢!有没有什么办法可以保证订单的动态安排?
  • @Marouen “保证订单”是什么意思。当然,动态调度不能保证连续循环的索引的均匀分布。那会破坏整个目的。
  • 默认计划取决于实现,而不是static
  • @Zulan 这是我的问题:使用动态调度,有没有办法告诉每个工作人员以j=0 的所有迭代方式处理一大块迭代i块然后j=1
  • @Marouen 我现在想不出除了在j=0 循环期间记录所有索引i 然后手动重放该索引序列之外的任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
相关资源
最近更新 更多