2009-11-11 2 views
5

je reçois l'avertissement controlling expression is constant sur instruction assert comme ceci:CUDA: FPUNV donne contrôle de l'expression est un avertissement constant sur assert

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

Pourquoi cet avertissement sur cette assertion? Comment puis-je supprimer cet avertissement?

NVCC est le compilateur NVIDIA cuda, je pense qu'il est basé sur LLVM. Pourquoi cela donne-t-il cet avertissement, quand même compile bien avec les compilateurs GCC ou Visual C++?

+0

Le compilateur devrait par défaut être gcc sur linux selon la référence NVCC2.0. –

+0

Et gcc (au moins 3.4.4 et 4.3.2) ne donne pas de tels avertissements. Peut-être essayer de vérifier le compilateur via '#ifdef __GNUC__' /' __GNUG__'? –

+0

Je ne peux même pas reproduire l'avertissement et je ne gcc aucun drapeau pour supprimer cet avertissement. Bizarre. –

Répondre

3

Une alternative portable (peut-être enveloppé dans une macro) serait quelque chose comme:

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

Pour éclaircir ce que je voulais dire:

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

... donne par exemple:

assertion "ouch & & (un & & b) » a échoué [...]

0

Si elle est basée LLVM, vous pouvez utiliser quelque chose comme ceci:

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

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

#pragma clang diagnostic pop 

De Controlling Diagnostics via Pragmas.

1

J'ai rencontré ce problème et j'ai finalement trouvé un moyen de désactiver les avertissements sur le périphérique. Voici les détails ...

Pour désactiver un avertissement spécifique, vous devez utiliser l'indicateur -Xcudafe associé à un jeton répertorié sur cette page (http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg). Par exemple, pour désactiver l'avertissement « contrôle de l'expression est constante », passer ce qui suit à FPUNV:

-Xcudafe « --diag_suppress = boolean_controlling_expr_is_constant »

Cela a fonctionné pour moi! Pour les autres avertissements, voir le lien ci-dessus.

2

Ajoutez ce qui suit quelque part près du début de votre code:

#pragma diag_suppress boolean_controlling_expr_is_constant 

Notez que ce supprimera tous les avertissements du compilateur pour « contrôle de l'expression est constante », non seulement l'avertissement associé à vos affirmations.

Je reçois parfois cet avertissement lors de la vérification des constantes ou propriétés qui sont définies (ou peuvent être dérivées) au moment de la compilation, donc dans mon expérience l'avertissement a été généralement bénin et OK à ignorer.

+1

Vous pouvez également réactiver l'avertissement avec '#pragma diag_warning boolean_controlling_expr_is_constant'. Cependant, ces 'pragma's ne peuvent pas être dans le code de l'appareil.Ils sont également complètement non documentés en ce qui concerne la boîte à outils CUDA, donc je ne serais pas surpris s'ils cessaient un jour de fonctionner ... – Sam