View Single Post
Old 12-12-2009, 12:50   #1
Lucrezio
Senior Member
 
L'Avatar di Lucrezio
 
Iscritto dal: Dec 2003
Cittā: Trento, Pisa... ultimamente il mio studio...
Messaggi: 4388
[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
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
Lucrezio č offline   Rispondi citando il messaggio o parte di esso