我只是从在线教程和资源中学习 OpenMP。我想使用parallel for
循环对矩阵求平方(将其与自身相乘)。在IBM 编译器文档中,我发现了“迭代变量必须是signed
整数”的要求。在 GCC 实现中也是如此吗?它是否在 OpenMP 标准中指定?如果是这样,是否有此要求的原因?
(这并不重要,因为预期的尺寸远小于INT_MAX
,但它确实花费了我一些演员。)
引自Why are not unsigned OpenMP index variables allowed? :
根据OpenMP 2.0 C/C++ API规范 (pdf),第 2.4.1 节,这是 for 循环的限制之一。没有给出任何理由,但我怀疑这只是为了简化代码和编译器必须做出的假设,因为有特殊代码可以确保范围不会溢出类型的最大值。
OpenMP 3.0 显然也允许无符号类型,但我还没有看到它在起作用。
简而言之,它是标准的一部分,下一个版本将允许无符号整数。
这背后有一个可能的原因。同一篇文章说
b, ub, incr
是循环不变的有符号整数表达式和exit_cond
采取形式:iv <= ub
或iv < ub
或iv >= ub
或iv > ub
(iv
您询问的迭代变量在哪里)由于exit_cond
条件涉及比较并且比较是针对有符号ub
变量进行的,因此必须对循环变量iv
进行签名以避免有符号/无符号比较可能出现的问题。
根据 OpenMP 3.0 规范:http ://www.openmp.org/mp-documents/spec30.pdf ,对于变量可以是有符号或无符号整数类型,请参阅 2.5.1 循环构造。问题是给定的 OpenMP 实现是否符合这个最新的规范。
回答您关于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)没有抱怨并且做正确的事。