Ekim 19, 2021
11 11 11 ÖÖ
TCP nedir ? Aktarım Katmanı 2
Aktarım Katmanı Tcp Nedir
Yönlendirme Nedir 2 ?
Yönlendirme Nedir ?
Ağ Katmanı Nedir 2 ?
Ağ Katmanı Nedir ?
Veri Bağı Katmanı Nedir 2 ?
Android Studio Nasıl Kurulur ?
Veri Bağı Katmanı Nedir ?
Fiziksel Katman Nedir ?
Son Yazılar
TCP nedir ? Aktarım Katmanı 2 Aktarım Katmanı Tcp Nedir Yönlendirme Nedir 2 ? Yönlendirme Nedir ? Ağ Katmanı Nedir 2 ? Ağ Katmanı Nedir ? Veri Bağı Katmanı Nedir 2 ? Android Studio Nasıl Kurulur ? Veri Bağı Katmanı Nedir ? Fiziksel Katman Nedir ?
paralel programlama

Paralel Programlama Bölüm 3

Paylaşım , Takip İçin

Paralel Donanım ve Yazılımlar

• Verimli paralel programlar yazabilmemiz için paralel olarak çalışacak
programın üzerinde çalışacağı bilgisayar donanımı ve işletim sistemi
hakkında bilgi sahibi olmamız gerekiyor.
• Bu bölüm içerisinde paralel yazılım yöntemlerinden bahsedeceğiz.

Paralel Yazılım

• Günlük yaşantımızda paralel donanımları PC’ler ve Sunucu
bilgisayarlarda yaygın olarak kullanıyoruz, ama aynı durum paralel
yazılımlar için geçerli mi?
• Paralel Yazılımları iki alt başlık içinde inceleyebiliriz
• Hafıza Paylaşımlı ve Dağıtık Hafızalı sistemler
• Paylaşımlı hafızalarda çalışan programlar tek bir işlem (process)
üzerinden çoklu iş parçacıkları (thread) kullanarak çalışırlar.
• Dağıtık sistemlerde ise görevleri (tasks) gerçekleştirmek için her çoklu
işlem (process) yapılarına ihtiyaç duyulmaktadır.

Hafıza Paylaşımlı Programlar

• Hafıza paylaşımlı programlarda değişkenler (variables) paylaşılabilir
(public) veya özel (private) olabilir.
• Paylaşılan(Public) değişkenler herhangi bir iş parçacığı (thread) tarafından
okunabilir veya yazılabilirken, Özel değişkenler (private) normalde yalnızca bir
iş parçacığı üzerinden erişilebilir.
• İş parçacıkları (thread) arasındaki iletişim genellikle paylaşılan değişkenler
aracılığıyla yapılır.
• Bu nedenle iş parçacıkları (thread) iletişim örtülü (implict) bir şekilde
gerçekleşir.

Dinamik ve Statik Thread’ler

• Birçok yazılım geliştirme ortamı paylaşımlı hafıza programları için
dinamik iş parçacıklarını (Threads) kullanır.
• Genellikle bu tür yapılar bir ana iş parçacığı ve buna bağlı işçi
threadlerden oluşmaktadır. Yeni bir Görev geldiğinde ana iş parçacığı
bu görevi bir iş parçağına atar.
• Statik Thread yapsında ise; tüm iş parçacıkları ana iş parçacığı
tarafından gerekli ayarlamanın ardından çatallanır ve tüm iş
tamamlanıncaya kadar iş parçacıkları çalıştırılır.
• Static threadler dinamiklere oranla daha hızlı çalışırlar.

Nondeterminism (Belirsizlik)

• İşlemcilerin asenkron olarak çalıştığı MIMD sistemlerinde
muhtemelen belirsizlik söz konusudur.
• Belirli bir girdi farklı çıktılarla sonuçlanırsa, hesaplama belirsizdir.
• Birden çok iş parçacığı bağımsız olarak çalışıyorsa, deyimleri
tamamladıkları göreceli hız, her çalıştırmada değişir ve dolayısıyla
programın sonuçları her çalıştırmada farklı olabilir.
• Bu durum genelde büyük sorunlara yol açmaz.
• Bazı durumlarda ise, eğer sistem kaynakları ortak kullanılıyorsa bir iş
parçacığının çıktısı diğer bir iş parçacığını engelleyebilir.

Nondeterminism Örneği

• Farz edelim ki 2 adet iş parçacığımız var (Thread 0, 1) ve bu iş
parçacıkları my_x adı verilen özel bir değişken hesaplıyorlar. Thread 0
için my_x=7 ve Thread 1 için my_x=19 olsun. Her iki iş parçacığı
aşağıdaki kodu çalıştırdığında :

