Come posso avviare un nuovo progetto CUDA in Visual Studio 2008?

Questa è una domanda incredibilmente semplice, ma come posso iniziare un nuovo progetto CUDA in Visual Studio 2008? Ho trovato tonnellate e tonnellate di documentazione sulle questioni relative alla CUDA, ma nulla su come avviare un nuovo progetto. Sto lavorando con Windows 7 x64 Visual Studio 2008 C ++. Mi piacerebbe davvero trovare una sorta di app di Hello World davvero semplice per ottenere e compilare e far funzionare un programma di base.

Modificare:

Ho provato i tuoi passi Tom. Ho installato un’app per console. Ho quindi eliminato il file .cpp di default che è stato inserito e copiato dai tre file del progetto di modello solo per avere qualcosa da compilare. Quando lo compilo, template_gold.cpp si è lamentato di non aver incluso stdafx.h, quindi l’ho incluso. Ora la build fallisce con questo:

 1> ------ Inizio: Progetto: CUDASandbox, Configurazione: Debug x64 ------ 1> Compilazione ... 1> template_gold.cpp 1> Collegamento ... 1> LIBCMT.lib (crt0. obj): errore LNK2019: principale di simbolo esterno non risolto a cui fa riferimento la funzione __tmainCRTStartup 1> D: \ Stuff \ Programming \ Visual Studio 2008 \ Projects \ CUDASandbox \ x64 \ Debug \ CUDASandbox.exe: errore irreversibile LNK1120: 1 non risolto esterno 1> Registro di configurazione è stato salvato in "file: // d: \ Stuff \ Programmazione \ Visual Studio 2008 \ Progetti \ CUDASandbox \ CUDASandbox \ x64 \ Debug \ BuildLog.htm" 1> CUDASandbox - 2 errori, 0 avviso / i == ======== Build: 0 riuscito, 1 fallito, 0 aggiornato, 0 saltato ========== 

NOTA Con il rilascio della versione 3.2 di CUDA Toolkit, NVIDIA ora include il file delle regole con Toolkit invece dell’SDK. Pertanto ho suddiviso questa risposta in due parti, utilizzare le istruzioni corrette per la versione del Toolkit.

NOTA Queste istruzioni sono valide per Visual Studio 2005 e 2008. Per Visual Studio 2010 vedere questa risposta .


CUDA TOOLKIT 3.2 e versioni successive

Consiglio di utilizzare il file NvCudaRuntimeApi.rules (o NvCudaDriverApi.rules se si utilizza l’API del driver) fornito da NVIDIA, questo viene rilasciato con il toolkit e supporta gli ultimi flag del compilatore in modo amichevole. Personalmente sconsiglio di usare il wizard VS, ma solo perché davvero non penso che ne hai bisogno.

Il file rules (installato nella directory Program Files\Microsoft Visual Studio 9.0\VC\VCProjectDefaults ) “insegna a” Visual Studio “come compilare e colbind qualsiasi file .cu nel progetto alla tua applicazione.

  • Creare un nuovo progetto usando le procedure guidate standard di MS (ad es. Un progetto di console vuoto)
  • Implementare il codice host (seriale) nei file .c o .cpp
  • Implementa i tuoi wrapper e kernel in file .cu
  • Aggiungi NvCudaRuntimeApi.rules (fai clic con il tasto destro del mouse sul progetto, Regole di NvCudaRuntimeApi.rules personalizzate , spunta la casella pertinente), vedi nota 1
  • Aggiungi la libreria di runtime CUDA (fai clic destro sul progetto e scegli Proprietà , quindi in Linker -> Generale aggiungi $(CUDA_PATH)\lib\$(PlatformName) alle Directory di libreria aggiuntive e in Linker -> Inserisci aggiungi cudart.lib al Dipendenze aggiuntive ), vedi note [2] e [3]
  • Aggiungi facoltativamente i file CUDA include al percorso di ricerca, necessario se includi file CUDA nei tuoi file .cpp (al contrario dei file .cu) (fai clic con il pulsante destro del mouse sul progetto e scegli Proprietà , quindi in C / C ++ -> Generale aggiungi $(CUDA_PATH)\include alle Directory di inclusione aggiuntive ), vedi nota [3]
  • Quindi crea il tuo progetto e i file .cu verranno compilati in .obj e aggiunti automaticamente al link

