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

Posted

技术标签:

【中文标题】如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?【英文标题】:How to Get CUDA Toolkit Version at Compile Time Without nvcc? 【发布时间】:2016-06-22 14:21:50 【问题描述】:

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

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

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

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

【问题讨论】:

一种可能的方法:在您的 .cpp 文件中包含 cuda_runtime_api.h,并使用其中包含的 CUDART_VERSION 定义。 8000 = CUDA 8.0。 7050 = CUDA 7.5 等。例如,如果您在 .cpp 文件中使用 cudaMalloc/cudaMemcpy,则可能包含 cuda_runtime_api.h @RobertCrovella 成功了!谢谢! 【参考方案1】:

一种可能的方法:

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

    使用包含在该头文件中的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
    

    或类似的。

【讨论】:

请注意,对于 CUDA 10.0,它是 10000,对于 CUDA 10.1,它是 10010,等等。【参考方案2】:

另一种方式:

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

将打印:

CUDA v11.1

最新版本。

【讨论】:

以上是关于如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 fseek 和 ftell 的情况下在 ANSI C 中获取文件大小?

如何在不请求的情况下在firebase-auth中首次加载时获取currentUser

如何在没有时区干扰的情况下在树枝中渲染时间

如何在没有互联网连接的情况下在android中获取当前纬度和经度?

如何在没有入口的情况下在 AKS 上获取 HTTPS

如何在没有查询的情况下在 Retrofit 中提取 Json 数据