5.1 Calculer le temps que va mettre notre fonction

Dans notre exemple, nous voulons avoir une bonne précision du calcul du temps mis par notre multiplication de matrice, donc nous n'allons pas utiliser clock ou clock_gettime mais une fonction maison, qui nous renverra le nombre de cycle écoulé depuis le début du programme. Il faudra ensuite soustraire les dates de début et de fin du calcul pour avoir le nombre de cycles total.

Voici la fonction :

1
extern uint64_t rdtsc(void);

Et le corps de la fonction :

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef __i386
extern uint64_t rdtsc(void) {
	uint64_t x;
	__asm__ volatile ("rdtsc" : "=A" (x));
	return x;
}
#elif defined __amd64
extern uint64_t rdtsc(void) {
	uint64_t a, d;
	__asm__ volatile ("rdtsc" : "=a" (a), "=d" (d));
	return (d<<32) | a;
}
#endif

Qui diffère en 32 et en 64 bits.

Je vous conseil de faire plusieurs fichiers :

  • calcul.h : Ou on définira les fonctions de calcul et rdtsc
  • calcul.c : On on implémentera les fonctions de calcul.h
  • main.c : qui appellera ces fonctions, et calculera le temps d'exécution
  • CMakeLists.txt : car nous allons faire deux compilations séparées, donc on se simplifie la vie avec CMake