Sto tentando di collegare un kernel CUDA a un progetto di autotools C++, ma non riesco a passare la fase di collegamento.Creazione di una libreria CUDA statica da collegare a un programma C++
Ho un file GPUFloydWarshall.cu che contiene il kernel e una funzione wrapper C che vorrei inserire in una libreria libgpu.a. Questo sarà coerente con il resto del progetto. È possibile?
In secondo luogo, la libreria dovrebbe quindi essere collegata a circa dieci altre librerie per l'eseguibile principale che al momento utilizza mpicxx.
Attualmente sto usando/generare il seguito i comandi per compilare e creare la libreria libgpu.a
nvcc -rdc=true -c -o temp.o GPUFloydWarshall.cu
nvcc -dlink -o GPUFloydWarshall.o temp.o -L/usr/local/cuda/lib64 -lcuda -lcudart
rm -f libgpu.a
ar cru libgpu.a GPUFloydWarshall.o
ranlib libgpu.a
Quando questo è tutto legato al eseguibile principale ottengo il seguente errore
problem/libproblem.a(libproblem_a-UTRP.o): In function `UTRP::evaluate(Solution&)':
UTRP.cpp:(.text+0x1220): undefined reference to `gpu_fw(double*, int)'
La funzione gpu_fw è la mia funzione wrapper.
io non sono molto sicuro di capire principalmente a causa autotools che generano la libreria per me. Ho modificato la mia domanda originale per includere dettagli aggiuntivi che dovrebbero, se tutto va bene, rendere le cose un po 'più chiare. –
Seguendo questo approccio ora posso compilare il codice con successo. Durante l'esecuzione, tuttavia, viene generato il seguente errore. Msgstr "Errore funzione del dispositivo non valido sulla riga 84 nel file GPUFloydWarshall.cu". Questo significa che il kernel non viene compilato?So che il kernel è corretto poiché l'ho testato esternamente. –
SO non è davvero una chat room. Hai un problema diverso ora. Si consiglia di pubblicare una nuova domanda. Il kernel è compilato, ma l'architettura/destinazione non corrisponde alla GPU su cui viene eseguita. Avrebbero bisogno di altre specifiche come il comando di compilazione attuale, la GPU su cui si sta eseguendo, la versione CUDA, ecc. –