我可以通过#define在编译时获得CUDA Compute功能(版本)吗?

时间:2012-10-02 22:39:37

标签: cuda gpgpu nvcc

如何通过#define在编译时获得CUDA Compute功能(版本)? 例如,如果我使用__ballot并使用

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

我可以通过#define在我的代码中获得计算能力的版本,以便选择带有__ballot的代码分支吗?

1 个答案:

答案 0 :(得分:15)

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

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

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

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

等。引用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