Burak IŞIKLI

Computer scientist living in Istanbul, Turkey. Data scientist at Turkcell, Traveller, Rower, Sailor

Twitter Github Linkedin Mail

Paralel Programlama(Hesaplama) Temelleri

Paralel hesaplama en basit şekliyle şöyle tarif edebiliriz. Bir problemi çözmek için kaynaklaı eşzamanlı çoklu olarak kullanmaktır. Örneğin bir integrali hesaplamak için iki bilgisayarı veya iki işlemci(çekirdeği) kullanarak yapabiliriz. Bu örnekleri çoğaltabiliriz. Fakat paralel programlama yaparken dikkat edeceğimiz ilk önemli konulardan biri mimarilerdir. Bu konuda şöyle bir yasa vardır:
Moore Yasası:
Intel şirketinin kurucularından Gordon Moore’un 19 Nisan 1965 yılında Electronics Magazine dergisinde yayınlanan makalesi ile teknoloji tarihine kendi adıyla geçen yasa.
Her 18 ayda bir tümleşik devre üzerine yerleştirilebilecek bileşen sayısının iki katına çıkacacağını, bunun bilgisayarların işlem kapasitelerinde büyük artışlar yaratacağını, üretim maliyetlerinin ise aynı kalacağını, hatta düşme eğilimi göstereceğini öngören deneysel (ampirik) gözlem. Bu gözlem kendini doğrulamıştır. Bu durumda bu teoriye göre tasarım karmaşıklığı, performans artışının nasıl olacağı, ölü alanlarla ne yapacağız gibi engeller önümüze çıkıyor. İşte bu noktada paralellik önümüze çıkıyor.
Paralel sistemlerin birçok kullanım alanı vardır. Hava tahmini modelleme, termonükleer proses, fizik, kimya, biyoteknoloji, matematik, veri madenciliği, web indeksleme, veritabanları gibi birçok alanda kullanılıyor.
Paralel programlama başlamadan önce bazşekilde çözebiliriz:
* Multiple Datapath(Çoklu Veriyolu)
* Multiple Memory Units(Çoklu Hafıza Birimleri)
* Multiple Processing Units(Çoklu İşlemci Birimleri)
Bu konuda sıkça kullanılan iki mimari mevcuttur.
1-) SIMD(Single Instruction Multiple Data): Bir kontrol birılıyor. Yani birden fazla programımız farklı veya bölünmüş veri setinde işlem yapıyor.
Bu mimarilerden istediğimiz birini kullanarak darboğazı aşabiliriz. Programlamaya başlamadan önce bize uygun paralel mimarimizi seçtikten sonra hangi paralel algoritmayı kullanacağımıza karar vermemiz gerekiyor.

Paralel Algoritmalar:
- Data Paralel
- Task-Graph
- Work Pool
- Master Slave
- Pipeline
- Hybrid
Bu algoritmaları araştırarak detaylı bulabilirsiniz. Ben zamanı geldikçe anlatacağım. Bize uyan paralel algoritmayı da seçtikten sonra programlamaya geçebiliriz. Literatürde kullanabileceğimiz iki paralel programlama modeli vardır.
* Message-Passing
* Shared Adress Space

1-) Message-Passing
* Genelde büyük çaptaki bilgisayar sistemlerinde kullanılan program türü(Örneğin Cluster sistemlerde)
* Paylaştırılmış adres alanı
* Implicit paralelleme
* Proses etkileşimi veriyi gönderip alarak sağlanıyor
* Haberleşme mesajları gönderip alarak sağlanıyor
* Primitive
+ Send
+ Recieve
+ Blocking vs non-blocking
+ Buffered vs non-buffered
* En iyi bilinen bu konuda kullanılan kütüphanesi MPI(Message-Passing Interface)
(http://burakisikli.files.wordpress.com/2010/01/2.jpg?w=300 “Message Passing”)

2-) Shared Address Space
* Genelde SMP makinalarda kullanılır.(Multicore chip)
* Paylaşılmış adres alanı
* Thread
* Shmget/shmat unix operasyonları
* Explicit Paralelleştirme
* Proses/Thread haberleşmesi ile iletişim sağlanır.
* Memory oku/yaz ile haberleşme gerçekleşir.(Örnek x++;)
* En iyi bilinen bu konuda kullanılan kütüphanesi POSIX Thread(PThreads) API
+ Thread oluşumu ve silinmesi
+ Thread yönetimi
+ Senkronizasyon
(http://burakisikli.files.wordpress.com/2010/01/13.jpg “Shared Memory”)

Paralel Programlama Görünmez Tehlikeleri(Pitfalls)
- Senkronizasyon
+ Deadlock
+ Livelock
+ Fairness
- Verimlilik
+ Paralelleştirmeyi maksimum hale getirmek
- Güvenilirlik
+ Doğruluk
+ Debugging


Comments !