为GeForce 310(计算能力1.2)编译CUDA程序,选项不匹配-arch=compute_20-代码=sm_20“;
我正在为具有1.2计算能力的GeForce 310 GPU使用带有选项的为GeForce 310(计算能力1.2)编译CUDA程序,选项不匹配-arch=compute_20-代码=sm_20“;,cuda,gpu,nvcc,Cuda,Gpu,Nvcc,我正在为具有1.2计算能力的GeForce 310 GPU使用带有选项的nvcc编译一个CUDA程序。程序似乎正常运行,如下所示 wangli@wangli-desktop:~/wangliC2050/1D-EncodeV6.1$ make nvcc -O --ptxas-options=-v 1D-EncodeV6.1.cu -o 1D-EncodeV6.1 -I../../NVIDIA_GPU_Computing_SDK/C/common/inc -I../../NVIDIA_GPU_Com
nvcc
编译一个CUDA程序。程序似乎正常运行,如下所示
wangli@wangli-desktop:~/wangliC2050/1D-EncodeV6.1$ make
nvcc -O --ptxas-options=-v 1D-EncodeV6.1.cu -o 1D-EncodeV6.1 -I../../NVIDIA_GPU_Computing_SDK/C/common/inc -I../../NVIDIA_GPU_Computing_SDK/shared/inc -arch=compute_20 -code=sm_20
ptxas info : Compiling entry function '_Z6EncodePhPjS0_S_S_' for 'sm_20'
ptxas info : Function properties for _Z6EncodePhPjS0_S_S_
0 bytes stack frame, 0 bytes spill stores, 0 bytes spill loads
ptxas info : Used 14 registers, 52 bytes cmem[0]
wangli@wangli-desktop:~/wangliC2050/1D-EncodeV6.1$ ./1D-EncodeV6.1
########################### Encoding start (loopCount=10)#######################
#p n size averageTime(s) averageThroughput(MB/s) errorRate(0~1)
#================= Encode on GPU v6.1 ===============
4 4 4 0.000294 0.051837 100.000000
#################### Encoding stop #########################
所以,我想知道:
nvcc
选项-arch=compute\u 20-code=sm\u 20
与卡的计算能力1.2不匹配-arch
选项的值与-code
选项的值不同,会发生什么情况谢谢。CUDA可执行文件通常包含两种类型的程序数据:基本上是GPU机器代码的SASS代码和中间代码(尽管它与机器代码非常接近)。只要可执行文件中存在PTX代码,那么如果驱动程序确定GPU无法使用正确的SASS二进制文件来实际运行该代码,它将在应用程序启动时执行“”步骤,使用应用程序包中的PTX代码创建适用于相关设备的必要二进制代码 这就是你的情况 如果拱门!=代码,然后您创建的设备代码在体系结构上符合arch类型,但编译为使用与代码类型关联的机器级指令。例如,如果我为arch=1.2和code=2.0编译,我不能使用
double
类型(它们将降级为float
,因为double
在1.2体系结构中不受支持),但生成的SASS机器代码将准备在cc 2.0设备上执行,对于这种设备,不需要JIT编译步骤
NVCC手册中有更多的信息,特别是关于的部分。您的答案和进一步的阅读非常清楚,我突然明白了!谢谢你的热情,你的帮助将是对我最大的鼓励。事实上,我不认为我在回答中直接提到了这一点。为
-arch=sm_20
编译的内核不应该在cc 1.2设备上运行,它应该在内核启动时抛出错误(您必须这样做)。但是,如果内核是为一个设备编译的,并且它成功地在另一个设备上运行,这是由于JIT编译机制。