Bonjour a tous,
Je sollicite votre aide car je me retrouve bloquee et malgre de nombreuses recherches sur le net, je n'ai rien trouve qui puisse resoudre mon probleme.
Je cherche a realiser un pti code tout simple mettant en oeuvre le calcul du produit d'une matrice carree et d'un vecteur (de flottants) et le temps d'execution. Seulement, j'ai quelques imperatifs :
ne faire qu'un seul gros malloc pour la matrice et les 2 vecteurs.
faire varier la taille des matrices et vecteurs, pour pouvoir etudier l'evolution des performances.
Je repete egalement le calcul un certain nb de fois pour rendre le timer pertinent.
Voici le code :
Je fais 2 fichiers car je les compile avec des options d'optimisation differentes.
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 #include <sys/time.h> #include <stdlib.h> #include <stdio.h> #include <math.h> int N; int main(void) { int j,k,l; double* tab; struct timeval t1; struct timeval t2; struct timezone tz1; long int diff; for (l=1;l<=1100;l+=2){ fflush(stdin); N = l; tab = malloc((N+2)*N*sizeof(double)); /* initialisation des tableaux */ for (j=0; j<(N+1)*N; j++) { tab[j]=drand48(); } /* appel de la routine */ gettimeofday(&t1,&tz1); for (k=0;k<10000;k++) { routine(tab,tab+(N*N),tab+(N+1)*N); } gettimeofday(&t2,&tz1); diff = (t2.tv_sec-t1.tv_sec) * 1000000 +((t2.tv_usec) - (t1.tv_usec)); printf("%d;%d\n", N, diff); } } #include <stdlib.h> #include <stdio.h> extern int N; void routine(double A[], double B[], double C[]){ int i,j; for(i=0;i<N;i++) { for (j=0; j<N; j++) { C[i] = C[i] + A[(i*N)+j] * B[j]; } } }
Le probleme est que le programme n'arrive pas jusqu'a la fin : il se termine automatiquement a la moitie de l'execution. De plus, il met plus d'une heure a le faire du coup les MFLOPS obtenues sont tres insatisfaisants par rapport a l'architecture du processeur.
Avez-vous une petite idee de ce qui cloche dans mon programme ?
Merci d'avance pour votre aide ! ;-)
Partager