2010-05-12 50 views
18

我有一個循環,我的C++/OpenMP的代碼看起來像這樣:爲什麼不允許未簽名的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頁面並沒有給我提供任何線索。

回答

12

根據OpenMP 2.0 C/C++ API specification(pdf),第2.4.1節,這是for循環的限制之一。沒有理由給它,但我懷疑這只是爲了簡化代碼和編譯器必須做出的假設,因爲有特殊的代碼來確保範圍不會溢出該類型的最大值。

OpenMP 3.0顯然允許使用無符號類型,但我還沒有看到它的實際操作。

2

與Visual Studio 2013集成的Microsoft C/C++ Compiler 12.0仍然只支持OpenMP 2.5,並且不允許unsigned int用於循環計數器。

GCC自4.4版以來支持OpenMP 3.0,並允許unsigned int作爲循環計數器。

+0

讓我們來精確一點:與VS 2013捆綁在一起的MS C/C++編譯器可能不支持v2.5之後的OpenMP,但與VS集成的Intel編譯器確實支持OpenMP 3.1。與VS集成的其他編譯器是否支持我不知道的更新標準。 – 2013-07-22 09:06:59

+0

對,糾正。 – 2013-07-22 12:08:52

相關問題