Rehber Paralel Programlama

Paralel Programlama
Nedir?

Paralel programlama, verileri ve işlemleri bölerek maaliyetti düşürmeyi amaçlayan bir stratejidir. Burada maliyet zaman ve para demektir.

Paralel programlama ile komutlar, veriler, döngüler, kodlar, işlemler, işlemciler ve başka birçok şey bölünerek eş zamanlı olarak çalışır ve problemleri kısa sürede çözüme ulaştırır. Basit bir örnek ile 100 tane veriyi tek işlemci yüz birim zamanda işlerken bu 100 veriyi iki işlemciye üleştirirsek eş zamanlı olarak elli birim zamanda 100 tane veri işlenmiş olur.

Bana göre bir hiledir.
Neden ihtiyaç duyuldu?
Basitçe transistörlerden bahsedelim. Transistör; açık kapalılık durumu ifade eden devre elemanıdır. Açılıma ve kapanma özelliği vardır. Açık ise 1, kapalı ise 0 bitini temsil eder. Bir transistör; 1 ve 0 ile 2 durum ifade eder. 2 transistör ise 4 durum ifade eder, 2’nin katları olarak devam eder bu. Bir işlemcide bu devre elemanında milyonlarca, milyarlarca bulunabilir.
Transistörlerin durumları; komutları ve verileri ifade eder. İşlemci bu durumları anlar ve işlemleri yapar. Transistörlerin sayısı işlem gücünü ifade eder.

Transistörlerin sayısını arttırarak bir yere kadar hız sağlanabildi. Yani yetersiz gelmeye başlandı. Moore Yasası’nı takiben her 18 ayda bir transistörlerin sayısı belli oranda artırılırdı ve artışta da yüzde 50 işlemci performansı elde edilirdi fakat bu 2002 yılına kadar sağlandı. Sonraki artışta yüzde 20 kadar işlemci hızı ön görüldü ve ileride bu performans artışı daha da düşebilirdi.

Az artış olmasının nedeni transistörlerin artık çözüm olmadığındandır. Çünkü;

  • Kompleks ve büyük ölçekli işlemler barındıran problemler için transistörlerin sayısını belli bir zamanda belli bir oran kadar artırmak performanslı önemli bir şekilde arttırmıyor ama bu problemleri çözmek için maaliyetler artıyordu. Transistörlerin sayısı tamam artırılsın ama 18 ay sonra problemlerin karmaşıklığı ve ölçeği de büyüyordu.
  • Bana göre bir neden de birçok problem için aslında bu transistör sayısı yetiyor. Daha fazla arttırmak önemli ölçüde zamandan ve maliyetten tasarruf etmiyordu..
Böyle nedenlerden ötürü başka yöntemlere ihtiyaç duyuldu. Parelel programala geliştirildi.

Yani transistör sayısını arttırmak yerine ya da güçlü bir işlemci-donanım almak yerine mevcut imkanlarla problemlerin çözüm sürelerini kısaltmak ve paradan tasarruf etmek.
Karmaşık diyebileceğemiz bazı problemler;
  • Google'ın navigasyon servisi ile anlık meteroloji ve trafik bilgisi elde edip dağıtması,
  • Yıldızların, gezegenlerin, uyduların, gezegenlerin yörünge takibi,
  • Yüzlerce yıllık deprem verilerini inceleme ve tahminler oluşturma,
  • Genetik problemleri çözme (Crossing over ile çeşitlilik falan),
  • Yapay zeka ile çoklu verileri işleme
Basitçe bir örnek ile paralel programlamanın hızı;

Seri yöntemle yani (geleneksel yöntem olan sırayla işlemleri yap mantığıyla);
12 boyutlu bir sayı dizisi var; 3, 2, 1, 4, 2, 1, 2, 3, 8, 7, 5, 6.
Siz bu sayıları for döngüsü kullanarak bu dizinin tüm elemanlarının toplamak istediniz.
Kod:
for (int indis = 0; indis < 12; i ++)
{
 Toplam += dizi[i];
}
Buradan geçen birim süre dizinin boyutu kadardır. Yani dizinin boyutu kadar işlem yapılır. Yani 12 kere.

Paralel programlamada ise verileri, işlemleri, işlemcileri vb. bölebileceğimiz için iki, üç tane, dört tane döngüyü aynı anda çalıştırabiliriz.
Mesela elimizde bulunan dizinin elemanlarını 3’leri gruplara ayıralım ve buna göre 4 farklı for döngüsünü aynı anda yürütelim.

