使用nvcc、icpc编译时,来自cudaGetDeviceCount的运行时cudaErrorInsufficient

Runtime cudaErrorInsufficientDriver error from cudaGetDeviceCount when compiling with nvcc, icpc

本文关键字:cudaGetDeviceCount 来自 运行时 cudaErrorInsufficient nvcc icpc 编译 使用      更新时间:2023-10-16

问题

我有一个使用FFTW3的基于FFT的应用程序。我正在使用CUFFT将应用程序移植到基于CUDA的实现中。在Nsight中独立编译和运行应用程序的FFT核心效果良好。我已经从那里开始将设备代码集成到我的应用程序中。

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

背景

我在CentOS 6上运行,在GeForce GTX 750和icpc 12.1.5上使用CUDA 7.0。我还成功地测试了一个使用GT610的小例子。这两个卡都可以在Nsight中工作(我也编译并运行了命令行,但没有像在Nsight内那样广泛(。

为了将FFT核心的CUFFT实现集成到我的应用程序中,我编译了与nvcc连接的设备,然后使用icpc(英特尔C++编译器(编译主机代码,并链接设备和主机代码以创建.so。我最终完成了这一步,没有出现错误或警告(依赖本教程(。

(关于我为什么使用.so的理由有相当多的历史和额外的背景。只需说我的申请需要制作.so就足够了。(

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

注意:默认情况下,nvcc链接在libcudart中。我假设它对libcuda也是如此,因为Nsight在任何编译和链接步骤中都不包括这两个库。。顺便说一句,我确实觉得奇怪的是,尽管默认情况下nvcc会将它们链接进来,但它们不会在可执行文件上调用ldd时显示出来。

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

我看到了一些关于Intel/NVC兼容性的讨论(例如,请参阅本文(,但它们似乎是在编译时出现的,与旧版本的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标志,至少目前是这样,但它们不会引起任何问题,最终,我可能会以这种方式编译。

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

-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。(请参阅本文(。

相关文章:
  • 没有找到相关文章