Upload
didina
View
59
Download
4
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
Komut, işcik ve bellek düzeyinde paralelliğe yönelik derleyici teknikleri
Ali Üllenoğlu504061502
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 = *ar2 = *br1 = r1 + r2r2 = *cr1 = r1 + r2r2 = *dr3 = *er2 = r2 + r3r1 = r1 + e2
Örnek (Paralellik)
Her değişken için bir saklayıcı İşlem 4 saat çevriminda
tamamlanabilir
r1 = *a r2 = *b r3 = *c r4 = *d r5 = *e r6 = r1 + r2 r7 = 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ı.
Veri Bağımlılık Grafı
Sonuç Kod
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ı.
Örnek Kod
Derlenmiş Örnek Kod
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 = &BMUL R7, R5, R6nopADD R8, R7, R4 // R4 = cnopST 0(R3++), R8 BL R10, L // R3 = &D, R10 = n-1
Döngü Açma
1 LD2 LD3 MUL LD4 LD5 MUL LD6 ADD LD7 MUL LD8 ST ADD LD9 MUL LD10 ST ADD LD11 MUL12 ST ADD1314 ST ADD1516 ST
Yazılım İş Hattı Optimizasyonu
1 LD2 LD3 MUL LD4 LD5 MUL LD6 ADD LD7 L: MUL LD8 ST ADD LD BL (L)9 MUL10 ST ADD1112 ST ADD1314 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, cdo 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.
İş Hattı Yöntemi (Sonuç)
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.
Örnek (Kod)
Örnek (Çalışma)
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