Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/07/2014, à 14:44

cjobic

Ralentissement d'un programme

Bonjour à tous.

Développant un programme me permettant de calculer la FFT d'une image pour l'enregistrer dans un fichier, je me suis aperçu d'une chose surprenante.
Lorsque je lance le programme en ne calculant que la FFT, celui-ci s'execute en moins d'une seconde.
En revanche, si je demande au programme d'utiliser le tableau ainsi créé, ou d'écrire directement le résultat de ces calculs dans un fichier, le programme devient extraordinairement lent.

Avez-vous déjà été confronté à un problème similaire ?

Bonne journée !

Voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tgmath.h>

#define pixelx 600
#define pixely 600




int main(void){
float tab[pixelx][pixely];
float tf_tab[pixelx][pixely];
float sum;
int i,j,i1,j1;



// On lit l'image d'origine
FILE* image=fopen("image.txt","r");

for(i=0;i<pixely;i++){
	for(j=0;j<pixelx;j++){
		fscanf(image,"%f",&tab[j][i]);
	}while(fgetc(image)!='\n');
}while(fgetc(image)!=EOF);
fclose(image);




//On calcule la FFT de l'image
float prefM=2*3.14159/((float)pixelx);
float prefN=2*3.14159/((float)pixely);
float diff,cos_value,tab_value;

for(i1=0;i1<pixelx;i1++){
printf("%d\n",i1);
	for(j1=0;j1<pixely;j1++){
	 sum=0;
	//printf("test %d\n",j1);
		for(i=0;i<pixelx;i++){
			for(j=0;j<pixely;j++){
			diff=prefM*(float)i*(float)i1-prefN*(float)j*(float)j1;
			cos_value=cos(diff);
			tab_value=tab[i][j];
			sum=sum+cos_value*tab_value;
			}
		}
	tf_tab[i1][j1]=sum;
	}
		
}


//On enregistre la FFT créée
FILE* resultat=fopen("fft.txt","w");
for(i1=0;i1<pixelx;i1++){
	for(j1=0;j1<pixely;j1++){
		fprintf(resultat,"%g\t",tf_tab[i1][j1]);
	}
	fprintf(resultat,"\n");
}
fclose(resultat);


exit(EXIT_SUCCESS);
}

Hors ligne

#2 Le 13/07/2014, à 14:58

louis94

Re : Ralentissement d'un programme

Bonjour,

Dans quelle partie du code ton programme est-il lent ? Utilise des printf() pour savoir où il en est. Si ton image est grande, il est possible que l'enregistrement prenne du temps. La précision des flottants peut entraîner l'écriture d'un fichier nettement plus grand que celui lu initialement.

Ce n'est pas vraiment une solution, mais peut-être que le compilateur peut optimiser ton programme : essaye de compiler avec

gcc -O4

Louis

Hors ligne

#3 Le 13/07/2014, à 15:05

cjobic

Re : Ralentissement d'un programme

Merci Louis pour la réponse. Enfait, lorsque je calcule le tableau tf_tab sans utiliser dans la suite du programme ses valeurs, le programme tourne correctement. En revanche, si par la suite, j'utilise ce tableau ou l'une de ses valeurs, avec fprintf par exemple pour l'enregistrer dans un fichier, c'est l'intégralité du programme qui est lent. Rien que le calcul du tableau prend dans ces conditions plus de 10 min. Et je ne comprend pas pourquoi le fait d'utiliser le tableau une fois que celui-ci est calculé, à un impact sur le temps nécessaire pour calculer au préalable ce même tableau.

Après avoir testé ta solution, celle-ci n'a malheureusement aucun effet.

Hors ligne

#4 Le 13/07/2014, à 15:09

louis94

Re : Ralentissement d'un programme

Une possibilité est que GCC détecte quand le tableau n'est pas utilisé. Et se dit qu'il est totalement idiot de le calculer pour rien.

Louis

Hors ligne

#5 Le 13/07/2014, à 15:25

cjobic

Re : Ralentissement d'un programme

D'accord. Je vais donc être condamné à patienter le temps qu'il faut pour que le programme se termine

Hors ligne

#6 Le 13/07/2014, à 19:41

telliam

Re : Ralentissement d'un programme

Salut,
Ton tableau prend bcp de place en pile, tu devrais le déclarer en static. L'écriture dans un fichier est couteuse, d'autant plus que tu écris valeur après valeur. Il vaudrait mieux ecrire par blocs de valeurs ou utiliser une autre fonction d'ecriture.


"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard

Hors ligne