使用nvcc,icpc

时间:2015-09-30 16:32:40

标签: c++ linux cuda nsight icc

问题

我有一个使用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

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

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