【问题标题】:OpenMP - running things in parallel and some in sequence within themOpenMP - 在其中并行运行一些东西,并在其中按顺序运行一些东西
【发布时间】:2010-04-19 01:49:08
【问题描述】:

我有这样一个场景:

for (i = 0; i < n; i++)  
{  
  for (j = 0; j < m; j++)  
{  
  for (k = 0; k < x; k++)  
  {  
     val = 2*i + j + 4*k  
     if (val != 0)  
     {  
      for(t = 0; t < l; t++)  
         {  
           someFunction((i + t) + someFunction(j + t) + k*t)  
         }  
      }  
   }  
}  
}

考虑到这是块 A,现在我的代码中有两个类似的块。我想将它们并行放置,所以我使用了 OpenMP 编译指示。但是我无法并行化它,因为在这种情况下我有点困惑哪些变量将是共享的和私有的。如果内部循环中的函数调用是 sum += x 之类的操作,那么我可以添加一个归约子句。 一般来说,当我们有一个嵌套的 for 循环,然后另一个内部 for 循环执行主要操作时,如何使用 OpenMP 并行化代码。 我尝试声明一个并行区域,然后简单地将 pragma fors 放在块之前,但我肯定错过了一点!

谢谢, 萨彦

【问题讨论】:

    标签: openmp


    【解决方案1】:

    我更像是一个 Fortran 程序员而不是 C,所以我对 C 风格的 OpenMP 的了解很差,我将把语法留给你。

    您最简单的方法可能是(我稍后会对此进行限定)简单地并行化最外层循环。默认情况下,OpenMP 将变量i 视为私有变量,其余变量视为共享变量。这可能不是您想要的,您可能也希望将 jkt 设为私有。我怀疑你也想要 val 私人的。

    我对你的循环嵌套底部的语句(即someFunction...)有点困惑,它似乎根本没有返回任何值。有副作用吗?

    因此,您不需要声明包含所有这些代码的并行区域,并且您应该只并行化最外层的循环。如果您也要并行化内部循环,您可能会发现您的 OpenMP 安装要么忽略它们,要么产生比处理器更多的进程,要么抱怨不已。

    我说您最简单的方法可能是并行化最外层循环,因为我已经对您的程序(片段)正在做什么做了一些假设。如果假设是错误的,您可能需要并行化其中一个内部循环。要检查的另一点是,您并行化的循环的执行次数远大于您使用的线程数。您不希望在 4 个线程上使用行程计数为 7 的 OpenMP 运行循环,负载平衡会很差。

    【讨论】:

      【解决方案2】:

      你是对的,最里面的语句宁愿是 someFunction((i + t) + someFunction2(j + t) + k*t)。

      【讨论】:

      • 其实就是写入一个数组。这个概念是有一个大数组,其中位置 x,y 被写入值 x',y'(数组的其他位置,已经更新或 0)乘以某个数字。该程序在编写时并没有考虑到并行性,所以,你知道的!谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 2013-12-02
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      相关资源
      最近更新 更多