Bonjour,
Je suis en train de découvrir les multithreads. J'ai donc récupérer un exemple de Intel :
Je compile sous linux (gcc main.c -o main -lpthread) et je teste les performances avec la commande time ./main : 29,01s user 0,00s system 198% cpu 14,611 totalCode:
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 #include <stdio.h> #include <pthread.h> #define INTERVALS 1000000000 #define THREADS 2 float global_sum = 0.0; pthread_mutex_t global_lock = PTHREAD_MUTEX_INITIALIZER; void *pi_calc (void *num); int main () { pthread_t tid[THREADS]; int i, t_num[THREADS]; for (i = 0; i < THREADS; i++) { t_num[i] = i; pthread_create (&tid[i], NULL, pi_calc, &t_num[i]); } for (i = 0; i < THREADS; i++) pthread_join (tid[i], NULL); printf ("Pi = %f\n", global_sum); } void *pi_calc (void *num) { int i, myid, start, end; float h, x, my_sum = 0.0; myid = *(int *)num; h = 1.0 / INTERVALS; start = (INTERVALS / THREADS) * myid; end = start + (INTERVALS / THREADS); for (i = start; i < end; i++) { x = h * ((float)i - 0.5); my_sum += 4.0 / (1.0 + x * x); } pthread_mutex_lock (&global_lock); global_sum += my_sum; pthread_mutex_unlock (&global_lock); }
Le CPU travaille à 198% pendant 14.6 secondes : normal, processeur Dual Core.
Afin de vérifier l'efficacité du Multithreading, je modifie le programme pour qu'il lance les 2 fonctions l'une après l'autre :
Je relance time : 14,49s user 0,00s system 99% cpu 14,490 totalCode:
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 #include <stdio.h> #define INTERVALS 1000000000 #define THREADS 2 float global_sum = 0.0; void *pi_calc (void *num); int main () { int i, t_num[THREADS]; for (i = 0; i < THREADS; i++) { t_num[i] = i; pi_calc(&t_num[i]); } printf ("Pi = %f\n", global_sum); } void *pi_calc (void *num) { int i, myid, start, end; float h, x, my_sum = 0.0; myid = *(int *)num; h = 1.0 / INTERVALS; start = (INTERVALS / THREADS) * myid; end = start + (INTERVALS / THREADS); for (i = start; i < end; i++) { x = h * ((float)i - 0.5); my_sum += 4.0 / (1.0 + x * x); } global_sum += my_sum; }
Le CPU travaille à 99% pendant 14.5 secondes.
En fait, ce qui me perturbe c'est que la version multithread a la même vitesse d'exécution que la version utilisant un seul processeur. Normalement, la version multithread devrait être 2 fois plus rapide que l'autre.
Est-ce que quelqu'un sait pourquoi il y a ce problème ?
Merci
Mr Bonheur