如何通过#define 在编译时获得 CUDA 计算能力(版本)?例如,如果我使用 __ballot 并编译
nvcc -c -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_13,code=sm_13
source.cu
我可以通过#define 在我的代码中获得计算能力的版本,以便选择带有 __ballot 和不带 __ballot 的代码分支吗?
是的。首先,最好了解使用-gencode
. NVCC 将多次编译您的输入设备代码,每个设备目标架构一次。因此,在您的示例中,NVCC 将为compute_20 运行编译阶段1,为compute_13 运行一次。
当 nvcc 编译一个 .cu 文件时,它定义了两个预处理器宏,__CUDACC__
和__CUDA_ARCH__
. __CUDACC__
没有值,如果 cudacc 是编译器,则仅定义它,如果不是,则不定义。
__CUDA_ARCH__
定义为一个整数值,表示正在编译的 SM 版本。
等引用 CUDA 工具包中包含的 NVCC 文档:
在
__CUDA_ARCH__
为.xy0
_compute_xy
该宏可用于 GPU 函数的实现,以确定当前正在为其编译的虚拟架构。主机代码(非 GPU 代码)不能依赖它。
所以,在你想使用的情况下__ballot()
,你可以这样做:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif