g++ install - Come posso compilare il codice CUDA e collegarlo ad un progetto C++?




installing manual (4)

Sto cercando aiuto per iniziare un progetto che coinvolge CUDA. Il mio obiettivo è avere un progetto che possa essere compilato nel compilatore nativo di g ++ ma che usi il codice CUDA. Capisco che devo compilare il mio codice CUDA nel compilatore nvcc, ma dalla mia comprensione posso in qualche modo compilare il codice CUDA in un file cubin o in un file ptx.

Ecco le mie domande:

  1. Come posso usare nvcc per compilare un file cubin o un file ptx? Non ho bisogno di un -c o qualcosa?
  2. Quale tipo di file voglio usare?
  3. Quali sono i comandi di g ++ per compilare e collegare correttamente il progetto insieme?

Supponiamo quanto segue:

  1. Ho un file chiamato "main.cpp" che ha una funzione principale in esso e include cuda.h.
  2. Ho un altro file chiamato "cudaFunc.cu" che contiene il codice CUDA. Diciamo, per esempio, che voglio aggiungere due array di interi che esistono in main.cpp.

Answers

Ho scoperto che il collegamento del codice oggetto cuda compilato con g ++ può essere problematico. Prova a compilarlo in questo modo:

all:
nvcc cudafile.cu mainfile.cpp -o executable

clean: rm -rf *.o

La mia risposta a questa domanda recente descrive probabilmente ciò di cui hai bisogno.

Un paio di note aggiuntive:

  1. Non è necessario compilare il tuo .cu in un file .cubin o .ptx. Devi compilarlo in un file .o object e collegarlo con i file .o object dai tuoi file .cpp compilati con g ++.
  2. Oltre a inserire il codice del kernel CUDA in cudaFunc.cu, è necessario anche inserire una funzione wrapper C o C ++ in quel file che avvia il kernel (a meno che non si stia utilizzando l'API del driver CUDA, che è improbabile e sconsigliata). Aggiungi anche un file di intestazione con il prototipo di questa funzione wrapper in modo da poterlo includere nel codice C ++ che deve chiamare il codice CUDA. Quindi colleghi i file insieme usando la tua linea di collegamento standard g ++.

Sto iniziando a ripetere la mia altra risposta , quindi consiglio di leggerlo. :)


Sono stato in grado di risolvere il mio problema con un paio di post diversi, inclusi questi. Non dimenticare che se stai usando una macchina a 64 bit per collegarti alla libreria a 64 bit! Sembra una cosa ovvia, ma per i pagliacci come me, è qualcosa che ho dimenticato. Ecco il file make che ora uso ... se riesci a digerire questo file make, dovresti essere in grado di fare ciò che stavo cercando di fare, che era una compilazione separata di codice cuda e altro codice G ++. Ricorda anche che devi avere i compilatori gcc, g ++ in certe versioni (sto usando g ++ - 4.4 e funziona per me) Comunque, ecco il file make ...

all: program

program: cudacode.o
    g++ -o program -L/usr/local/cuda/lib64 -lcuda -lcudart main.cpp  cudacode.o 

cudacode.o:
    nvcc -c -arch=sm_20 cudacode.cu 

clean: rm -rf *o program

Si spera che si possa vedere che la prima cosa che faccio è compilare il cudacode (che è stato salvato come .cu) usando il compilatore nvcc e l'opzione -c (si noti inoltre che si potrebbe voler rimuovere il -arch = sm_20). Questo ha creato un cudacode.o. Quindi uso il compilatore g ++ con l'opzione -o e il collegamento alla libreria lib64 e collego i file lcuda e lcudart insieme alla compilazione del mio main.cpp e quindi al collegamento di cudacode.o. Spero che questo aiuti qualcuno!


C'è Prometheus GPU Metrics Exporter (PGME) che sfrutta il binario nvidai-smi. Puoi provare questo. Una volta che l'esportatore è in esecuzione, è possibile accedervi tramite http://localhost:9101/metrics . Per due GPU, il risultato del test assomiglia a questo:

temperature_gpu{gpu="TITAN X (Pascal)[0]"} 41
utilization_gpu{gpu="TITAN X (Pascal)[0]"} 0
utilization_memory{gpu="TITAN X (Pascal)[0]"} 0
memory_total{gpu="TITAN X (Pascal)[0]"} 12189
memory_free{gpu="TITAN X (Pascal)[0]"} 12189
memory_used{gpu="TITAN X (Pascal)[0]"} 0
temperature_gpu{gpu="TITAN X (Pascal)[1]"} 78
utilization_gpu{gpu="TITAN X (Pascal)[1]"} 95
utilization_memory{gpu="TITAN X (Pascal)[1]"} 59
memory_total{gpu="TITAN X (Pascal)[1]"} 12189
memory_free{gpu="TITAN X (Pascal)[1]"} 1738
memory_used{gpu="TITAN X (Pascal)[1]"} 10451