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
Come vedete non e' nulla di difficile. Le cose potenzialmente utili sarebbero
- 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