Alcuni altri consigli:

  • Modificare la generazione del codice per utilizzare il runtime C caricato staticamente in modo che corrisponda al runtime CUDA; fare clic con il tasto destro del mouse sul progetto e selezionare Proprietà , quindi in C / C ++ -> Generazione codice modificare la libreria di runtime in / MT (o / MTd per debug, nel qual caso sarà necessario eseguire il mirroring in Runtime API -> Host -> Runtime Biblioteca ), vedi nota [4]
  • Abilitare l’evidenziazione della syntax utilizzando il file usertype.dat incluso con l’SDK, consultare il file readme.txt in \C\doc\syntax_highlighting\visual_studio_8

Raccomanderei anche di abilitare il supporto Intellisense con la seguente voce di registro (sostituisci 9.0 con 8.0 per VS2005 invece di VS2008):

 [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++] "NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl" 

Per inciso vorrei sostenere evitando cutil se ansible, invece rotolare il proprio controllo. Cutil non è supportato da NVIDIA, è solo usato per cercare di mantenere gli esempi nell’SDK incentrati sul programma reale e sulla progettazione dell’algoritmo ed evitare di ripetere le stesse cose in ogni esempio (ad esempio l’analisi della riga di comando). Se scrivi il tuo, avrai un controllo molto migliore e saprai cosa sta succedendo. Ad esempio, il wrapper cutilSafeCall chiama exit() se la funzione fallisce: un’applicazione reale (al contrario di un campione) dovrebbe probabilmente gestire l’errore in modo più elegante!


CUDA TOOLKIT 3.1 e precedenti

Vorrei usare il file Cuda.rules fornito da NVIDIA con l’SDK, questo viene rilasciato insieme al toolkit e supporta le ultime flag del compilatore in modo amichevole. Personalmente sconsiglio di usare il wizard VS, ma solo perché davvero non penso che ne hai bisogno.

Il file delle regole (nella directory C \ common dell’SDK) “insegna a” Visual Studio “come compilare e colbind qualsiasi file .cu nel progetto alla tua applicazione.

  • Creare un nuovo progetto usando le procedure guidate standard di MS (ad es. Un progetto di console vuoto)
  • Implementare il codice host (seriale) nei file .c o .cpp
  • Implementa i tuoi wrapper e kernel in file .cu
  • Aggiungi Cuda.rules (fai clic con il tasto destro del mouse sul progetto, Regole di Cuda.rules personalizzate , cerca il file delle regole e assicurati che sia selezionato)
  • Aggiungi la libreria di runtime CUDA (fai clic con il tasto destro del mouse sul progetto e scegli Proprietà , quindi in Linker -> Generale aggiungi $(CUDA_LIB_PATH) alle Directory di libreria aggiuntive e in Linker -> Inserisci aggiungi cudart.lib alle Dipendenze aggiuntive ), vedi nota [ 2] sotto
  • Aggiungi facoltativamente i file CUDA include al percorso di ricerca, necessario se includi file CUDA nei tuoi file .cpp (al contrario dei file .cu) (fai clic con il pulsante destro del mouse sul progetto e scegli Proprietà , quindi in C / C ++ -> Generale aggiungi $(CUDA_INC_PATH) alle Directory di inclusione aggiuntive )
  • Quindi crea il tuo progetto e i file .cu verranno compilati in .obj e aggiunti automaticamente al link

Alcuni altri consigli:

  • Modificare la generazione del codice per utilizzare il runtime C caricato staticamente in modo che corrisponda al runtime CUDA, fare clic con il tasto destro sul progetto e scegliere Proprietà , quindi in C / C ++ -> Generazione codice modificare la libreria di runtime in / MT (o / MTd per debug, in cui caso in cui dovrai specularlo in CUDA Build Rule -> Hybrid CUDA / C ++ Options ), vedi nota [4]
  • Abilitare l’evidenziazione della syntax utilizzando il file usertype.dat incluso con l’SDK, consultare il file readme.txt in \C\doc\syntax_highlighting\visual_studio_8

Raccomanderei anche di abilitare il supporto Intellisense con la seguente voce di registro (sostituisci 9.0 con 8.0 per VS2005 invece di VS2008):

 [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\Languages\Language Services\C/C++] "NCB Default C/C++ Extensions"=".cpp;.cxx;.c;.cc;.h;.hh;.hxx;.hpp;.inl;.tlh;.tli;.cu;.cuh;.cl" 

Per inciso vorrei sostenere evitando cutil se ansible, invece rotolare il proprio controllo. Cutil non è supportato da NVIDIA, è solo usato per cercare di mantenere gli esempi nell’SDK incentrati sul programma reale e sulla progettazione dell’algoritmo ed evitare di ripetere le stesse cose in ogni esempio (ad esempio l’analisi della riga di comando). Se scrivi il tuo, avrai un controllo molto migliore e saprai cosa sta succedendo. Ad esempio, il wrapper cutilSafeCall chiama exit() se la funzione fallisce: un’applicazione reale (al contrario di un campione) dovrebbe probabilmente gestire l’errore in modo più elegante!


