Bonjour,

Je suis en train de découvrir les multithreads. J'ai donc récupérer un exemple de Intel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
}
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 total
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
}
Je relance time : 14,49s user 0,00s system 99% cpu 14,490 total
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