为什么循环变量必须并行签名?

时间:2010-10-21 14:21:58

标签: c++ c parallel-processing openmp signed

我只是从在线教程和资源中学习OpenMP。我想使用parallel for循环对矩阵(与其自身相乘)进行平方。在IBM compiler documentation中,我发现要求“迭代变量必须是signed整数。”在GCC实施中也是如此吗?是否在OpenMP标准中指定?如果是这样,是否有理由要求这一要求?

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

4 个答案:

答案 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 <= ubiv < ubiv >= ubiv > 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容易接受unsignedsize_t循环变量,例如

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

至少我的(64位ubuntu上的gcc v 4.4)不会抱怨并且做对了。