cuda-1(兼容性)

cuda程序兼容性问题

先了解cuda程序编译的流程:先从C/C++代码编译为PTX,再从PTX编译为cudin代码

  • C/C++源码转化为PTX这一步骤与硬件无关

  • PTX指令转化为二进制cubin代码与具体的GPU架构有关

指定虚拟架构计算能力

  • C/C++源码编译为PTX时,可以指定虚拟架构的计算能力,用于确定代码中可以使用的CUDA功能
  • 编译指令(指定虚拟架构计算能力):
1
-arch-compute_XY

XY:第一个数字X代表计算能力的主版本号,第二个数字Y代表计算能力的次版本号

  • PTX的指令只能在更高的计算能力的GPU使用

例如假设我们cuda显卡的计算能力为6.2:

1
2
test.cu -o test61 -arch-compute_61
test.cu -o test61 -arch-compute_70

这样·生成的test61文件是可以正常执行的,但是test70就不能正常运行

​ 如果能知道显卡的真实计算能力,那么最好就设置显卡的虚拟机算能力为真实计算能力

指定真实架构的计算能力

  • 编译指令(指定真实架构计算能力):
1
-code=sm_XY

​ sm代表流式多处理器架构(Streaming Multiprocessor, SM),XY的含义同上

注意:

  1. 对于二进制cubin代码,大版本之间是不兼容的!
  2. 指定真实架构计算能力必须大于虚拟架构计算能力
  3. 指定真实架构计算能力的时候必须指定虚拟架构的计算能力

指定多GPU版本编译

​ 为了能够使可执行文件能够在多GPU上运行,我们可以同时指定多种GPU版本进行编译

编译选项-gencode arch=computeXY-code=sm_XY
例如:

1
2
3
4
-gencode=arch=compute_35,code=sm_35
-gencode=arch=compute_50,code=sm_50
-gencode=arch=compute_60,code=sm_60
-gencode=arch=compute_70,code=sm_70

开普勒架构麦克斯韦架构帕斯卡架构伏特架构编译出的可执行文件包含4个二进制版本,生成的可执行文件称为胖二进制文件(fatbinary)

注意:

  1. 执行上述指令必须CUDA版本支持7.0计算能力,否则会报错
  2. 过多指定计算能力,会增加编译时间和可执行文件的大小

nvcc即时编译

不管