9

我只是从在线教程和资源中学习 OpenMP。我想使用parallel for循环对矩阵求平方(将其与自身相乘)。在IBM 编译器文档中,我发现了“迭代变量必须是signed整数”的要求。在 GCC 实现中也是如此吗?它是否在 OpenMP 标准中指定?如果是这样,是否有此要求的原因?

(这并不重要,因为预期的尺寸远小于INT_MAX,但它确实花费了我一些演员。)

4

4 回答 4

10

引自Why are not unsigned OpenMP index variables allowed?

根据OpenMP 2.0 C/C++ API规范 (pdf),第 2.4.1 节,这是 for 循环的限制之一。没有给出任何理由,但我怀疑这只是为了简化代码和编译器必须做出的假设,因为有特殊代码可以确保范围不会溢出类型的最大值。

OpenMP 3.0 显然也允许无符号类型,但我还没有看到它在起作用。

简而言之,它是标准的一部分,下一个版本将允许无符号整数。

于 2010-10-21T14:31:05.963 回答
8

这背后有一个可能的原因。同一篇文章

  • b, ub, incr是循环不变的有符号整数表达式和
  • exit_cond采取形式:iv <= ubiv < ubiv >= ubiv > ubiv您询问的迭代变量在哪里)

由于exit_cond条件涉及比较并且比较是针对有符号ub变量进行的,因此必须对循环变量iv进行签名以避免有符号/无符号比较可能出现的问题。

于 2010-10-21T14:35:11.037 回答
7

根据 OpenMP 3.0 规范:http ://www.openmp.org/mp-documents/spec30.pdf ,对于变量可以是有符号或无符号整数类型,请参阅 2.5.1 循环构造。问题是给定的 OpenMP 实现是否符合这个最新的规范。

于 2010-10-21T14:33:34.500 回答
3

回答您关于gcc. 不,似乎gcc很容易接受unsignedsize_t循环变量,例如

#pragma omp parallel for
for (size_t i = 0; i < N; ++i) {
  /* do it */
}

至少我的(64 位 ubuntu 上的 gcc v 4.4)没有抱怨并且做正确的事。

于 2010-10-21T15:36:05.133 回答