前言
在 CUDA 编程中,确保代码能够在不同的 NVIDIA GPU 上高效运行是非常重要的。为了实现这一点,CUDA 编译器 (nvcc
) 提供了多种配置选项,其中 compute_XX
和 sm_XX
是两个关键的编译选项。本文将深入探讨这两个选项的作用及其配置顺序,帮助更好地理解和使用这些设置。
什么是 compute_XX
和 sm_XX
?
compute_XX
compute_XX
选项用于指定你希望生成的代码支持的 CUDA 计算能力版本。CUDA 计算能力(compute capability)是用来描述 GPU 硬件特性的指标。例如,compute_61
表示计算能力为 6.1 的 GPU。计算能力决定了 GPU 支持哪些特性和指令集。
生成的代码在编译时会被转化为 PTX(Parallel Thread Execution)代码。PTX 是一种中间代码,可以在不同的 GPU 上执行。指定 compute_XX
选项是为了确保生成的 PTX 代码能被所有支持该计算能力及更高计算能力的 GPU 设备执行。
sm_XX
sm_XX
选项用于指定你希望生成的代码是针对特定 GPU 架构的机器代码。这里的 sm
代表“流式多处理器”(Streaming Multiprocessor),sm_XX
表示特定 GPU 架构。例如,sm_61
表示针对计算能力 6.1 的 GPU 架构优化的机器代码。
生成的机器代码是针对特定 GPU 架构进行优化的,能更有效地利用该架构的特性,从而提升执行性能。如果你希望代码在特定的 GPU 上运行得更快,应该使用 sm_XX
来生成针对该架构的优化代码。
如何配置 compute_XX
和 sm_XX
?
在使用 nvcc
编译 CUDA 程序时,可以通过 -gencode
标志来同时指定多个 compute_XX
和 sm_XX
配置。例如,假设想支持rtx3080 或者 P600的显卡,找到对应的计算配置
Your GPU Compute Capability ,
生成支持计算能力 6.1 和 8.6 的代码,可以使用如下命令:
nvcc -gencode arch=compute_61,code=sm_61 -gencode arch=compute_86,code=sm_86 my_program.cu
在这个命令中,nvcc
会生成两个版本的代码:
- 针对计算能力 6.1 的 PTX 代码,以及对应的
sm_61
架构优化的机器代码。 - 针对计算能力 8.6 的 PTX 代码,以及对应的
sm_86
架构优化的机器代码。
配置的优先级和顺序
在 nvcc
命令中,compute_XX
和 sm_XX
的顺序并不影响编译过程的实际效果。nvcc
会生成所有指定配置的代码。为了确保代码能够在较旧的或不明确指定的 GPU 上运行,通常建议按从较旧到较新的顺序排列这些配置。
为什么这些配置重要?
正确配置 compute_XX
和 sm_XX
对于充分利用 GPU 硬件性能至关重要。通过为不同 GPU 架构生成优化的机器代码,可以确保代码在各种设备上都有良好的执行性能。同时,生成 PTX 代码可以保证代码在较旧的设备上也能运行,从而提高程序的兼容性。