- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题
我有一个基于 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/
我正在 docker 中执行一些 CUFFT 例程,遇到了一些问题。我使用以下 Dockerfile。 FROM nvidia/cuda:9.1-runtime-ubuntu16.04 ENV NVI
问题 我有一个基于 FFT 的应用程序,它使用 FFTW3。我正在使用 CUFFT 将应用程序移植到基于 CUDA 的实现。在 Nsight 中独立编译和运行应用程序的 FFT 核心工作正常。我已经从
我是一名优秀的程序员,十分优秀!