C++ 为什么必须对循环变量进行并行签名?

C++ 为什么必须对循环变量进行并行签名?,c++,c,parallel-processing,openmp,signed,C++,C,Parallel Processing,Openmp,Signed,我只是从在线教程和资源中学习OpenMP。我想使用并行for循环对矩阵求平方(与其自身相乘)。在中,我发现了“迭代变量必须是有符号的整数”的要求。在GCC实现中也是这样吗?OpenMP标准中是否有规定?如果是,这项要求有何理由 (这并不重要,因为预期尺寸远小于INT\u MAX,但它确实花费了我一些演员。)引用: 根据规范(pdf),第 2.4.1,这是for循环的限制之一。没有给出任何理由 但我怀疑这只是为了 简化代码所包含的假设 而编译器必须做出,因为 有专门的代码来确保 范围没有超出最大值

我只是从在线教程和资源中学习OpenMP。我想使用
并行for
循环对矩阵求平方(与其自身相乘)。在中,我发现了“迭代变量必须是有符号的整数”的要求。在GCC实现中也是这样吗?OpenMP标准中是否有规定?如果是,这项要求有何理由

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

引用:

根据规范(pdf),第 2.4.1,这是for循环的限制之一。没有给出任何理由 但我怀疑这只是为了 简化代码所包含的假设 而编译器必须做出,因为 有专门的代码来确保 范围没有超出最大值 类型的值

OpenMP 3.0显然允许 也有未签名的类型,但我没有看到 它还在运行


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

根据OpenMP 3.0规范:,变量可能是有符号或无符号整数类型,请参阅2.5.1循环构造。问题是给定的OpenMP实现是否符合此最新规范。

这背后可能有一个原因。报告说

  • b、ub、incr
    是循环不变的有符号整数表达式和
  • exit_cond
    的形式为:
    iv=ub
    iv>ub
    (其中
    iv
    是您询问的迭代变量)

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

回答关于
gcc
的第一个问题。不,似乎
gcc
很容易接受
unsigned
size\t
循环变量

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

至少我的(64位ubuntu上的GCC4.4版)没有抱怨,做了正确的事情。

+1原因就在于此。知道事情为什么是这样总是很好的。这就引出了一个问题,为什么其他表达式必须是有符号的。嗯,这不是真正的原因。如果原因是,则必须具有相同类型的边界和计数器,包括有符号性。我会买的。我坚持使用GCC4.3,它实现了OpenMP 2.5。现在我将把我的
size\u t
转换为
int
。接受是因为3.0中取消了限制,所以一开始可能没有什么好的理由。这个问题被标记为重复,但有一点不同,那就是我对GCC的OpenMP特别感兴趣。