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

24

我在我的C++/OpenMP代码中有一个循环,看起来像这样:

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

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

error C3016: 'i':OpenMP“for”语句中的索引变量必须具有带符号整数类型

我明白这个错误是因为 i 是无符号的,而不是有符号的,将 i 更改为有符号的解决了这个错误。我想知道的是为什么会出现这种错误?为什么不允许使用无符号索引变量?查看此错误的MSDN页面没有给我任何线索。

2个回答

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

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


1
已经过去十多年了,但是 VS 2022 的 cl.exe 仍然只支持通过 /openmp 来实现 OpenMP 2.0,除非选择 /openmp:llvm,但是根据 Microsoft 的说法,这种方式仅支持 x64 目标和无符号循环索引,例如 OpenMP 3.0。有点不幸... GCC/Clang 要领先得多。 - phetdam

4

微软的 C/C++ 编译器 12.0 集成于 Visual Studio 2013,仅支持 OpenMP 2.5,并且不允许使用无符号整数作为循环计数器。

GCC 自版本 4.4 起支持 OpenMP 3.0,并允许使用无符号整数作为循环计数器。


让我们在这里明确一点:与VS 2013捆绑的MS C/C++编译器可能不支持OpenMP v2.5之后的版本,但是与VS很好集成的英特尔编译器支持OpenMP 3.1。至于其他与VS集成的编译器是否支持更新的标准,我不清楚。 - High Performance Mark

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