2016-06-07 64 views
0
#define cuset(symbol, T, val) 
{ 
    void *cuset_addr; 
    cucheck(cudaGetSymbolAddress(&cuset_addr, symbol)); 
    T cuset_val=(val); 
    cucheck(cudaMemcpy(cuset_addr, &cuset_val, sizeof(cuset_val),cudaMemcpyHostToDevice)) 
} 

當我編譯並運行該項目,它提出一個錯誤:https://github.com/canonizer/halloc無效的設備符號

中的自述:

invalid device symbol in cudaGetSymbolAddress(&cuset_addr, random_states_g).

我從下載項目項目目前這樣:

Note: libraries and tests are currently not compiled for compute_50/sm_50, i.e. Maxwell.

我的環境是:Ubuntu14.04,cuda7.5, capability5.0

的編譯,因爲這:

nvcc -gencode arch=compute_20,code=sm_20 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 -lineinfo -O3 -lib -rdc=true -Xptxas -dlcm=cg -Xptxas -dscm=wb \ 
    -Xptxas -maxrregcount=64 -o bin/libhalloc.a src/*.cu 

,我不知道是否是因爲我CUDA的版本,當我搜索的錯誤,我發現它似乎有一些符號,它是從5.0中刪除。

回答

2

makefile,改變這種:

ARCH= -gencode arch=compute_20,code=sm_20 \ 
    -gencode arch=compute_30,code=sm_30 \ 
    -gencode arch=compute_35,code=sm_35 

這樣:

ARCH= -gencode arch=compute_20,code=sm_20 \ 
    -gencode arch=compute_30,code=sm_30 \ 
    -gencode arch=compute_35,code=compute_35 \ 
    -gencode arch=compute_35,code=sm_35 

和重建項目。

這裏的基本問題是,該項目編譯選項被設置爲包括裝置代碼(SASS)僅被包括即沒有選項來生成PTX。只有設備代碼爲sm_20sm_30sm_35,沒有爲您的設備生成設備代碼的選項,因此您的設備沒有可加載模塊。

通常情況下,這種錯誤可能會顯示爲「無效設備功能」的錯誤,當您嘗試運行的內核。但是,如果第一個活動正在訪問設備符號,則這些符號也無效,因爲設備上沒有加載適當的圖像,所以在這種情況下您將得到此特定錯誤。

通過包含一個以code=compute_35結尾的編譯選項,我們指示CUDA編譯器也爲您的項目包含一個PTX模塊,PTX可以在運行時進行前向JIT編譯以匹配您運行的任何新設備。

這不是修改編譯操作與您的設備正常工作的唯一可能的方式,但它是一個可行的方法通常會帶有各種設備的向前兼容。

+0

謝謝,這真的很有幫助,並解決了我的問題。 – shrimp