Le CMakeLists.txt commence comme tout les autres :
1
2
|
project(ProgrammeCuda)
cmake_minimum_required(VERSION 2.8)
|
Ensuite on test si CUDA est bien installer sur le système :
1
|
find_package(CUDA REQUIRED)
|
On affiche les emplacements des librairies et des includes pour vérifier que tout s'est bien passé :
1
2
3
4
5
|
if(${CUDA_FOUND})
message(STATUS "Found headers CUDA : ${CUDA_INCLUDE_DIRS}")
message(STATUS "Found lib CUDA : ${CUDA_LIBRARIES}")
message(STATUS "Found CUDA nvcc : ${CUDA_NVCC_EXECUTABLE}")
endif(${CUDA_FOUND})
|
La différence par rapport à un CMakeLists.txt classique, on doit ajouter des options de compilations pour que NVCC génère des kernels pour différentes architectures, ce qui évite les mauvaises surprises.
1
2
3
4
|
set(CUDA_NVCC_FLAGS -gencode arch=compute_11,code=sm_11 -gencode arch=compute_20,code=sm_20
-gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
-gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50
-gencode arch=compute_50,code=compute_50)
|
Ensutie on créé l'exécutable :
1
|
cuda_add_executable("testCuda" reduce.cu)
|
Ensuite on demande à NVCC de lier le programme aux librairies CUDA :
1
|
target_link_libraries(testCuda ${CUDA_LIBRARIES})
|
Voici le fichier CMakeLists.txt final :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
project(ProgrammeCuda)
cmake_minimum_required(VERSION 2.8)
find_package(CUDA REQUIRED)
if(${CUDA_FOUND})
message(STATUS "Found headers CUDA : ${CUDA_INCLUDE_DIRS}")
message(STATUS "Found lib CUDA : ${CUDA_LIBRARIES}")
message(STATUS "Found CUDA nvcc : ${CUDA_NVCC_EXECUTABLE}")
endif(${CUDA_FOUND})
set(CUDA_NVCC_FLAGS -gencode arch=compute_11,code=sm_11 -gencode arch=compute_20,code=sm_20
-gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35
-gencode arch=compute_37,code=sm_37 -gencode arch=compute_50,code=sm_50)
cuda_add_executable("testCuda" reduce.cu)
target_link_libraries(testCuda ${CUDA_LIBRARIES})
|
|