Я новичок в OpenMP. Я пытаюсь использовать несколько ядер для цикла for, но я получаю эту ошибку компиляции:
msgstr «ошибка C3016: ‘x’: переменная индекса в OpenMP ‘для оператора’ должна иметь целочисленный тип со знаком».
Я знаю, что OpenMP 2.0, который является стандартным для Microsoft Visual Studio 2010 (что я использую), по какой-то причине не поддерживает типы данных без знака, но я не верю, что в этом цикле используются типы данных без знака.
Вот как выглядит мой код:
Переменные Declerations:
struct Vertex
{
float x, y;
};
FractalGenerator::Vertex FractalGenerator::_fracStart;
FractalGenerator::Vertex FractalGenerator::_fracEnd;
float FractalGenerator::_pointPrecision = 0.008f;
float FractalGenerator::_scaleFactor = 1;
Для цикла:
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)
{
Похоже, OpenMP не поддерживает нецелые типы, так как индекс в for
петля. У тебя есть float x
и пока float
это арифметический тип, это не целочисленный тип.
Интегральный тип является одним из: bool
, char
, char16_t
, char32_t
, wchar_t
и любой из целочисленных типов со знаком и без знака (char
, short
, int
, long
, а также 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;
// ...
}
}
Других решений пока нет …