OpenMP 5.1 规范是否允许具有非矩形循环的折叠子句?

问题描述

考虑以下 OpenMP 代码

#pragma omp target teams distribute parallel for collapse(4) map(tofrom: a) private(i,j,k,l)
for (i = 0; i < SIZE_N; i++) {
  for (j = 0; j < SIZE_M; j++) {
    for (k = i; k < SIZE_N; k++) {
       for (l = 0; l < SIZE_M; L++) {
         a[i][j][k][l] += i+2*j+3*k+4*l;
       }
    }
  }
}

代码是否符合 OpenMP Spec 5.1?我在规范中找不到任何不允许使用此类代码的措辞,但我不确定我是否遗漏了什么。

谢谢!

解决方法

这是否符合 OpenMP Spec 5.1?

根据 Support for non-rectangular collapsed loops 是的,它是合规的。

OpenMP 5.0 之前,所有 OpenMP 循环结构(工作共享循环、 simd、distribute、taskloop 以及基于组合或复合结构的 在那些)必须是矩形的。这意味着所有的 所有的下界、上界和增量表达式 循环嵌套中的关联循环必须是不变的 反对最外层循环。 OpenMP 5.0 仍然需要所有 增量表达式是循环不变的,但 允许某些情况 其中内循环的下界和上界表达式可以是 基于单个外循环迭代器。

我在规范中找不到任何 不允许使用这种代码的措辞,但我不确定我遗漏了什么。

OpenMP 5.0 specification page 625,Version 4.5 to 5.0 Differences 中,您可以阅读以下内容:

不完美嵌套循环的关联循环的崩溃 是为工作共享循环定义的(参见第 101 页上的第 2.9.2 节), simd(请参阅第 110 页上的第 2.9.3.1 节)、任务循环(请参阅第 2.10.2 节 第 140 页)和分发(参见第 123 页第 2.9.4.2 节) 构造。