CUDA: NVCC fornece expressão controladora é um aviso constante em
-
19-09-2019 - |
Pergunta
Eu recebo o aviso controlling expression is constant
na declaração afirmadora como esta:
assert(... && "error message");
Por que esse aviso sobre esta afirmação? Como posso suprimir esse aviso?
O NVCC é o compilador NVIDIA CUDA, acho que é baseado no LLVM. Por que ele dá esse aviso, quando os mesmos compilam bem com os compiladores GCC ou Visual C ++?
Solução
Uma alternativa portátil (possivelmente embrulhada em uma macro) seria algo como:
{
const bool error_message = true;
assert([...] && error_message);
}
Para esclarecer o que eu quis dizer:
#define myAssert(msg, exp) { const bool msg(true); assert(msg && (exp)); }
// usage:
myAssert(ouch, a && b);
... dá por exemplo:
ASSERTION "OUCH && (a && b)" falhou [...
Outras dicas
Eu encontrei esse problema exato e finalmente encontrei uma maneira de desativar os avisos no dispositivo. Aqui estão os detalhes...
Para desativar um aviso específico, você precisa usar a bandeira -xcudafe combinada com um token listado nesta página (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/ssl/opt/intel/cc/9.0/lib/locale/en_us/mcpcom.msg). Por exemplo, para desativar a "expressão controladora é um aviso constante", passe o seguinte ao NVCC:
-Xcudafe "---diag_suppress = boolean_controlling_expr_is_constant"
Isso funcionou para mim! Para outros avisos, consulte o link acima.
Adicione o seguinte em algum lugar próximo ao início do seu código:
#pragma diag_suppress boolean_controlling_expr_is_constant
Observe que isso suprimirá todos os avisos do compilador para "controlar a expressão é constante", não apenas o aviso associado às suas afirmações.
Às vezes, recebo esse aviso ao verificar constantes ou propriedades que são definidas (ou podem ser derivadas) no momento da compilação; portanto, na minha experiência, o aviso foi geralmente benigno e ok de ignorar.
Se for baseado em LLVM, você pode usar algo assim:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"
char b = 'df'; // no warning.
#pragma clang diagnostic pop
A partir de Controlando o diagnóstico via Pragmas.
Tentar #pragma warning
.