Programmazione.it v6.2
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Chat Forum
Programmazione parallela: generare un frattale di Mandelbrot con Deino MPI (2/3)
Scritto da Francesco Carotenuto il 09-02-2010 ore 09:08
La generazione dei punti di una bitmap appartenenti all'insieme di Mandelbrot, è un problema facilmente parallelizzabile, poiché il calcolo di un singolo punto è del tutto indipendente dagli altri punti.

Così come mostrato dal seguente codice, che sarà la base della nostra soluzione, e che calcola n righe di immagine a partire dalla riga ydisp. Oltre a tale parametri, serviranno anche la risoluzione orizzontale e verticale espressa da hxres e hyres e il numero massimo di iterazioni, espresso dal parametro itermax e da magnify che rappresenterebbe lo zoom da applicare all'immagine.
  1. ...
  2. RGBApixel** mandelbrot(int hxres, int hyres, int itermax, double magnify,int nrows, int ydisp){
  3.  
  4. 		double x,xx,y,cx,cy;
  5. 		int iteration,hx,hy;	
  6.  
  7.  
  8. 		RGBApixel** ret=createBuffer(hxres,ysize);
  9.  
  10. for (hy=ydisp;hy<ydisp+nrows;hy++){  
  11. 	for(hx=0;hx<hxres;hx++)  {
  12. 		cx = (((float)hx)/((float)hxres)-0.5)/magnify*3.0-0.7;
  13. 		cy = (((float)hy)/((float)hyres)-0.5)/magnify*3.0;
  14. 		x = 0.0; y = 0.0;			
  15. 		for (iteration = 1;iteration < itermax; iteration++)  {
  16. 		xx = x * x - y * y + cx;
  17. 		y = 2.0 * x * y + cy;
  18. 		x = xx;
  19. 		if (x * x + y * y > 100.0)  
  20. 			break;
  21. 		}
  22.  
  23. 		if (iteration == itermax) {
  24. 			ret[hy-ydisp][hx]=BLACK;
  25. 		} else {
  26. 			ret[hy-ydisp][hx]=computeRGBA(iteration, itermax);
  27. 		}
  28. 	}	
  29.  
  30. }
  31. 	return ret;
  32. }
  33. ...
Altra funzione importante è computeRGBA, che preso in input il numero di iterazione in cui è stato generato il punto e il numero di iterazione massima, stabilisce il colore del punto generato, eseguendo i passi definiti nel codice qui riportato.
  1. RGBApixel computeRGB(int iteration, int itermax){
  2.  
  3. 	RGBApixel ret;		
  4.  
  5. 	double colore = (double)iteration/((double)itermax);
  6. 	colore = colore*360;				
  7. 	int h = (int)colore*5;
  8. 	int s = 255;
  9. 	int v = 255;
  10.  
  11. 	int f;
  12.  
  13. 	ret.Alpha=1;
  14.  
  15. 	if( s == 0 ){
  16. 		ret.Red=ret.Green=ret.Blue=v;
  17.         return ret;
  18. 	}
  19.  
  20. 	long p, q, t;
  21.  
  22. 	f = ((h%60)*255)/60;
  23. 	h /= 60;
  24.  
  25. 	p = (v * (256 - s))/256;
  26. 	q = (v * (256 - ((s * f)/256) ))/256;
  27. 	t = (v * (256 - ((s * (256 - f))/256)))/256;
  28.  
  29. 	switch( h ) {
  30.        case 0:
  31. 			ret.Red = v;
  32.             ret.Green = t;
  33.             ret.Blue = p;
  34. 			break;
  35.        case 1:
  36. 		   ret.Red = q;
  37. 		   ret.Green= v;
  38. 		   ret.Blue = p;
  39.             break;
  40.        case 2:
  41. 		   ret.Red = p;
  42. 		   ret.Green = v;
  43. 		   ret.Blue = t;
  44.             break;
  45.         case 3:
  46.             ret.Red = p;
  47.             ret.Green = q;
  48.             ret.Blue = v;
  49.             break;
  50.         case 4:
  51.             ret.Red = t;
  52.             ret.Green = p;
  53.             ret.Blue = v;
  54.             break;
  55.         default:
  56.             ret.Red = v;
  57.             ret.Green = p;
  58.             ret.Blue = q;
  59.             break;
  60.     }
  61. 	return ret;
  62.  
  63. }
