好的,这让我头疼了一段时间,我希望这里的一些专家可以帮助我。
简短版本:
我尝试编译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吗?有没有机会将它们联系起来?
答案 0 :(得分:1)
32位符号是__stdcall
函数的标准Windows修饰(在16位日内也称为__pascal)。鉴于CUDA在Windows上缺乏对GCC的支持(严重的是,这不是你想要关闭的路径),我的猜测是cuda.h头文件没有正确定义CUDAAPI
。