Bonjour a tous tout d'abord,
je suis en stage la et je dois optimiser un programme (noyau de calcul de modification des orientations atomiques des constituants d'une molecule apres une deformation).
Je ne suis qu'en L2 et mes connaissances en C sont suffisantes... MAIS... J'ai un pb avec du code... Je travaille sur une machine Sun SunBlade 1500 sous Solaris (JE VEUX MON BEAU UBUNTU)...
Voila l'extrait de code original :
On voit bien ici un bel exemple de boucle longue... A lui suel, cet extrait dure 30 minutes environ pour s'executer (Natomes est une variable qui fait dans nos tests 46)...Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /*APPEL DE LinMode => Indicateurs de temps CallLinMode1 et CallLinMode2 */ CallLinMode1 = time(NULL); /*MODIFIE LE 05/04/06*/ printf("CallLinMode1 = %lf\n",CallLinMode1); k = 0; for (j = 0; j < Natomes; j++){ for (i = 0; i <= 2 ;i++) { if (CMOD[j][i] == 1) {/*par defaut on traite tous les modes, plus tard on pourra choisir */ LinMode(Natomes, j, i, k, nj, nk, En, err, dx, nl, gg, D, M); kk[j][i] = k; k = k+1; } } } CallLinMode2 = time(NULL); /*MODIFIE LE 05/04/06*/ printf("CallLinMode2 = %lf\n",CallLinMode2); TEMPS_BOUCLE_LINMODE = difftime(CallLinMode2,CallLinMode1) ; /*MODIFIE LE 05/04/06*/ printf("******************************************\n\n"); printf("temps en s = %lf\n", TEMPS_BOUCLE_LINMODE); printf("temps en min = %lf\n", TEMPS_BOUCLE_LINMODE/60) ; printf("\n\n******************************************\n\n");
Je me suis demande si la longueur venait de la boucle du main ou de la fonction elle-meme :
A mon avis c'est le passage du main qui est en faute... mais comment optimiser ce bout de code... ?Code:
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
53
54
55 void LinMode(int Natomes, int N, int in, int k, int nj, int nk, double En, double err, double *dx,int *nl, int *gg, double **D, double **M) { time_t LM_BEGIN=time(NULL), LM_END ; double eps, *ddx , LM_Duree ; int i, j, n, nn, ii, it; ddx=vec(3 * Natomes); puts("LinMode\n"); eps = 10. * err; it = 3 * Natomes - 6; for (i = 0; i < 3 * Natomes; i++) { dx[i] = 0.; } ii = 3 * nl[N] + in; if (ii == it) { ii = it - 1; } printf("ii=%d\n",ii); dx[ii] = 1.; while (eps > err) { for (i = 0; i < it ; i++) { ddx[i] = dx[i]; if (i != ii) { for (j = 0; j < it ; j++) { if (i != j) { dx[i] += D[i][j] * dx[j]; } } dx[i] = -dx[i] / D[i][i]; } ddx[i] -= dx[i]; } eps = Norme(ddx,it); /* normalisation de ddx pas nécessaire !*/ } En = Energie(Natomes, dx, D); printf("Energie = %f\n",En); for (n = 0; n < Natomes - 3; n++) { nn = 3 * n; ii = gg[n] * 3; M[ii][k] = dx[nn]; M[ii + 1][k] = dx[nn + 1]; M[ii + 2][k] = dx[nn + 2]; } nn = 3 * Natomes - 9; M[3 * nk][k] = dx[nn]; M[3 * nk + 1][k] = dx[nn + 1]; M[3 * nj][k] = dx[nn + 2]; M[3 * Natomes][k] = En; M[3 * Natomes + 1][k] = 3 * N + in; LM_END=time(NULL) ; LM_Duree=difftime(LM_END,LM_BEGIN) ; printf(" Duree (en secondes) d'execution pour cet appel = %lf\n", LM_Duree) ; }
De toute facon, la suite de mon stage consistera a passer sur super calculateur et/ou machine parallele mais bon autant d'abord optimiser l'algo !
Si vous avez une idee, contactez-moi svp...