Nel prossimo articolo mostreremo come utilizzare queste due funzioni per realizzare la nostra implementazione parallela del frattale di Mandelbrot.
Precedente: Integrare il phostream di Flickr nello Zend Framework
Successiva: Alcune novità di CSS3
Intervento di Salvatore Iannece a.k.a. salvatore985 del 23-02-2010 ore 14:38, Roma (RM)
Plebeo
Plebeo
(3 interventi)
Iscritto il 23-02-2010
Ciao Francesco,
ho trovato molto interessante la tua discussione. Vorrei sapere se è possibile avere il codice completo del programma. Spero di non pretendere troppo. Ciao.
Intervento di Francesco Carotenuto a.k.a. nucarote del 23-02-2010 ore 18:13, Nocera inferiore (SA)
Plebeo
Plebeo
(25 interventi)
Iscritto il 14-01-2009
salvatore985 ha scritto:
Ciao Francesco,
ho trovato molto interessante la tua discussione. Vorrei sapere se è possibile avere il codice completo del programma. Spero di non pretendere troppo. Ciao.

Purtroppo ora non ce l'ho a portata di mano, comunque al codice pubblicato manca solo di un modulo con delle define, e la definizione di una/due funzioncine di utilità che creano le matrici (createBuffer) per il resto ho utilizzato una libreria http://easybmp.sourceforge.net/ per la scrittura del bitmap e la definizione della struttura RGBAPixel.
Intervento di Salvatore Iannece a.k.a. salvatore985 del 09-03-2010 ore 12:00, Roma (RM)
Plebeo
Plebeo
(3 interventi)
Iscritto il 23-02-2010
Ciao Francesco, scusa se ti disturbo ancora, ma essendo un programmatore C alle prime armi ho qualche problema. Ho provato ad eseguire il programma sequenziale, ma mi viene restituito sempre 'segmentation fault'. Credo che il problema sia nelle righe 24 e 26 della funzione mandelbrot e quindi nella funzione createbuffer. Io l'ho creata così:
RGBApixel** createBuffer(int hxres, int ysize){
return ((RGBApixel**)malloc(hxres*ysize*sizeof(RGBApixel*)));
}

Dove sbaglio? Non riesco proprio a capire. Ciao.
Intervento di Francesco Carotenuto a.k.a. nucarote del 09-03-2010 ore 12:19, Nocera inferiore (SA)
Plebeo
Plebeo
(25 interventi)
Iscritto il 14-01-2009
L'allocazione della matrice è errato, ti suggerisco di guardati bene il modo di allocare una matrice in maniera dinamica in C e di comprendere il modo con cui C tratta le matrici, indispensabile per la programmazione parallela in C . Qui ci dovrebbe essere un aiuto http://www.diit.unict.it/users/mpalesi/COURSES/LDI_02-03/DISPENSE/allocazione_dinamica.pdf ;)
Intervento di Francesco Carotenuto a.k.a. nucarote del 09-03-2010 ore 12:24, Nocera inferiore (SA)
Plebeo
Plebeo
(25 interventi)
Iscritto il 14-01-2009
Doppio
Intervento di Salvatore Iannece a.k.a. salvatore985 del 10-03-2010 ore 16:05, Roma (RM)
Plebeo
Plebeo
(3 interventi)
Iscritto il 23-02-2010
nucarote ha scritto:
L'allocazione della matrice è errato, ti suggerisco di guardati bene il modo di allocare una matrice in maniera dinamica in C e di comprendere il modo con cui C tratta le matrici, indispensabile per la programmazione parallela in C . Qui ci dovrebbe essere un aiuto http://www.diit.unict.it/users/mpalesi/COURSES/LDI_02-03/DISPENSE/allocazione_dinamica.pdf ;)

Ti ringrazio per la pazienza e l'aiuto. Ho risolto il problema. Ciaooooo.
Copyright Programmazione.it™ 1999-2009. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.766 secondi. Sito ottimizzato per Mozilla Firefox. Powered by Kyron.