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

Fre*_*Foo 7 c c++ parallel-processing signed openmp

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

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

Jac*_*cob 10

引用为什么不允许使用未签名的OpenMP索引变量?:

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

OpenMP 3.0显然也允许使用无符号类型,但我还没有看到它的实际应用.

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


sha*_*oth 7

这背后有可能的原因.在同一篇文章中说,

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

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

  • 这就引出了为什么其他表达必须是"签名"的问题. (3认同)

Ale*_*x F 5

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