Bonjour, j'ai deux versions d'un prgm : une version séquentielle et une version en utilisant les threads. Mon pb est que le temps de calcul est un tout petit plus long en utilisant les threads... ce qui n'est pas super (sur mon PC, j'ai deux bi-processeurs). Savez-vous d'où pourrait venir cette lenteur ? D'autant plus que lorsque je fait un "top" dans mon shell, je vois que la valeur de Cpu(s) oscille entre 31% et 36 % (avec les thread et en séquentiel). Bref, j'ai l'impression que mon pgrm ne se parallélise pas. Voici un extrait de mon code avec les thread (je n'ai pas de mutex car les différentes tâches ne partagent pas de données) :
et dans la fonction main() j'ai
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52 typedef struct { CVodeMem cvode_mem; N_Vector y; double t; double tout; unsigned int nbpar; /* number of the particle */ double rpm6; /* 6 * rotation per minute */ } Integ; void CreateInteg(void * cvode_mem,N_Vector y,double t,double tout,unsigned int nbpar,double rpm6,Integ * integ) { integ->cvode_mem=(CVodeMem) cvode_mem; integ->y=y; integ->t=t; integ->tout=tout; integ->nbpar=nbpar; integ->rpm6=rpm6; } void * Integration(void * p) { if(p==NULL) { fprintf(stderr,"Error in %s %u : p == NULL\n",__FILE__,__LINE__); exit(EXIT_FAILURE); } else { Integ * pInteg=(Integ * ) p; CVodeMem pcvode_mem=pInteg->cvode_mem; int flag; flag=CVodeReInit(pInteg->cvode_mem,pcvode_mem->cv_f,pInteg->t,pInteg->y,CV_SV,pcvode_mem->cv_reltol,pcvode_mem->cv_Vabstol); if(flag!=CV_SUCCESS) { fprintf(stderr,"Error in %s %d : CVodeReInit() failed at theta = %f for the particle %d. Exit program\n",__FILE__,__LINE__,pInteg->rpm6*pInteg->t-180.,pInteg->nbpar); exit(EXIT_FAILURE); } flag = CVode(pInteg->cvode_mem, pInteg->tout,pInteg-> y, &pInteg->t,CV_NORMAL); if (check_flag(&flag, "CVode", 1)) { fprintf(stderr,"Error in %s : %d : CVode failed at theta = %g for the particle %d\nExit program\n",__FILE__,__LINE__,pInteg->rpm6*pInteg->t-180.,pInteg->nbpar); exit(EXIT_FAILURE); } return NULL; } }
remarque : j'ai utilisé la fonction pthread_join() car je dois effectuer toutes les tâches avant de faire ma "turbulence". Devrais-je utiliser à la place des thread avec condition (pthread_cond_signal et pthread_cond_wait) ?
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
39
40
41 pthread_t task[N]; Integ * integ=malloc(N*sizeof(*integ)); if(integ==NULL) { MEMERROR; exit(EXIT_FAILURE); } while(tout<tfin) { //printf("theta = %f\n",e->rpm6*tout-180.); for(i=0;i<N;++i) /* loop on particles */ { CreateInteg(cvode_mem[i],y[i],t[i],tout,i,e->rpm6,&integ[i]); pthread_create(&task[i], NULL, Integration, &integ[i]); t[i]=tout; pthread_join (task[i], NULL); } /* end of for(i=0;i<N;++i) */ /**** Turbulence *****/ for(j=0;j<neq;++j) { aux3=0.; for(k=0;k<N;++k) aux3+=Ith(y[k],j); for(k=0;k<N;++k) Ith(y[k],j)=Ith(y[k],j)*aux1+aux3*aux2; } fPrintOutput(fileOutput,tout,y,N,e,mec); tout += dt; } /* end of while(tout<tfin) */
Merci.
Partager