2013-08-16 3 views
9

Ho un progetto che costruisce una libreria e voglio aggiungere un po 'di supporto per cuda ad esso.CMake: come aggiungere cuda al progetto esistente

La struttura è:

| Basedir
| _subdir1
| _subdir2

La struttura di base dei file CMakeLists.txt: (subdir2 non è importante).
in Basedir:

cmake_minimum_required(VERSION 2.6) 
PROJECT(myproject) 
find_package(CUDA) 
INCLUDE_DIRECTORIES(${MYPROJECT_SOURCE_DIR}) 
ADD_SUBDIRECTORY(subdir1) 
ADD_SUBDIRECTORY(subdir2) 

in subdir1:

ADD_LIBRARY(mylib shared 
    file1.cpp 
    file2.cpp 
    file3.cpp 
) 

INSTALL(
TARGETS mylib 
DESTINATION lib 
PERMISSIONS 
    OWNER_READ OWNER_WRITE OWNER_EXECUTE 
    GROUP_READ GROUP_EXECUTE 
    WORLD_READ WORLD_EXECUTE 
) 

FILE(GLOB_RECURSE HEADERS RELATIVE ${MYPROJECT_SOURCE_DIR}/myproject *.h) 

FOREACH(HEADER ${HEADERS}) 
    STRING(REGEX MATCH "(.*)[/\\]" DIR ${HEADER}) 
    INSTALL(FILES ${HEADER} DESTINATION include/myproject/${DIR}) 
ENDFOREACH(HEADER) 

Io in realtà non so davvero come mettere il CUDA-supporto in esso. Voglio sostituire file2.cpp con file2.cu e l'ho fatto, ma non ha creato il file .cu, solo i file cpp.

Devo aggiungere CUDA_ADD_EXECUTABLE() per includere tutti i file cuda? Come faccio a collegarlo agli altri file?

Ho provato ad aggiungere quanto segue alla CMakeLists.txt in subdir1:

CUDA_ADD_EXECUTABLE(cuda file2.cu OPTIONS -arch sm_20) 

che compilerà il file, ma costruire un cuda eseguibile. Come faccio a collegarlo a mylib? Basta con ?:

TARGET_LINK_LIBRARIES(cuda mylib) 

devo ammettere che non sto sperimentato in CMake, ma credo che tu pensato che.

risposta

12

È possibile utilizzare il progetto CUDA_ADD_LIBRARY per mylib. Funziona come CUDA_ADD_EXECUTABLE ma per le librerie.

CUDA_ADD_LIBRARY(mylib SHARED 
    file1.cpp 
    file2.cu 
    file3.cpp 
    OPTIONS -arch sm_20 
) 

TARGET_LINK_LIBRARIES(mylib ${CUDA_LIBRARIES}) 
+0

Grazie per questa soluzione facile! Funziona perfettamente. – nanosto