如何在编译时获取CUDA工具包版本而无需使用nvcc?

7
我有一些在.cpp文件中对cuSPARSE库的调用,这些调用在旧版工具包中不可用。为了支持旧版工具包的系统,我想使用编译器指令来编译不同的代码部分。特别地,我想使用CSR格式中的矩阵解决稀疏三角系统的问题,以供旧版工具包使用,并使用BSR格式供新版工具包使用。
问题是,在这个部分,我并没有使用nvcc编译任何实际的CUDA代码,只是进行库调用,因此不能使用nvcc宏获取版本信息。
在cuda.h中有一个__CUDA_API_VERSION的#define,但无论是否包含cuda.h,我都会在编译我的.cpp时得到0。
在这种情况下,我如何在编译时获取工具包版本信息?我正在CentOS 7上工作,并使用g++编译我的.cpp。

2
一种可能的方法是:在您的.cpp文件中包含cuda_runtime_api.h,并使用其中包含的CUDART_VERSION定义。 8000= CUDA 8.0。 7050= CUDA 7.5等。如果您在.cpp文件中使用cudaMalloc/cudaMemcpy,则通常会包括cuda_runtime_api.h - Robert Crovella
@RobertCrovella 那个有效了!谢谢你! - user1777820
2个回答

11

一种可能的方法:

  1. 在您的 .cpp 文件中包含 cuda_runtime_api.h(如果您正在使用任何 CUDA 运行时 API 函数,例如 cudaMalloc,则可能已经这样做了)

  2. 使用从该头文件中包含的 CUDART_VERSION 宏定义:

    #include <cuda_runtime_api.h>
    ...
    #ifndef CUDART_VERSION
    #error CUDART_VERSION Undefined!
    #elif (CUDART_VERSION == 8000)
    // your code for the CUDA 8.0 case
    #elif (CUDART_VERSION == 7050)
    // your code for the CUDA 7.5 case
    #elif ...
    //etc.
    #else
    #error Unknown CUDART_VERSION!
    #endif
    

    或类似的。


3
请注意,对于CUDA 10.0,其版本号为10000,对于CUDA 10.1,其版本号为10010,以此类推。 - einpoklum

3

另一种方法:

#include <fmt/format.h>
#include <cuda.h>
...
fmt::print("CUDA v{}.{}\n", CUDA_VERSION/1000, CUDA_VERSION/10%100);

将会打印:

CUDA v11.1

针对最新版本。


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