Nested Parallel Loops

Matrix Multiplication / Matrix Carpma islemlerini OpenMP araciligi ile paralel alanda nasil yapilabilecegini incelerken ayni zamanda for construct'larin nested parallel loops alaninda nasil calistigini goruyor olacagiz.
Oncelikle parallel region icin gerekli olan matrix multiplication kodumuzu yazdigimizda,
10000 x 10000 'lik bir MA ve MB matrislerini carpiyor olacagiz. Paralel bolgelerde shared yani ortak degiskenler; size, MA,MB ve MC iken private yani ozel degiskenler ise row,col,i'dir. Ilk paralel dongu MC matrislerinin sonucu icin kullaniliyor. Ikinci paralel alanda ise ic ice kullanilmis donguler bulunmaktadir ve bunun icin for dongulerini paralellestirmek amaci ile for construct'i kullanilmaktadir. Aslinda ilk dongu gizli bir senkronizasyonla calisip sona ermektedir.
Nested Parallel Loops kodlarini inceledigimiz zaman ise, isminden de anlasilabilecegi gibi ic ice yuvalanmis for dongulerini paralellestiriyor olacagiz. Bu paralel havuz icerisine girdigimizde, ilk for construct ile her bir dizinin row(satir) alanlarina ait verilerin gecerli islemlerini yapmaktadir. Ikinci bir paralel yapisi olan baska bir for construct ise, bu sefer de dizinlerin col(sutun) degeri icin gecerli islemleri yapiyor olacaktir. Boylelikle her bir MC farkli thread'ler tarafindan hesaplanmaktadir. Bu sebepten dolayi thread'ler de her bir baslatma ve hesaplama islemleri icin senkronizasyon islemine gerek yoktur.
ParallelRegion.Cpp Kaynak Kodu;
#include <stdlib.h> #include <stdio.h> #include <time.h> #include <float.h> #include <iostream> #include <conio.h> #include <omp.h> int MA<10000>
<10000>
, MB<10000>
<10000>
, MC<10000>
<10000>
; int i, row, col, size = 100; clock_t HesaplamayaBasla, HesaplamayiBitir; double SureFarki; int main() { printf("\nHesaplama Islemine Basladi : "); HesaplamayaBasla = clock(); printf("%f saniye surdu. \n", (double) HesaplamayaBasla ); #pragma omp parallel shared(MA,MB,MC,size) private(row,col,i) { #pragma omp for schedule(static) for(row=0; row<size; row++) { for (col=0; col<size; col++) MC
= 0.0; } #pragma omp for schedule(static) for(row=0; row<size; row++) { for (col=0; col<size; col++) for(i=0; i<size; i++) MC
+= MA
* MB
; printf("MC<%d>
<%d>
= %d \n", row, col, MC
);
}
}
printf ("Hesaplama Islemi Sona Erdi : ");
HesaplamayiBitir = clock();
printf("%f saniye surdu. \n",(double) HesaplamayiBitir );
SureFarki = ((double) (HesaplamayiBitir - HesaplamayaBasla)) / CLOCKS_PER_SEC ;
printf("Hesaplanan Sure Farki : %f saniyedir.", SureFarki);
getche();
return 0;
}
Ekran Goruntusu;
NestedLoops.Cpp Kaynak Kodu;
#include <stdlib.h> #include <stdio.h> #include <time.h> #include <float.h> #include <iostream> #include <conio.h> #include <omp.h> int MA<10000>
<10000>
, MB<10000>
<10000>
, MC<10000>
<10000>
; int i, row, col, size = 100; clock_t HesaplamayaBasla, HesaplamayiBitir; double SureFarki; int main() { printf("\nHesaplama Islemine Basladi : "); HesaplamayaBasla = clock(); printf("%f saniye surdu. \n", (double) HesaplamayaBasla ); #pragma omp parallel private(row, col, i) { #pragma omp for schedule(static) for(row=0; row<size; row++) { #pragma omp parallel shared(MA,MB,MC,Size) { #pragma omp for schedule(static) for (col=0; col<size; col++) { MC
= 0.0; for(i=0; i<size; i++) MC
+= MA
* MB
; printf("MC<%d>
<%d>
= %d \n", row, col, MC
);
}
}
}
}
printf ("Hesaplama Islemi Sona Erdi : ");
HesaplamayiBitir = clock();
printf("%f saniye surdu. \n",(double) HesaplamayiBitir );
SureFarki = ((double) (HesaplamayiBitir - HesaplamayaBasla)) / CLOCKS_PER_SEC ;
printf("Hesaplanan Sure Farki : %f saniyedir.", SureFarki);
getche();
return 0;
}
Ekran Goruntusu;
OpenMp kendi kutuphaneleri sayensinde Nested Parallel Loops calismalarinda thread'ler uzerinde dogru sonuclar vermeyi garantilemektedir. Keyifli Calismalar Dilerim..
Yorumlar