Почему не допускаются беззнаковые индексные переменные OpenMP? - PullRequest
20 голосов
/ 12 мая 2010

У меня в коде 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 ]

14 голосов
/ 12 мая 2010

Согласно спецификации OpenMP 2.0 C / C ++ API (pdf), раздел 2.4.1, это одно из ограничений цикла for. Для этого нет никаких причин, но я подозреваю, что это просто для упрощения предположений, которые должны сделать код и компилятор, поскольку существует специальный код, который гарантирует, что диапазон не переполняет максимальное значение типа.

OpenMP 3.0, очевидно, допускает и неподписанные типы, но я еще не видел его в действии.

3 голосов
/ 22 июля 2013

Компилятор Microsoft C / C ++ 12.0, интегрированный с Visual Studio 2013, все еще поддерживает только OpenMP 2.5 и не допускает unsigned int для счетчика цикла.

GCC поддерживает OpenMP 3.0 начиная с его версии 4.4 и допускает unsigned int для счетчика цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...