我只是从在线教程和资源中学习OpenMP。我想使用parallel for
循环对矩阵(与其自身相乘)进行平方。在IBM compiler documentation中,我发现要求“迭代变量必须是signed
整数。”在GCC实施中也是如此吗?是否在OpenMP标准中指定?如果是这样,是否有理由要求这一要求?
(预期尺寸远小于INT_MAX
并不重要,但它确实花了我一些演员。)
答案 0 :(得分:10)
引自Why aren't unsigned OpenMP index variables allowed?:
根据OpenMP 2.0 C/C++ API规范(pdf),部分 2.4.1,这是for循环的限制之一。没有理由 为此,但我怀疑它只是为了 简化代码的假设 和编译器必须做,因为 有特殊的代码来确保这一点 范围不会溢出最大值 类型的价值。
OpenMP 3.0显然允许 无符号类型,但我还没有看到 它还在行动中。
简而言之,它是标准的一部分,下一个版本将允许无符号整数。
答案 1 :(得分:7)
这背后可能的原因。 same article表示
b, ub, incr
是循环不变的有符号整数表达式和exit_cond
的格式为:iv <= ub
或iv < ub
或iv >= ub
或iv > ub
(其中iv
是您询问的迭代变量)< / LI>
由于exit_cond
条件涉及比较,并且对已签名的ub
变量进行了比较,因此必须对循环变量iv
进行签名,以避免签名/无符号比较可能出现的问题。
答案 2 :(得分:5)
根据OpenMP 3.0规范:http://www.openmp.org/mp-documents/spec30.pdf,对于变量可以是有符号或无符号整数类型,请参见2.5.1循环构造。问题是给定的OpenMP实现是否符合最新的规范。
答案 3 :(得分:1)
回答关于gcc
的第一个问题。不,似乎gcc
容易接受unsigned
或size_t
循环变量,例如
#pragma omp parallel for
for (size_t i = 0; i < N; ++i) {
/* do it */
}
至少我的(64位ubuntu上的gcc v 4.4)不会抱怨并且做对了。