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:
Supposons ce qui suit:
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!
Ma réponse à cette question récente décrit probablement ce dont vous avez besoin.
Quelques notes supplémentaires:
.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 ++.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.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