8.1.2 : Le CMakeLists.txt

Définition notre projet :
1
2
project(CURANDReduce)
cmake_minimum_required(VERSION 3.0)


Il faut utiliser le CMAKE_PREFIX_PATH et non le CMAKE_MODULE_PATH pour une raison qui m'échappe. En ce qui me concerne : export NVHPC_CMAKE_MODULES=/opt/nvidia/hpc_sdk/Linux_x86_64/22.11/cmake/ :
1
set(CMAKE_PREFIX_PATH "$ENV{NVHPC_CMAKE_MODULES}")


L'utilisation n'est pas trivial, mais la doc est assez complete : Donc on utilise HOSTUTILS pour les includes
1
find_package(NVHPC REQUIRED COMPONENTS HOSTUTILS MATH CUDA thrust)


On peut aussi utiliser nvc++, mais ce n'est pas obligé
1
2
3
4
if(DEFINED ENV{NVCPP})
	message(STATUS "Use nvc++ compiler at $ENV{NVCPP}")
	set(CMAKE_CXX_COMPILER $ENV{NVCPP})
	


On ajoute quelques flags de compilation (le fameux -stdpar, une option d'optimisation basique, les warnings et l'activation de C++20) :
1
2
3
4
	set(CMAKE_CXX_FLAGS "-stdpar=gpu -O2 -Wall -std=c++20")
else()
	message(FATAL_ERROR "Cannot use a default compiler because we are mixing CURAND and -stdpar=gpu")
endif()


Puis on créer notre exécutable, et on link aux bibliothèques (CURAND est dans NVHPC::MATH) :
1
2
add_executable(test_curand_reduce main.cpp)
target_link_libraries(test_curand_reduce PRIVATE NVHPC::MATH NVHPC::CUDART)


Le CMakeLists.txt complet :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
project(CURANDReduce)
cmake_minimum_required(VERSION 3.0)
set(CMAKE_PREFIX_PATH "$ENV{NVHPC_CMAKE_MODULES}")
find_package(NVHPC REQUIRED COMPONENTS HOSTUTILS MATH CUDA thrust)

if(DEFINED ENV{NVCPP})
	message(STATUS "Use nvc++ compiler at $ENV{NVCPP}")
	set(CMAKE_CXX_COMPILER $ENV{NVCPP})
		set(CMAKE_CXX_FLAGS "-stdpar=gpu -O2 -Wall -std=c++20")
else()
	message(FATAL_ERROR "Cannot use a default compiler because we are mixing CURAND and -stdpar=gpu")
endif()
add_executable(test_curand_reduce main.cpp)
target_link_libraries(test_curand_reduce PRIVATE NVHPC::MATH NVHPC::CUDART)


On ne peut pas autoriser la compilation sans -stdpar=gpu car sinion le pointeur GPU que l'on passe à curandGenerateNormal ne serait pas reconnu, e qui donnerait un segmentation fault, ou dans le meilleur des cas, une erreur de compilation.


Le fichier CMakeLists.txt est disponible ici.