Как отключить предупреждения компилятора с помощью 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++
Диалог.
ref gcc/clang параметры компиляции:
https://docs.adacore.com/live/wave/gcc-12.x/html/gcc/gcc.html#Warning-Options
https://releases.llvm.org/12.0.0/tools/clang/docs/DiagnosticsReference.html#diagnostic-flags
Я использовал nvcc с компиляторами ubuntu g++, в моем случае openmpi mpiC++. Для "-Wunused-result" компилятора g ++ соответствующее подавление сообщений будет "-Wno-unused-result". Так что передача его в nvcc как -Xcompiler "-Wno-unused-result" сработала для меня.