Kod:
for(int i = 0; i<3; i++)
{
 Toplam +=dizi[i];
}
Kod:
for(int i = 3; i<6; i++)
{
 Toplam +=dizi[i];
}
Kod:
for(int i = 6; i<9; i++)
{
 Toplam +=dizi[i];
}
Kod:
for(int i = 9; i<12; i++)
{
 Toplam +=dizi[i];
}

Bir for döngüsü 3 birim sürede çalışır

Bu for döngüleri aynı anda çalıştığı zamanda 3 birim süre kadar 12 boyutlu dizinin elemanlarını toplayabilecek. Tabi bu teorik bir anlatım.
Çünkü çözüm yöntemleri de var. Mesela Master ve Slave mantığında bunu çözersek, eş zamanlı çalışan işlemlerin eksi 1 adet sayısı da bu birim süreye dahil edilir.
Yani 3 + 4 – 1 = 6 birim zamanda çözülür. Şimdilik aman aman bir kar yok gibi duruyor değil mi?
İlave not; Master ve Slave mantığı bir serileştirme yöntemi. Bir ana döngü/işlemci/fonksiyon seçilir ve diğer döngüler bu ana döngüye/işlemciye/fonskiyona son çıktılarını gönderiler ve ana döngü/işlemci/fonksiyon üzerinden bu çıktılar işlenir. Böyle bir mantıklar çalışır. Yani köle, efendi mantığında ilerler.
Devam edelim;
Teorik olarak yine örneğin 1.000.000 elemanlı bir dizinin tüm elemanlarını;

Seri yöntemle toplarsak 1.000.000 birim zamanda toplayabiliriz.

Paralel yöntemle toplarsak; dizi elemanlarını 1000'leri gruplara ayırıp, 1000 adet for döngüsüne üleş edip, eş zamanlı çalıştırdık. 1000 birim zaman artı Master ve Slave mantığıyla çözdüğümüz için 999 birim zaman eklenerek 1999 birim zamanda çözdük.
Süre çok ama çok kısaldı.

Tabii bu bir yöntemdir. Siz bu döngülerin çıktılarını da serileştirme yerine paralize edebilirsiniz ve bu süreyi daha da azaltabilirsiniz. 100 kat kadar azaltan yöntemler bile var.
İşte paralel programlama mantığı budur.
Diğer bir ilave notum ise eğer bir program veya oyun, seri yöntemle yazılırsa çoklu çekirdekli sistemlerde paralel çalışan bir yöntem olmaz ve çoklu çekirdek performansından verim alınmaz. İlk başlarda böyle sorunlar olduğu için paralel programlamanın gücü anlaşılmamıştı da ondan :D.
Sonra programlar ve oyunlar bu yönteme uyarak çıkış yaptı, güncellendi.

Bir ilave not daha; Bir ağa bağlı bilgisayarların ortak kullanımı ile de paralel programlama yapılabilir. Bu yönteme de dağıtık sistemler denir.
 
Son düzenleme:
Thread oluşturması vb. şeylerin maliyeti de var. O şekilde varsaymak doğru değil.
Onu bilmiyordum ve bilmediğim bir çok kısım da var üstad. Ben teorik anlatmaya çalıştım. Çünkü genel itibari ile maliyeti azaltan bir yöntem. Yani zamandan ve mangırlardan tasarruf etmeye yarıyor.
 
12 sayılı örneğinizi deneyebilirsiniz. Tek thread ile daha kısa süreceğine bahse girerim.

Çekirdek sayısı aaildiktaj sonra thread açmanın çok bir anlamı kalmaz. Bir milyon sayıyı bin thread ile toplayın bir de on thread ile toplayın.
Evet pek karlı değildir 12 boyutlu dizi örneği hocam ve hepsi bir varsayımdır zaten.
Aslında şöyle bir şeyden bahsettim zaten Master ve Slave için. Bir ana döngü/işlemci/fonksiyon seçilir.

Yani bu bir üleş yapma (😅) meselesidir. İşleri bölerek eş zamanlı bir çalışma gerçekleşir. Zamandan ve paradan tasaruf etmeyi amaçlar.
 
Son düzenleme:
Elinize sağlık, bu rehberi incelemenizi öneririm.

 

Geri
Yukarı