2009-11-11 6 views
5

に一定の警告が、私はこのようにassert文に警告controlling expression is constantを取得された発現を制御する与える:CUDA:NVCCがアサート

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

なぜこのアサートでこの警告?どうすればこの警告を抑制できますか?

NVCCは、私はそれがLLVMに基づいていると思う、NVIDIAのCUDAコンパイラです。なぜGCCやVisual C++コンパイラでコンパイルできたらこの警告が出るのですか? Controlling Diagnostics via Pragmasから

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

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

#pragma clang diagnostic pop 

:それはLLVMベースとしている場合

+0

コンパイラはNVCC2.0の参照に応じてLinux上でGCCをデフォルトとすべきです。 –

+0

gcc(少なくとも3.4.4と4.3.2)は警告を出しません。おそらく、 '#ifdef __GNUC__' /' __GNUG__'を介してコンパイラを検証しようとしますか? –

+0

私は警告を再現することさえできません、そして、私はgccにその警告を抑制するためのフラグがありません。奇妙な。 –

答えて

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); 

は...などを提供します:

アサーション「痛い& &(& & b) "失敗[...]

0

は、その後、あなたはこのようなものを使用することができます。

0

試してみてください#pragma warning

1

私はこの正確な問題に遭遇し、最終的には、デバイス上の警告を無効にする方法を発見しました。ここに詳細があります...

特定の警告を無効にするには、このページに記載されているトークン(http://www.ssl.berkeley.edu/~jimm/grizzly_docs/SSL/opt/intel/cc/9.0/lib/locale/en_US/mcpcom.msg)と組み合わせて-Xcudafeフラグを使用する必要があります。たとえば、「発現を制御することは一定である」という警告を無効にするには、NVCCに以下のパス:

-Xcudafe「--diag_suppress = boolean_controlling_expr_is_constant」

は、これは私のために働きました!その他の警告については、上記のリンクを参照してください。

2

はあなたのコードの先頭近くのどこかに以下を追加します。これは、「発現を制御することは一定である」ために、すべてのコンパイラの警告、あなたのアサーションに関連付けられているだけではなく、警告を抑制することを

#pragma diag_suppress boolean_controlling_expr_is_constant 

注意を。

コンパイル時に定義されている(または派生することができます)定数やプロパティをチェックするとき、私の経験では、警告は無視して、一般的に良性とOKとなっているので、私は時々、この警告が表示されます。

+1

また 'の#pragma diag_warning boolean_controlling_expr_is_constant'バックに警告を変えることができます。しかし、これらの 'プラグマ'はデバイスコードに入れることはできません。彼らはCUDAのツールキットが公開されている限り完全に文書化されていないので、いつかは機能しなくなっても驚かないだろう。 – Sam

関連する問題