Görev paralelliği - Task parallelism
Görev paralellik (aynı zamanda fonksiyon paralellik ve kontrol paralellik ) şeklidir paralelleştirme bir bilgisayar kodu çok sayıda boyunca işlemci içinde paralel hesaplama ortamları. Görev paralelliği, süreçler veya iş parçacıkları tarafından eşzamanlı olarak gerçekleştirilen görevleri farklı işlemciler arasında dağıtmaya odaklanır . Aynı görevi farklı veri bileşenleri üzerinde çalıştırmayı içeren veri paralelliğinin aksine , görev paralelliği, aynı veri üzerinde aynı anda birçok farklı görevi çalıştırarak ayırt edilir. Yaygın bir görev paralelliği türü, tek bir veri kümesini, her bir görevin diğerlerinden bağımsız olarak yürütülebildiği bir dizi ayrı görevden geçirmekten oluşan ardışık düzen oluşturmadır.
Açıklama
Çok işlemcili bir sistemde, görev paralelliği, her işlemci aynı veya farklı veriler üzerinde farklı bir iş parçacığı (veya işlem) yürüttüğünde elde edilir. İş parçacıkları aynı veya farklı kodu çalıştırabilir. Genel durumda, farklı yürütme iş parçacıkları çalışırken birbirleriyle iletişim kurarlar, ancak bu bir gereklilik değildir. İletişim, genellikle bir iş akışının parçası olarak verilerin bir iş parçacığından diğerine aktarılmasıyla gerçekleşir .
Basit bir örnek olarak, bir sistem paralel bir ortamda 2 işlemcili bir sistemde ( CPU "a" & "b") kod çalıştırıyorsa ve "A" ve "B" görevlerini yapmak istiyorsak, şunu söylemek mümkündür CPU "a" görevini "A" yapacak ve CPU "b" "B" görevini aynı anda yapacak, böylece yürütmenin çalışma süresini kısaltacaktır. Görevler, aşağıda açıklandığı gibi koşullu ifadeler kullanılarak atanabilir .
Görev paralelliği, verilerin ( veri paralelliği ) aksine, işlemenin dağıtılmış (paralelleştirilmiş) doğasını (yani iş parçacıkları) vurgular . Çoğu gerçek program, görev paralelliği ve veri paralelliği arasındaki süreklilik üzerine bir yere düşer.
İş parçacığı düzeyinde paralellik ( TLP ), aynı anda birden çok iş parçacığı çalıştıran bir uygulamanın doğasında bulunan paralelliktir . Bu tür paralellik, büyük ölçüde veritabanları gibi ticari sunucular için yazılmış uygulamalarda bulunur . Birçok iş parçacığını aynı anda çalıştırarak, bu uygulamalar iş yüklerinin maruz kalabileceği yüksek miktarda G / Ç ve bellek sistemi gecikmesini tolere edebilir - bir iş parçacığı bir bellek veya disk erişimini beklerken, diğer iş parçacıkları yararlı işler yapabilir.
Çok çekirdekli mikroişlemcilerin ortaya çıkmasıyla birlikte, iş parçacığı düzeyinde paralellik kullanımı masaüstü pazarına da girmeye başladı . Bunun nedeni, çeşitli nedenlerden ötürü, tek bir çekirdeğin saat hızını veya saat başına komutunu arttırmanın giderek daha pratik olmamasıdır. Bu eğilim devam ederse, potansiyel bilgi işlem gücündeki artıştan yararlanmak için yeni uygulamaların birden çok iş parçacığı kullanacak şekilde tasarlanması gerekecektir. Bu, mevcut kodun daha yeni / daha hızlı bir bilgisayarda çalıştırılarak otomatik olarak hızlandırıldığı önceki mikroişlemci yenilikleriyle tezat oluşturuyor.
Misal
Aşağıdaki sözde kod , görev paralelliğini göstermektedir:
program:
...
if CPU = "a" then
do task "A"
else if CPU="b" then
do task "B"
end if
...
end program
Programın amacı, bazı net toplam görevler ("A + B") yapmaktır. Kodu yukarıdaki gibi yazıp 2 işlemcili bir sistemde başlatırsak, çalışma zamanı ortamı aşağıdaki gibi çalıştıracaktır.
- Bir SPMD (tek program, çoklu veri) sisteminde, her iki CPU da kodu yürütecektir.
- Paralel bir ortamda, her ikisi de aynı verilere erişebilir.
- "İf" yan tümcesi CPU'lar arasında farklılık gösterir. CPU "a", "if" üzerinde doğru okuyacaktır ve CPU "b", "else if" üzerinde doğru okuyacaktır, böylece kendi görevine sahip olacaktır.
- Şimdi, her iki CPU aynı anda farklı görevleri yerine getirerek ayrı kod bloklarını aynı anda yürütür.
CPU "a" tarafından yürütülen kod:
program: ... do task "A" ... end program
CPU "b" tarafından yürütülen kod:
program: ... do task "B" ... end program
Bu kavram artık herhangi bir sayıda işlemciye genelleştirilebilir.
Dil desteği
Görev paralelliği, yerleşik tesisler veya kütüphaneler tarafından genel amaçlı dillerde desteklenebilir. Önemli örnekler şunları içerir:
- Ada: Görevler (yerleşik)
- C ++ (Intel): Threading Yapı Taşları
- C ++ (Intel): Cilk Plus
- C ++ (Açık Kaynak / Apache 2.0): RaftLib
- C, C ++, Objective-C, Swift (Apple): Grand Central Dispatch
- D: görevler ve lifler
- Delphi (System.Threading.TParallel)
- Git: gorutinler
- Java: Java eşzamanlılığı
- .NET: Görev Paralel Kitaplığı
Ayrıntılı göreve paralel dillerin örnekleri, Verilog ve VHDL gibi Donanım Açıklama Dilleri alanında bulunabilir .