Cuda C - Linker erreur undefined reference
Je vais avoir du mal à compiler un simple cuda programme consiting de seulement deux fichiers.
Le principal.c ressemble à ceci:
#include "my_cuda.h"
int main(int argc, char** argv){
dummy_gpu();
}
Le cuda.h ressemble à ceci:
#ifndef MY_DUMMY
#define MY_DUMMY
void dummy_gpu();
#endif
Et la my_cuda.cu fichier loos comme ceci:
#include <cuda_runtime.h>
#include "my_cuda.h"
__global__ void dummy_gpu_kernel(){
//do something
}
void dummy_gpu(){
dummy_gpu_kernel<<<128,128>>>();
}
Cependant, si je compile j'ai toujours l'erreur suivante:
gcc -I/usr/local/cuda/5.0.35/include/ -c main.c
nvcc -c my_cuda.cu
gcc -L/usr/local_rwth/sw/cuda/5.0.35/lib64 -lcuda -lcudart -o md.exe main.o my_cuda.o
main.o: In function `main':
main.c:(.text+0x15): undefined reference to `dummy_gpu'
collect2: ld returned 1 exit status
Merci pour votre aide.
Mon CUDA est rouillé, mais vous ne devriez pas être en mesure d'appeler les symboles compilé avec le compilateur nvcc. Vous avez besoin de l'installation d'un noyau et d'appeler la nécessaire fonctions de lancement, si je ne me trompe pas.
La vraie question est: pourquoi ne pas utiliser nvcc pour les liens et les laisser faire le travail? Ou utiliser quelque chose comme CMake?
CMake serait un échec.
La vraie question est: pourquoi ne pas utiliser nvcc pour les liens et les laisser faire le travail? Ou utiliser quelque chose comme CMake?
CMake serait un échec.
OriginalL'auteur user1829358 | 2012-11-25
Vous devez vous connecter pour publier un commentaire.
Vous avez un problème avec le nom de symbole d'amputation.
nvcc
utilise l'hôte compilateur C++ pour compiler le code hôte, ce qui implique qu'symbole name mangling est appliqué au code émis par le CUDA de la chaîne d'.Il y a deux solutions à ce problème. La première est de définir
dummy_gpu
l'aide d'une liaison C, afin de changer votremy_cuda.cu
à quelque chose comme ceci:Notez que vous aurez besoin de changer votre tringlerie de commande:
parce que le CUDA bibliothèques partagées doivent être spécifiés après des fichiers de l'objet qui les utilisent.
Votre deuxième alternative serait d'utiliser soit
g++
ounvcc
à faire le lien, dans ce cas la tout le problème devrait disparaître.Vous aurez également besoin de modifier la façon dont
my_cuda.h
inclus dans le .cu fichier. Voir l'edit que j'ai fait pour plus de détails.un grand merci à vous deux 🙂 Ça fonctionne maintenant.
Merci beaucoup talonmies, j'ai été intéressé par la façon dont vous avez découvert que nvcc utilisée g++? J'ai eu mes soupçons que certains d'amputation qui se passait, mais je n'avais aucune idée de comment faire pour vérifier! Merci encore!
vous pouvez exécuter nvcc avec l' --dryrun ou --verbose options. Cela permet d'imprimer les commandes émises à chaque étape de compilation. De là, vous pouvez voir le g++/cl invocations où l'hôte code est compilé. Vous pouvez aussi utiliser l'elfe/mach outils sur Linux/mac OS X pour vider l'en-tête des tableaux de fichiers de l'objet et de voir la présence de C++ name mangling, RTTI de l'espace, des crochets dans la bibliothèque standard, etc.
OriginalL'auteur talonmies
Vous avez un C/C++ liaison problème. nvcc est la décoration de choses en C++ de la mode, mais votre compilateur gcc est de régler les choses à l'aide de C style de couplage. Une façon simple de résoudre le problème est de renommer votre main.c à main.cpp et puis répétez vos commandes à l'aide de g++ au lieu de gcc
Alors je vous suggérons d'utiliser la méthode de @talonmies a indiqué, indiquez explicitement le compilateur c++ de ne pas marquer les noms de fonction qui sera lié à la C côté. Il semble fonctionner pour moi.
OriginalL'auteur Robert Crovella