. . .
printf(“Thread %d > my_val = %d\n”, my_rank, my_x);
. . .

• Farz edelim ki 2 adet iş parçacığımız var (Thread 0, 1) ve bu iş
parçacıkları my_x adı verilen özel bir değişken hesaplıyorlar. Thread 1
için my_x=7 ve Thread 2 için my_x=19 olsun. Her iki iş parçacığı
aşağıdaki kodu çalıştırdığında :

. . .
printf(“Thread %d > my_val = %d\n”, my_rank, my_x);
. . .

• Birinci Çalıştırmada ekran çıktısı:


Thread 0 > my_val = 7
Thread 1 > my_val = 19


İkinci Çalıştırmada ise:


Thread 1 > my_val = 19
Thread 0 > my_val = 7


şeklinde gerçekleşebilir.

paralel programlama

Dağıtık Hafızalı Programlar

• Dağıtık hafızalı (bellek) programlarında, çekirdekler doğrudan sadece
kendi özel hafızalarına erişebilir.
• Bu yapı için en yaygın kullanılan yöntem Mesaj-geçişi (messagepassing) yöntemidir.
• Dağıtık hafızalı sistemler paylaşımlı bir hafıza üzerinde de kolaylıkla
uygulanabilir.
• Programcı mantıksal olarak ortak belleği çeşitli iş parçacıkları için özel
adres alanlarına bölebilir.
• Daha sonra bir kitaplık veya derleyici iş parçacıkları arasında gereken
iletişimi uygulayabilir.

Mesaj-geçişi (Message-passing)

• Mesaj-geçişi API (Application Programming Interface) en azından bir
mesaj gönderim (send) ve alım (receive) fonksiyonu içermelidir.
• İşlemler tipik olarak birbirlerini rütbeleri (rank) ile tanımlarlar. p adet
işlem içeren dağıtık bir sistemde işlem rütbeleri (rank) 0,1,…p-1 olarak
tanımlanır.
• Mesaj-geçişi için en yaygın olarak kullanılan API Message Passing
Interface veya MPI’dır.

Mesaj-geçişi Örneği

char message[100];
. . .
my_rank = Get_rank();
if (my_rank == 1) {
sprintf(message, "Greetings from process 1");
Send(message, MSG_CHAR, 100, 0);
}else if (my_rank == 0) {
Receive(message, MSG_CHAR, 100, 1);
printf("Process 0 > Received: %s\n", message);
}
Get_rank() fonksyonu çağrılan işlemin rütbesini döndürür.
Ardından işlemler rütbelerine göre dallanırlar.
Rütbesi 1 olan işlem aşağıdaki fonksyon
sprintf(message, "Greetings from process 1");ile
bir mesaj oluşturur ve Send(message, MSG_CHAR, 100, 0);
fonksiyonu ile bunu işlem 0’a gönderir.
İşlem 0 ise Receive(message, MSG_CHAR, 100, 1);
fonksiyonu ile gelen mesajı alır.
message:mesaj içeriği, MSG_CHAR:mesaj türü, 100:mesaj
uzunluğu, 1:mesajı gönderen işlem.

Tek taraflı iletişim (One-sided communication)

• Mesaj-geçişli sistemlerde, bir işlem, mutlaka bir gönderme fonksiyonu
çağırmalı ve gönderme fonksiyonu, başka bir işlem tarafından bir alma
fonksiyonu ile eşleştirilmelidir.
• Tek taraflı iletişim veya uzak hafıza erişimi (remote memory access)
yapısında ise; tek bir işlem, yerel belleği başka bir işlemden veya uzak
belleği çağıran bir işlemden gelen değerle güncelleyen bir fonksyonu
çağırır.
• İletişim her zaman tek yönlüdür.

Performans

• Paralel programlara ihtiyaç duymamızın en büyük nedeni şüphesiz ki
programın performansını (çalışma hızı, işlem kapasitesi vs.)
artırmaktır.
• Peki paralel programları hangi performans kriterine göre
değerlendirmemiz gerekiyor?

Hızlanma (Speedup) ve Verimlilik (Efficiency)

Farz edelim ki programımız p adet core bulunan bir sistem üzerinde tamamen
paralel şekilde çalışıyor bu durumda programın çalışma süresi:

𝑇𝑝𝑎𝑟𝑎𝑙𝑙𝑒𝑙 =𝑇𝑠𝑒𝑟𝑖𝑎𝑙/𝑝

İle ifade edilebilir. Bu ideal durum olarak kabul edilir. Bu durumuma doğrusal
hızlanma (linear speedup) diyoruz.
Fakat bu durum gerçekte pekte mümkün olmayabiliyor ve speedup aşağıdaki
formül ile hesaplanır:

