top of page

Loop Optimization - Loop Optimizasyonu

  • Writer: Sevdanur GENC
    Sevdanur GENC
  • Apr 25, 2013
  • 2 min read

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; loop unrolling, loop fusion ve loop tiiling.

Loop Unrolling - Dongu Acma

Dogunlerin yukunu azaltmak icin kullanabilecegimiz bir yontemdir. Buradaki amac egerki dongumuz 100 * 1024 kez donuyorsa bu iterasyonlari daha az sayiya cekebilmektir. Mesela, (100 * 1024) /1024 seklinde var olan iterasyonlarimizi azaltabiliriz. Amac iterasyonu azaltmak oldugu kadar yapilan sey ise, cache line utilization islemidir. Yani cache kac defa guncelleniyor bilgisidir ki bu da iterasyon sayisina denktir. Bir satir 8 gozune 8 veri cekecekse cache line kendisini 8 kez guncellemek zorundadir. Bunu tek bir guncelleme icerisinde 8 veriyide bir kerede yaptirabilmemiz cache icin daha kaliteli bir islem olacaktir. Bu da CPU'nun bir isi tek bir islemle bitirebilmesi anlamina gelmektedir ki bu da hiz kelimesini kendisi icin anlamlastiriyor demektir. Burada gerceklesen tek dezavantaj ise malesef kodun uzunlugunun artmasidir. Peki dongunun ilk hali ile dongunun acilmis halleri arasindaki farklar neledir ; aslinda koddaki mantikta degisen birsey yoktur. Tek bir iterasyona okunan veri sayisini arttiriyoruz ve cache'i daha cok dolduruyoruz.

          Burada degisenlerde; artisi ikiser ikiser yapiyoruz bu sayade yuzde 50 kazanc olmus oluyor. Ayni zamanda tek bir iterasyonda okunan veri sayisini arttiriyoruz. Verileri tek tek degilde ikiser ikiser veri olarak doldurma islemi yapiyoruz cache line uzerinde.

                  Ilk dongu standart halidir. Hemen yanindaki dongu ise biraz daha sikilastirilmis (Jam) sekilde tasarlanan fakat acilmis bir dongu yapisidir. Asagidaki yapi ise, tamamen standart dongumuzun acilmis halidir.

Loop Fussion - Dongu Birlestirme

Var olan dongulerimizi birlestirerek tek bir dongu icerisinde kullanabiliriz. Burada dikkat etmemiz gereken degiskenlerin birbirine olan bagimliliginin yani sira ayni zamanda baslangic ve bitis degerlerinede dikkat etmeliyiz.

Loop Tiling - Dongu Sikistirma

Dongulerimizi daha ozgun bir sekilde toparlayabiliyoruz. Karmasiklik aza inerken, cache'de daha efektif bir kullanim soz konusu oluyor. Normalde satir sutun'larda islem yaparken bire bir goz goz islem yapmaktayiz. Bizim tek bir iterasyonda islemlerimizi tamamlamamiz gerekmektedir. Aslinda bu bir karmasikliktir ve for sayimiz ne kadar artiyorsa n'in katlari seklinde bir karmasiklik ortaya cikacaktir. Cache'i daha iyi bir sekilde kullanmamizi saglayacak olan bu karmasiklik aslinda ciddi anlamda is yukumuzu azaltmaktadir.

        Keyifli Calismalar Dilerim..

Recent Posts

See All
Memory Access Patterns And Performance

Paralel programlama ile calismalarimizda bellege nasil erisecek olmamiz onemlidir. Bellegin nasil calistigini bilirsek yazacagimiz kod'un performansinida ayni sekilde hesaplayabilmis oluruz. Bunun onc

 
 
 
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 calistigin

 
 
 
OpenMP Synchronization Constructs

Synchronization Constructs konu basligi altinda Critical Constructs, Atomic Constructs ve Barrier Constructs yapilarini birer ornekle aciklamaya calisacagim. Ayni zamanda Reduction Clause yapisi hakki

 
 
 

Comments


©2035 by Sevdanur Genc. Powered and secured by Wix

bottom of page