为什么并行for循环中的循环变量必须是有符号的?

9
我正在从在线教程和资源中学习OpenMP。我想使用parallel for循环来平方一个矩阵(将其与自身相乘)。在IBM编译器文档中,我发现“迭代变量必须是signed整数”的要求。GCC实现中也是如此吗?这是否规定在OpenMP标准中?如果是,这个要求有什么原因吗?
(尽管预期的维度远小于INT_MAX,但这会让我付出一些类型转换的代价。)

这个问题被标记为重复问题,链接是这个,但是有一个区别,就是我特别关注GCC的OpenMP。 - Fred Foo
4个回答

10

引用自为什么不允许使用无符号OpenMP索引变量?

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

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

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


我被困在GCC 4.3中,它实现了OpenMP 2.5。目前我将我的size_t转换为int - Fred Foo

8
这可能是原因之一。同一个文章指出:
  • b, ub, incr 是循环不变的有符号整数表达式,并且
  • exit_cond 的形式为:iv <= ubiv < ubiv >= ubiv > ub(其中iv是您所问的迭代变量)
由于比较运算符与有符号ub变量进行比较,所以循环变量iv必须是带符号的,以避免出现有符号/无符号比较的问题。

1
+1的原因是知道事情为什么会变得这样总是很好的。 - pmg
3
为什么其他表达式必须“签名”呢?这就引出了一个问题。 - Fred Foo
1
嗯,那不是真正的原因。如果原因是,你必须要让边界和计数器具有相同的类型,包括符号。那个我可以接受。 - Jens Gustedt

7

已被接受,因为在3.0中限制已被取消,所以一开始可能没有一个好的理由。 - Fred Foo

3

关于gcc的第一个问题,答案是否定的。似乎gcc很容易接受像以下这样的unsignedsize_t循环变量:

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

至少我的(gcc v 4.4 在64位ubuntu上)没有报错,并且做到了正确的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接