𝑆 =𝑇𝑠𝑒𝑟𝑖𝑎𝑙/𝑇𝑝𝑎𝑟𝑎𝑙𝑙𝑒𝑙

S(Speedup): Paralel programın hızlanma kriteri

Hızlanma (Speedup) ve Verimlilik (Efficiency)

İdeal durumda (ki bu gerçek hayatta pek mümkün değil) S=p olacaktır.
Sistemin verimliliği (Efficiencys (E)) ise :

𝐸 =𝑆/𝑝

formülü ile hesaplanabilir.
(E: Verimlilik S: Hızlanma p: çekirdek sayısı) formülü biraz daha açarsak:

𝐸 = 𝑆/𝑝 = (𝑇𝑠𝑒𝑟𝑖𝑎𝑙/𝑇𝑝𝑎𝑟𝑎𝑙𝑙𝑒𝑙)/𝑝 =𝑇𝑠𝑒𝑟𝑖𝑎𝑙/𝑝 . 𝑇𝑝𝑎𝑟𝑎𝑙𝑙𝑒𝑙

Olarak hesaplanır.

Paralelleştirme Maliyeti (Parallel overhead)

Gerçek hayatta herhangi bir program paralelleştirilirken verinin core’lara dağıtılması
ve tekrar birleştirilmesi gibi ek maliyetler ortaya çıkmakta ve buda sistemin
paralelleştirilme süresinin üzerine bir yük olarak eklenmektedir.

𝑇𝑝𝑎𝑟𝑎𝑙𝑙𝑒𝑙 =(𝑇𝑠𝑒𝑟𝑖𝑎𝑙/𝑝) + 𝑇𝑜𝑣𝑒𝑟ℎ𝑒𝑎𝑑

İşlemlerin core’lara dağıtılıp tekrar toplanması süresi Seri hesaplama süresinden
çok daha küçüktür.

𝑇𝑜𝑣𝑒𝑟ℎ𝑒𝑎𝑑<< 𝑇𝑠𝑒𝑟𝑖𝑎l

Amdahl Yasası

• 1960 da Gene Amdahl tarafından ortaya konulan yasa:
• Amdahl’a göre bir programı tümüyle Paralelleştirmek mümkün değildir. Bu
yüzden belirli bir seviyeden sonra core sayısını ne kadar artırırsanız arttırın
sistemi daha fazla hızlandıramazsınız.

Paralel Program Tasarımı

• Paralel donanım mimarileri belirli kriterler çerçevesinde tasarlanarak
üretilebilmesine rağmen Seri bir programı paralel bir programa
çevirebilmek için kesin bir çözüm yolu bulunmamaktadır.
• Yine de Ian Foster’ın geliştirmiş olduğu Paralel Program Tasarımı ve
Mimarisi başlıklı eserinde Paralel Programlama metodolojisini 4 adıma
ele almıştır.

Paralel Programlama Metodolojisi

• Ian Foster’ın Yöntemi aşağıda verilen dört temel prensibe
dayanmaktadır (Foster’s methodology):

1. Bölme (Partitioning)
2. Haberleşme (Communication)
3. Birleştirme (Aggregation)
4. Planlama (Mapping)

Bölme (Partitioning)

• Gerçekleştirilecek hesaplamayı ve hesaplamayda kullanılacak olan
verileri küçük görevlere bölünmelidir. Buradaki odaklanma, paralel
olarak yürütülebilecek görevlerin tanımlanması üzerine olmalıdır.
• Divide and Conquer (Böl ve Yönet)

Haberleşme (Communication)

• Bir önceki adımda tanımlanan görevler arasında hangi iletişimin
yapılması gerektiğini belirlenmelidir:
• Dağıtık bir Sistem mi kullanacağız yoksa Hafıza paylaşımlı bir sistem mi olacak?
• Paralel sistem görevli arasında haberleşme nasıl olmalı?

Birleştirme (Aggregation)

• İlk adımda belirlenen görevleri ve iletişimleri daha büyük görevlere
birleştirin.
• Örneğin, görev A, görev B yürütülmeden önce yürütülmeliyse, bunları
tek bir bileşik göreve toplamak mantıklı olabilir.

Planlama (Mapping)

• Bir önceki adımda tanımlanan bileşik görevleri süreçlere atayın.
• Bu, iletişimin en aza indirgenmesi ve her işlemin kabaca aynı miktarda
işle uğraşması için yapılmalıdır

Bir sonraki Paralel programlama konusu için — Tıklayınız


Paylaşım , Takip İçin
0 0 votes
Article Rating

Bir Cevap Yazın

0 Yorum
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x
HAYALİNDEKİ YAZILIM
%d blogcu bunu beğendi: