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

Ale*_*lex 5 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
Run Code Online (Sandbox Code Playgroud)

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

har*_*ism 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文档:

在编译的每个nvcc编译阶段1期间,为体系结构标识宏__CUDA_ARCH__分配一个三位数值字符串xy0(以字面值0结尾)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
Run Code Online (Sandbox Code Playgroud)

  • 是的,[例如参见此处](http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__TYPES_g3c09bba9b1547aa69f1e346b82bcdb50.html)。实际上,它是主要版本乘以 1000 + 次要版本乘以 10,所以 4.2 --> 4020。 (2认同)