3.2.4 : CMakeLists.txt
Écrivons le fichier CMakeLists.txt :
On commence par définir le projet :
1 2 |
project(PERFORMANCE_WITH_NAN) cmake_minimum_required(VERSION 3.0) |
Ensuite, on inclue les macros que l'on vient d'écrire :
1 |
include(multiplePerfTest.cmake)
|
On définie les différentes tailles de vecteurs qui seront les différents points de nos graphes (attention à avoir des multiples de 8 pour que les tests en fonctions intrisèques se passent bien) :
1 |
set(CONFIG_HADAMARD_PRODUCT "512, 1024, 2048, 2664, 4096, 5008, 10000") |
Définissions ce qu'est un NaN (qui se signal) :
1 |
set(NAN_DEF "std::numeric_limits<float>::signaling_NaN()") |
Définissions ce qu'est un infini :
1 |
set(INF_DEF "std::numeric_limits<float>::infinity()") |
Définissons un nombre dénormalisé :
1 |
set(DENORM_DEF "std::numeric_limits<float>::denorm_min()") |
Testons avec le plus petit nombre possible (si on le multiplie par lui même il sera dénormalisé) :
1 |
set(MIN_TO_DENORM_DEF "std::numeric_limits<float>::min()") |
Voici les trois sources de base pour tous les tests de performances de cette partie :
1 2 3 |
set(HADAMARD_PRODUCT_BASE_SRC hadamard_product_base.cpp main_generic.cpp) set(HADAMARD_PRODUCT_VECTORIZE_SRC hadamard_product_vectorize.cpp main_generic.cpp) set(HADAMARD_PRODUCT_INTRINSICS_SRC hadamard_product_intrinsics.cpp main_generic.cpp) |
Créons les tests de références :
1 2 3 |
multiplePerfTest("hadamardProductBase" hadamard_product base "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTest("hadamardProductVectorize" hadamard_product vectorize "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTest("hadamardProductIntrinsics" hadamard_product intrinsics "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
Nous pouvons également ajouter des graphes (mais il faut faire attention au nom des programmes que l'on compoare) :
1 2 |
phoenix_plotPerf("cmpHadamardProductSafe03" hadamard_product_base_O3 hadamard_product_vectorize_O3 hadamard_product_intrinsics_O3) phoenix_plotPerf("cmpHadamardProductSafe0fast" hadamard_product_base_Ofast hadamard_product_vectorize_Ofast hadamard_product_intrinsics_Ofast) |
Testons avec des NaN :
1 2 3 4 5 6 7 8 |
multiplePerfTestValue("hadamardProductBaseNanO3" hadamard_product base nan -O3 "${NAN_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeNanO3" hadamard_product vectorize nan -O3 "${NAN_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinsicsNanO3" hadamard_product intrinsics nan -O3 "${NAN_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
Testons avec des Inf :
1 2 3 4 5 6 7 8 |
multiplePerfTestValue("hadamardProductBaseInfO3" hadamard_product base inf -O3 "${INF_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeInfO3" hadamard_product vectorize inf -O3 "${INF_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinsicsInfO3" hadamard_product intrinsics inf -O3 "${INF_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
Testons avec des nombres dénormalisés :
1 2 3 4 5 6 7 8 |
multiplePerfTestValue("hadamardProductBaseDenormO3" hadamard_product base denorm -O3 "${DENORM_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeDenormO3" hadamard_product vectorize denorm -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinicsDenormO3" hadamard_product intrinsics denorm -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
Essayons de régler le problème avec des nombres dénormalisés :
1 2 3 4 5 6 7 8 |
multiplePerfTestValue("hadamardProductBaseDenormDazO3" hadamard_product base denormDaz -O3 "${DENORM_DEF}" "${DENORM_DAZ_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeDenormDazO3" hadamard_product vectorize denormDaz -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION} ${DENORM_DAZ_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinicsDenormDazO3" hadamard_product intrinsics denormDaz -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION} ${DENORM_DAZ_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
Voyons ce qu'il se passe lorsque le calcul produit des nombres dénormalisés :
1 2 3 4 5 6 7 8 |
multiplePerfTestValue("hadamardProductBaseMakeDenormO3" hadamard_product base make_denorm -O3 "${MIN_TO_DENORM_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeMakeDenormO3" hadamard_product vectorize make_denorm -O3 "${MIN_TO_DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinicsMakeDenormO3" hadamard_product intrinsics make_denorm -O3 "${MIN_TO_DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
project(PERFORMANCE_WITH_NAN) cmake_minimum_required(VERSION 3.0) include(multiplePerfTest.cmake) set(CONFIG_HADAMARD_PRODUCT "512, 1024, 2048, 2664, 4096, 5008, 10000") set(NAN_DEF "std::numeric_limits<float>::signaling_NaN()") set(INF_DEF "std::numeric_limits<float>::infinity()") set(DENORM_DEF "std::numeric_limits<float>::denorm_min()") set(MIN_TO_DENORM_DEF "std::numeric_limits<float>::min()") set(HADAMARD_PRODUCT_BASE_SRC hadamard_product_base.cpp main_generic.cpp) set(HADAMARD_PRODUCT_VECTORIZE_SRC hadamard_product_vectorize.cpp main_generic.cpp) set(HADAMARD_PRODUCT_INTRINSICS_SRC hadamard_product_intrinsics.cpp main_generic.cpp) multiplePerfTest("hadamardProductBase" hadamard_product base "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTest("hadamardProductVectorize" hadamard_product vectorize "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTest("hadamardProductIntrinsics" hadamard_product intrinsics "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) phoenix_plotPerf("cmpHadamardProductSafe03" hadamard_product_base_O3 hadamard_product_vectorize_O3 hadamard_product_intrinsics_O3) phoenix_plotPerf("cmpHadamardProductSafe0fast" hadamard_product_base_Ofast hadamard_product_vectorize_Ofast hadamard_product_intrinsics_Ofast) multiplePerfTestValue("hadamardProductBaseNanO3" hadamard_product base nan -O3 "${NAN_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeNanO3" hadamard_product vectorize nan -O3 "${NAN_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinsicsNanO3" hadamard_product intrinsics nan -O3 "${NAN_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) multiplePerfTestValue("hadamardProductBaseInfO3" hadamard_product base inf -O3 "${INF_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeInfO3" hadamard_product vectorize inf -O3 "${INF_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinsicsInfO3" hadamard_product intrinsics inf -O3 "${INF_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) multiplePerfTestValue("hadamardProductBaseDenormO3" hadamard_product base denorm -O3 "${DENORM_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeDenormO3" hadamard_product vectorize denorm -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinicsDenormO3" hadamard_product intrinsics denorm -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) multiplePerfTestValue("hadamardProductBaseDenormDazO3" hadamard_product base denormDaz -O3 "${DENORM_DEF}" "${DENORM_DAZ_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeDenormDazO3" hadamard_product vectorize denormDaz -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION} ${DENORM_DAZ_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinicsDenormDazO3" hadamard_product intrinsics denormDaz -O3 "${DENORM_DEF}" "${VECTORIZED_OPTION} ${DENORM_DAZ_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) multiplePerfTestValue("hadamardProductBaseMakeDenormO3" hadamard_product base make_denorm -O3 "${MIN_TO_DENORM_DEF}" "" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_BASE_SRC}) multiplePerfTestValue("hadamardProductVectorizeMakeDenormO3" hadamard_product vectorize make_denorm -O3 "${MIN_TO_DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_VECTORIZE_SRC}) multiplePerfTestValue("hadamardProductIntrinicsMakeDenormO3" hadamard_product intrinsics make_denorm -O3 "${MIN_TO_DENORM_DEF}" "${VECTORIZED_OPTION}" "${CONFIG_HADAMARD_PRODUCT}" ${HADAMARD_PRODUCT_INTRINSICS_SRC}) |
Vous pouvez le télécharger ici.
Il n'a fallu que quelques lignes pour créer tous les tests dont nous avons besoin.