Visual Studio 在Windows上将cuda库与gcc链接

bqf10yzr  于 2023-01-02  发布在  Windows
关注(0)|答案(1)|浏览(209)
    • 简短版本:**

我试图编译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上编译MAGMA(64位)(最后都是32位和64位)并链接到我用GCC编译的程序中,问题是Windows上的Cuda不支持Mingw/MSys工具链,在Windows上使用nvcc编译Cuda似乎需要Visual Studio C编译器cl.exe。我安装了Cuda 4.0(64位下载)并成功地在32位和64位变体中构建了示例(使用VS2008)-证明Cuda安装在这两种位中。
MAGMA however does not provide a solution for Visual Studio, and I'm not experienced enough to generate one since it involves also a good portion of Fortran code to be compiled. Therefore I tried to use both toolchains (MinGW & VS2008) together. I adopted the make.inc file to my paths and perform the build in three steps. First using Msys/Mingw for the compilation of all the Fortran stuff, and after running into the errors of nvcc which is not able to find cl.exe I switch over to the VS command promt (x86 or x64, depending on the bitness to be built). The latter steps finishes with an library archive file libmagmablas.a which looks right.
然而,问题就开始了。使用TDM 64位编译器(gcc-4.5)对于MAGMA示例的编译和链接,一切似乎都工作正常,但. exe文件在调用cuInit时立即失败().(我认为这是一个编译器错误/不兼容,因为当我使用此Mingw-w64工具链编译Cuda示例时也发生了同样的情况)。因此,我切换到32位Mingw-w64工具链,它能够编译Cuda的例子。用它编译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吗?有没有机会把它们正确地链接起来?

mwg9r5ms

mwg9r5ms1#

32位符号是__stdcall函数的标准Windows修饰(在16位时代也称为__pascal)。鉴于CUDA在Windows上缺乏对GCC的支持(说真的,这不是一条你想走的路),我猜测cuda. h头文件没有正确定义CUDAAPI

相关问题