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

时间:2010-05-12 16:08:12

标签: c++ openmp

我的C ++ / OpenMP代码中有一个循环,如下所示:

#pragma omp parallel for
for(unsigned int i=0; i<count; i++)
{
    // do stuff
}

当我编译它时(使用Visual Studio 2005),我收到以下错误:

error C3016: 'i' : index variable in OpenMP 'for' statement must have signed integral type

我了解错误的发生是因为i是未签名而非签名,而更改i要签名会删除此错误。我想知道的是为什么这是一个错误?为什么不允许使用无符号索引变量?查看此错误的MSDN页面没有提供任何线索。

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:2)

与Visual Studio 2013集成的Microsoft C / C ++编译器12.0仍然只支持OpenMP 2.5,并且不允许unsigned int用于循环计数器。

GCC从版本4.4开始支持OpenMP 3.0,并允许unsigned int用于循环计数器。