OpenMP 5.1 规范是不是允许使用非矩形循环的折叠子句?

Posted

技术标签:

【中文标题】OpenMP 5.1 规范是不是允许使用非矩形循环的折叠子句?【英文标题】:Is collapse clause with non-rectangular loops allowed by the OpenMP 5.1 Spec?OpenMP 5.1 规范是否允许使用非矩形循环的折叠子句? 【发布时间】:2021-09-23 16:30:48 【问题描述】:

考虑以下 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?我在规范中找不到任何不允许这种代码的措辞,但我不确定我是否遗漏了什么。

谢谢!

【问题讨论】:

【参考方案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,4.5 到 5.0 的差异,可以阅读以下内容:

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

【讨论】:

我想补充一点,虽然 OpenMP API v5.1 现在已经为折叠的非矩形循环定义了明确的行为,但您的 OpenMP 实现可能还不支持这一点。请检查编译器更改日志,如果他们已经对此提供支持。

以上是关于OpenMP 5.1 规范是不是允许使用非矩形循环的折叠子句?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GCC 5.1 和 OpenMP 将工作卸载到 Xeon Phi

C++:OpenMP 并行循环内存泄漏

为啥 OpenMP 不允许使用 != 运算符?

openmp - 用于文本文件读取和使用管道的 while 循环

openmp 条件并行循环

openmp 条件并行循环