gpt4 book ai didi

c++ - 使用 nvcc、icpc 编译时来自 cudaGetDeviceCount 的运行时 cudaErrorInsufficientDriver 错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:49:50 25 4
gpt4 key购买 nike

问题

我有一个基于 FFT 的应用程序,它使用 FFTW3。我正在使用 CUFFT 将应用程序移植到基于 CUDA 的实现。在 Nsight 中独立编译和运行应用程序的 FFT 核心工作正常。我已经从那里转移到将设备代码集成到我的应用程序中。

当我使用集成到我的应用程序中的 CUFFT 核心代码运行时,cudaGetDeviceCount 返回一个 cudaErrorInsufficientDriver 错误,尽管我没有通过 Nsight 独立运行得到它。此调用是在我初始化 GPU 时在运行开始时进行的。

背景

我在 CentOS 6 上运行,在 GeForce GTX 750 和 icpc 12.1.5 上使用 CUDA 7.0。我还使用 GT 610 成功地测试了一个小示例。两张卡都可以在 Nsight 中使用(而且我还编译和运行命令行没有问题,尽管不像在 Nsight 中那样广泛)。

为了将 FFT 核心的 CUFFT 实现集成到我的应用程序中,我使用 nvcc 进行编译和设备链接,然后使用 icpc(英特尔 C++ 编译器)进行编译主机代码并链接设备和主机代码以创建 .so。我终于在没有错误或警告的情况下完成了该步骤(依赖于 this tutorial )。

(关于我为什么使用 .so 的原因有相当多的历史和额外的背景。只要说我的应用程序需要制作 .so 就够了。)

教程指出,生成独立可执行文件(就像我在 Nsight 中所做的那样)和生成包含在 .so 中的设备链接库的编译步骤是不同的。为了完成编译,我必须按照教程中的说明将 -lcudart 以及 -lcuda 添加到我的 icpc 链接调用(以及 -L 添加 .../cuda-7.0/lib64.../cuda-7.0/lib64/stubs 作为这些库的路径)。

注意:默认情况下,nvcc 链接在 libcudart 中。我假设它对 libcuda 做同样的事情,因为 Nsight 在任何编译和链接步骤中都不包含这些库中的任何一个。顺便说一句,我确实觉得很奇怪,虽然 nvcc 默认情况下链接它们,它们不会在可执行文件上调用 ldd 时出现。

我还必须将 --compiler-options '-fPIC' 添加到我的 nvcc 命令中以避免描述的错误 here .

我看到一些关于 Intel/NVCC 兼容性的讨论(例如,参见 this post ),但看起来它们出现在旧版本 NVCC 的编译时,所以...我认为 我没问题。

最后是编译三个.cu文件的编译命令(除了.cu文件名和.o文件名外,其他都一样):

nvcc
-ccbin g++
-Iinc
-I/path/to/cuda/samples/common/inc
-m64
-O3
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_30,code=sm_30
-gencode arch=compute_35,code=sm_35
-gencode arch=compute_37,code=sm_37
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
-gencode arch=compute_52,code=compute_52
--relocatable-device-code=true
--compile
--compiler-options '-fPIC'
-o my_object_file1.o
-c my_source_code_file1.cu

下面是我传递给设备链接步骤的标志:

nvcc
-ccbin g++
-Iinc
-I/path/to/cuda/samples/common/inc
-m64
-O3
-gencode arch=compute_20,code=sm_20
-gencode arch=compute_30,code=sm_30
-gencode arch=compute_35,code=sm_35
-gencode arch=compute_37,code=sm_37
-gencode arch=compute_50,code=sm_50
-gencode arch=compute_52,code=sm_52
-gencode arch=compute_52,code=compute_52
--compiler-options '-fPIC'
--device-link
my_object_file1.o
my_object_file2.o
my_object_file3.o
-o my_device_linked_object_file.o

我可能不需要 30、37 和 52 的 -gencode 标志,至少目前是这样,但它们应该不会造成任何问题,最终,我可能会那样编译.

这是我用于调用我的 CUDA 库的 .cc 文件的编译标志(减去 -o 标志和所有 -I 标志):

-c
-fpic
-D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64
-fno-operator-names
-D_REENTRANT
-D_POSIX_PTHREAD_SEMANTICS
-DM2KLITE -DGCC_
-std=gnu++98
-O2
-fp-model source
-gcc
-wd1881
-vec-report0

最后,这是我的链接标志:

-pthread
-shared

关于如何解决这个问题有什么想法吗?

最佳答案

不要添加到 LD_LIBRARY_PATH .../cuda7.0/lib64/stubs。如果这样做,您将从那里而不是从驱动程序中获取 libcuda.so。 (参见 this post)。

关于c++ - 使用 nvcc、icpc 编译时来自 cudaGetDeviceCount 的运行时 cudaErrorInsufficientDriver 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32871311/

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