在Windows上用ccc链接cuda库

时间:2011-08-08 11:18:50

标签: windows visual-studio gcc cuda mingw

好的,这让我头疼了一段时间,我希望这里的一些专家可以帮助我。

简短版本:

我尝试编译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 libs中检查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位lib看起来还不错,并且链接正确。但是32位lib(第二个输出)在方法名称上有一些装饰。这就是我被困住的地方。

问题

这些装饰是什么意思? 32bit不是普通的C吗?有没有机会将它们联系起来?

上下文

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

但是,MAGMA没有为Visual Studio提供解决方案,而且我没有足够的经验来生成一个,因为它还涉及要编译的Fortran代码的很大一部分。因此,我试图同时使用两个工具链(MinGW和VS2008)。我将make.inc文件采用到我的路径并分三步执行构建。首先使用Msys / Mingw编译所有Fortran的东西,并且在遇到无法找到cl.exe的nvcc错误后,我切换到VS命令promt(x86或x64,具体取决于bitness是建)。后面的步骤完成了一个看起来正确的库存档文件libmagmablas.a。

然而问题就开始了。使用TDM 64位编译器(gcc-4.5),一切似乎也可以正确地用于MAGMA示例的编译和链接,但.exe文件在调用cuInit()时会立即失败。 (我认为这是一个编译器错误/不兼容性,因为当我使用这个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 libs中检查这些符号我得到以下内容:

$ /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位lib看起来还不错,并且链接正确。但是32位lib(第二个输出)在方法名称上有一些装饰。这就是我被困住的地方。

这些装饰是什么意思? 32bit不是普通的C吗?有没有机会将它们联系起来?

1 个答案:

答案 0 :(得分:1)

32位符号是__stdcall函数的标准Windows修饰(在16位日内也称为__pascal)。鉴于CUDA在Windows上缺乏对GCC的支持(严重的是,这不是你想要关闭的路径),我的猜测是cuda.h头文件没有正确定义CUDAAPI