web-dev-qa-db-fra.com

Comment puis-je compiler du code CUDA puis le lier à un projet C ++?

Je cherche de l'aide pour démarrer un projet impliquant CUDA. Mon objectif est d'avoir un projet que je peux compiler dans le compilateur natif g ++ mais qui utilise du code CUDA. Je comprends que je dois compiler mon code CUDA dans le compilateur nvcc, mais d'après ma compréhension, je peux en quelque sorte compiler le code CUDA dans un fichier cubin ou un fichier ptx.

Voici mes questions:

  1. Comment utiliser nvcc pour compiler dans un fichier cubin ou un fichier ptx? N'ai-je pas besoin d'un -c ou quelque chose?
  2. Quel type de fichier dois-je utiliser?
  3. Quelles sont les commandes g ++ pour compiler et lier correctement le projet?

Supposons ce qui suit:

  1. J'ai un fichier appelé "main.cpp" qui a une fonction principale et comprend cuda.h.
  2. J'ai un autre fichier appelé "cudaFunc.cu" qui contient du code CUDA. Disons, par exemple, que je veux ajouter deux tableaux entiers qui existent dans main.cpp.
46
Matthew

J'ai pu résoudre mon problème avec quelques messages différents, y compris ceux-ci. N'oubliez pas que si vous utilisez une machine 64 bits pour vous connecter à la bibliothèque 64 bits! Cela semble assez évident, mais pour les clowns comme moi, c'est quelque chose que j'ai oublié. Voici le fichier make que j'utilise maintenant ... si vous pouvez digérer ce fichier make, vous devriez pouvoir faire ce que j'essayais de faire qui était une compilation séparée du code cuda et d'autres codes G ++. Gardez également à l'esprit que vous devez avoir les compilateurs gcc, g ++ sur certaines versions (j'utilise g ++ - 4.4 et cela fonctionne pour moi) Quoi qu'il en soit, voici le fichier 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 -f *.o program

J'espère que vous pouvez voir que la première chose que je fais est de compiler le cudacode (qui a été enregistré en tant que .cu) en utilisant le compilateur nvcc et -c option (notez également que vous souhaiterez peut-être supprimer le -Arch=sm_20). Cela a créé un cudacode.o. J'utilise ensuite le compilateur g ++ avec le -o option et un lien vers la bibliothèque lib64 et lier le -lcuda et -lcudart bibliothèques ainsi que la compilation de mon main.cpp puis en liant le cudacode.o. J'espère que cela aide quelqu'un!

49
Matthew

Ma réponse à cette question récente décrit probablement ce dont vous avez besoin.

Quelques notes supplémentaires:

  1. Vous n'avez pas besoin de compiler votre .cu à un .cubin ou .ptx fichier. Vous devez le compiler dans un .o fichier objet, puis liez-le avec le .o fichiers objets de vos fichiers .cpp compilés avec g ++.
  2. En plus de mettre votre code du noyau cuda dans cudaFunc.cu, vous devez également placer une fonction wrapper C ou C++ dans ce fichier qui lance le noyau (sauf si vous utilisez l'API du pilote CUDA, ce qui est peu probable et déconseillé). Ajoutez également un fichier d'en-tête avec le prototype de cette fonction wrapper afin de pouvoir l'inclure dans votre code C++ qui doit appeler le code CUDA. Ensuite, vous liez les fichiers ensemble à l'aide de votre ligne de lien g ++ standard.
15
harrism

J'ai trouvé que la liaison du code d'objet cuda compilé avec g ++ peut être gênante. Essayez de le compiler comme ceci:

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

clean: rm -rf *.o
10