Отключение генерации неявной прагмы OpenACC с помощью компилятора pgc

#c #compiler-errors #gpu #openacc #pgi

#c #ошибки компилятора #графический процессор #openacc #pgi

Вопрос:

Я использую pgc компилятор для некоторого кода на C , который использует директивы OpenACC, и мне было интересно, есть ли опция компилятора для отключения неявной генерации прагмы, которая выполняется при компиляции кода, если пользователь оставляет требуемые прагмы. Например, при компиляции моего собственного кода с -Minfo=accel помощью флага я вижу, что появляются следующие сообщения:

 Generating implicit copy(beam_endpoint_grid_idx,beam_endpoint_world_frame[:]) [if not already present]
Generating implicit copyin(R[:][:]) [if not already present]
Generating implicit copyin(this[:],particle_position_world_frame[:]) [if not already present]
 

И то, что я пытаюсь сделать, это запретить pgc компилятору создавать эти неявные copy() copyin() и т.д. прагмы, а вместо этого выдавать ошибку. Доступен ли такой вариант?

Выполняя поиск в pgc man page , единственными вариантами , которые содержали это слово implicit в их названии или в их описании , были,

 --implicit_include (default) --no_implicit_include
--implicit_typename (default) --no_implicit_typename
--using_std (default) --no_using_std
 

Но это, к сожалению, не отключает неявную генерацию прагмы.

Ответ №1:

Это поведение по умолчанию, определенное стандартом OpenACC, когда пользователь не использует предложения data в вычислительной конструкции (parallel / kernels). Выполняется проверка во время выполнения, и если данные уже присутствуют на устройстве, никаких действий не выполняется. Если данных нет на устройстве, то данные копируются.

Вы можете добавлять эти переменные в предложения data по отдельности или добавлять предложение «default (present)» в свою вычислительную конструкцию, чтобы все общие данные предполагались присутствующими на устройстве. Если данные отсутствуют, то возникнет ошибка времени выполнения.

Ответ №2:

Как указал @Mat Colgrove, ожидаемое поведение компилятора заключается в неявном добавлении предложений данных для переменных, которые не отображаются в одном. Вы можете добавить default(none) в свои прагмы, и это даст указание компилятору выдать ошибку во время компиляции, если переменная используется в пределах региона и не отображается в предложении data. Однако я не знаю о опции компилятора для выполнения этой программы в масштабе всей программы.