多维嵌套OpenMP循环

时间:2011-03-13 03:59:50

标签: c parallel-processing openmp nested-loops

在OpenMP中并行化多维尴尬并行循环的正确方法是什么?维度的数量在编译时是已知的,但是哪个维度是大的。他们中的任何一个可能是一,二或一百万。当然,我不希望N omp parallel用于N维循环...

思想:

  • 问题在概念上很简单。只有最外层的“大”循环需要并行化,但循环维度在编译时是未知的,可能会发生变化。

  • 动态设置omp_set_num_threads(1)#pragma omp for schedule(static, huge_number)会使某些循环并行化成为无操作吗?这会产生不良的副作用/开销吗?感觉就像一个kludge。

  • OpenMP Specification(2.10,A.38,A.39)讲述了符合和不符合嵌套并行性的区别,但没有提出解决此问题的最佳方法。

  • 重新排序循环是可能的,但可能会导致大量缓存未命中。展开是可能的,但不是重要的。还有其他办法吗?

这是我要并行化的内容:

for(i0=0; i0<n[0]; i0++) {
  for(i1=0; i1<n[1]; i1++) {
    ...
       for(iN=0; iN<n[N]; iN++) {
         <embarrasingly parallel operations>
       }
    ...
  }
}

谢谢!

1 个答案:

答案 0 :(得分:9)

here所述,collapse指令可能正是您所寻求的。这将基本上形成一个单独的循环,然后进行并行化,并且设计用于这些类型的情况。所以你要这样做:

#pragma omp parallel for collapse(N)
for(int i0=0; i0<n[0]; i0++) {
  for(int i1=0; i1<n[1]; i1++) {
    ...
       for(int iN=0; iN<n[N]; iN++) {
         <embarrasingly parallel operations>
       }
    ...
  }
}

并完成所有设定。