top of page

Nested Parallel Loops

Yazarın fotoğrafı: Sevdanur GENC
Sevdanur GENC
12 Nis 2013
2 dakikada okunur

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..

Son Yazılar

Hepsini Gör
Oracle Java Cloud Service Uygulamasi

Bir onceki Oracle Cloud Computing yazisinda bahsettigim gibi JDeveloper Oracle Cloud icin gelistirmis oldugu surumu olan Oracle JDeveloper 11g (11.1.1.6.0) ile kucuk bir uygulama gelistirip bunu oracl

 
 
 
Oracle Cloud Computing Hakkinda

Bulut bilisim konusundaki arastirmalarima devam ederken bu kez solugu Oracle Cloud Computing'de aldim. Bu makalem ve ilerleyen makalelerimde Trial versiyonu ile user tarafini pek yormayan bir yapidan

 
 
 
Loop Optimization - Loop Optimizasyonu

Var olan dongulerin acilmis yada sikistirilmis hallerini optimize ettikten sonra cache'imizde nasil bir performans saglayacigini gorebiliriz. Bunun icin uc adet dogu optimizasyon yontemi bulunmaktadir

 
 
 

Yorumlar


©2026 by Sevdanur Genc

bottom of page