如何在没有 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