Почему переменные цикла должны быть подписаны параллельно? - PullRequest
7 голосов
/ 21 октября 2010

Я только изучаю OpenMP из онлайн-уроков и ресурсов.Я хочу возвести в квадрат матрицу (умножить ее на себя), используя цикл parallel for документации компилятора IBM я обнаружил требование, что "переменная итерации должна быть signed целым числом".Это также верно в реализации GCC?Это указано в стандарте OpenMP?Если да, то есть ли причина для этого требования?

(Это не имеет большого значения, так как ожидаемые размеры намного меньше, чем INT_MAX, но это стоит некоторых бросков).

Ответы [ 4 ]

10 голосов
/ 21 октября 2010

Цитирование из Почему не допускаются беззнаковые индексные переменные OpenMP? :

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

OpenMP 3.0, очевидно, позволяет беззнаковые типы тоже, но я не видел пока в действии.

Короче говоря, это часть стандарта, и в следующей версии будут разрешены целые числа без знака.

7 голосов
/ 21 октября 2010

Вот возможная причина этого.В той же статье говорится, что

  • b, ub, incr являются целочисленными выражениями со знаком, инвариантными к циклу, и
  • exit_cond принимает форму: iv <= ub или iv < ub илиiv >= ub или iv > ub (где iv - это итерационная переменная, о которой вы спрашиваете)

, поскольку условие exit_cond включает сравнение и сравнение выполняется со знаком ub со знакомпеременная цикла iv должна быть подписана, чтобы избежать возможных проблем со знаком со знаком / без знака.

5 голосов
/ 21 октября 2010

Согласно спецификации OpenMP 3.0: http://www.openmp.org/mp-documents/spec30.pdf, для переменной может иметь целочисленный тип со знаком или без знака, см. 2.5.1 Контур Loop.Вопрос в том, соответствует ли данная реализация OpenMP этой последней спецификации.

1 голос
/ 21 октября 2010

Чтобы ответить на ваш первый вопрос о gcc. Нет, похоже, что gcc легко принимает переменные цикла unsigned или size_t в виде, подобном

#pragma omp parallel for
for (size_t i = 0; i < N; ++i) {
  /* do it */
}

по крайней мере мой (gcc v 4.4 на 64-битной Ubuntu) не жалуется и делает правильные вещи.

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