技术开发 频道

CUDA 3.0 编程接口

  3.1.2 二进制兼容性

  二进制代码是由架构确定的。生成cubin对象时,使用编译器选项-code指定目标架构:例如,用-code=sm_13编译时,为计算能力1.3的设备生成二进制代码 。二进制兼容性保证向后兼容,但不保证向前兼容,也不保证跨越主修订号兼容。换句话说,为计算能力为X.y生成的cubin对象只能保证在计算能力为X.z的设备上执行,这里,z>=y。

  3.1.3 PTX兼容性

  一些PTX指令只被高计算能力的设备支持。例如,全局存储器上的原子指令只在计算能力1.1及以上的设备上支持;双精度指令只在1.3及以上的设备上支持。将C编译成PTX代码时,-arch编译器选项指定假定的计算能力。因此包含双精度计算的代码,必须使用“-arch=sm_13”(或更高计算能力)编译,否则双精度计算将被降级为单精度计算。

  为某些特殊计算能力生成的PTX代码始终能够被编译成相等或更高计算能力设备上的二进制代码。

  3.1.4 应用兼容性

  为了在特定计算能力的设备上执行代码,应用加载的二进制或PTX代码必须满足如3.1.2节和3.1.3节说明的计算能力兼容性。特别地,为了能在将来更高计算能力(不能产生二进制代码)的架构上执行,应用必须装载PTX代码并为那些设备即时编译。

  CUDA C应用中嵌入的PTX和二进制代码,由-arch和-code编译器选项或-gencode编译器选项控制,详见nvcc用户手册。例如

nvcc x.cu
–gencode arch
=compute_10,code=sm_10
–gencode arch
=compute_11,code=\’compute_11,sm_11\’

  嵌入与计算能力1.0兼容的二进制代码(第一个-gencode选项)和PTX和与计算能力1.1兼容的二进制代码(第二个-gencode选项)。

  生成的主机代码在运行时自动选择最合适的代码装载并执行,对于上面例子,将会是:

  1.0二进制代码为计算能力1.0设备,

  1.1二进制代码为计算能力1.1,1.2,1.3的设备,

  通过为计算能力2.0或更高的设备编译1.1PTX代码获得的二进制代码。

  例如,x.cu可有一个使用原子指令的优化代码途径,只能支持计算能力1.1或更高的设备。__CUDA_ARCH__宏可以基于计算能力用于不同的代码途径。它只为设备代码定义。例如,当使用“arch=compte_11”编译时,__CUDA_ARCH__等于110。

  使用驱动API的应用必须将代码编译成分立的文件,且在运行时显式装载和执行最合适的文件。

  nvcc用户手册为-arch,-code和-gencode编译器选项列出了多种简写。如“arch=sm_13”是“arch=compute_13 ?code=compute_13,sm_13”的简写(等价于“-gencode arch=compute_13,code=\’compute_13,sm_13\’”)。

0
相关文章