Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Döngü açma

bullvar_katip

Administrator
Katılım
21 Mayıs 2024
Mesajlar
532,105
Döngü açma (İngilizcesi loop unwinding veya loop unrolling), bir programın çalışmasını hızlandıran döngü dönüştürme yöntemlerinden biridir. Bu yöntem yazılan programın kod satır sayısını arttırmaktadır. Döngülerdeki dönüşüm manuel olarak programcı tarafından yapılabileceği gibi kodlar derleyiciler tarafından da düzenlenebilmektedir. Döngü açmanın amacı, döngülerdeki kontrol buyruklarını (örnek: gösterge aritmetiği ya da "döngü sonu" testleri) azaltarak ya da tamamen ortadan kaldırarak programın çalışmasını hızlandırmaktır. Döngüler, birbirini tekrarlayan ve bağımsız kod satırları eklenerek tekrar yazılır, bunun sonucunda da döngülerde harcanan fazla zaman yükü ortadan kaldırılır. Yürütme zamanı gösterge aritmetiğinin statik şekilde ortadan kaldırılması "Sıkı" döngülerdeki fazla zaman yükü, "döngü sonu" testleri ile olabileceği gibi, bir dizinin sonraki elemanına geçmeyi sağlayan gösterge indisini arttırma işlemi (gösterge aritmetiği) sebebiyle olur. Optimizasyon sağlayan bir derleyici ya da çevirici her ayrı ayrı referanslanmış dizi değişkeninin değerini hesapladığı takdirde, kodları direkt olarak makine dili buyruklarına çevirir ve böylece yürütme zamanında fazladan aritmetik operasyon yapılmasına gerek kalmaz. Avantajlar Yürütülen buyrukların azalmasından kaynaklanan çalışma hızındaki artış, programın uzunluğundaki fazlalaşmadan kaynaklanan yavaşlamayı dengelediği takdirde başarımda büyük ölçüde artış gözlenmektedir. Döngüdeki kod satırlarının birbirinden bağımsız olması durumunda bu satırlar paralel işleme ile çalışabilir. Optimizasyon sağlayan derleyiciler çoğunlukla döngü açma işlemini otomatik olarak ya da isteğe bağlı olarak yapabilmektedir. Derleme zamanında dizideki elemanların sayısı bilinmiyor ise dinamik olarak gerçekleştirimi yapılabilir. Dezavantajlar Tek iterasyonda geçici değişkenleri saklamak için gereken yazmaç sayısında artış olma ihtimali vardır, ki bu durum başarımı etkilemektedir. Program kod uzunluğunda artış olacaktır. Bu durum gömülü sistemler için istenmeyen bir durumdur. Kod uzunluğundaki artış, buyruk önbelleğinde isabetsizliklere yol açabilir, ki bu durum başarımı olumsuz etkilemektedir. Optimizasyon yapabilen derleyiciler tarafından yapılmadığı takdirde kodun okunabilirliğinde azalmalar olabilir. C Dilinde yazılmış basit bir örnek Aşağıda bir koleksiyondan 100 adet item silen bir bilgisayar programı vardır. Bu normalde delete(item_number) fonksiyonunu çağıran bir for-döngüsü tarafından yapılmaktadır. Eğer programın bu kısmı optimize edilecek olursa ve fazladan oluşan zaman yükü programdaki önemli kaynakları elinde barındırıyorsa, zaman yükü yok edildiğinde bu döngünün açılması programın hızlandırılması için kullanılabilir. Bu değişiklik sayesinde yeni programın 100 yerine 20 iterasyon yapması gerekir. Bu sayede atlamaların ve koşullu dallanmaların sadece %20'si yapılacak ve döngüde fazladan oluşan zaman yükü önemli ölçüde azalır. Eğer optimizasyon yapan derleyici otomatik olarak fonksiyonu çağıran satır yerine fonksiyonun içeriğini kullanırsa daha da büyük bir başarım artışı sağlanır. Çünkü 100 adet fonksiyon çağrımı yapan kod satırı da derleyici tarafından silinecektir. İyileştirmeyi en uygun hale getirmek için, açılan döngüde gösterge ile tanımlanmış değişken bulunmaması gerekmektedir. Bu da genellikle indis tabanlı referans yerine, "taban adresi + konum" şeklindeki adresleme ile yapılır. Öte yandan bu şekilde manuel olarak yapılan döngü açma işlemi kaynak kod boyutunu 3 satırdan 7 satıra çıkarmaktadır. Bu da daha fazla satırın derleyici tarafından kontrol edilmesine ve işlenmesine sebep olacaktır. Derleyici kodu bu şekilde derlemek için daha fazla yazmaç kullanabilir. WHILE döngülerinin açılması Örnek bir while döngüsünün sözde-kodu şu şekildedir. Açılmamış olan döngü daha hızlıdır. Bu kodda ENDWHILE (derlendiğinde döngünün ilk satırına bir "atla" kodu ekler) satırı %66 daha az çalışacaktır. Daha da iyi olanı ince ayar yapılmış olan kod parçasıdır. Bazı derleyiciler otomatik olarak ince ayarı gerçekleştirir ve koşulsuz olan atlamaları elimine eder. Dinamik döngü açma Döngü açmanın faydaları programda kullanılan dizinin büyüklüğüne bağlı olduğu için çoğunlukla yürütme zamanından önce bilinememektedir. JIT (Just-in-time compilation) yapan derleyiciler döngülerin standart bir şekilde çalıştırılmasına veya ayrı ayrı buyrukları sıralayarak farklı bir kod oluşturup döngülerin açılmasına karar verebilirler. Bu esneklik just-in-time derlemenin statik veya manuel olarak döngülerin açılmasına göre büyük üstünlük sağladığını gösterir. Assembly dili programcıları da verimli dallanma tablolarında kullanılan tekniğe benzer bir teknik kullanarak dinamik döngü açma tekniğinden faydalanabilmektedir. Aşağıdaki örnek IBM 360 veya Z mimarisini kullanan çevirici kodlarıyla yazılmıştır. 256 baytlık ve 50 elemanlı 2 dizi olan FROM ve TO dizilerinde, 'FROM' dizisinin 100 baytını 'TO' dizisine kopyalama işlemi gerçekleştirilmektedir. Assembler örneği (IBM 360 veya Z Mimarisi) Bu örnekte, klasik döngü kullanımıyla 50 iterasyonluk bir döngü ile yaklaşık 202 buyruk çalıştırılacakken, dinamik kod ile 89 buyrukta tamamlanabilecektir. Dizi 2 girdi ile yapılsaydı yaklaşık olarak yine normal, açılmamış döngüde harcanan zamana denk olacaktı. Koddaki artış ise 108 bayt kadar olup, binlerce girdi ile denense bile aynı sonucu verecekti. Tabii ki benzer yöntemler birden fazla buyruk işin içine katıldığında da birleşik buyruk uzunluğu ayarlanarak kullanılabilir. Örneğin yukarıdaki kod parçasında kopyalanan 100 bayttan hemen sonra kopyaladığımız kısımları silmek istersek fazladan temizleme buyruğu her MVC buyruğu çağırıldıktan sonra eklenebilir.' '(buradaki 'xx' bir üst satırdaki MVC buyruğundaki değerdir). C örneği Aşağıdaki örnek C programlama dilinde yazılmış bir döngü açma programıdır. Yukarıdaki assembler örneğinin aksine, gösterge/indis aritmetiği compiler tarafından kullanılmaktadır. Bunun sebebi dizinin adreslenmesinde kullanılan (i) değişkenidir. Tam optimizasyon için indislerin gerçek değerlerinin (i) değişken değeriyle değiştirilmesi gerekmektedir. Not Bu madde, İngilizce Wikipedia'nın sayfasından çevrilmiştir. Kategori:Derleyici optimizasyonu Kategori:Paralel hesaplama
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Izgara yada normal mod

Temanızda forum listeleme yapısını ızgara yapısında yada normal yapıda listemek için kullanabilirsiniz.

Forum arkaplan resimleri

Forum arkaplanlarına eklenmiş olan resimlerinin kontrolü senin elinde, resimleri aç/kapat

Sidebar blogunu kapat/aç

Forumun kalabalığında kurtulmak için sidebar (kenar çubuğunu) açıp/kapatarak gereksiz kalabalıklardan kurtula bilirsiniz.

Yapışkan sidebar kapat/aç

Yapışkan sidebar ile sidebar alanını daha hızlı ve verimli kullanabilirsiniz.

Radius aç/kapat

Blok köşelerinde bulunan kıvrımları kapat/aç bu şekilde tarzını yansıt.

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Geri