Bonjour à tous, je reviens encore avec un problème de performance d'un programme que je développe en multithread à l'aide de la librairie boost_thread.
Dans ce programme je lance un thread_group de cette façon là :
avec la fonction fonc_matr qui est égale à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for(i=0;i<nbr_proc;i++){ group.create_thread(boost::bind(fonc_matr,i)); } group.join_all();
La donnée nbr_proc est une variable globale que je change selon mes tests. Si elle est de un, un seul thread est créé, sinon plusieurs.
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 void fonc_matr(int num){ long lig,col,siz,siz_2,deb,fin; siz=lis.size(); siz_2=siz-(siz%nbr_proc); deb=(siz_2/nbr_proc)*num; if(num+1!=nbr_proc){ fin=(siz_2/nbr_proc)*(num+1); }else{ fin=siz; } minm3[num]=inf; for(lig=deb;lig<fin;lig++){ for(col=0;col<siz;col++){ if(arc(lis[lig],lis[col])){ Matr[lig][col]=lis[col].cout; Matr2[lig][col]=lis[col].cout; if((minm3[num]==inf)||(minm3[num]>lis[col].cout)){ minm3[num]=lis[col].cout; } }else{ Matr[lig][col]=inf; Matr2[lig][col]=inf; } } if(fin-deb<100){ cerr <<"calcul matrice " << nummatr << ", thread "<< num+1 << "/" << nbr_proc << " : " << ((lig-deb)*100)/(fin-deb)<<"%" << endl; }else{ if(lig%((int)(fin/100))==0){ cerr <<"calcul matrice " << nummatr << ", thread "<< num+1 << "/" << nbr_proc << " : " << ((lig-deb)*100)/(fin-deb)<<"%" << endl; } } } cerr <<"calcul matrice, thread "<< num+1 << "/" << nbr_proc << " : terminé " <<endl; }
Mon problème est qu'en multithread, j'ai l'impression que les performances que j'obtiens ne sont pas celles auxquelles je pourrais m'attendre.
Pour vous donner une idée j'obtiens ceci dans le visionneur de ressource en mono thread, ce qui me parait correcte :
et voici ce que j'obtiens en multi :
Dans ces graphiques, le carré en haut à gauche signal la charge CPU user des 4 procs, en haut à droite, la charge CPU system, en bas à gauche, la charge CPU inactive.
Ma question est la suivante, est-ce que ça vous parait logique qu'en multi les procs ne soient pas à 100% de charge comme le proc unique qui tourne en monothread?
Au vu de ces informations et du code, pensez vous que je me sois planté quelque part dans la programmation ?
Merci pour ceux qui auront le courage d'avoir lu jusque là, en attendant vos réponses avisées.
Partager