5.6.5 : Le fichier main.cpp

Développons le main.cpp :

Pour afficher les résultats :
1
#include <iostream>


Notre chonomètre :
1
#include "timer.h"


Notre produit de Hadamard :
1
#include "hadamard_product.h"


La fonction principale du programe :
1
int main(int argc, char** argv){


Définissons le nombre d'éléments et le nombre d'appels du calcul par défaut :
1
	size_t nbElement(100000000), nbCallPerTest(10000lu);


Ensuite, nous prennons en compte les éventuels arguments passés au programme, le nombre d'élément tout seul, ou le nombre d'éléments suivit du nombre de d'appels :
1
2
3
4
5
6
7
	if(argc == 2){
		nbElement = atol(argv[1]);
	}else if(argc == 3){
		nbElement = atol(argv[1]);
		nbCallPerTest = atol(argv[2]);
	}
	std::cout << "Perform test with " << nbElement << " elements and "<< nbCallPerTest << " repetitions" << std::endl;


Déclaration et initialisation de nos tableaus de test :
1
2
3
4
5
6
	std::vector<float> tabX, tabY, tabRes;
	tabRes.resize(nbElement);
	for(size_t i(0lu); i < nbElement; ++i){
		tabX.push_back(i*19lu%11);
		tabY.push_back(i*27lu%19);
	}


Résultat et lancement du chronomètre :
1
2
	float res(0.0f);
	HiPeTime beginTime = phoenix_getTime();


Répétition du nombre de calcul
1
2
3
4
	for(size_t i(0lu); i < nbCallPerTest; ++i){
		hadamard_product(tabRes, tabX, tabY);
		res += tabRes[0];
	}


Arrêt du chronomètre :
1
	NanoSecs elapsedTime(phoenix_getTime() - beginTime);


Calcul du temps par test :
1
	double fullNs(elapsedTime.count()/((double)nbCallPerTest));


Affichage des résultats :
1
2
	std::cerr << "timing\t" << nbElement << "\t" << fullNs << std::endl;
	std::cout << "x = " << tabX.front() << ", y = " << tabY.front() << ", tabRes = " << tabRes.front() << ", res = "<< res << ", nbElement = "<<nbElement<<", elapsedTime " << fullNs << std::endl;


Fin de la fonction principale :
1
2
	return 0;
}


Le fichier main.cpp 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
/***************************************
	Auteur : Pierre Aubert
	Mail : pierre.aubert@lapp.in2p3.fr
	Licence : CeCILL-C
****************************************/
#include <iostream>
#include "timer.h"
#include "hadamard_product.h"
int main(int argc, char** argv){
	size_t nbElement(100000000), nbCallPerTest(10000lu);
	if(argc == 2){
		nbElement = atol(argv[1]);
	}else if(argc == 3){
		nbElement = atol(argv[1]);
		nbCallPerTest = atol(argv[2]);
	}
	std::cout << "Perform test with " << nbElement << " elements and "<< nbCallPerTest << " repetitions" << std::endl;
	std::vector<float> tabX, tabY, tabRes;
	tabRes.resize(nbElement);
	for(size_t i(0lu); i < nbElement; ++i){
		tabX.push_back(i*19lu%11);
		tabY.push_back(i*27lu%19);
	}
	float res(0.0f);
	HiPeTime beginTime = phoenix_getTime();
	for(size_t i(0lu); i < nbCallPerTest; ++i){
		hadamard_product(tabRes, tabX, tabY);
		res += tabRes[0];
	}
	NanoSecs elapsedTime(phoenix_getTime() - beginTime);
	double fullNs(elapsedTime.count()/((double)nbCallPerTest));
	std::cerr << "timing\t" << nbElement << "\t" << fullNs << std::endl;
	std::cout << "x = " << tabX.front() << ", y = " << tabY.front() << ", tabRes = " << tabRes.front() << ", res = "<< res << ", nbElement = "<<nbElement<<", elapsedTime " << fullNs << std::endl;
	return 0;
}


Le fichier main.cpp est disponible ici.