能否在编译时通过 #define 获取 CUDA 计算能力(版本)?

6

我如何通过#define在编译时获取CUDA计算能力(版本)? 例如,如果我使用__ballot并进行编译

nvcc -c -gencode arch=compute_20,code=sm_20  \
        -gencode arch=compute_13,code=sm_13
        source.cu

我能不能在我的代码中使用 #define 来获取计算能力版本,在有 __ballot 和没有 __ballot 的代码分支中进行选择?

1个回答

16

可以的。首先,最好了解在使用-gencode时会发生什么。NVCC将为每个设备目标架构编译您的输入设备代码多次。因此,在您的示例中,NVCC将为compute_20和compute_13分别运行编译阶段1一次。

当nvcc编译.cu文件时,它定义了两个预处理器宏:__CUDACC____CUDA_ARCH____CUDACC__没有值,如果cudacc是编译器,则仅定义,并且如果不是,则未定义。

__CUDA_ARCH__被定义为表示正在编译的SM版本的整数值。

  • 100 = compute_10
  • 110 = compute_11
  • 200 = compute_20

等等。引用CUDA Toolkit附带的NVCC文档:

在每个编译为compute_xy的nvcc编译阶段1期间,架构识别宏__CUDA_ARCH__被分配一个三位数字值字符串xy0(以文字0结尾)。该宏可用于实现GPU函数,以确定当前正在编译的虚拟架构。主机代码(非GPU代码)不得依赖它。

因此,在您希望使用__ballot()的情况下,可以这样做:

....
#if __CUDA_ARCH__ >= 200
    int b = __ballot();
    int p = popc(b & lanemask);
#else
    // do something else for earlier architectures
#endif

非常感谢!它起作用了 :) 那么CUDA_VERSION是什么意思?它是否等于CUDA工具包的版本号? - Alex
2
是的,请参见此处的示例。实际上,它是主版本乘以1000加上次版本乘以10,因此4.2-->4020。 - harrism

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接