如何在没有nvcc的情况下在编译时获取CUDA工具包版本?

时间:2016-06-22 14:21:50

标签: c++ cuda

我在.cpp文件中调用cuSPARSE库,这些调用在旧工具包中不可用。为了支持使用旧工具包的系统,我想使用编译器指令编译不同的代码段。特别是,我想使用CSR格式的矩阵解决旧工具包的稀疏三角形系统和新工具包的BSR格式。

问题是,我不是用nvcc编译本节中的任何实际CUDA代码,只是进行库调用,因此获取版本信息的nvcc宏不可用。

cuda.h中有__CUDA_API_VERSION的#define,但在编译我的.cpp时它是0,无论我是否包含cuda.h。

在这种情况下,如何在编译时获取有关工具包版本的信息?我正在使用CentOS 7并使用g ++编译我的.cpp。

2 个答案:

答案 0 :(得分:5)

一种可能的方法:

  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
    

    或类似。

答案 1 :(得分:0)

另一种方式:

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

将打印:

CUDA v11.1

获取最新版本。