2010-08-14 17 views
5

sto facendo un po 'di programmazione con nVidia CUDA C. Sto usando Visual Studio 2008 come il mio ambiente di sviluppo e sto avendo alcuni problemi con un po' di collegamento e mi chiedo se qualcuno conosce un modo per risolvere il problema o ha avuto lo stesso problema e potrebbe offrire una soluzione.Visual Studio Linking problema con Cuda

Il mio programma è costituito da 3 file. 1 file di intestazione (stuff.h), 1 file di origine C (stuff.c) e 1 file CUDA C (main.cu). (I nomi sono falsi ma è solo per illustrare il punto).

Ora stuff.h/stuff.c definire/implementare alcune funzioni di supporto che io chiamo da dentro main.cu.

Utilizzo Visual Studio 2008 e Cuda.rules dall'SDK di GPU Computing di nVidia e tutto si compila bene ma ... quando si tratta di collegare tutti i file insieme, fallisce. Sembra che tutte le funzioni definite in stuff.h (e implementate in stuff.c) non siano collegate correttamente in quanto sono contrassegnate come "simboli esterni non risolti".

Quali sono le possibili cause e come potrei risolvere questo problema?

Molte grazie,

ExtremeCoder


Va bene così sono riuscito a ottenere tutto compilazione. Sembra che tutto quello che dovevo fare era cambiare l'estensione del file di implementazione roba da .c a cpp (che significa la compilazione come C++ funziona mentre la compilazione di C non!).

Cosa potrebbe causare questo? Avrei preferito tenere tutto come .c invece cpp (in quanto questo è veramente destinata a essere il codice C ...

Tutti gli indicatori?

risposta

2

Il file main.cu viene elaborato da nvcc che, per default, è un compilatore C++ (in realtà è un involucro intorno al CUDA sottostante compilatore e cl.exe, il compilatore MS predefinito). Di conseguenza, sta cercando le funzioni con il binding C++, mentre compilando come C si hanno le associazioni C.

Se si desidera mantenere il vostro codice come C allora si può modificare stuff.h per dichiarare le funzioni come extern "C":

/* in stuff.h */ 
if defined(__cplusplus) 
    extern "C" 
    { 
#endif 
/* ... your declarations ... */ 
if defined(__cplusplus) 
    } 
#endif 

Oppure si può avvolgere l'inclusione di stuff.h in main .cu:

// in main.cu 
extern "C" 
{ 
#include "stuff.h" 
} 
+0

Grazie per l'aiuto. Ho funzionato. Esiste un modo per rendere i file .cu compilati come file C e non come file C++? Grazie. – ExtremeCoder

+0

Puoi provare l'opzione '--host-compilation = c', ma guarda questo post per le avvertenze: http://forums.nvidia.com/index.php?showtopic=101609. In generale, preferisco mantenere la mia funzione 'main' e tutto il resto nei file C/C++ standard e quindi ho solo kernel e wrapper nei file CU. Un sacco di cose Thrust deve anche andare nei file CU ... – Tom

1

C'è un progetto VS 2005 che utilizza CUDA per convertire le immagini in loro la rappresentazione in scala di grigi here. esso utilizza OpenCV, però. Se è già stato installato dovrebbe essere abbastanza semplice.

Ma anche se non si dispone di OpenCV e non volete compilare l'applicazione, VS 2008 in grado di convertire e aprire questo progetti, e sarete in grado di vedere come si dovrebbe separare CUDA codice sorgente dal codice C/C++ e su come configurare correttamente le proprietà del progetto.

Ho anche sottolineare questa grande discussione:

How do I start a new CUDA project in Visual Studio 2008?

+0

Grazie per la risposta, mi ha aiutato un po 'oltre ma non a quello che speravo di ottenere. In realtà ho dato un'occhiata ad altri progetti, ho fatto un po 'di casino e sembra che se tutto ciò che faccio è cambiare l'estensione di stuff.c in stuff.cpp, tutto funziona correttamente. Cosa potrebbe causare questo? Grazie. – ExtremeCoder

+0

Buono! L'uso dell'estensione .cpp è un problema per te? Se hai bisogno di aiuto per capire il tuo problema, abbiamo bisogno che tu modifichi la tua domanda e incolli i messaggi di errore che VS 2008 ti sta dando. – karlphillip

Problemi correlati