7.1.1.4.1 : Le CMakeLists.txt
Commençons par tester si on peut utiliser nvc++. Comme il est dans le HPC_SDK, l'utilisateur doit définir une variable d'environnement NVCPP pour l'activer noteEn ce qui me concerne export NVCPP="/opt/nvidia/hpc_sdk/Linux_x86_64/22.11/compilers/bin/nvc++" :
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 5 6 |
set(COMPILATION_FLAGS "-stdpar=gpu -O2 -Wall -std=c++23") #set(COMPILATION_FLAGS "-O2 -Wall -std=c++23") set(CMAKE_CXX_LINK_FLAGS "-stdpar=gpu -O2 -Wall -std=c++23") else() message(STATUS "Use default compiler ${CMAKE_CXX_COMPILER}") |
On ajoute quelques flags de compilation (sans -stdpar qui est spécifique à nvc++) :
1 2 3 |
set(COMPILATION_FLAGS "-O2 -Wall -std=c++23") set(EXTRA_DEPENDENCIES TBB::tbb) endif() |
Définissons le nombre d'év
1 2 |
add_definitions(-DNB_PIXEL=2048 -DNB_SLICE=40) set(CONFIG_NB_EVENT "64, 128, 256, 512, 1024, 2048") #, 3072, 4992, 10048 |
Notre test classique :
1 |
phoenix_compileAndRunExample(calibration_nvcpp_O2 "${COMPILATION_FLAGS}" "${CONFIG_NB_EVENT}" main.cpp) |
Une variante qui ne calcule le modulo qu'une seule fois :
1 |
phoenix_compileAndRunExample(calibration_nvcpp_O2_precomputed_modulo "${COMPILATION_FLAGS}" "${CONFIG_NB_EVENT}" main_precompute_modulo.cpp) |
Une variante qui utilise std::views::repeat qui permet de broadcaster les données de calibration :
1 |
phoenix_compileAndRunExample(calibration_nvcpp_O2_repeat "${COMPILATION_FLAGS}" "${CONFIG_NB_EVENT}" main_repeat.cpp) |
Une variante qui utilise std::views::repeat qui permet de broadcaster les données de calibration :
1 2 3 4 5 6 7 8 |
phoenix_compileAndRunExample(calibration_nvcpp_O3_repeat_vectorize "${COMPILATION_FLAGS} -ftree-vectorize -march=native -mtune=native" "${CONFIG_NB_EVENT}" main_repeat.cpp) phoenix_plotPerf("calibrationBaseNvcpp" calibration_nvcpp_O2 calibration_nvcpp_O2_precomputed_modulo calibration_nvcpp_O2_repeat calibration_nvcpp_O3_repeat_vectorize ) |
Le fichier CMakeLists.txt complet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
if(DEFINED ENV{NVCPP}) message(STATUS "Use nvc++ compiler at $ENV{NVCPP}") set(CMAKE_CXX_COMPILER $ENV{NVCPP}) set(COMPILATION_FLAGS "-stdpar=gpu -O2 -Wall -std=c++23") #set(COMPILATION_FLAGS "-O2 -Wall -std=c++23") set(CMAKE_CXX_LINK_FLAGS "-stdpar=gpu -O2 -Wall -std=c++23") else() message(STATUS "Use default compiler ${CMAKE_CXX_COMPILER}") set(COMPILATION_FLAGS "-O2 -Wall -std=c++23") set(EXTRA_DEPENDENCIES TBB::tbb) endif() add_definitions(-DNB_PIXEL=2048 -DNB_SLICE=40) set(CONFIG_NB_EVENT "64, 128, 256, 512, 1024, 2048") #, 3072, 4992, 10048 phoenix_compileAndRunExample(calibration_nvcpp_O2 "${COMPILATION_FLAGS}" "${CONFIG_NB_EVENT}" main.cpp) phoenix_compileAndRunExample(calibration_nvcpp_O2_precomputed_modulo "${COMPILATION_FLAGS}" "${CONFIG_NB_EVENT}" main_precompute_modulo.cpp) phoenix_compileAndRunExample(calibration_nvcpp_O2_repeat "${COMPILATION_FLAGS}" "${CONFIG_NB_EVENT}" main_repeat.cpp) phoenix_compileAndRunExample(calibration_nvcpp_O3_repeat_vectorize "${COMPILATION_FLAGS} -ftree-vectorize -march=native -mtune=native" "${CONFIG_NB_EVENT}" main_repeat.cpp) phoenix_plotPerf("calibrationBaseNvcpp" calibration_nvcpp_O2 calibration_nvcpp_O2_precomputed_modulo calibration_nvcpp_O2_repeat calibration_nvcpp_O3_repeat_vectorize ) |