如何通过#define在编译时获得CUDA Compute功能(版本)? 例如,如果我使用__ballot并使用
进行编译nvcc -c -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_13,code=sm_13
source.cu
我可以通过#define在我的代码中获得计算能力的版本,以便选择带有__ballot的代码分支吗?
答案 0 :(得分:15)
是。首先,最好了解使用-gencode
时会发生什么。 NVCC将多次编译您的输入设备代码,每个设备目标架构一次。因此,在您的示例中,NVCC将为compute_20运行一次编译阶段1,对于compute_13运行一次。
当nvcc编译.cu文件时,它定义了两个预处理器宏__CUDACC__
和__CUDA_ARCH__
。 __CUDACC__
没有值,如果cudacc是编译器,则简单定义,如果不是,则定义。
__CUDA_ARCH__
被定义为表示正在编译的SM版本的整数值。
等。引用CUDA工具包中包含的NVCC文档:
在为
__CUDA_ARCH__
编译的每个nvcc编译阶段1期间,为体系结构标识宏xy0
分配一个三位数值字符串compute_xy
(以文字0结尾)。该宏可用于GPU功能的实现,以确定当前正在编译的虚拟体系结构。主机代码(非GPU代码)不得依赖它。
因此,在您要使用__ballot()
的情况下,您可以执行此操作:
....
#if __CUDA_ARCH__ >= 200
int b = __ballot();
int p = popc(b & lanemask);
#else
// do something else for earlier architectures
#endif