C++ Programlama Dili: Paralel STL Algoritmaları Kıyaslaması

Adanali

Active member
C++ Programlama Dili: Paralel STL Algoritmaları Kıyaslaması


  1. C++ Programlama Dili: Paralel STL Algoritmaları Kıyaslaması

Bugün, STL’nin en sevdiğim özelliği olan paralel STL algoritmaları hakkında Victor J. Duvanenko’nun konuk yazısını sunmaktan mutluluk duyuyorum. Victor, “Practical Parallel Algorithms in C++ and C#” üzerine bir kitap yayınladı. Bununla birlikte, doğrudan Victor’un İngilizce konuk gönderisini çevirmeye gidiyorum:

Duyuru








Rainer Grimm, uzun yıllardır yazılım mimarı, ekip lideri ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanır, aynı zamanda sık sık uzmanlık konferanslarında konuşmaktan da keyif alır. Modernes C++ blogunda yoğun bir şekilde C++ tutkusundan bahsediyor.







C++, standart bir genel algoritma seti, Standart Şablon Kitaplığı (STL) içerir. Windows’ta Microsoft, aşağıda listelenen bu algoritmaların paralel sürümlerini sunar; burada ilk argüman std:: VE. Intel ayrıca, aşağıda ilk başlıkta ele alınan paralel uygulamalar da sunmaktadır. dpl:: listelendi. Bu paralel sürümler, daha fazla işlemci çekirdeği kullanır ve birçok standart algoritma için çok daha hızlı performans sunar.

Algoritmaların tek çekirdekli veya çok çekirdekli sürümünü belirlemek, aşağıda gösterildiği gibi kolaydır:


sort(data.begin(), data.end()); // single-core
// or
sort(std::execution::seq, data.begin(), data.end()); // single-core
// Parallel multi-core
sort(std::execution::par, data.begin(), data.end()); // multi-core


İlk iki görünüm sort() eşdeğerdirler ve tek çekirdekli bir işlemci üzerinde çalışırlar. Son arama sort()çoklu çekirdek kullanır. Algoritmayı çalıştırmanın dört yolu vardır:

  • seq – sıralı tek çekirdekli sürüm
  • unseq – Tek çekirdekli SIMD/SSE vektörleme
  • par – Çok çekirdekli sürüm
  • par_unseq – Vektör SIMD/SSE Çok Çekirdekli
Aşağıdaki tablo, 14 çekirdekli bir i7-12700 dizüstü bilgisayar işlemcisinde çalışırken ve 100 milyon 32 bitlik bir tam sayı dizisini işlerken en yüksek derecede paralel hızlanma sergileyen algoritmaları gösterir:

Duyuru








n/s, desteklenmediği anlamına gelir, yani değişken uygulanmaz.

48 çekirdekli bir işlemci üzerindeki kıyaslamalar daha sonra gösterilecektir. Tablodaki her öğenin birimi saniyede milyonlarca tamsayıdır. Örneğin, par sürümü şu adresten çalışır: sort(std:: 73 milyon tamsayı/saniye ve par sürümü ile sort(dpl:: 109 milyon tamsayı/saniye ile. Her sütun, 100 milyon dizi boyutunun seçildiği bir uygulamanın performansını gösterir. Dizi, işlemci önbelleğine sığamayacak kadar büyük olduğundan, bu boyut önbelleğe alma etkilerini hariç tutar. Bu, çok büyük bir dizinin kullanım durumu için paralel iyileştirmeyi ölçmenizi sağlar.

referans ortamı


Önceki kıyaslamalar, Intel C++ derleyici ve Intel OneAPI 2023.1 ortamı kullanılarak yayın modunda VisualStudio 2022 ile çalıştırıldı. Bu, hem Microsoft’a erişime izin verdi std:: Intel’deki uygulamaların yanı sıra dpl:: uygulamalar. Kıyaslamalar Windows 11 altında gerçekleştirilmiştir.

notlar


Tüm standart özellikler Microsoft veya Intel tarafından uygulanmaz.

Microsoft sıralı SIMD uygulamasını destekler (unseq) çünkü bu uygulama derleme yapmıyor. Diğer algoritmalar için, Microsoft uygulamaları derlenir ancak performans avantajı sağlamaz.

Intel, sayım dışında (48 çekirdekte) çoğu algoritma için daha yüksek performansla daha paralel algoritmalar uygular. Paralel işlevler, çekirdek sayısı arttıkça paralel ölçeklendirme yaşar. Birden çok çekirdek üzerinde çalışırken tüm algoritmalar hızlanır.

Diğer standart paralel algoritmalar


Aşağıdaki tablo, 14 çekirdekli dizüstü bilgisayar işlemcisinde standart C++ algoritmalarının tek çekirdekli ve çok çekirdekli uygulamaları için karşılaştırmalı değerlendirmeler içerir:








Daha fazla çekirdek, daha fazla güç


İşlemci çekirdeği sayısı arttıkça standart C++ algoritmalarından bazıları diğerlerinden daha iyi ölçeklenir. Aşağıdaki tablo, 100 milyon 32 bit tam sayıdan oluşan bir diziyi işlerken 48 çekirdekli bir AWS Intel Xeon 8275CL düğümünde tek çekirdekli seri ve çok çekirdekli paralel algoritmaların performansını gösterir:








48 çekirdekli işlemcide daha fazla çekirdek ve daha fazla bellek bant genişliği mevcut olduğunda her paralel algoritma daha fazla hızlanır. Büyük problemler için paralel algoritma uygulamaları önemli bir performans avantajı sunar.

Nvidia’dan paralel algoritmalar


Nvidia, Intel ve AMD’den olanlar gibi x86 komut seti işlemcileri üzerinde çalışan nvc++ derleyicisi için bir C++ paralel STL uygulaması geliştirmiştir. Aşağıdaki tablo, karşılaştırmalı değerlendirmenin derlenmesi için özet olarak kullanılmıştır. -stdpar=multicore güncellenmiş:








Nvidia’nın paralel uygulamaları, Intel ve Microsoft’unkilere kıyasla önemli performans farklılıkları gösteriyor. Nvidia, GPU’larla standart C++ algoritmalarının hızlandırılmasını da destekler. Bu blogdaki kıyaslamalara bakın.

Referans Kodu


Kıyaslama uygulaması için kaynak kodu bu depoda ücretsiz olarak mevcuttur: https://github.com/DragonSpit/ParallelSTL

Daha yüksek performanslı kendi algoritmaları


Kendi paralel algoritmalarınızı geliştirmek istiyorsanız, aşağıdaki kitaptan örnekler kullanarak bununla ilgili daha fazla bilgi edinebilirsiniz. Örneğin, standart algoritmalar yalnızca karşılaştırmaya dayalı bir sıralama uygular. Kitapta geliştirilen paralel lineer zaman tabanı sıralaması, performansı birçok kez artırır. Paralel programlamayı basitleştirmek için çeşitli stratejiler gösterilmiştir ve tüm kaynak kodları bir havuzda ücretsiz olarak bulunur:








Sıradaki ne?


Bir sonraki yazımda yolculuğuma C++23 üzerinden devam edeceğim. bu sefer bitireceğim std::expected yazmak.


(rm)



Haberin Sonu
 
Üst