问题描述
考虑以下 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 节) 构造。