Paralel hesaplama

Paralel hesaplama (ya da koşut hesaplama), birden fazla hesaplama işleminin aynı anda gerçekleştirildiği bir hesaplama biçimidir. Bu yaklaşımda büyük bir problem daha küçük parçalara bölünür; her parça bağımsız olarak işlenir ve sonuçlar birleştirilerek nihai yanıt elde edilir. Geleneksel dizisel hesaplamada adımlar sırayla, tek bir merkezi işlem birimi üzerinde yürütülürken, paralel hesaplamada pek çok işlemci ya da çekirdek eş zamanlı olarak birlikte çalışır.[1][2]
Paralel hesaplamayı zorunlu kılan temel etken, Moore yasası kapsamında transistör yoğunluğunun artmaya devam etmesine karşın Dennard ölçeklemesinin 2000'li yılların ortasında çökmesidir. Bu çöküş, saat frekansını artırmanın beraberinde getirdiği güç tüketimi ve ısı sorunlarıyla birlikte "güç duvarı" olarak adlandırılan bir engeli gündeme getirdi. Tasarımcılar tek bir çekirdeği hızlandırmak yerine aynı kırmık üzerine birden fazla çekirdek yerleştirme yolunu seçti; bu sayede çok çekirdekli işlemciler, 2005'ten itibaren masaüstü bilgisayarlardan sunuculara uzanan geniş bir alanda standart hâle geldi.[3]
Günümüzde paralel hesaplama; çok çekirdekli işlemcilerden binlerce düğümlü süper bilgisayarlara, grafik işlem birimlerinden (GPU) bulut tabanlı dağıtık sistemlere kadar çok farklı ölçeklerde uygulanmaktadır. Makine öğrenimi, iklim modelleme, ilaç tasarımı ve büyük veri analitiği gibi güncel uygulama alanları, günümüz hesaplama altyapısının paralel doğasına doğrudan bağımlıdır. Yapay zekâ modellerinin eğitimi gibi görevler, on binlerce GPU'yu eşgüdümlü biçimde çalıştırmayı gerektirmektedir.[4]
Tarihçe
[değiştir | kaynağı değiştir]
Paralel hesaplamanın kökleri 1960'lı yıllara uzanır. Bu dönemde ana bilgisayar üreticileri, birden fazla işlemciyi eşgüdümlü çalıştıran sistemler geliştirmeye başladı. 1966'da tanıtılan ILLIAC IV, 64 işlem birimini aynı anda çalıştırabilen ve döneminin en iddialı paralel mimarilerinden biri olan dizi işlemcisi olarak tarihe geçti. Aynı yıllarda Intel'in 4004 gibi tek çipli mikroişlemcilerden yıllar öncesinde, büyük ölçekli bilimsel hesaplama merkezleri birden fazla işlemci içeren sistemleri araştırıyordu.[5]
Teorik çerçeveyi belirleyen önemli bir kırılma noktası 1967'de yaşandı: Gene Amdahl, tüm sistemin paralel hesaplamadan sağlayabileceği hızlanmanın, programın dizisel kalan kesimiyle sınırlı olduğunu matematiksel olarak ortaya koydu.[6] Bu çalışma, Amdahl yasası adıyla paralel hesaplama araştırmalarının temel taşlarından biri hâline geldi.
1970'ler ve 1980'ler, vektör işlemcilerin altın çağıdır. 1976'da Seymour Cray tarafından tasarlanan Cray-1, saniyede 160 milyon kayan noktalı işlem gerçekleştirme kapasitesiyle döneminin en hızlı bilgisayarıydı. Vektör birimleri, aynı işlemi büyük veri dizileri üzerinde tek bir buyrukla uygulayarak önemli bir performans artışı sağlıyordu. Bu dönemde aynı zamanda simetrik çoklu işlemci (İngilizce: symmetric multiprocessor, SMP) mimarileri de ticari sistemlerde yaygınlaşmaya başladı.[3]
1990'ların başında büyük ölçekli paralel işlemciler (İngilizce: massively parallel processor, MPP), bağımsız işlemci düğümlerini birbirine bağlayarak binlerce çekirdeğe ulaşan devasa sistemler kurdu. 1993'te TOP500 listesinin yayımlanmaya başlamasıyla süper bilgisayar rekabeti resmî bir zemine oturdu. 1994'te NASA'dan Thomas Sterling ve Don Becker, sıradan kişisel bilgisayarlardan oluşan ucuz bilgisayar kümelerinin bilimsel hesaplamada kullanılabileceğini göstererek Beowulf kavramını ortaya koydu. Bu gelişmeyle birlikte paralel hesaplama yalnızca büyük kurumların değil, üniversitelerin ve araştırma laboratuvarlarının da erişebildiği bir alan hâline geldi.[5]
Yazılım cephesinde ise 1992'de OpenMP ve 1994'te MPI (İngilizce: Message Passing Interface) standartlarının oluşturulması, taşınabilir paralel programlamayı mümkün kıldı. Bu standartlar, farklı donanım platformlarında çalışabilen paralel uygulamaların geliştirilmesinin önünü açtı.[2]
2000'li yılların ortasında Intel ve AMD'nin çok çekirdekli tüketici işlemcileri piyasaya sürmesiyle paralel hesaplama, masaüstü ve dizüstü bilgisayarların olağan bir özelliği hâline geldi. Bu değişimin ardındaki temel neden, artan transistör sayısına karşın tekli çekirdek performansının güç ve ısı duvarına çarpmasıydı; artık frekans artışı yerine çekirdek adedi artırmak temel tasarım stratejisi oldu.[1]
2010'ların sonundan itibaren derin öğrenme ve büyük dil modellerinin yükselişi, grafik işlem birimlerini ve özelleşmiş yapay zekâ hızlandırıcılarını hesaplama gündeminin odak noktası hâline getirdi. Günümüzde eksaölçek (İngilizce: exascale) süper bilgisayarlar, saniyede 1018 kayan noktalı işlem sınırını aşmış bulunmaktadır.[4]
Temel kavramlar
[değiştir | kaynağı değiştir]Hızlanma ve Amdahl yasası
[değiştir | kaynağı değiştir]
Hızlanma, paralel bir programın N işlemciyle elde ettiği süre kazanımını ölçen temel ölçüttür. Bir programın dizisel (tek işlemcili) çalışma süresi , N işlemcili paralel çalışma süresi ise ile gösterilirse, hızlanma şöyle tanımlanır:
Gene Amdahl, 1967'de bir programın paralelleştirilebilen kesiminin p oranında olduğunu varsayarak elde edilebilecek maksimum hızlanmayı formüle etti:[6]
Burada , iş yükünün paralel çalıştırılabilen oranı; ise değişmez dizisel kesimdir. Bu formülün en çarpıcı sonucu şudur: N sonsuza gitse bile hızlanma ile sınırlıdır. Örneğin programın yalnızca %5'i dizisel kalıyorsa sonsuz işlemciyle bile 20 kattan fazla hızlanma sağlanamaz. Bu sınır, paralel sistem tasarımında dizisel darboğazların ne denli kritik olduğunu vurgular.[6]
Hızlanma, doğrusal olmayan bir ilişkidir: gerçek sistemlerde iletişim yükü, eşzamanlama maliyetleri ve önbellek tutarsızlıkları nedeniyle kuramsal değerin altında kalınır.[3]
Gustafson yasası
[değiştir | kaynağı değiştir]
Amdahl yasası, problem boyutunu sabit tutarak işlemci sayısını artırdığımızda hızlanmanın sınırlı kaldığını göstermektedir. Ancak pratikte kullanıcılar genellikle daha hızlı bilgisayarla daha büyük problemi çözmeyi hedefler; bu durumda problem boyutu işlemci sayısıyla birlikte büyür.
John Gustafson 1988'de bu gözlemden yola çıkarak "zayıf ölçekleme" (İngilizce: weak scaling) yaklaşımını önerdi:[7] Sabit süre içinde N işlemciyle çözülebilecek en büyük problemin ölçeklenmiş hızlanması şöyledir:
Burada , toplam işin dizisel kesiminin oranıdır. Gustafson yasası, paralel sistemlerin sabit bir problemde çöktüğü iddiasını yanlışlar; problem büyüdükçe büyük işlemci sayılarında bile anlamlı hızlanma elde edilebileceğini gösterir. Bu bulgu, iklim simülasyonu ve genomik gibi problem boyutunun veri miktarıyla doğrudan büyüdüğü uygulamalar için büyük önem taşır.[7]
Amdahl ile Gustafson yasaları birbirini dışlamaz; sabit yük için Amdahl, büyüyen yük için Gustafson uygun ölçütü sağlar.[2]
Bağımlılıklar, taneciklilik ve eşzamanlama
[değiştir | kaynağı değiştir]Paralel hesaplamada bir programın ne ölçüde paralelleştirilebileceğini belirleyen temel etken, işlemler arasındaki veri bağımlılıklarıdır. Bernstein koşulları, iki işlemin çakışan okuma/yazma kümeleri olmadığında güvenle paralel yürütülebileceğini tanımlar. Bir işlemin çıktısı başka bir işlemin girdisiyse oluşan akış bağımlılığı, bu iki işlemin paralel çalışmasını engeller.[2]
Taneciklilik, işin ne kadar küçük birimlere bölündüğünü ifade eder. İnce taneli (İngilizce: fine-grained) ayrıştırmada her birim çok az iş taşır; bu durum yük dengelemeyi kolaylaştırır ancak eşzamanlama yükünü artırır. Kaba taneli (İngilizce: coarse-grained) ayrıştırmada parçalar büyüktür; iletişim maliyeti düşer ancak bazı işlemciler boşa bekleyebilir.
Birden fazla iş parçacığının paylaşımlı veriyi koşullu sırayla değiştirdiği durumlarda yarış durumu (İngilizce: race condition) ortaya çıkabilir. Yarış durumunu önlemek için karşılıklı dışlama (İngilizce: mutual exclusion) mekanizmaları, kilitler ve semaforlar kullanılır; ancak bu mekanizmalar yanlış tasarlandığında kilitlenmeye (İngilizce: deadlock) yol açabilir. Kilitlenme, iki ya da daha fazla iş parçacığının birbirinin bırakmasını beklediği döngüsel bekleme durumudur. Eşzamanlama maliyeti; bariyer senkronizasyonu, kilit yarışması ve önbellek tutarsızlığı protokol trafiği biçimlerinde performansa yansır.[5]
"Utanç verircesine paralel" (İngilizce: embarrassingly parallel) problem, parçaları arasında hiç ya da çok az iletişim gerektiren, dolayısıyla neredeyse mükemmel hızlanma sağlayan bir iş yüküdür. Monte Carlo benzetimleri ve kaba kuvvet arama algoritmaları bu sınıfın tipik örnekleridir.[2]
Paralellik türleri
[değiştir | kaynağı değiştir]Bit düzeyi paralellik
[değiştir | kaynağı değiştir]Bit düzeyi paralellik (İngilizce: bit-level parallelism), işlemcinin tek bir adımda kaç bit üzerinde işlem yapabildiğine ilişkin en temel paralellik biçimidir. İlk mikroişlemciler 8 bitlik sözcük uzunluğuyla çalışıyordu; ardından 16, 32 ve bugün yaygın biçimde 64 bitlik işlemciler standart hâle geldi. Sözcük uzunluğunun iki katına çıkması, tamsayı aritmetiği ve bellek adresleme gibi işlemlerde iki katı daha yüksek doğal paralellik anlamına gelir. Bu ilerleme donanım tasarımına içkin bir paralellik türüdür ve programcı müdahalesi gerektirmez.[1]
Buyruk düzeyi paralellik
[değiştir | kaynağı değiştir]
Buyruk düzeyi paralellik (İngilizce: instruction-level parallelism, ILP), tek bir iş parçacığı içindeki buyruklara aynı anda birden fazla adımda yürütme olanağı tanıyan donanım mekanizmalarını kapsar.[3]
Boru hattı (İngilizce: pipeline), bir buyruğu getirme, çözme, yürütme ve geri yazma gibi birbirini izleyen aşamalara böler; her aşama farklı bir buyruk üzerinde eş zamanlı çalışarak işlemciyi sürekli meşgul tutar. Beş aşamalı klasik RISC boru hattı bu tasarımın temel örneğidir.
Çoklu buyruk başlatımlı (İngilizce: superscalar) işlemciler, tek bir saat çevriminde birden fazla buyruk başlatır. sıra dışı yürütme (İngilizce: out-of-order execution), veri bağımlılığı olmayan buyruklara sırasıyla değil, kaynaklarının hazır olduğu anda yürütme izni vererek boru hattı duraksatmalarını en aza indirir. Eşzamanlı çoklu iş parçacığı (İngilizce: simultaneous multithreading, SMT) ise tek bir fiziksel çekirdeğin birden fazla iş parçacığı bağlamını aynı anda tutarak boru hattı boşluklarını farklı iş parçacıklarının buyruklarıyla doldurmasını sağlar.[3]
Öngörüye dayalı yürütme (İngilizce: speculative execution) ve dallanma öngörüsü (İngilizce: branch prediction) de ILP'yi destekleyen temel mekanizmalardandır: işlemci, koşullu dallanmanın yönünü tahmin ederek bu tahmine göre buyruklara önceden yürütme başlatır; tahmin yanlışsa boru hattı temizlenerek doğru yol izlenir.[1]
Veri düzeyi paralellik
[değiştir | kaynağı değiştir]Veri düzeyi paralellik (İngilizce: data-level parallelism, DLP), aynı işlemin büyük veri kümelerinin tüm elemanları üzerinde eş zamanlı uygulanmasını tanımlar. Tek buyruk, çoklu veri (İngilizce: single instruction, multiple data, SIMD) mimarisi, tek bir buyruğun çok sayıda veri öğesi üzerinde paralel yürütülmesine olanak tanır. Modern masaüstü ve sunucu işlemcilerindeki SSE, AVX ve ARM NEON gibi vektör uzantıları bu mimarinin tüketici donanımındaki yansımasıdır.
Vektör işlemciler, tüm tasarımı geniş yazmaçlara ve toplu veri işlemine yönelik olan ve bu sayede sıkıştırma/genişletme döngülerine gerek bırakmayan özelleşmiş birimlerdir. Grafik işlem birimlerindeki binlerce küçük çekirdek de özünde son derece geniş bir SIMD yapısıdır; vektör boyutu bazen 1024 bit ya da daha fazlasına ulaşabilir.[3]
Görev düzeyi paralellik
[değiştir | kaynağı değiştir]Görev düzeyi paralellik (İngilizce: task-level parallelism, TLP), farklı işlemcilerin ya da çekirdeklerin birbirinden görece bağımsız görevleri eş zamanlı yürütmesini ifade eder. Veri düzeyi paralellikten farkı, işlemlerin aynı veri yapısı üzerinde değil, farklı veri kümeleri ya da tamamen farklı hesaplama akışları üzerinde gerçekleşmesidir. Çok iş parçacıklı uygulamalarda, iş kuyruğuna dayalı çalışma çalma (İngilizce: work stealing) düzeneklerinde ve çatallan-birleş modelinde görev düzeyi paralellik temel soyutlamayı oluşturur.[2]
Donanım
[değiştir | kaynağı değiştir]Çok çekirdekli ve çok işlemcili sistemler
[değiştir | kaynağı değiştir]
Çok çekirdekli (İngilizce: multi-core) işlemciler, tek bir entegre devre kırmığı üzerinde birden fazla tam işlemci çekirdeği barındırır. Her çekirdeğin kendine ait birinci ve ikinci düzey önbellekleri bulunurken üçüncü düzey önbellek genellikle tüm çekirdekler tarafından paylaşılır. Günümüz tüketici işlemcilerinde 4 ila 24 çekirdek alışıldık bir sayı iken sunucu işlemcileri 96 veya daha fazla çekirdek içerebilmektedir.[1]
Simetrik çoklu işlemci (İngilizce: symmetric multiprocessor, SMP) mimarisinde birden fazla fiziksel işlemci aynı paylaşımlı ana belleğe ve işletim sistemine erişir. Tüm işlemciler eşit haklara sahip olmakla birlikte ortak veri yoluna ve belleğe erişim, bant genişliği darboğazı oluşturabilir.
Eşzamanlı çoklu iş parçacığı (SMT), tek bir fiziksel çekirdeğe birden fazla donanım iş parçacığı bağlamı ekleyerek yürütme kaynaklarının daha verimli kullanılmasını sağlar. Intel'in "Hyper-Threading" markasıyla tanıttığı bu teknoloji yaygın bir örnektir.[3]
Bellek mimarisi
[değiştir | kaynağı değiştir]
Bellek mimarisi, paralel sistemlerin tasarımında hem performansı hem de programlama karmaşıklığını doğrudan etkileyen temel etkendir. Başlıca iki model şöyle ayrılır:[5]
Paylaşımlı bellek (İngilizce: shared memory) modelinde tüm işlemciler tek bir mantıksal adres uzayını görür. İki alt sınıfa ayrılır:
- Düzgün bellek erişimi (UMA): Her işlemcinin her bellek hücresine erişim süresi eşittir. Küçük SMP sistemlerinde yaygındır; ancak çekirdek sayısı arttıkça ortak veriyolundaki çekişme darboğaz yaratır.
- Düzgün olmayan bellek erişimi (NUMA): Her işlemcinin bir yerel bellek bankası vardır; yerel erişim uzak erişimden çok daha hızlıdır. Günümüz çok soketli sunucu sistemlerinin büyük bölümü NUMA mimarisi kullanır. İşletim sistemi ve çalışma zamanı kütüphaneleri, iş parçacıklarını yerel belleklerine yakın tutmaya çalışarak gecikmeyi azaltır.
Paylaşımlı bellekli sistemlerde önbellek tutarlılığı (İngilizce: cache coherence) kritik bir sorundur: bir çekirdek ortak bir veri satırını değiştirdiğinde, diğer çekirdeklerin önbelleklerindeki eski kopyaların geçersiz kılınması gerekir. MESI ve MESIF gibi protokoller bu tutarlılığı sağlar; ancak büyük sistemlerde protokol trafiği önemli bir yük oluşturabilir.[5]
Dağıtık bellek (İngilizce: distributed memory) modelinde ise her işlemcinin yalnızca kendi yerel belleğine doğrudan erişimi vardır; düğümler arası veri alışverişi açık mesaj geçişiyle gerçekleştirilir. Bu model ölçekleme açısından üstündür; ancak programlama sorumluluğunu artırır.
Dağıtık bellekli sistemler
[değiştir | kaynağı değiştir]
Bilgisayar kümeleri (İngilizce: computer cluster), ağ üzerinden bağlı bağımsız bilgisayarların (düğüm) tek bir hesaplama kaynağı olarak sunulduğu sistemlerdir. Her düğüm kendi işletim sistemini ve belleğini barındırır; düğümler arası iletişim yüksek hızlı Ethernet, InfiniBand ya da benzeri ara bağlantı ağlarıyla sağlanır.[5]
Beowulf kümeleri, ticari hazır bileşenlerden oluşturulan ve Linux işletim sistemi üzerinde çalışan düşük maliyetli bilimsel hesaplama kümeleridir. 1990'ların ortasında başlayan bu hareket, paralel hesaplamayı tüm araştırma kurumlarına erişilebilir kıldı.
Büyük ölçekli paralel işlemciler (İngilizce: massively parallel processor, MPP), binlerce hatta on binlerce düğümden oluşan, özel tasarım ara bağlantı ağlarına sahip sistemlerdir. Top500 listesindeki en yüksek sıralardaki süper bilgisayarların büyük çoğunluğu bu kategoridedir.
Izgara bilişim (İngilizce: grid computing), coğrafi olarak dağılmış kurumların bilgisayarlarını sanal bir havuzda birleştirerek büyük ölçekli hesaplama görevlerini paylaştırır. Bulut bilişim, sanal makineler ve konteyner teknolojisi aracılığıyla benzer bir kaynak paylaşımını ticari hizmet modeliyle sunar; kullanıcılar ihtiyaç duydukları işlemci sayısını dinamik olarak kiralayabilir.[4]
Özelleşmiş paralel donanım
[değiştir | kaynağı değiştir]Grafik işlem birimi (GPU), başlangıçta ekran görüntüleme için tasarlanmış olmakla birlikte bugün genel amaçlı paralel hesaplamanın merkezindedir. Modern bir GPU, her biri daha yavaş ama binlercesi eş zamanlı çalışan akış işlemcisi çekirdeği barındırır; bu yapı, veri paralel iş yüklerinde merkezi işlem biriminin on kat ya da daha fazlasına ulaşan iş hacmi sunabilir. Genel amaçlı grafik işlem birimi (İngilizce: general-purpose GPU, GPGPU) hesaplama, GPU'yu yalnızca grafik değil bilimsel, finansal ve yapay zekâ uygulamaları için de kullanmayı ifade eder. CUDA ve OpenCL bu alanda önde gelen programlama ortamlarıdır.[4]
Alan programlanabilir kapı dizileri (İngilizce: field-programmable gate array, FPGA), yeniden yapılandırılabilirlikleri sayesinde belirli paralel algoritmaları doğrudan donanımda gerçekleştirmeye olanak tanır. Yapay zekâ hızlandırıcıları (Google'ın TPU'su, Graphcore IPU'su gibi), derin öğrenme iş yüklerine özgü matris ve tensör işlemlerini son derece verimli biçimde gerçekleştirmek üzere tasarlanmıştır.[4]
Flynn sınıflandırması
[değiştir | kaynağı değiştir]Michael Flynn, 1966'da bilgisayar mimarilerini buyruk ve veri akışlarının sayısına göre dört sınıfa ayırdı:[3]
- Tek buyruk, tek veri (SISD): Geleneksel tek çekirdekli dizisel işlemci; aynı anda bir buyruk, bir veri öğesi işler.
- Tek buyruk, çoklu veri (SIMD): Tek buyruk aynı anda birçok veri öğesi üzerinde yürütülür; vektör işlemciler ve GPU'lar bu sınıfa girer.
- Çoklu buyruk, tek veri (MISD): Aynı veri akışı birden fazla buyruk tarafından bağımsız olarak işlenir; hataya dayanıklı sistemlerde görülür, pratikte nadirdir.
- Çoklu buyruk, çoklu veri (MIMD): Her işlemci farklı bir buyruk akışını farklı veri üzerinde yürütür; modern çok çekirdekli ve çok düğümlü sistemlerin büyük çoğunluğu bu sınıftadır.
MIMD, günümüzde en yaygın paralel mimari sınıfıdır; paylaşımlı ve dağıtık bellekli sistemlerin tamamı bu çatı altında değerlendirilir.
Yazılım
[değiştir | kaynağı değiştir]Paralel programlama modelleri
[değiştir | kaynağı değiştir]
Paralel programlama, hesaplamanın birden fazla yürütme akışı arasında nasıl bölüştürüleceğini ve bu akışların nasıl koordine edileceğini belirleyen yazılım soyutlamalarını kullanır. Başlıca modeller şunlardır:[2]
Paylaşımlı bellek modeli, tüm iş parçacıklarının aynı adres uzayına eriştiği ve veriyi doğrudan yazmaç üzerinden paylaştığı programlama yaklaşımıdır. Programcı, yarış durumlarını önlemek için kritik bölgeleri kilitler ya da atomik işlemlerle korumak zorundadır. Bu model, görece kolay geçişe izin verir; çünkü tek iş parçacıklı program altyapısından büyük ölçüde yararlanılabilir. Bununla birlikte önbellek tutarlılığı ve ölçeklenebilirlik sorunları dikkatli tasarım gerektirir.
Mesaj geçişi modeli (İngilizce: message passing), her işlemin kendi yerel belleği olduğunu ve işlemler arası verinin açık gönder/al çağrılarıyla aktarıldığını öngörür. Dağıtık bellekli küme sistemlerinde zorunlu olan bu model, veri akışının programcı tarafından açıkça yönetilmesini gerektirir; ancak ölçeklenebilirliği genellikle paylaşımlı bellek modelinden daha iyidir.
Veri paralel model, aynı işlemlerin büyük veri yapılarının her öğesine bağımsız olarak uygulandığı bir soyutlamadır. GPU programlamasında ve SIMD optimizasyonunda yaygındır.
Çatallan-birleş (İngilizce: fork-join) modeli, ana iş parçacığının paralel bir bölgeye girdiğinde birden fazla iş parçacığı ürettiği (çatallama), tüm iş parçacıkları işini bitirince yeniden tek akışta birleştiği (birleşme) yapıyı tanımlar. Bu model yinelemeli bölüm-yönet algoritmalarının doğal ifade biçimidir.
Programlama araçları
[değiştir | kaynağı değiştir]OpenMP (İngilizce: Open Multi-Processing), paylaşımlı bellekli çok çekirdekli sistemlerde C, C++ ve Fortran programlarını yönlendirici (pragma) tabanlı anotasyonlarla paralel kılmayı sağlayan bir uygulama programlama arayüzüdür. Döngü paralelleştirme, görev tabanlı paralellik ve SIMD anotasyonları desteklenmektedir. Mevcut koda eklenti niteliğinde çalışması, benimsenmesini kolaylaştırmıştır.[2]
MPI (İngilizce: Message Passing Interface), dağıtık bellekli sistemlerde süreçler arası mesaj alışverişini standartlaştıran geniş kapsamlı bir arayüz kitaplığıdır. Nokta-nokta ve toplu iletişim işlemlerini kapsar; büyük ölçekli süper bilgisayar uygulamalarında fiilî standart konumundadır.
CUDA (İngilizce: Compute Unified Device Architecture), NVIDIA GPU'larını genel amaçlı hesaplama için programlamayı sağlayan Nvidia'nın paralel hesaplama platformudur. İş parçacıklarını ızgara (grid) ve blok hiyerarşisinde düzenler; her blok paylaşımlı yerel belleğe erişebilir. Derin öğrenme çerçevelerinin büyük çoğunluğu CUDA üzerine kuruludur.[4]
OpenCL (İngilizce: Open Computing Language), CPU, GPU, FPGA ve diğer hızlandırıcılar dahil heterojen platformlarda taşınabilir paralel kod yazmayı sağlayan açık standarttır. Belirli bir üreticiye bağlı olmaksızın geniş donanım yelpazesinde çalışabilmesi temel avantajıdır.
Otomatik paralelleştirme ve zorluklar
[değiştir | kaynağı değiştir]Derleyici tabanlı otomatik paralelleştirme, programcının müdahalesi olmaksızın dizisel koddan paralel kod üretmeyi hedefler. Bu yaklaşım, özellikle bağımsız dizi işlemlerini içeren düzenli döngülerde (İngilizce: loop parallelization) başarı sağlayabilir. Ancak karmaşık veri bağımlılıkları, işaretçi örtüşmeleri ve yan etkileri olan fonksiyon çağrıları, derleyiciyi doğruluğu garanti edemediği için yasal olmayan dönüşümlerden alıkoymaktadır. Dolayısıyla otomatik paralelleştirme, pratik iş yüklerinin yalnızca bir alt kümesinde etkilidir.[2]
Paralel program geliştirmenin önündeki pratik güçlükler şunlardır:
- Yük dengeleme (İngilizce: load balancing): İşin işlemciler arasında eşit dağılmaması hâlinde bazı çekirdekler boşta beklerken diğerleri aşırı yüklenir; bu dengesizlik toplam hızlanmayı sınırlar.
- Ölçeklenebilirlik sınırı: İletişim yükü ve eşzamanlama maliyetleri arttıkça ek işlemcilerin katkısı azalır; belirli bir noktadan sonra çekirdek eklemek performansı düşürebilir.
- Hata ayıklama güçlüğü: Yarış durumları ve kilitlenmeler yeniden üretilmesi güç, zamana bağlı hatalar oluşturur; geleneksel tek iş parçacıklı hata ayıklama araçları çoğu zaman yetersiz kalır.
- Önbellek tutarsızlığı ve bellekten bağlantı tıkanması: Birden fazla çekirdek aynı önbellek satırını değiştirdiğinde ortaya çıkan "yanlış paylaşım" (İngilizce: false sharing), gereksiz tutarlılık trafiği yaratarak performansı düşürür.[5]
Uygulama alanları
[değiştir | kaynağı değiştir]Paralel hesaplama, günümüzde pek çok kritik alanda vazgeçilmez bir altyapı unsuru hâline gelmiştir.
Bilimsel hesaplama ve mühendislik simülasyonu, tarihsel olarak yüksek başarımlı paralel hesaplamanın birincil çekici alanı olmuştur. Hava durumu tahmini, iklim modelleme, hesaplamalı akışkanlar dinamiği, deprem simülasyonu ve sonlu elemanlar yöntemi tabanlı yapısal analizler, binlerce düğüm üzerinde çalışan paralel kodlar gerektirmektedir. Bu uygulamaların büyük çoğunluğu, MPI ile yazılmış ve on yıllardır süregelen bilimsel yazılım mirasına dayanmaktadır.[4]
Yapay zekâ ve makine öğrenimi, 2010'lardan itibaren paralel hesaplama talebinin en hızlı büyüyen alanı olmuştur. Derin sinir ağlarının eğitimi, trilyonlarca parametre üzerinde gerçekleştirilen matris çarpımlarından oluşur; bu işlemler, binlerce GPU çekirdeğinde veri ve model paralelliğiyle dağıtılır. Makine öğrenimi çerçeveleri olan TensorFlow ve PyTorch, GPU paralelliğini programcıya görünmez biçimde soyutlar; ancak arka planda karmaşık dağıtık eğitim protokolleri çalışmaktadır.[4]
Grafik ve görüntü işleme, gerçek zamanlı üç boyutlu oluşturma (İngilizce: rendering), oyun motorları ve sinema görsel efektleri GPU'ların sağladığı paralel işleme kapasitesine doğrudan bağımlıdır. Modern GPU mimarileri başlangıçta bu alan için tasarlanmış olsa da bugün bilimsel hesaplama ve yapay zekâ iş yükleri grafik iş yüklerini önemli ölçüde geçmiştir.
Büyük veri ve veri tabanı işlemleri, MapReduce gibi paradigmalar sayesinde petabayt ölçeğindeki veri kümelerinin paralel olarak taranmasına, gruplanmasına ve dönüştürülmesine imkân tanır. İlişkisel veri tabanlarında sorgu optimizatörleri, birleşim ve tarama işlemlerini paralel alt görevlere böler.
Gömülü sistemler ve gerçek zamanlı uygulamalar da paralel hesaplamadan giderek artan ölçüde yararlanmaktadır. Otonom araçlarda sensör kaynaştırma, baz istasyonlarında sinyal işleme ve medikal görüntülemede yeniden yapılandırma gibi görevler, gömülü sistemlere özgü çok çekirdekli işlemciler ve FPGA hızlandırıcılarıyla gerçek zamanlı kısıtlar altında paralel olarak çözülmektedir.[1]
Ayrıca bakınız
[değiştir | kaynağı değiştir]Kaynakça
[değiştir | kaynağı değiştir]- 1 2 3 4 5 6 Patterson, David A.; Hennessy, John L. (2017). Computer Organization and Design: The Hardware/Software Interface (RISC-V Edition) (İngilizce). Morgan Kaufmann.
- 1 2 3 4 5 6 7 8 9 Grama, Ananth; Gupta, Anshul; Karypis, George; Kumar, Vipin (2003). Introduction to Parallel Computing (İngilizce) (2. bas.). Addison-Wesley.
- 1 2 3 4 5 6 7 8 Hennessy, John L.; Patterson, David A. (2019). Computer Architecture: A Quantitative Approach (İngilizce) (6. bas.). Morgan Kaufmann.
- 1 2 3 4 5 6 7 8 Asanović, Krste; ve diğerleri (2006). "The Landscape of Parallel Computing Research: A View from Berkeley". Teknik Rapor UCB/EECS-2006-183, California Üniversitesi, Berkeley.
- 1 2 3 4 5 6 7 Culler, David E.; Singh, Jaswinder Pal; Gupta, Anoop (1999). Parallel Computer Architecture: A Hardware/Software Approach (İngilizce). Morgan Kaufmann.
- 1 2 3 Amdahl, Gene M. (1967). "Validity of the single processor approach to achieving large scale computing capabilities". AFIPS Conference Proceedings (İngilizce). Cilt 30. ss. 483-485.
- 1 2 Gustafson, John L. (1988). "Reevaluating Amdahl's Law". Communications of the ACM (İngilizce). 31 (5). ss. 532-533.