счетные циклы и OpenMP - PullRequest
       6

счетные циклы и OpenMP

0 голосов
/ 19 ноября 2018

В некоторых документах, связанных с OpenMP, говорится, что для обработки цикла OpenMP он должен быть «счетным», предоставляя различные определения для цикла «счетный»:

• the number of iterations in the loop must be countable
  with an integer and loop use a fixed increment. 
• the loop count can be “determined” ( what does it mean “determined”? )

Действительно ли это требование OpenMP? Или это требование конкретной реализации компилятора OpenMP?

Кроме того, может ли следующий цикл - не кажется счетным - быть распараллеленным с помощью OpenMP (обратите внимание, что вопрос в том, можно ли распараллелить код, а не в том, есть ли способ создать параллельный эквивалент этого кода)

for ( i = 0; i < cnt; )
{
 x1 = 2.0 * x - 1.;
 if ( x1 < 1.0 )
 {
  i = i + 3;
  x = x*2.;
 }
 else // if ( x1 >= 1. )
 {
  i = i + 2;
  x = x/2.;
 }
}

1 Ответ

0 голосов
/ 19 ноября 2018

Стандарт OpenMP требует Каноническая форма циклов

Каноническая форма позволяет вычислять число итераций всех связанных циклов перед выполнением самого внешнегопетля.Вычисление выполняется для каждого цикла целочисленного типа.

Это не ограничивается целыми числами, вы можете использовать типы указателей в C и типы итераторов произвольного доступа в C ++, которые логически переводятся в целые числа.

Переменная цикла не должна изменяться в цикле for (кроме выражения приращения).Поэтому в вашем примере недопустимый код OpenMP.

Дополнительные ограничения заключаются в том, что циклический тест должен представлять собой сравнение отношений <, <=, > или >= - не != или что-то ещеболее сложный.Приращение должно быть постоянным на протяжении всего цикла.Отсутствующее выражение приращения в вашем примере также делает его недействительным.

Об этом можно прочитать в стандарте OpenMP , раздел 2.6.

...