NOTA

  1. È inoltre ansible utilizzare un fule di regole specifiche per la versione di Toolkit, ad esempio NvCudaRuntimeApi.v3.2.rules . Ciò significa che, invece di cercare CUDA Toolkit in% CUDA_PATH%, apparirà in% CUDA_PATH_V3_2%, che a sua volta significa che è ansible avere più versioni del CUDA Toolkit installato sul sistema e diversi progetti possono scegliere versioni diverse. Vedi anche nota [3].
  2. Il file rules non può modificare la compilazione C / C ++ e le impostazioni del linker, poiché è semplicemente aggiungendo le impostazioni di compilazione per il codice CUDA. Pertanto è necessario eseguire questo passaggio manualmente. Ricordati di farlo per tutte le configurazioni!
  3. Se si desidera stabilizzare su una versione specifica di CUDA Toolkit, è necessario sostituire CUDA_PATH con CUDA_PATH_V3_2. Vedi anche nota 1 .
  4. Avere una versione non corrispondente del runtime C può causare una varietà di problemi; in particolare se hai errori riguardo LIBCMT (es. LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs ) o LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs simboli definiti per funzioni di libreria standard, allora questo dovrebbe essere il tuo primo sospetto.

Che bella domanda !! Per tutta la documentazione CUDA là fuori, questa è una cosa che ho sempre pensato fosse un’omissione ovvia … In effetti, sono davvero felice di aver trovato questo post, perché dopo aver usato CUDA per un po ‘, non ho ancora avuto Ho trovato un modo ufficiale e corretto per convincere VS a produrre un programma CUDA da zero.

Quando ho avuto bisogno di avviare un nuovo programma CUDA, ho sempre copiato e modificato l’esempio ” modello ” dalla directory SDK. Questo potrebbe non essere esattamente quello che stai cercando, perché non si avvia in modo nuovo, ma è un modo rapido per ottenere un progetto compatibile con CUDA che funzioni in VS con tutti i nomi di file / progetto corretti …

  1. Crea una copia dell’esempio ” modello ” dall’SDK e rinomina la directory: gli unici contenuti necessari nella directory sono il codice sorgente e i file VS .sln e .vcproj
  2. Rinominare entrambi i file .sln e .vcproj
  3. Aprire il file .sln in un editor di testo e rinominare la variabile Project e il nomefile .vcproj nella terza riga del file
  4. Aprire il file .vcproj in un editor di testo e rinominare le variabili Name e RootNamespace nelle prime righe del file
  5. Aprire il progetto con VS e aprire le pagine delle proprietà (fare clic con il tasto destro del mouse sul nome del progetto nel riquadro Esplora soluzioni, selezionare “Proprietà”)
  6. Modificare il nome del file di output nelle pagine delle proprietà (in Proprietà di configurazione -> Linker -> Generale) … Prima di cambiare il nome del file, seleziono “Tutte le configurazioni” dal menu a discesa Configurazione e “x64” dal menu a discesa della piattaforma. giù, dato che sono su un sistema a 64 bit
  7. Modificare il nome del file di database del programma nelle pagine delle proprietà (in Proprietà di configurazione -> Linker -> Debug) … Prima di cambiare il nome del file, seleziono “Debug” e “x64” nei menu a discesa.
  • Installa procedura guidata CUDA VS. Imposterà VS e aggiungerà Progetto CUDA al menu “nuovo progetto”.
  • Assicurati di avere il compilatore x64 installato (deve essere controllato durante l’installazione di VS).
  • Controlla se hai librerie x64, include, nvcc dir e nel percorso di ricerca.
  • Crea un nuovo progetto usando il modello CUDA.
  • Cambia il tipo di progetto in x64 e l’impostazione CUDA in Nativo (se hai nv card abilitata per cuda) o emulazione in caso contrario.
  • Il modello creerà regole di compilazione personalizzate che compilano i file .cu con nvcc e altri file con il compilatore predefinito.
  • se, vs sta cercando di compilare i file .cu con il compilatore C / C ++, fare clic su quel file in solution explorer e disabilitare la compilazione per quei file (punto rosso sull’icona del file)

Ulteriori informazioni sull’installazione della procedura guidata CUDA su VS2008 sono disponibili qui e qui

[modificare]
Se non si desidera utilizzare la procedura guidata, è necessario impostare manualmente i percorsi CUDA lib / include / nvcc e aggiungere regole di compilazione personalizzate a ciascun nuovo programma CUDA. Per ulteriori informazioni su come farlo dare un’occhiata a Tom’s Answer.