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

Posted

技术标签:

【中文标题】使用不匹配的选项“-arch=compute_20 -code=sm_20”为 GeForce 310(计算能力 1.2)编译 CUDA 程序【英文标题】:Compiling CUDA program for a GeForce 310 (compute capability 1.2) with unmatched options "-arch=compute_20 -code=sm_20" 【发布时间】:2013-03-30 02:44:39 【问题描述】:

我正在使用 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 #########################

所以,我想知道:

    为什么这个程序可以在带有 nvcc 选项 -arch=compute_20 -code=sm_20 的 GeForce 310 上运行,这些选项与显卡的计算能力 1.2 不匹配? 如果-arch 选项的值与-code 选项的值不同会怎样?

谢谢。

【问题讨论】:

【参考方案1】:

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

这就是你的情况。

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

NVCC 手册有更多信息,尤其是steering code generation 部分。

【讨论】:

你的回答和进一步的阅读如此清晰,让我恍然大悟!感谢你的温暖,你的帮助是对我最大的鼓励。 实际上,我认为我没有直接在答案中解决这个问题。为-arch=sm_20 编译的内核不应该在 cc 1.2 设备上运行,它应该在内核启动时抛出错误(你必须properly trap this type of error)。但是如果一个内核是为一个设备编译的,并且它在另一个设备上成功运行,这是由于 JIT 编译机制。

以上是关于使用不匹配的选项“-arch=compute_20 -code=sm_20”为 GeForce 310(计算能力 1.2)编译 CUDA 程序的主要内容,如果未能解决你的问题,请参考以下文章

无效的选项对象。已使用与 API 架构不匹配的选项对象初始化开发服务器

ValidationError:无效的选项对象。已使用与 API 架构不匹配的选项对象初始化开发中间件

Sass 加载程序错误:无效的选项对象。 Stylus Loader 已使用与 API 架构不匹配的选项对象进行初始化

FFmpeg命令使用setpts和atempo选项使音频和视频不匹配

Google chart api折线图:单位不匹配点

nginx location匹配规则