CUDA:为什么compute_35设备上的compute_20代码失败?
对于使用Titan GPU(CUDA:为什么compute_35设备上的compute_20代码失败?,cuda,cmake,Cuda,Cmake,对于使用Titan GPU(compute\u 35,sm\u 35)的计算机,我在CMakeLists.txt中使用这行代码编译了一些代码: set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_35,code=sm_35) 代码编译后运行良好 我想检查一下这段代码会给一个使用GTS450(compute\u20,sm\u21)的朋友带来什么编译问题。因此,我将上述行更改为: set(CUDA_NVCC_FLAGS ${CU
compute\u 35,sm\u 35
)的计算机,我在CMakeLists.txt
中使用这行代码编译了一些代码:
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_35,code=sm_35)
代码编译后运行良好
我想检查一下这段代码会给一个使用GTS450(compute\u20,sm\u21
)的朋友带来什么编译问题。因此,我将上述行更改为:
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_20,code=sm_21)
代码在我使用Titan的计算机上编译时没有任何错误。但是,当我运行它(再次在我的Titan计算机上运行)时,它在一个asch::copy
调用后失败,错误如下:
$ ./foobar
terminate called after throwing an instance of 'thrust::system::system_error'
what(): invalid device function
"foobar" terminated by signal SIGABRT (Abort)
谷歌表示,上述错误是由于GPU架构不匹配造成的
最奇怪的是,在上面这一行(arch=compute_20,code=sm_21
)中,代码在我朋友的GTS 450计算机上编译和运行时没有错误!除了GPU,她的Ubuntu 12.04、gcc和CUDA SDK 5.5版本与我的相同
这是这个错误的真正原因吗?为什么Titan不能运行compute\u20
code?CUDA GPU不应该与PTX或SASS代码向后兼容吗?即使不是,为什么驱动程序不能将compute\u 20
PTX编译为sm\u 35
的SASS?如果您指定:
-gencode arch=compute_20,code=compute_20
您的代码应该(通过JIT)在任一GPU上运行
根据,当您为code
开关指定虚拟体系结构时,会直接启用JIT。您可以在一个命令中创建多个规范:
-arch=compute_20 -code=compute20,sm_21,sm_35
(注意,这代替了指定-gencode…
)
这将允许来自sm_20 PTX的JIT,以及直接在cc2.1或cc3.5设备上的非JIT执行。我没有意识到compute_xx可以传递给-code!谢谢:)