2009-11-11 5 views
5

Ich erhalte die Warnung controlling expression is constant auf assert-Anweisung wie folgt aus:CUDA: NVCC Ausdruck bringt Steuerung konstant Warnung auf assert

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

Warum diese Warnung auf dieser assert? Wie kann ich diese Warnung unterdrücken?

NVCC ist der NVIDIA Cuda Compiler, ich denke, dass es auf LLVM basiert. Warum gibt es diese Warnung, wenn die gleiche Kompilierung mit GCC oder Visual C++ - Compiler durchgeführt wird?

+0

Compiler sollte standardmäßig auf GCC auf Linux gemäß der NVCC2.0-Referenz. –

+0

Und GCC (mindestens 3.4.4 und 4.3.2) gibt solche Warnungen nicht. Vielleicht versuchen Sie den Compiler über '#ifdef __GNUC__' /' __GNUG__' zu verifizieren? –

+0

Ich kann nicht einmal die Warnung reproduzieren und ich gcc hat keine Flags zur Unterdrückung dieser Warnung. Seltsam. –

Antwort

3

Eine tragbare Alternative (möglicherweise in einem Makro verpackt) wäre so etwas wie sein

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

... gibt zB:

Behauptung "autsch & & (ein & & b) "Fehler [...]

0

Wenn es LLVM basiert, dann kann man so etwas wie folgt verwenden:

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

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

#pragma clang diagnostic pop 

Von Controlling Diagnostics via Pragmas.

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

Zur Klärung, was ich meinte:

1

Ich stieß auf genau dieses Problem und fand schließlich eine Möglichkeit, Warnungen auf dem Gerät zu deaktivieren. Hier sind die Details ...

Um eine bestimmte Warnung zu deaktivieren, müssen Sie das Flag -Xcudafe kombiniert mit einem Token auf dieser Seite (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg) verwenden. Um zum Beispiel die deaktivieren „Ausdruck Steuerung konstant“ Warnung, passieren folgendes NVCC:

-Xcudafe „--diag_suppress = boolean_controlling_expr_is_constant“

Das funktionierte für mich! Weitere Warnungen finden Sie unter dem obigen Link.

2

folgend irgendwo am Anfang des Codes hinzufügen:

#pragma diag_suppress boolean_controlling_expr_is_constant 

Beachten Sie, dass diese alle Compiler-Warnungen unterdrücken für „Kontrolle der Expression konstant“, nicht nur die Warnung mit Ihren Behauptungen verbunden.

Ich erhalte manchmal diese Warnung, wenn ich Konstanten oder Eigenschaften überprüfe, die zur Kompilierzeit definiert (oder abgeleitet) werden können. Daher war die Warnung meiner Erfahrung nach generell gutartig und OK zu ignorieren.

+1

Sie können die Warnung auch mit '#pragma diag_warning boolean_controlling_expr_is_constant' wieder einschalten. Diese 'Pragma's können jedoch nicht im Gerätecode enthalten sein.Sie sind auch völlig undokumentiert, soweit das CUDA-Toolkit geht, also wäre ich nicht überrascht, wenn sie eines Tages nicht mehr funktionieren würden ... – Sam