visuel studio - Link cuda biblioteker med gcc på Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Ok dette giver mig hovedpine i et stykke tid, og jeg håber, at nogle af eksperterne herom kan hjælpe mig med det.


Den korte version:


Jeg forsøger at kompilere MAGMA og få klager over manglende symboler:


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


Kontrol af disse symboler i både 32 og 64 bit i cuda libs får jeg følgende:


$ /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


Så 64 bit libs ser ok ud, og de linker til højre. Imidlertid har 32bit lib (den anden udgang) nogle dekorationer ved metodenavnet. Det er her, jeg er fast.


Spørgsmålene


Hvad betyder disse dekorationer? Er 32bit ikke almindelig C? Er der nogen chance for at forbinde dem rigtigt?


Konteksten


Jeg vil kompilere MAGMA på Windows 7 (64 bit) (både 32 og 64 bit endelig) og linke det til mit program compiled med gcc. Problemet er, at Cuda on Windows ikke understøtter Mingw/MSys værktøjskæde, jeg er bekendt med. Cuda compilation ved hjælp af nvcc på Windows synes at kræve Visual Studio C compiler cl.exe. Jeg installerede Cuda 4.0 (64 bit downloads) og bygget eksemplerne (ved hjælp af VS2008) med succes i både 32 og 64 bit varianter - hvilket viser, at Cuda er installeret i begge vidner. [7]


MAGMA leverer dog ikke en løsning til Visual Studio, og jeg er ikke erfaren nok til at generere en, da det også involverer en stor del af Fortran kode, der skal kompileres. Derfor forsøgte jeg at bruge begge værktøjskæder (MinGW &VS2008) sammen. Jeg vedtog filen make.inc til mine stier og udfører opbygningen i tre trin. Først ved hjælp af Msys/Mingw til sammenstillingen af ​​alle Fortran-emnerne og efter at have kørt ind i fejlene ved nvcc, som ikke er i stand til at finde cl.exe I skift til VS kommando promt (x86 eller x64, afhængigt af den evidens der skal bygges). Sidstnævnte trin afslutter med et bibliotek arkiv fil libmagmablas.a som ser rigtigt ud.


Men så begynder problemerne. Ved hjælp af TDM 64bit-kompilatoren (gcc-4.5) ser det ud til, at alt fungerer korrekt også til kompilering og sammenkædning af MAGMA-eksemplerne, men .exe-filer fejler straks ved at kalde cuInit (). (Jeg tror, ​​det er en compiler bug/inkompatibilitet da det samme sker, når jeg kompilerer Cuda eksemplerne ved hjælp af denne Mingw-w64 værktøjskæde).
Derfor skiftede jeg til 32bit Mingw-w64 værktøjskæden, som kunne kompilere Cuda eksemplerne. Sammenligning af MAGMA med det, og at gentage alle ovenstående trin går godt, indtil forbindelsestrin i MAGMA-eksemplerne. Der er klager over manglende symboler:


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


Kontrol af disse symboler i cuda libs får jeg følgende:


$ /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


Så 64 bit libs ser ok ud, og de linker til højre. Imidlertid har 32bit lib (den anden udgang) nogle dekorationer ved metodenavnet. Det er her, jeg er fast.


Hvad betyder disse dekorationer? Er 32bit ikke almindelig C? Er der nogen chance for at forbinde dem rigtigt?

Bedste reference


32-bit symbolerne er standard Windows dekoration til \_\_stdcall funktioner (også kendt som \_\_pascal i 16-bit-dage). I betragtning af CUDAs manglende støtte til GCC på Windows (og alvorligt, dette er ikke en vej, du vil gå ned), mit gæt er, at cuda.h headers ikke definerer CUDAAPI korrekt.