Sunteți pe pagina 1din 1

nmulirea a dou matrici.

Presupunem a i b de tip Mn*n . Declarm a, b i c de tip double i c=a*b. Algoritmul secvenial de nmulire a dou matrici este: 1. for [ i = 0 to n-1 ] 2. for [j = 0 to n-1 ] 3. { c[i, j] = 0.0 ; 4. for [k = 0 to n-1] 5. c[i,j] = c[i, j] + a[i, k] * b[k, j]; 6. } Definiie: dou operaii se pot executa n paralel dac sunt independente. Fie o o operaie. RS(o) este mulimea variabilelor utilizate n o i nemodificate de o. WS(o) este mulimea variabilelor modificate de o (i eventual utilizate). Dou operaii o1 i o2 sunt independente dac: a) WS(o1) WS(o2) = b) RS(o1) RS(o2) = Ex. Instruciunea o : x = y + x + z RS(o) = {y , z} WS(o) = {x} Obs. Variabilele utilizate sunt cele care apar n partea dreapt a atribuirii. Revenind la exemplul de mai sus, cel cu nmulirea matricelor, observm c pentru linia 5 de cod avem: RS(5) = {a[i, k] , b[k, j]} iar WS(5) = {c[i, j]} Notaie: co pentru a simula execuia paralel. co - proces co [k=0 to n-1] c[i, j] = c[i, j] + a[i, k]*b[k, j] oc ns se poate observa c operaiile de la randul 5 nu sunt independente deoarece: WS(5, i0) WS(5, j0) = {c[i, j]} Atunci operaiile care pot fi paralelizate sunt: co [ i = 0 to n-1 ] (se vor calcula in paralel liniile matricii c) for [j = 0 to n-1 ] { c[i, j] = 0.0 ; for [k = 0 to n-1] c[i,j] = c[i, j] + a[i, k] * b[k, j]; } Adic: procesul 0 va calcula linia 0, ... procesul i va calcula linai i ,...procesul n-1 va calcula linia n-1. Sau presupunem c avem n2 procese care fiecare calculeaz un element al matricii c. co [ i = 0 to n-1 , j = 0 to n-1 ] { c[i, j] = 0.0 ; for [k = 0 to n-1] c[i,j] = c[i, j] + a[i, k] * b[k, j]; }

S-ar putea să vă placă și