| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  12-12-2009, 13:50 | #1 | 
| Senior Member Iscritto dal: Dec 2003 Città: Trento, Pisa... ultimamente il mio studio... 
					Messaggi: 4389
				 | 
				
				[Fortan77] Parallelizzazione di una semplice routine
			 
		Ciao a tutti! Mi sono ritrovato a dover calcolare una funzione di correlazione, di cui poi devo fare la trasformata di fourier, fra velocita' di atomi ottenute con una dinamica molecolare. Ho scritto un programmino che mi permette di fare il calcolo, ma dovendo trattare anche quantita' piuttosto ingenti di dati (Il calcolo scala come O(N^2)) mi piacerebbe sfruttare tutti i core del mio processore parallelizzando l'esecuzione. Ho provato - non sono un programmatore se non per necessita', quindi ho cercato la soluzione piu' facile! - ad usare le opzioni di autoparallelizzazione dei compilatori che ho a disposizione (intel ifort e portland pgf77), ma la cosa non ha dato risultati. La parte da parallelizzare sarebbe questa: Codice: 
      do I = 1, Lenght+1, IFr
        do J = 1, NStep - I + 1, IFr
          Fac = Dble(NStep-I+1)/Dble(NStep*(NStep+1)/2)
          VVx(I) = VVx(I) + Fac*Vel(1,IAt1,J)*Vel(1,IAt2,J+I-1)
          VVy(I) = VVy(I) + Fac*Vel(2,IAt1,J)*Vel(2,IAt2,J+I-1)
          VVz(I) = VVz(I) + Fac*Vel(3,IAt1,J)*Vel(3,IAt2,J+I-1)
        enddo
        ACF(I) = (VVx(I)+VVy(I)+VVz(I))/Three
        write(2,*) I,ACF(I)
      enddo- far fare ogni somma (VVx,VVy,VVz) ad un core diverso - parallelizzare l'esecuzione del ciclo esterno - parallelizzare l'esecuzione del ciclo interno Qualcuno ha qualche dritta da darmi sul come fare? Grazie mille! 
				__________________ "Expedit esse deos, et, ut expedit, esse putemus" (Ovidio) Il mio "TESSORO": SuperMicro 733TQ, SuperMicro X8DAI I5520, 2x Xeon Quad E5620 Westmere, 12x Kingston 4GB DDR3 1333MHz, 4x WD 1Tb 32MB 7.2krpm   | 
|   |   | 
|  12-12-2009, 15:18 | #2 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Dai un'occhiata ad OpenMP: http://en.wikipedia.org/wiki/OpenMP Dovrebbe essere compatibile con Fortran e con il compilatore Intel   | 
|   |   | 
|  12-12-2009, 16:10 | #3 | 
| Senior Member Iscritto dal: May 2004 Città: Londra (Torino) 
					Messaggi: 3692
				 | 
		Per esperienza io affronterei il problema parallelizzando unicamente il ciclo esterno, distribuendo gli indici tra i diversi core. Ma non saprei affrontare il probelma In Fortran. 
				__________________ Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. | 
|   |   | 
|  12-12-2009, 16:26 | #4 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Con OpenMP parallelizzarlo sarebbe una cavolata, basta una direttiva per parallelizzare il ciclo più esterno   https://computing.llnl.gov/tutorials/openMP/#Combined Le versioni del compilatore Intel che supportano OpenMP sono le versioni 11.0 e 11.1. Ultima modifica di cionci : 12-12-2009 alle 16:31. | 
|   |   | 
|  12-12-2009, 16:44 | #5 | 
| Senior Member Iscritto dal: Dec 2003 Città: Trento, Pisa... ultimamente il mio studio... 
					Messaggi: 4389
				 | 
		Era effettivamente una boiata! Posto la soluzione, così per curiosità: Codice: C$omp parallel do
