2009-11-11 1 views
5
утверждают

я получаю предупреждение controlling expression is constant на Assert заявление так:CUDA: NVCC дает контроль выражение является постоянным предупреждением о

assert(... && "error message"); 

Почему это предупреждение об этом утверждают? Как я могу подавить это предупреждение?

NVCC - это компилятор NVIDIA cuda, я думаю, что он основан на LLVM. Почему он дает это предупреждение, когда одни и те же компилируются с компиляторами GCC или Visual C++?

+0

Компилятор должен по умолчанию использовать gcc на linux в соответствии с ссылкой NVCC2.0. –

+0

И gcc (не менее 3.4.4 и 4.3.2) не дает таких предупреждений. Возможно, попробуйте проверить компилятор с помощью '#ifdef __GNUC__' /' __GNUG__'? –

+0

Я даже не могу воспроизвести предупреждение, и у меня нет gcc никаких флагов для подавления этого предупреждения. Weird. –

ответ

3

Портативное альтернатива (возможно, завернутые в макро) будет что-то вроде:

{ 
    const bool error_message = true; 
    assert([...] && error_message); 
} 

Чтобы выяснить, что я имел в виду:

#define myAssert(msg, exp) { const bool msg(true); assert(msg && (exp)); } 
// usage: 
myAssert(ouch, a && b); 

... дает, например:

утверждение "ouch & & (a & & b) "не удалось [...]

0

Если он основан LLVM, то вы можете использовать что-то вроде этого:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wmultichar" 

char b = 'df'; // no warning. 

#pragma clang diagnostic pop 

От Controlling Diagnostics via Pragmas.

1

Я столкнулся с этой проблемой и, наконец, нашел способ отключить предупреждения на устройстве. Вот подробности ...

Чтобы отключить определенное предупреждение, вам необходимо использовать флаг -Xcudafe в сочетании с токеном, указанным на этой странице (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg). Например, чтобы отключить предупреждение «контроль выражение является постоянным», передать следующее NVCC:

-Xcudafe «--diag_suppress = boolean_controlling_expr_is_constant»

Это работает для меня! Другие предупреждения см. В приведенной выше ссылке.

2

Добавьте следующее где-то ближе к началу кода:

#pragma diag_suppress boolean_controlling_expr_is_constant 

Обрати внимание, что это будет подавлять все предупреждения компилятора для «управление выражением является постоянным», а не только предупреждением, связанное с вашими утверждениями.

Иногда я получаю это предупреждение при проверке констант или свойств, которые определены (или могут быть получены) во время компиляции, поэтому, по моему опыту, предупреждение было обычно доброкачественным и нормально игнорировать.

+1

Вы также можете включить предупреждение с помощью '#pragma diag_warning boolean_controlling_expr_is_constant'. Однако эти «прагмы» не могут быть в коде устройства.Они также полностью недокументированы в отношении инструментария CUDA, поэтому я не удивлюсь, если они однажды перестанут функционировать ... – Sam