使用不匹配的选项“-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 架构不匹配的选项对象进行初始化