420 likes | 695 Views
Komut, işcik ve bellek düzeyinde paralelliğe yönelik derleyici teknikleri. Ali Üllenoğlu 504061502. Komut Düzeyinde Paralellik. Aynı anda kaç adet komut bir arada işletilebilir? Programdaki potansiyel paralellik İşlemcinin paralel işleme yeteneği
E N D
Komut, işcik ve bellek düzeyinde paralelliğe yönelik derleyici teknikleri Ali Üllenoğlu 504061502
Komut Düzeyinde Paralellik • Aynı anda kaç adet komut bir arada işletilebilir? • Programdaki potansiyel paralellik • İşlemcinin paralel işleme yeteneği • Orjinal sıralı kodu paralelleştirme yeteneğimiz • Verilen kod sıralama kısıtlamaları altında en iyi paralel kodu bulma yeteneğimiz
Komut Düzeyinde Paralellik Yöntemleri • İş hatları • Komut yürütme işleminin safhalarını paralel olarak yürütme. • Birden fazla komut işleyebilme • Aynı anda birden fazla komut yürütebilme yeteneği. • Aynı anda bir aritmetik işlem, bir dallanma, bir bellekten yükleme, bir belleğe yazma komutu işlenebilir.
Kod Sıralama Yöntemi • Derleyici sıralı (sequential) çalışmak için yazılmış kodu paralel çalışması için tekrar düzenler. • Çeşitli kısıtlamalar mevcut.
Kod Sıralama Kısıtlamaları • Kontrol Bağımlılığı • Orjinal programdaki tüm komutlar optimize edilmiş programda da bulunmalı • Veri Bağımlılığı • Optimize program, orjinal program ile aynı sonuçları vermeli • Kaynak Kısıtlamaları • Optimize program, orjinal programa göre çok fazla kaynak kullanmamalı.
Bellek Erişimleri Arasındaki Bağımlılıklar • Belleğin tam adresinin bilinmesine gerek yok. Aynı alanı gösterdiklerinin bilinmesi yeterli. • Farklı işaretçiler aynı bellek alanını gösteriyor olabilir. • Dizi veri bağımlılığı analizi • Prosedürler arası analiz • İşaretçi analizi
Saklayıcı Kullanımı ve Parallellik Arasında Seçim Yapma • Derleyici, minimum sayıda saklayıcı kullanma eğiliminde. • Paralellik için maksimum sayıda saklayıcı kullanılmalı. • İkisi arasında bir anlaşma sağlanmalı.
Örnek (Saklayıcı Kullanımı) • (a + b) + c + (d + e) için r1 = *a r2 = *b r1 = r1 + r2 r2 = *c r1 = r1 + r2 r2 = *d r3 = *e r2 = r2 + r3 r1 = r1 + e2
Örnek (Paralellik) • Her değişken için bir saklayıcı • İşlem 4 saat çevriminda tamamlanabilir r1 = *ar2 = *br3 = *cr4 = *dr5 = *e r6 = r1 + r2r7 = r4 + r5 r8 = r6 + r3 r9 = r8 + r7
Kontrol Bağımlılığı Analizi if (a > t) b = a * a d = a + c • b = a * a işlemi, a > t karşılaştırmasının sonucuna bağlı olarak işletilir • a > t karşılaştırması yapılırken, a * a işlemi spekülatif olarak yapılabilir. Çünkü yan etkisi yok. • Eğer karşılaştırma doğru çıkarsa hızlanma sağlanmış oldu. Yanlış çıkarsa yan etkisi olmadığı için sorun yok.
Temel Blok Sıralama • Örnek Mimari • İşlemci 1 saat çevriminde 2 işlem yapar. • Birisi dallanma veya ALU • OP dst, src1, src2 • İkincisi yükleme (load) veya yazma (store) • LD dst, addr • ST addr, dst
Veri Bağımlılık Grafı • G = (N, E) grafı. • N: Düğümler. Her komuta karşılık bir düğüm. • E: Düğümleri birleştiren kenarlar. Her kenarın üzerindeki değer, birleştirdiği düğümlerin arasında geçmesi gereken saat çevrimi sayısı.
Global Kod Sıralama • Sadece temel blok içerisinde kod sıralama yetmez. • Bloklar arasında kod sıralama. • Kısıtlamalar: • Orjinal programdaki tüm komutlar, optimize edilmiş programda da bulunmalı. • Yürütülecek spekülatif komutlar yan etkiye yol açmamalı.
Optimize Kod • B3 bloğundaki işlemler B1’e taşınabilir. • B2 bloğundaki LD işlemi spekülatif yürütülebilir. • B2’deki ST işlemi yukarı taşınamayacağı için bir dallanma daha açılır ve B3’teki ST kopyalanır.
Yazılım İş Hatları(Software Pipelining) • Donanımdaki iş hatlarının yazılımda gerçeklenişi. • Örnek Mimari: • 1 saat çevriminde 1 LD, 1 ST, 1 ALU, 1 BR işlemi yapabilir. • BL R, L komutu ile R 1 azaltılır ve R=0 değilse L’ye dallanılır. • R1++ şeklinde otomatik bellek adresleme yöntemi var. Değer döndürülür ve 1 arttırılır. • Aritmetik işlemler iş hatlıdır ve 2 saat çevriminde sonuç verir. Diğer komutların sonuçları 1 saat çevriminde alınır.
Yazılım İş Hatları • Örnek Döngü: for(i = 0; i < n; i++) D[i] = A[i] * B[i] + c; • Üretilen Kod: L: LD R5, 0(R1++) // R1 = &A LD R6, 0(R2++) // R2 = &B MUL R7, R5, R6 nop ADD R8, R7, R4 // R4 = c nop ST 0(R3++), R8 BL R10, L // R3 = &D, R10 = n-1
Döngü Açma 1 LD 2 LD 3 MUL LD 4 LD 5 MUL LD 6 ADD LD 7 MUL LD 8 ST ADD LD 9 MUL LD 10 ST ADD LD 11 MUL 12 ST ADD 13 14 ST ADD 15 16 ST
Yazılım İş Hattı Optimizasyonu 1 LD 2 LD 3 MUL LD 4 LD 5 MUL LD 6 ADD LD 7 L: MUL LD 8 ST ADD LD BL (L) 9 MUL 10 ST ADD 11 12 ST ADD 13 14 ST
Kısıtlamalar • Saklayıcı Kullanımı • Bir indeks’teki değerlerin farklı indeksteki iterasyonlarda kullanılması, saklayıcı kullanımında sorunlara yol açar. • Eğer aynı saklayıcı birden fazla döngüde kullanılıyorsa. • Genelde art arda gelen iterasyonlarda sorun çıkar. • Tek sayılı ve çift sayılı iterasyonlar farklı birer döngü haline getirerek çözülebilir.
Kısıtlamalar • Kaynak kısıtlamaları • Toplam açılan döngüler, varolan kaynaklardan fazlasını kullanamaz. • Eğer kaynak kullanımı azsa döngü birkaç kere daha açılabilir. • Eğer kaynaklar tüketilmişse döngü daha fazla açılamaz. • Örneğin, Bir LD işlemi 2 saat çevrimi sürdüğü için bir döngü 2 saat çevriminden az süremez.
İşçik Seviyesinde Paralellik • Modern işlemciler çok çekirdekli. • Her çekirdekte birden fazla işçik çalıştırılabilir. • Tek işçik olarak yazılmış program derleyici tarafından çok işçiğe ayrılarak işlemcide paralel işleme sağlanır.
Otomatik Döngü İşçikleri Oluşturma(Automatic Loop Multithreading) • Intel derleyicilerinin kullandığı bir yöntem. • Pentium 4 ve Xeon tabanlı işlemcilerinde kullanılır. • Döngüler paralel çalışabilecek kısımlara ayrılır.
Otomatik Döngü İşçikleri Oluşturma • Orjinal Program Kodu subroutine serial(a, b, c) integer, dimension(100) :: a, b, c do i=1,100 a(i) = a(i) + b(i) * c(i) enddo end subroutine serial
Otomatik Döngü İşçikleri Oluşturma • Derleyici tarafından 2 işçikli hale getirilmiş kod: subroutine parallel(a, b, c) integer, dimension(100) :: a, b, c ! Thread 1 do i=1,50 a(i) = a(i) + b(i) * c(i) enddo ! Thread 2 do i=51,100 a(i) = a(i) + b(i) * c(i) enddo end subroutine parallel
Otomatik Döngü İşçikleri Oluşturma Aşamaları • Programdaki döngüler belirlenir ve bir hiyerarşi oluşturulur. • Döngüler arasında veri bağımlılığı analizi yapılır. Paralelleştirilebilir döngüler belirlenir. • Önceden tahmin edilebilen döngülerin paralelleştirilmesinin getireceği performans kayıp/kazancı hesaplanır. • Önceden tahmin edilemeneyen döngülerin kazancını hesaplamak için simülasyon yapılır.
İş Hattı Yöntemi • Bir döngüde farklı iterasyonlar arasında veri bağımlılığı varsa kullanılabilir. • Bağımlı olan veri bir adımda bir işlemcide işlenirken diğer adımda bir bitişiğindeki işlemcide işlenir.
İş Hattı Yöntemi (Örnek) for(i = 1; i <= m; i++) for(j = 1; j <=n; j++) X[i] = X[i] + Y[i,j] • X[i] işlemi; • Y[i, 0] • Y[i, 1] • Y[i, n] iterasyonlarında kullanılır. • Döngünün farklı iterasyonları arasında veri bağımlılığı var.
Bellek Kullanımı Optimizasyonları • Bir işçiğe mümkün olduğunca aynı bellek alanı üzerinde işlem yapan komutlar aktarılır. • Cep belleğin etkin kullanımı • İşlemciler arasındaki haberleşme maliyeti azaldı • Bir işçiğin kullandığı değişkenler bellekte birbirine yakın yerlere atanır. • Yerellik artar • İşlemci – bellek alanı atanması daha etkin
Bellek Düzeyinde Paralellik • Bellek gecikmeleri işlemcinin çalışması üzerinde negatif etkilere sahip • Örnek: Cep bellek ıska durumu (100’den fazla işlemci çevrimi sürer) • Bellek gecikmelesi yaratan komutları üst üste bindirme • Bellek gecikmesi yaratan komutları önceden işleme
Okuma Iska Gruplaması (Read Miss Clustering) • Bir komut penceresinde belli miktarda komut bulunur. • Bir okuma işlemi pencerenin başına geldiğinde cep ıskası olursa okuma işlemi bloke olur. • Bir işlem bloke iken penceredeki diğer komutlar çalıştırılabilir. • Diğer komutlar hızlı çalıştıkları için işlerini hemen bitirirler.
Okuma Iska Gruplaması • Tüm komutlar sırayla komut penceresinden çıkmak zorunda. • Komutların komut penceresinden çıkması için okuma komutunun sonlanması gerekli. • Bütün komutlar okuma komutunun sonlanması için bekleyecek. • Optimizasyon Gerekli
Okuma Iska Gruplaması • Okuma işlemlerinin aynı komut penceresine denk getirilmesine çalışılır. • Böylece birden fazla okuma işlemi sadece aynı zaman dilimi içerisinde bloke olur. • Toplam bloke kalma süresi azalmış oldu.
Kısıtlama • Aynı pencere içine yerleştirilecek okuma sayısı cep bellek satır sayısını aşmamalı. • Aksi durumda yerellik kötü etkilenir
Yazılımsal Önceden Getirme(Software Prefetching) • Analiz Safhası: Derleyici program kodu içerisinde bellek ıskası olacak komutları tahmin eder. • Örneğin bellek erişimlerinde, dizinin hangi elemanlarının hangi cep satırına geleceği hesaplanır. • Gerekli elemanı bellekten getirmek için komut yerleştirilir. • O eleman bellekten getirilirken cep satırının gerisine önceden hesaplanmış elemanlar doldurulur.
Referanslar • 1.Compilers: Principles, Techniques and Tools 2nd Edition. Alfred V. Aho, Ravi Sethi, and Jeffrey D. Ullman. Addison-Wesley, 2006 • 2. “Instruction Level Parallelism”, http://en.wikipedia.org/wiki/Instruction_level_parallelism • 3.“Software Pipelining”, http://en.wikipedia.org/wiki/Software_pipelining • 4. “Compiler Techniques for Concurrent Multithreading with Hardware Speculation Support”, Zhiyuan Li,Jenn-yuan Tsai,Xin Wang,Pen-chung Yew,Bess Zheng, 1996 • 5. “Exploiting Thread-Level and Instruction-Level. Parallelism for Hyper-Threading Technology”, Xinmin Tian, Aart Bik, Milind Girkar, Paul Grey, 2003 • 6. “Comparing and Combining Read Miss Clustering and Software Prefetching”, Vijay S. Pai, Sarita V. Adve, Parallel Architectures and Compilation Techniques, 2001. Proceedings. 2001 International Conference on Volume , Issue , 2001 Page(s):292 – 303 • 7.“Memory Level Parallelism”, http://en.wikipedia.org/wiki/Memory_level_parallelism • 8. “Code Transformations to Improve Memory Parallelism”, Vijay S. Pait, Sarita Advel