Планирование OpenACC

Скажите, что у меня есть такая конструкция:

for(int i=0;i<5000;i++){
  const int upper_bound = f(i);
  #pragma acc parallel loop
  for(int j=0;j<upper_bound;j++){
    //Do work...
  }
}

Где f - монотонно убывающая функция i.

Поскольку num_gangs, num_workers и vector_length не установлены, OpenACC выбирает то, что, по его мнению, является подходящим расписанием.

Но выбирает ли он такое расписание заново каждый раз, когда встречает прагму, или только один раз, когда встречается прагма в первый раз?

Глядя на вывод PGI_ACC_TIME, можно предположить, что планирование выполняется только один раз.


person Richard    schedule 19.06.2018    source источник


Ответы (2)


Компилятор PGI выберет способ декомпозиции работы во время компиляции, но обычно определяет количество групп во время выполнения. Банды по своей сути являются масштабируемым параллелизмом, поэтому решение о том, сколько их можно отложить до времени выполнения. Длина вектора и количество рабочих процессов влияют на то, как генерируется базовое ядро, поэтому они обычно выбираются во время компиляции, чтобы максимизировать возможности оптимизации. В таких циклах, где границы на самом деле не известны во время компиляции, компилятор должен сгенерировать некоторый дополнительный код в ядре, чтобы обеспечить выполнение точно правильного количества итераций.

person jefflarkin    schedule 09.08.2018
comment
Любые цитаты / ссылки, которые вы могли бы добавить, были бы полезны. - person Richard; 09.08.2018

Согласно спецификации OpenAcc 2.6 [1] Строки 1357 и 1358:

Цикл, связанный с конструкцией цикла, у которой нет предложения seq, должен быть написан таким образом, чтобы счетчик итераций цикла был вычислим при входе в конструкцию цикла.

Кажется, что это так, значит, ваш код действителен.

Однако обратите внимание, что реализация определяет, как распределять работу между бригадами и рабочими, и может быть, что компилятор PGI просто выполняет простое разбиение итераций. Вы можете вручную определить значения gang / worker, используя num_gangs и num_workers, и целочисленное выражение, передаваемое в эти предложения, может зависеть от значения вашей функции (см. 2.5.7 и 2.5.8 по спецификации OpenACC).

[1] https://www.openacc.org/sites/default/files/inline-files/OpenACC.2.6.final.pdf

person Ruyk    schedule 20.06.2018