2014-05-13 48 views
3

例子:不能CUDA中使用常量

#include <cuda.h> 
#include <stdint.h> 
#include <assert.h> 

__constant__ int32_t m; 

int main(int argc, char* argv[]) 
{ 
    void* s; 
    int r = cudaGetSymbolAddress(&s, m); 
    assert(r == cudaSuccess); 
    return 0; 
} 

編譯:

$ nvcc test.cu -o test -arch compute_20 -code sm_20 

運行:

$ ./test 

得到:

test: test.cu:15: int main(int, char**): Assertion `r == cudaSuccess' failed. 
Aborted (core dumped) 

(如果日在兩個不同的計算機中,我在兩張不同的卡片上測試了這一點。 Cuda 6在這兩種情況下)。

有什麼不對?

+0

好吧,我會咬人的。你實際得到的錯誤是什麼,即'r'的價值是什麼?這個參數不應該是'&m'嗎? – Angew

+0

@Angew它應該可以同時工作....但是,我嘗試了你的建議。它也不起作用。錯誤是cudaErrorInvalidSymbol – dsign

+0

你測試過哪些GPU?如果代碼編譯的目標體系結構高於執行代碼的GPU,則會得到相同的錯誤。 – sgarizvi

回答

2

As @ sgar91指出,問題在於編譯目標與實際GPU不匹配。

具體而言:您的選項中有-code sm_20,這將使編譯器爲sm_20構建一個二進制文件,並且二進制文件中不會有PTX - 這意味着它不能爲您的設備進行JIT編譯(計算能力> 2.0)因此你的GPU操作將會失敗。您應該有-code compute_20或一個或多個-gencode參數(有關更多示例,請參閱nvcc manual)。

一些例子:

$ nvcc test.cu -o test -arch compute_20 -code compute_20 
$ nvcc test.cu -o test -gencode="arch=compute_20,code=\"compute_20,sm_20,sm_30\"" 
$ nvcc test.cu -o test -gencode="arch=compute_20,code=\"sm_20,sm_21\"" -gencode="arch=compute_30,code=\"compute_30,sm_30\"" 

而不是你的CUDA API調用做一個斷言,您應該報告的實際錯誤,因爲這將是有幫助這裏。

+1

謝謝湯姆的幫助!這看起來確實很有趣!順便說一句,你爲一家很棒的公司工作。 – dsign