CUDA:为什么compute_35设备上的compute_20代码失败?

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

对于使用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 ${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!谢谢:)