0

我有这样的场景:

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 放在块之前,但我肯定错过了一点!

谢谢,萨扬

4

2 回答 2

1

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

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

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

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

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

于 2010-04-19T11:01:29.863 回答
0

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

于 2010-04-19T16:39:45.580 回答