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