In questo momento sto lavorando a un progetto che utilizza le funzionalità di collegamento degli oggetti di Cuda 5. Poiché il progetto sta iniziando a diventare complesso, volevo passare all'utilizzo di cmake per compilare il codice. Tuttavia non riesco a ottenere il collegamento degli oggetti per funzionare correttamente per me.Utilizzo dell'oggetto Cuda Collegamento con Cmake
Ho finito per creare una versione giocattolo del progetto che ottiene lo stesso tipo di errori del progetto originale. Il progetto del giocattolo consiste in un file principale (TextureMain.cu) che chiama una funzione del kernel per l'esecuzione sulla GPU. In ogni thread GPU viene fatto riferimento a un'istanza di una classe definita dall'utente (TextureFunc), in cui la classe esiste in una cartella separata dal file principale. La classe è composta da un file TextureFunc.cu e TextureFunc.h in quella cartella.
Qui ci sono i file CMakeList.txt sto usando:
Nella directory del progetto (contiene cartella src):
project(TextureMain)
cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)
#-------------------------------------------------------------------------------
set(CUDA_NVCC_FLAGS "-arch=compute_20; -code=sm_20; -rdc=true; -lcudadevrt")
include_directories(src/TextureFunc)
#-------------------------------------------------------------------------------
add_subdirectory(src/TextureFunc)
add_subdirectory(src)
Nella directory src (contiene TextureMain.cu e TextureFunc directory):
cuda_add_executable(TextureMain TextureMain.cu)
target_link_libraries(TextureMain TextureFunc)
install(TARGETS TextureMain DESTINATION bin)
In directory TextureFunc (contiene TextureFunc.h e TextureFunc.cu):
cuda_add_library(TextureFunc TextureFunc.cu)
target_link_libraries(TextureFunc)
Quando si tenta di compilare questo codice utilizzando i file CMakeList.txt precedenti, viene visualizzato il seguente errore.
Linking CXX executable TextureMain
CMakeFiles/TextureMain.dir/./TextureMain_generated_TextureMain.cu.o: In function `__sti____cudaRegisterAll_46_tmpxft_00004c15_00000000_6_TextureMain_cpp1_ii_texRef':
/tmp/tmpxft_00004c15_00000000-3_TextureMain.cudafe1.stub.c:2: undefined reference to `__cudaRegisterLinkedBinary_46_tmpxft_00004c15_00000000_6_TextureMain_cpp1_ii_texRef'
TextureFunc/libTextureFunc.a(TextureFunc_generated_TextureFunc.cu.o): In function `__sti____cudaRegisterAll_46_tmpxft_00004bd8_00000000_6_TextureFunc_cpp1_ii_421ca072':
/tmp/tmpxft_00004bd8_00000000-3_TextureFunc.cudafe1.stub.c:8: undefined reference to `__cudaRegisterLinkedBinary_46_tmpxft_00004bd8_00000000_6_TextureFunc_cpp1_ii_421ca072'
collect2: ld returned 1 exit status
make[2]: *** [src/TextureMain] Error 1
make[1]: *** [src/CMakeFiles/TextureMain.dir/all] Error 2
Questo è ovviamente un errore di collegamento, e probabilmente ha a che fare con il modo in cui compilo il codice utilizzando CMake. Penso che i flag per nvcc abbiano ragione visto che sono riuscito a compilare questo progetto usando un Makefile con gli stessi flag. Tuttavia, non sono sicuro di cos'altro potrei fare male. Ho notato che il messaggio di errore fa riferimento a file .cpp inesistenti, ma non so cosa fare con questo.
Qualsiasi consiglio che può essere dato sarebbe molto apprezzato. Sto usando cmake versione 2.8.8.
Non so molto di CUDA, ma vedo il tuo '-lcudadevrt' nel CUDA_NVCC_FLAGS. E 'l'unica libreria necessaria? Non vedo che venga applicato alla riga di comando del linker, ma quella parte potrebbe semplicemente essere omessa. – metal
@metal Sì, quella bandiera potrebbe essere rimossa. Ho passato un po 'di tempo a cercare problemi di collegamento agli oggetti simili in precedenza e per un problema è stato suggerito di aggiungere questo flag. La bandiera in realtà non ha aiutato affatto. In ogni caso dovrei probabilmente rimuoverlo. –
Bene, sembra chiaro che manchi una libreria CUDA (o la versione sbagliata?). Puoi costruirlo a mano per vedere quali sono le corrette opzioni della riga di comando e poi confrontarlo con ciò che sta usando CMake? – metal