Ad Soyadı : Fahri Dönmez Şube No : TBIL-106-01 Öğrenci No : 12213251 Bölüm : Bilgisayar Mühendisliği Bilgisayar Programlama II Paralel Programlama Prof. Dr. Muhammet Ali AKÇAYOL Paralel Programlama Paralel bilgisayarlarda programlama için işletim sistemi seviyesinde ve programlama dili seviyesinde pek çok yazılım sistemi geliştirilmiştir. Bu sistemler, problemin parçalara bölümlenmesini ve işlemcilere atanmasını sağlayan çeşitli mekanizmalar içermelidir. Dolaylı paralellik (implicit parallelism) derleyici ya da diğer programın problemi bölümlemesi ve işlemcilere otomatik olarak atamasıdır. Dolaysız paralellik (explicit parallelism) ise programcının problemin nasıl bölümleneceğini bildirmesidir. Şu an pek çok paralel işleme derleyici uygulamaları tek-katmanlı paralelliği desteklemektedir. Çok-katmanlı paralellik de paralel çalışan thread’ler daha fazla paralellik için daha da bölünürler. Semaphore ve monitor adı verilen senkronizasyon yapıları ile işlemlerin kaynakları paylaşımında bir anlaşmazlık olması durumu engellenmiştir. Yük dengeleme, ağır yük ile çalışan işlemciden bazı görevleri daha hafif yük ile çalışan işlemcilere taşıyarak hepsinin aynı meşguliyette olmasını sağlar. Bazı insanlar paralel programlamayı, eş zamanlı (concurrent) programlama ile eş anlamlı kabul ederler. Bazıları da kesin bir çizgiyle ayırırlar. Paralel programlama, işlemler arasında iyi tanımlanmış iletişim yapıları kullanan ve verimi artırmaya yönelik işlemlerinin paralel işlenmesini sağlayan bir yapıdır. Eş zamanlı (concurrent) programlama, performanstan ziyade başka nedenlerden dolayı eş zamanlı işlemler arasında yeni iletişim tekniklerine dayanan bir yapıdadır. İşlemler arası iletişim genelde paylaşımlı hafıza veya mesaj geçirme tekniği ile yapılır. Seri Hesaplama Nedir? •Geleneksel olarak, yazılımlar seri hesaplama için yazılmıştır. •Yazılım bilgisayar üzerindeki tek Merkezi İşlem Birimi (CPU) üzerinde çalışmaktadır. •Problem komutlara ayrılmıştır. •Komutlar ardışık olarak çalıştırılmaktadır. •Herhangi bir anda sadece bir komut çalıştırılabilmektedir. Paralel Hesaplama Nedir? •Bir problemi çözmek için çok sayıdaki hesaplama kaynağını aynı anda kullanmaktır. •Program çok sayıda CPU üzerinde çalışmaktadır. •Problem eşzamanlı olarak çözülebilecek komutlara ayrılır. •Her bir parça kümesi komutlara ayrılır. •Her bir parçanın komutları aynı anda farklı CPU ‘lar üzerinde çalıştırılır. Konsept ve Termoloji: Tek işlem, tek data (Single instruction, single data (SISD)) Seri bilgisayarlardır. Birim zamanda sadece tek bir işlem yapılır. Birim zamanda sadece tek bir data akışı kullanılır. Tek işlem, çoklu data (Single instruction, multiple data (SIMD)) Paralel bilgisayar çeşididir. Birim zamanda sadece tek bir işlem yapılır. Birden çok data akışı kullanılır. Senkronizedir. Çoklu işlem, tek data (Multiple instruction, single data (MISD)) Paralel bilgisayar çeşididir. Birim zamanda birden çok işlem yapılır. Birim zamanda sadece tek bir data akışı kullanılır. Çoklu işlem, çoklu data (Multiple instruction, multiple data (MIMD)) Paralel bilgisayar çeşididir. Birim zamanda birden çok işlem yapılır. Birden çok data akışı kullanılır. Senkron yada asenkron olabilir. Bellek Yapısı Paylaşımlı Bellek(Shared Memory) Paralel bilgisayarlarda çeşitli paylaşımlı bellek çeşitleri vardır fakat genel olarak bütün işlemciler belleğe global adres uzayından erişir. Çoklu işlemciler işlemlerini kendi başlarına yaparlar fakat aynı bellek kaynağını paylaşırlar. Bir işlemcinin bellek alanında yaptığı değişiklik bütün işlemciler tarafından görülür. Paylaşımlı bellek kullanan bilgisayarlar belleğe ulaşım zamanlarına göre iki ana sınıfa ayrılırlar UMA ve NUM Uniform Memory Access (UMA): Simetrik çoklu işlemcili (SMP) bilgisayarlarda kullanılır. Belleğe erişim ve erişim hızları eşittir Non-Uniform Memory Access (NUMA): Fiziksel olarak birbirlerine bağlı iki yada daha fazla SMP’den oluşur. Bir SMP direk olarak diğer SMP’lerin belleklerine ulaşabilir. Bütün işlemciler bütün belleklere aynı erişim süresine sahip değildir. Paylaşımlı belleğin avantajları: Bellek erişimi için global adres uzayının kullanılması programlama açısından kullanıcı dostudur. İşlemciler arası data paylaşımı hızlıdır. Paylaşımlı belleğin dezavantajları: Paylaşımlı belleği kullanan işlemci sayısı artırılırsa işlemci bellek arasındaki trafik artacağından darboğaz oluşturur. Belleğin senkronizasyonu ve belleğe doğru şekilde erişilmesi programcının sorumluluğundadır. Dağıtık Bellek (Distributed Memory) Dağıtık belleklerde bellekler arası iletişim ağı vardır. İşlemcilerin kendi lokal bellekleri vardır. Bir işlemci diğer bellek adreslerini bilmez bu yüzden bellek adresleri için global adres uzayı konsepti yoktur. Her işlemci kendi belleğini organize eder ve yaptığı değişiklikler diğer işlemcilerin belleklerini etkilemez. Avantajları İşlemci sayısı artarsa orantılı olarak bellekte artar. Her işlemci kendi belleğine hemen erişebilir ağ iletişimi ile uğraşmaz. Dezavantajları İşlemciler arası data iletişiminin detaylarından programcı sorunludur. Bellek erişim süreleri farklılık gösterebilir. Karma Bellek (Hybrid Distributed-Shared Memory) Günümüzde daha çok karma bellek yapısı kullanılıyor. Her bellek modülünün ait olduğu bir işlemci topluluğu var bu kısım paylaşımlı bellek oluyor. Her bellek işlemci topluluğu da birbirleriyle ağ üzerinden bağlı bu kısımda dağıtık bellek oluyor. Bu sistem paylaşımlı ve dağıtık bellek sistemlerinin avantaj ve dezavantajlarını hepsini taşıyor. Paralel Programlama Adımları Programlama Dili (C/C++, FORTRAN) (Seri Kod) + Paralel Kütüphane (Dağıtık Bellek Paylaşımlı Bellek - Paylaşımlı Bellekli Dağıtık Sistem) = Paralel Program Paralel programlama modelleri Bir paralel programlama modeli, paralel algoritmaları açıklayan bir yazılım teknolojileri kümesidir. Bu model, uygulamalar, diller, derleyiciler, kütüphaneler, iletişim sistemleri ve paralel giriş/çıkış alanlarını kapsar. Programcılar, kendileri ve uygulamaları için uygun bir model veya karma bir model seçip, uygulamalarını geliştirirler. Paralel modeller çok farklı şekillerde uyarlanırlar: klasik sıralı dillerden çağrılan kütüphaneler şeklinde, dil uzantıları şeklinde ya da tamamen yeni işleme modelleriyle. Bu modeller kabaca ikiye ayrılırlar: paylaşımlı hafıza sistemleri ve dağıtık hafıza sistemleri. Günümüzde bu iki sistem arasındaki çizgi oldukça bulanıklaşmıştır. Sık kullanılan paralel programlama modelleri Sık kullanılan paralel programlama modelleri şöyledir: Dağıtık Bellek: PVM, MPI Paylaşımlı Bellek: Pthread,OpenMP Paylaşımlı Bellekli Dağıtık Sistem: MPI+OpenMP Global Arrays, Co-Array Fortran, UPC, HPF, SHMEM, Occam, Linda, Cilk. Paralel algoritmalar Böl ve Yönet (Divide & Conquer) Böl ve Yönet algoritması, orijinal problemi daha kolay çözmek için, problemi alt problemlere bölen, bölünen alt problemleri çözen, orijinal problemin çözümünü oluşturmak için, alt problemlerin çözümlerini birleştiren bir algoritmadır. Böl ve yönet paradigması program modülaritesini yükseltir, genellikle basit ve verimli algoritmalara yol açar. Bu nedenle sıralı algoritma tasarımcıları için güçlü bir araç olduğu kanıtlanmıştır. Böl ve yönet paralel algoritma tasarımı daha da önemli bir rol oynamaktadır. İlk adımda oluşturduğunuz alt problemler genellikle bağımsız olduğundan, bunlar paralel olarak çözülebilir. Genellikle alt problemler özyinelemeli olarak çözülür ve böylece bir sonraki bölme adımında paralel olarak çözülecek daha çok alt problem elde edilir. Ancak bilinmelidir ki, yüksek derecede bir paralel algoritma elde etmek için, böl ve yönet’in bölme ve birleştirme adımlarının paralelize (birlikte yürütülmesi) olması gerekir. Orijinal problemi mümkün olduğunca çok sayıda alt probleme bölerek, paralel olarak çözmek paralel algoritmalarda oldukça yaygındır. Paralel Böl ve Yönet örneği için, sıralı Merge Sort algoritması düşünün. Merge sort, n adet girilmiş elemanı alır ve onları sıralayarak geri verir. Bu algoritma, n elemanlı bir dizi iki parçaya bölünüp, bölünen her dizi öz yineli olarak sıralanıp ve sıralanmış yarı diziler tekrar birleştirilerek çalışır. Paralel İşaretçi Teknikleri Listeler, ağaçlar, graflar gibi geleneksel sıralı tekniklerin bir çoğunu paralel tekniklere çevirmek kolay değildir. Örneğin bağlı liste elementlerin dolaşmak, ağaç düğümlerini sıralı gezmek, graflarda derinlik öncelikli dolaşmak sıralı tekniklerdir. Şans eseri bu teknikler, neredeyse aynı kuvvetteki paralel tekniklerle genellikle yer değiştirilebilir. Paralel algoritmaların tasarımı, iş karmaşıklığını en aza indirecek düzeyde olması önemlidir. İşaretçi atlama tekniği bağlı liste ve ağaç yapıları için kullanılan yaygın bir teknik olup paralel programlama tekniklerinde sık kullanılan bir yöntemdir. Basit olarak ifade etmek gerekirse işlem dizisinde bir elemanın adresini diğerinin değerine atama işlemidir. Rastgeleleştirme (Randomization) Paralel algoritmalarda rastgele sayılar kullanılır. İşlemciler rastgele sayıları kullanarak genelde iyi sonuçlara ulaşmak amacıyla komutları yerel olarak işleyebilirler. Rastgele sayıların paralel programlamada en yaygın kullanılan 3 örneği; örnekleme, simetri kırılması ve yük dengelemedir. Örnekleme Rastgeleliliğin paralel programlama kullanımının bir çeşidi de bir element setinden temsilci örneğin seçilmesidir. Genellikle problem seçilen bu örnekle çözülür. Bu örnekte kullanılan çözüm yöntemi, orijinal veri setinin çözümü için bir rehber oluşturmuş olur. Örneğin, elimizde bir tamsayı kümesi var ve biz bunu sıralamak istiyoruz. Bunu tamsayı kümesini alt kümelere bölerek ve her bir kümeyi kendi içinde sıralayarak bu işi yapabiliriz. Bu algoritmanın iyi çalışması için, kümelerin birbiri ile örtüşmeyen sayı değerleri ile temsil edilmesi ve her bir kümenin yaklaşık olarak eşit sayıda anahtar içermesi gerekmektedir. Rastgele örneklem, aralık sınırlarının belirlenmesinde kullanılır. Öncelikle her bir işlemci kendi rastgele örneklem anahtarlarını seçer. Sonra seçilen bütün anahtarlar birlikte sıralanır. Son olarak bu anahtarlar sınır değerler olarak kullanılır. Bu tarz rastgele örnekleme ayrıca birçok paralel hesaplama geometrisinde, graflarda ve kelime eşleştirme algoritmalarında da kullanılmaktadır. Simetri Kırılması Rastgeleliliğin bir başka kullanımı da simetri kırılmasındadır. Örneğin, bir çizgede bağımsız düğümler setinin seçilmesi problemini düşünelim. (birbiri ile komşu olamayan düğümler seti bağımsız düğümlerdir.) diğer bütün düğümlerle paralel olarak her bir düğümün bağımsız düğümler setine katılıp katılmaması gerektiğine karar verilmesi gerektiğini düşünün. Eğer düğümlerden birisinin bağımsız düğümler setine katılmasına karar verilirse, ona komşu olan diğer bütün düğümlerin sete katılmaması gerekmektedir. Eğer her bir düğümün yerel yapısı aynıysa, her bir düğüm eşit sayıda komşuya sahipse, hangi düğümlerin sete katılacağına anlık olarak karar vermek oldukça zordur. Böyle zor bir çıkmaz durum, düğümler arasındaki simetriyi kırmak için rastgeleliliğin kullanılmasıyla çözülebilir. Yük dengeleme Rastgeleliliğin üçüncü kullanım şeklide yük dengelemedir. Çok büyük miktardaki veri kümesini yaklaşık olarak eşit büyüklükte alt kümelere hızlıca ayırmanın bir yolu da her bir maddeyi rastgele olarak alt kümelere atamaktır. Bu teknik en iyi, alt kümelerin ortalama boyutu en azından logaritmik olarak ilk veri kümesinin boyutlarında olduğu zamanlarda çalışır. Sonuç Günümüzde kullanılan bilgisayar donanımları çok çekirdekli olmasına rağmen, kullandığımız yazılımların çok az bir kısmı paralel olarak programlanmıştır. Bu sebeple seri programlanan bu yazılımlar donanımı etkili olarak kullanamamakta ve kullanıcının zaman kaybetmesine sebep olmaktadır. Paralel programlamada 3 temel algoritma kullanılmaktadır. Paralel programlama algoritmalarının kendine özgü kullanım alanı bulunmaktadır. Hangi algoritmanın kullanılacağı ya da programın paralel programlamaya uygun olup olmadığı programın yapısıyla doğrudan ilgilidir. Bu sebeple herhangi bir paralel programlama algoritmasının diğerinden daha iyi ya da kötü olduğunu söylemek mümkün değildir. Fakat paralel programlamanın temel mantığında bir problemi küçük parçalara ayırmak olduğu için en sık kullanılan algoritmanın “böl ve yönet” algoritması olduğu söylenebilir. Çok çekirdekli işlemcilerin kişisel ve taşınabilir bilgisayarlarda dahi yaygınlaşması paralel programlamaya duyulan ihtiyacı ve bu alanda yapılan araştırmaların önemini her geçen gün arttırmaktadır. Kaynaklar: - http://tr.wikipedia.org/wiki/Paralel_hesaplama -MPI Programlamaya Giris ve Motivasyon: Özden AKINCI - İTÜ Bilisim Enstitüsü - http://www.hermesiletisim.net/dev/paralel-programlama-nedir-2