2012-12-25 17 views
2

我是OpenMP的新手。我試圖使用for循環的多個核心,但我得到這個編譯錯誤:OpenMP - OpenMP中的索引變量'for'語句必須具有帶符號整數類型

「錯誤C3016:'x':索引變量在'OpenMP'爲'語句必須有符號整數類型」。

我知道與Microsoft Visual Studio 2010(我正在使用的)標準的OpenMP 2.0,由於某些原因不支持無符號數據類型,但我不相信我有任何未簽名的數據類型在此使用循環。

這裏是我的代碼看起來像:

可變Declerations:

struct Vertex 
{ 
    float x, y; 
}; 

FractalGenerator::Vertex FractalGenerator::_fracStart; 
FractalGenerator::Vertex FractalGenerator::_fracEnd; 
float FractalGenerator::_pointPrecision = 0.008f; 
float FractalGenerator::_scaleFactor = 1; 

For循環:

float _fracStep = _pointPrecision/_scaleFactor; 

#pragma omp parallel for 
for (float x = _fracStart.x; x < _fracEnd.x; x += _fracStep) 
{ 
    for (float y = _fracStart.y; y < _fracEnd.y; y += _fracStep) 
    { 

回答

3

看起來像OpenMP的不支持非整數類型的指數在for循環中。你有float x,而float是一個算術類型,它不是一個整數類型。

的積分類型爲下列之一:boolcharchar16_tchar32_twchar_t,以及任何所述符號和無符號整數類型(charshortintlong,和long long)的。

您需要將算法轉換爲將其中的一個用於for循環的索引。這可能有效:

int iEnd = (_fracEnd.x - _fracStart.x)/_fracStep; 
int jEnd = (_fracEnd.y - _fracStart.y)/_fracStep; 
for (int i = 0; i < iEnd; i++) 
{ 
    float x = _fracStart.x + i * _fracStep; 
    for (int j = 0; j < jEnd; j++) 
    { 
    float y = _fracStart.y + j * _fracStep; 
    // ... 
    } 
} 
+0

看起來你是對的。哇,這是一個無賴。看起來我必須找到一個不同的並行編程API。謝謝! – arnm

+0

有一種方法可能是將浮點值累加起來,這樣就可以使用整數,然後在循環內進行分割。浮點差距在性能方面並不可怕,所以如果你有足夠的處理器,它應該會給你一個很好的提升。 –

+1

@cstuts,你可以使用OpenMP,只是迭代'currentStep'變量,而不是'x',其中'x = _fracStart.x + currentStep * _fracStep' – Lol4t0

相關問題