多维嵌套OpenMP循环

10 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规范(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>
       }
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jon*_*rsi 9

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>
       }
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

一切都准备好了.

  • 有两点需要注意.首先,collapse子句仅在OpenMP V3.0及更高版本中.其次,虽然在使用collapse子句时不需要专门使循环迭代变量成为私有,但如果删除了collapse子句,那么最好是如上所述声明它们(使用C99语法)或将它们放在private子句中.否则他们将被分享,你将遇到问题. (2认同)