2016-06-07 65 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