2009-11-11 82 views
5

不斷警告我得到警告controlling expression is constant上斷言語句是這樣的:CUDA:NVCC給出控制表達式上斷言

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

爲什麼這個斷言此警告?我怎樣才能壓制這個警告?

NVCC是NVIDIA cuda編譯器,我認爲它是基於LLVM的。爲什麼它會在GCC或Visual C++編譯器編譯時出現此警告?

+0

根據NVCC2.0參考,編譯器應該默認爲linux上的gcc。 – 2009-11-11 03:38:18

+0

而gcc(至少3.4.4和4.3.2)不會給出這樣的警告。也許嘗試通過'#ifdef __GNUC__' /'__GNUG__'驗證編譯器? – 2009-11-11 04:05:59

+0

我什至不能重現警告,我不gcc有任何標誌來壓制這種警告。奇怪的。 – 2009-11-12 00:25:12

回答

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'重新開啓警告。但是,這些'pragma'不能在設備代碼中。就CUDA工具包而言,它們也完全沒有文檔,所以如果它們有一天停止運行,我不會感到驚訝。 – Sam 2015-09-24 16:22:51