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
)
Le fichier CMakeLists.txt est disponible ici.