7.3 Le fichier CMakeLists.txt

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})

#on prend en compte plusieurs architectures différentes pour que le programme compile sur plusieurs systèmes différents
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})