#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))
}
当我编译并运行项目时,它会出现错误:
cudaGetSymbolAddress中的设备符号无效(& cuset_addr, random_states_g)。
我从https://github.com/canonizer/halloc
下载项目项目中的自述文件提出了这一点:
注意:目前尚未编译库和测试 compute_50 / sm_50,即麦克斯韦。
我的环境是: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中删除。
答案 0 :(得分:2)
在 <system.web>
<customErrors mode="On" defaultRedirect="~/Error">
<error redirect="~/Error/NotFound" statusCode="404" />
</customErrors>
</system.web>
中,更改此内容:
makefile
到此:
ARCH= -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35
并重建项目。
这里的根本问题是项目编译选项被设置为仅包括设备代码(SASS),即不包括生成PTX的选项。仅使用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
,sm_20
和sm_30
的设备代码,您无法为sm_35
设备生成设备代码,因此您的设备无法加载模块
通常,当您尝试运行内核时,此类错误可能会显示为“无效的设备函数”错误。但是,如果第一个活动是访问设备符号,那么这些符号也无效,因为设备上没有加载正确的图像,所以在这种情况下你会得到这个特殊的错误。
通过包含以sm_50
结尾的编译选项,我们指示CUDA编译器还为您的项目包含一个PTX模块,并且PTX可以在运行时进行前向JIT编译,以匹配您所使用的任何新设备跑着。
这不是修改编译操作以使用您的设备的唯一可行方法,但这是一种可能的方法,通常与一系列设备向前兼容。