为GeForce 310(计算能力1.2)编译CUDA程序,选项不匹配-arch=compute_20-代码=sm_20“;

为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

我正在为具有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_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 #########################
所以,我想知道:

  • 为什么该程序可以在GeForce 310上运行,而该GeForce 310的
    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编译机制。