在Windows上使用gcc链接cuda库

好的,这个让我头疼一阵子,希望在这里的一些专家能够帮助我。

简短版本:

我试图编译MAGMA,并得到关于丢失符号的抱怨:

testing_cgemm.o:testing_cgemm.cpp:(.text+0x2e7): undefined reference to `cudaMalloc' testing_cgemm.o:testing_cgemm.cpp:(.text+0xbff): undefined reference to `cudaFree' 

在cuda库中检查32位和64位的这些符号,我得到以下结果:

 $ /C/Coding/Mingw-w64-tdm/bin/nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/x64/cudart.lib | grep cudaMalloc 0000000000000000 I __imp_cudaMalloc 0000000000000000 T cudaMalloc $ nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/Win32/cudart.lib | grep cudaMalloc 00000000 I __imp__cudaMalloc@8 00000000 T _cudaMalloc@8 

所以64位库看起来不错,他们链接的权利。 然而,32位库(第二个输出)在方法名称上有一些装饰。 这是我卡住的地方。

问题

那些装饰品是什么意思? 32bit是不是普通的C? 有没有机会把它们连接起来?

上下文

我想在Windows 7(64位)(最终都是32位和64位)上编译MAGMA ,并将其链接到我用gcc编译的程序。 问题是Windows上的Cuda不支持我熟悉的Mingw / MSys工具链。 在Windows上使用nvcc的Cuda编译似乎需要Visual Studio C编译器cl.exe。 我安装了Cuda 4.0(64位下载),并成功构build了32位和64位两个示例(使用VS2008) – certificateCuda安装在两个位中。

然而,MAGMA并没有提供Visual Studio的解决scheme,而且我也没有足够的经验来生成一个解决scheme,因为它也涉及到很大一部分要编译的Fortran代码。 所以我试图使用两个工具链(MinGW&VS2008)在一起。 我采用了make.inc文件到我的path,并通过三个步骤来执行构build。 首先使用Msys / Mingw编译所有Fortran的东西,运行后无法findcl.exe的nvcc错误我切换到VS命令promt(x86或x64,取决于比特位置build)。 后面的步骤完成一个库存档文件libmagmablas.a看起来是正确的。

然而,那么问题就开始了。 使用TDM 64位编译器(gcc-4.5),对于MAGMA示例的编译和链接,一切正常,但是.exe文件在调用cuInit()时会立即失败。 (我认为这是一个编译器bug / incompatability,因为当我使用这个Mingw-w64工具链编译Cuda的例子时会发生同样的情况)。 因此,我转而使用能够编译Cuda示例的32位的Mingw-w64工具链。 用它来编译MAGMA,重复上述所有步骤直到MAGMA例子的连接步骤。 有抱怨失踪的符号:

 testing_cgemm.o:testing_cgemm.cpp:(.text+0x2e7): undefined reference to `cudaMalloc' testing_cgemm.o:testing_cgemm.cpp:(.text+0xbff): undefined reference to `cudaFree' 

在cuda库中检查这些符号我得到以下内容:

 $ /C/Coding/Mingw-w64-tdm/bin/nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/x64/cudart.lib | grep cudaMalloc 0000000000000000 I __imp_cudaMalloc 0000000000000000 T cudaMalloc $ nm C:/Program\ Files/NVIDIA\ GPU\ Computing\ Toolkit/CUDA/v4.0/lib/Win32/cudart.lib | grep cudaMalloc 00000000 I __imp__cudaMalloc@8 00000000 T _cudaMalloc@8 

所以64位库看起来不错,他们链接的权利。 然而,32位库(第二个输出)在方法名称上有一些装饰。 这是我卡住的地方。

那些装饰品是什么意思? 32bit是不是普通的C? 有没有机会把它们连接起来?

32位符号是__stdcall函数(在16位日期中也称为__pascal)的标准Windows装饰。 考虑到CUDA在Windows上缺乏对GCC的支持(并且严重的是,这不是你想要下的路径),我的猜测是cuda.h头文件没有正确定义CUDAAPI