#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. Однако я не знаю о опции компилятора для выполнения этой программы в масштабе всей программы.