Как отключить предупреждения компилятора с помощью nvcc

Я хочу отключить конкретное предупреждение компилятора с nvccконкретно

предупреждение: ссылка NULL не допускается

Код, над которым я работаю, использует NULL ссылки являются частью SFINAEпоэтому их нельзя избежать.

Идеальным решением было бы #pragma только в исходном файле, где мы хотим отключить предупреждения, но флаг компилятора также подойдет, если он существует, чтобы отключить только соответствующее предупреждение.

РЕДАКТИРОВАТЬ: я задавал этот вопрос 5 лет назад, и с тех пор было предложено два разных решения.

Первое, предложенное @user2333829 ниже, заключается в использовании -Xcudafe флаг компилятора, чтобы отключить предупреждения для всего файла.

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

Спасибо за ваш отзыв на протяжении многих лет!

7 ответов

Решение

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

Вам нужно использовать -Xcudafe флаг в сочетании с токеном, указанным на этой странице. Например, чтобы отключить предупреждение "control expression is constant", передайте NVCC следующее:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

Другие предупреждения см. По ссылке выше.

Просто чтобы добавить к предыдущему ответу о -xcudafe (пока недостаточно репутации, чтобы оставить комментарий)

Вы можете сделать это локально в прагмах, например, так:

#pragma push
#pragma diag_suppress = code_is_unreachable 
...
#pragma pop

CudaFE - это, по-видимому, пользовательская версия Nvidia C++ Front End от Edison Design Group. Вы можете найти документы для этого здесь: http://www.edg.com/docs/edg_cpp.pdf Page 75 содержит прагматические директивы для диагностики. Здесь упоминаются только push и pop в "контексте Microsoft", но я протестировал их в своем коде (Mac, а не MSVC), и они работают.

Для дополнения ответа пользователя user2333829: если вы знаете имя предупреждения, вы можете отключить его следующим образом:

-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"

Если вы не знаете имя, получите номера предупреждений, составив:

-Xcudafe --display_error_number

А затем с:

-Xcudafe --diag_suppress=<warning_number>

(Примечание: оба варианта одновременно не работают.)

Вы можете использовать флаг w, чтобы подавить предупреждения nvcc -w

Я изо всех сил пытался найти подходящий -Xcudafe для моего предупреждения. Так что вот другой способ.

Вы можете передать флаг компилятора CL.exe это отключит конкретное предупреждение. Например, чтобы отключить предупреждения о непроверенных итераторах, вы можете передать /wd4996,

warning C4996: 'std::_Copy_impl': Function call with parameters that may be
unsafe - this call relies on the caller to check that the passed values are 
correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See 
documentation on how to use Visual C++ 'Checked Iterators'

Сложность в том, что по умолчанию аргументы из настроек компилятора хоста не передаются nvccтак что вам нужно добавить его через CUDA C/C++ Диалог.

Я использовал nvcc с компиляторами ubuntu g++, в моем случае openmpi mpiC++. Для "-Wunused-result" компилятора g ++ соответствующее подавление сообщений будет "-Wno-unused-result". Так что передача его в nvcc как -Xcompiler "-Wno-unused-result" сработала для меня.

Другие вопросы по тегам