2013-04-29 15 views
6

OK, ho una domanda CUDA 5.0 davvero preoccupante su come collegare correttamente le cose. Sarei davvero grato per qualsiasi aiuto!Come collegare il codice host con una libreria CUDA statica dopo la compilazione separabile?

Utilizzando le funzionalità di compilazione separabili di CUDA 5.0, ho generato una libreria statica (* .a). Questo si collega bene con altri file * .cu quando si esegue nvcc, l'ho fatto molte volte.

Vorrei ora prendere un file * .cpp e collegarlo al codice host in questa libreria statica utilizzando g ++ o qualsiasi altra cosa, ma non nvcc. Se tento questo, ricevo errori del compilatore come

undefined reference to __cudaRegisterLinkedBinary

sto utilizzando sia -lcuda e -lcudart e, per quanto ne so, sono le librerie nell'ordine corretto (che significa -lmylib -lcuda -lcudart). Non penso che sia un problema con quello. Forse ho sbagliato, ma sento che mi manca un passaggio e che ho bisogno di fare qualcos'altro nella mia libreria statica (collegamento del dispositivo?) Prima di poterlo usare con g ++.

Ho perso qualcosa di cruciale? È possibile?

Domanda bonus: voglio che il risultato finale sia una libreria dinamica. Come posso raggiungere questo obiettivo?

+1

add '-lcudadevrt' –

+1

Ho già provato che, didn non fare nulla Il comando che sto usando è: g ++ -pthread -shared -Wl, -O1 -Wl, -Bsymbolic-functions -Wl, -Bsymbolic-functions -Wl, -z, relro mycpplib.o mycudalib.a -L/usr/local/cuda-5.0/lib64 -L/usr/local/cuda-5.0/lib -lmystaticlib -lcuda -lcudart -lcudadevrt -o mylinkedlib.so - Sto provando a creare un modulo Python per la mia libreria CUDA. – user2333829

+0

L'errore relativo a __cudaRegisterLinkedBinary di essere indefinito si verifica effettivamente quando provo a importare il modulo Python. g ++ in realtà compila tutto senza lamentarsi. – user2333829

risposta

7

Quando si collega a nvcc, viene effettuato un collegamento implicito al dispositivo insieme al collegamento host. Se si utilizza il compilatore host per il collegamento (come con g ++), è necessario aggiungere un passaggio esplicito per fare un collegamento del dispositivo con l'opzione -dlink, ad es.

nvcc –arch=sm_35 –dc a.cu b.cu 
nvcc –arch=sm_35 –dlink a.o b.o –o dlink.o 
g++ a.o b.o dlink.o x.cpp –lcudart 

V'è un esempio di questo esattamente nel Using Separate Compilation chapter of the nvcc doc.

Attualmente supportiamo solo le librerie statiche per il codice di dispositivo rilocabile. Saremmo interessati a imparare come vorresti usare tale codice in una libreria dinamica. Non esitate a rispondere nei commenti.

Edit: "C'è un modo per utilizzare nvcc per trasformare mylib.a in qualcosa che può essere messo in g ++"

Per rispondere alla domanda nel commento qui sotto

basta usare la biblioteca come un oggetto, in questo modo:

nvcc –arch=sm_35 –dlink mylib.a –o dlink.o 
g++ mylib.a dlink.o x.cpp –lcudart 
+0

Grazie, penso che questo sia ciò a cui stavo andando a tentoni. Ora, l'unica cosa è che ho una libreria statica collegabile al dispositivo (mylib.a) invece dei singoli file * .o. Ovviamente posso usare ar per estrarre i file * .o originali, e poi fare esattamente ciò che descrivi. C'è un modo per usare nvcc per trasformare mylib.a in qualcosa che può essere inserito in g ++? Come il tuo secondo passo, ma con "mylib.a" che sostituisce "a.o b.o". O devo usare ar per ottenere nuovamente i file oggetto, quindi seguire esattamente il secondo e il terzo passaggio? – user2333829

+0

Per rispondere alla tua domanda, sto sviluppando una libreria C++ che è destinata a essere host-orientabile da Python. Python ha bisogno di librerie dinamiche. Io uso la libreria statica che ho già generato come libreria C++ collegabile al dispositivo. – user2333829

+0

Ho aggiunto una risposta alla tua domanda nel tuo primo commento. Si prega di accettare/votare se questo risponde alla tua domanda. – harrism

0

È possibile utilizzare le librerie ovunque si usano oggetti. Quindi, basta fare nvcc -arch = sm_35 -dlink mylib.a -o dlink.o g ++ mylib.a dlink.o x.cpp -lcudart

+1

Grazie mille per il tuo suggerimento, Mike, lo apprezzo. Ma, ho un comportamento strano quando provo esattamente il comando nvcc che hai proposto. Sì, il comando nvcc viene eseguito e non si lamenta. Tuttavia, quando provo a inserire il nuovo file oggetto tramite g ++, sembra che tutte le mie funzioni non siano definite. Una rapida ispezione delle dimensioni del file mostra che l'originale mylib.a è 988K, mentre l'oggetto dopo il collegamento del dispositivo è solo 56K. Non può essere giusto, nessuna idea di cosa succede? (Grazie ancora!) – user2333829

Problemi correlati