gpt4 book ai didi

cuda - 我可以在编译时通过 #define 获得 CUDA 计算能力(版本)吗?

转载 作者:行者123 更新时间:2023-12-04 16:40:23 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

当 nvcc 编译一个 .cu 文件时,它定义了两个预处理器宏,__CUDACC____CUDA_ARCH__ . __CUDACC__没有值,如果 cudacc 是编译器,则仅定义它,如果不是,则不定义。
__CUDA_ARCH__定义为一个整数值,表示正在编译的 SM 版本。

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

  • 等引用 CUDA 工具包中包含的 NVCC 文档:

    The architecture identification macro __CUDA_ARCH__ is assigned a three-digit value string xy0 (ending in a literal 0) during each nvcc compilation stage 1 that compiles for compute_xy. This macro can be used in the implementation of GPU functions for determining the virtual architecture for which it is currently being compiled. The host code (the non-GPU code) must not depend on it.



    因此,在您想使用 __ballot() 的情况下, 你可以这样做:
    ....
    #if __CUDA_ARCH__ >= 200
    int b = __ballot();
    int p = popc(b & lanemask);
    #else
    // do something else for earlier architectures
    #endif

    关于cuda - 我可以在编译时通过 #define 获得 CUDA 计算能力(版本)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12699455/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com