C$omp& shared(VVx,VVy,VVz,Vel,NThr,NStep,IFr)
C$omp& private (I,J)
      do I = 1, Lenght+1, IFr
        NThr = OMP_GET_NUM_THREADS()
        do J = 1, NStep - I + 1, IFr
          Fac = Dble(NStep-I+1)/Dble(NStep*(NStep+1)/2)
          VVx(I) = VVx(I) + Fac*Vel(1,IAt1,J)*Vel(1,IAt2,J+I-1)
          VVy(I) = VVy(I) + Fac*Vel(2,IAt1,J)*Vel(2,IAt2,J+I-1)
          VVz(I) = VVz(I) + Fac*Vel(3,IAt1,J)*Vel(3,IAt2,J+I-1)
        enddo
        ACF(I) = (VVx(I)+VVy(I)+VVz(I))/Three
      enddo
C$omp end parallel doCodice: include 'omp_lib.h' Codice: ifort -o acf -O3 -openmp acf.f 
				__________________ "Expedit esse deos, et, ut expedit, esse putemus" (Ovidio) Il mio "TESSORO": SuperMicro 733TQ, SuperMicro X8DAI I5520, 2x Xeon Quad E5620 Westmere, 12x Kingston 4GB DDR3 1333MHz, 4x WD 1Tb 32MB 7.2krpm   | 
|   |   | 
|  12-12-2009, 16:47 | #6 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Azz...l'hai fatto in 10 minuti   OpenMP  Dicci qualcosa sulle prestazioni...hai sempre quella workstation con otto core ? | 
|   |   | 
|  13-12-2009, 01:27 | #7 | |
| Senior Member Iscritto dal: Dec 2003 Città: Trento, Pisa... ultimamente il mio studio... 
					Messaggi: 4389
				 | Quote: 
 Cmq... sto lavorando su un dual xeon quad core nehalem con 48GB di ram, ma per fare queste cosine uso il personal...   
				__________________ "Expedit esse deos, et, ut expedit, esse putemus" (Ovidio) Il mio "TESSORO": SuperMicro 733TQ, SuperMicro X8DAI I5520, 2x Xeon Quad E5620 Westmere, 12x Kingston 4GB DDR3 1333MHz, 4x WD 1Tb 32MB 7.2krpm   | |
|   |   | 
|  13-12-2009, 09:30 | #8 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		time [comando]    Comunque tic e tac esistono, ma non fanno quello   | 
|   |   | 
|  13-12-2009, 19:45 | #9 | |
| Senior Member Iscritto dal: Dec 2003 Città: Trento, Pisa... ultimamente il mio studio... 
					Messaggi: 4389
				 | Quote: 
 Considera che sto facendo calcoli con un milione di punti, quindi O(10^12) operazioni  Un fattore 2 è già importante! 
				__________________ "Expedit esse deos, et, ut expedit, esse putemus" (Ovidio) Il mio "TESSORO": SuperMicro 733TQ, SuperMicro X8DAI I5520, 2x Xeon Quad E5620 Westmere, 12x Kingston 4GB DDR3 1333MHz, 4x WD 1Tb 32MB 7.2krpm   | |
|   |   | 
|  13-12-2009, 20:06 | #10 | 
| Senior Member Iscritto dal: Apr 2000 Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29 
					Messaggi: 53971
				 | 
		Hai guardato l'utilizzo dei vari core ? Come vengono utilizzati ?
		 | 
|   |   | 
|  17-12-2009, 22:48 | #11 | |
| Member Iscritto dal: Jan 2005 
					Messaggi: 157
				 | Quote: 
 1. Mi sembra che Fac non dipenda da J per cui la moltiplicazione la potresti fare fuori dal ciclo su J. 2. Non mi è chiaro il ruolo di Fac che non può essere altro che il denominatore ma non capisco che formula usi. Su una serie lunga N lo stimatore migliore per la ACF al lag k ha denominatore N (e non N-k) per questioni teoriche su cui non mi dilungo. 3. Mi sembra che tu stia calcolando la covarianza e non la correlazione. 4. Giusto per la precisione, il calcolo della correlazione su di una serie lunga N ha senso se N>50 e se il numero di lag k è minore di N\4. 5. Una curiosità : come mai rimani su f77 e non passi al F90? HTH ciao tiMo 
				__________________ The plural of anecdote is not data. ~ Roger Brinner | |
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 19:01.









 
		 
		 
		 
		









 
  
 



 
                        
                        










