5

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

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

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

4

1 回答 1

15

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

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

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

  • 100 = 计算_10
  • 110 = 计算_11
  • 200 = 计算_20

等引用 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
于 2012-10-02T23:53:07.507 回答