问题
我有一个使用FFTW3的基于FFT的应用程序。我正在使用CUFFT将应用程序移植到基于CUDA的实现。在Nsight中独立编译和运行应用程序的FFT核心工作正常。我已经从那里转移到将设备代码集成到我的应用程序中。
当我使用集成到我的应用程序中的CUFFT核心代码运行时,cudaGetDeviceCount
会返回cudaErrorInsufficientDriver
错误,尽管我没有通过Nsight独立运行获得它。我在初始化GPU时在运行开始时进行此调用。
背景
我在CentOS 6上运行,在GeForce GTX 750上使用CUDA 7.0,以及icpc
12.1.5。我还成功使用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在任何编译和链接步骤中都没有包含这些库中的任何一个。顺便说一句,我觉得很奇怪,尽管{ {1}}默认情况下会将其关联起来,而不会在可执行文件的nvcc
调用中显示出来。
我还必须在ldd
命令中添加--compiler-options '-fPIC'
,以避免错误描述为here。
我已经看到一些关于英特尔/ NVCC兼容性的喋喋不休(例如,见this post),但看起来它们是在编译时出现的旧版NVCC,所以...我想想我对那个帐户没问题。
最后,这里是用于编译三个.cu文件的编译命令(除了.cu文件的名称和.o文件的名称之外,所有文件都是相同的):
nvcc
以下是我传递给设备链接步骤的标志:
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
至少目前我可能不需要30,37和52的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
标志,但它们不应该导致任何问题,最终,我可能会以这种方式编译
这是我用于.cc文件的编译标志(减去-o标志,以及我所有的-I标志),它使用调用我的CUDA库:
-gencode
最后,这是我的链接标志:
-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
有关如何解决此问题的任何想法?
答案 0 :(得分:1)
不要添加到LD_LIBRARY_PATH .../cuda7.0/lib64/stubs
。如果你这样做,你将从那里而不是从驱动程序中获取libcuda.so。 (见this post)。