2009-11-11 9 views
5

otrzymuję ostrzeżenie controlling expression is constant na rachunku assert tak:CUDA: nvcc daje kontrolowania ekspresji jest stały ostrzegawczy na assert

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

Dlaczego to ostrzeżenie na tej dochodzić? Jak mogę wyłączyć to ostrzeżenie?

NVCC to kompilator NVIDIA, myślę, że jest oparty na LLVM. Dlaczego daje to ostrzeżenie, gdy samo kompiluje się dobrze z kompilatorami GCC lub Visual C++?

+0

Kompilator powinien domyślnie gcc na Linuksie zgodnie z referencją NVCC2.0. –

+0

I gcc (przynajmniej 3.4.4 i 4.3.2) nie daje takich ostrzeżeń. Może spróbuj zweryfikować kompilator za pomocą '#ifdef __GNUC__' /' __GNUG__'? –

+0

Nie mogę nawet odtworzyć ostrzeżenia, a gcc nie ma żadnych flag do tłumienia tego ostrzeżenia. Dziwne. –

Odpowiedz

3

Przenośna alternatywa (ewentualnie zawinięte w makro) byłoby coś jak:

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

Aby wyjaśnić, co mam na myśli:

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

... daje np

asercja "ouch & & (a & & b) "nie powiodło się [...]

0

Jeśli jest ona oparta LLVM, a następnie można użyć coś takiego:

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

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

#pragma clang diagnostic pop 

Od Controlling Diagnostics via Pragmas.

1

Wpadłem na ten problem i w końcu znalazłem sposób na wyłączenie ostrzeżeń na urządzeniu. Oto szczegóły ...

Aby wyłączyć określone ostrzeżenie, należy użyć flagi -Xcudafe w połączeniu z tokenem wymienionym na tej stronie (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg). Na przykład, aby wyłączyć „kontrolowania ekspresji jest stały” ostrzeżenie, przechodzą do nvcc następujące:

-Xcudafe „--diag_suppress = boolean_controlling_expr_is_constant”

Ten pracował dla mnie! Inne ostrzeżenia znajdują się w powyższym łączu.

2

Dodaj poniższe gdzieś w okolicach początku kodu:

#pragma diag_suppress boolean_controlling_expr_is_constant 

pamiętać, że będzie tłumić wszystkie ostrzeżenia kompilatora dla „kontrolowania ekspresji jest stały”, a nie tylko ostrzeżenie związane ze swoimi twierdzeń.

Czasami otrzymuję to ostrzeżenie podczas sprawdzania stałych lub właściwości, które są zdefiniowane (lub mogą być wyprowadzone) w czasie kompilacji, więc z mojego doświadczenia wynika, że ​​ostrzeżenie było ogólnie łagodne i OK, aby je zignorować.

+1

Możesz również ponownie włączyć ostrzeżenie za pomocą '#pragma diag_warning boolean_controlling_expr_is_constant'. Jednak te "pragma" nie mogą znajdować się w kodzie urządzenia.Są również całkowicie nieudokumentowane, jeśli chodzi o zestaw narzędzi CUDA, więc nie zdziwiłbym się, gdyby któregoś dnia przestały działać ... – Sam