2010-11-04 6 views
4

Je suis en train d'appeler une fonction CUDA (hôte) à partir d'un fichier C++, compilé séparément:Appeler code CUDA à partir du code régulier C++ - le tri des extern "C"

sample.cpp fichier C++:

extern "C" void cuda_function(int a, int b); 
int main(){ 
    //statements 
    cuda_function(23, 34); 
    //statements 
} 

cuda.cu fichier:

#include <cuda.h> 
__global__ void kernel(int a, int b) 
{ 
    //statements 
} 
void cuda_function(int a, int b){ 
    //cuda_function 
} 

commandes Ancienneté:

g++ -c sample.cpp 
nvcc -c cuda.cu 
nvcc -o sample sample.o cuda.o 

Mais cela donne erreur de liens:

sample.o: In function `main': 
sample.cpp:(.text+0x163): undefined reference to `cuda_function' 
collect2: ld returned 1 exit status 

Qu'est-ce qui ne va pas dans cette méthode d'intégration de C++ et CUDA?

+0

Il suffit de perdre le C externe ''. –

Répondre

10

Vous avez déclaré cuda_function() comme extern "C", mais vous l'avez ensuite défini à l'aide de C++. Retirez le extern "C" de votre delcaration et cela fonctionnera.

Alternativement, mais de manière inutile, vous pouvez ajouter la même déclaration au fichier cuda.cu. Pour plus d'informations, nvcc est un wrapper qui divise un fichier en code hôte et code de périphérique, puis appelle respectivement le compilateur hôte et le compilateur de périphérique. Dans les temps anciens de la programmation CUDA, nvcc appelait le compilateur hôte en mode "C", ce qui signifiait que vous deviez mettre extern "C" sur les delcarations lors de l'appel de C++. En revenant à l'heure actuelle, nvcc utilise par défaut C++ pour le code hôte, ce qui signifie que vous ne devriez plus avoir besoin de ces externs (sauf si le reste de votre code hôte est en C bien sûr).

Questions connexes