|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2003
Città: Trento, Pisa... ultimamente il mio studio...
Messaggi: 4387
|
[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 ![]() |
![]() |
![]() |
![]() |
#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 ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3691
|
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. |
![]() |
![]() |
![]() |
#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 15:31. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Dec 2003
Città: Trento, Pisa... ultimamente il mio studio...
Messaggi: 4387
|
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 do Codice:
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 ![]() |
![]() |
![]() |
![]() |
#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 ? |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Dec 2003
Città: Trento, Pisa... ultimamente il mio studio...
Messaggi: 4387
|
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 ![]() |
|
![]() |
![]() |
![]() |
#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 ![]() |
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Dec 2003
Città: Trento, Pisa... ultimamente il mio studio...
Messaggi: 4387
|
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 ![]() |
|
![]() |
![]() |
![]() |
#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 ?
|
![]() |
![]() |
![]() |
#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: 23:49.