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.