使用不匹配的选项“-arch = compute_20 -code = sm_20”为GeForce 310(计算能力1.2)编译CUDA程序

时间:2013-03-30 02:44:40

标签: cuda gpu nvcc

我正在使用nvcc使用选项-arch=20 -code=20为具有计算能力1.2的GeForce 310 GPU编译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 #########################

所以,我想知道:

  1. 为什么这个程序可以在GeForce 310上运行,nvcc选项-arch=compute_20 -code=sm_20与卡的计算能力1.2不匹配?
  2. 如果-arch选项的值与-code选项的值不同,会发生什么情况?
  3. 感谢。

1 个答案:

答案 0 :(得分:3)

CUDA可执行文件通常包含两种类型的程序数据:SASS代码,基本上是GPU机器代码,PTX是一个中间代码(尽管它非常接近机器代码)。只要可执行文件中存在PTX代码,如果驱动程序确定代码将实际运行的GPU没有正确的SASS二进制文件,它将执行" JIT-compile&# 34;在应用程序启动时,使用应用程序包中的PTX代码创建适用于相关设备的必要二进制代码。

这就是你的情况。

如果是arch!=代码,那么您将创建在架构上符合arch类型的设备代码,但编译为使用与代码类型相关联的机器级指令。例如,如果我编译arch = 1.2和code = 2.0,我就不能使用double类型(它们将被降级为float,因为1.2架构中不支持double但是生成的SASS机器代码可以在cc 2.0设备上执行,并且不需要为这种设备执行JIT编译步骤。

NVCC手册提供了更多信息,尤其是关于steering code generation的部分。