C ++ Programlama Dili: Paralel STL algoritmalarının ölçütü
Bugün Victor J. Duvanenko'nun en sevdiğim STL fonksiyonu üzerine konuk katkılarını sunabildiğim için memnunum: Paralel STL algoritmleri. Victor, “C ++ ve C#'daki pratik paralel algoritmalar” hakkında bir kitap yayınladı. Doğrudan Victors English Guest Post'un çevirisine atlayın:
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
C ++, genel algoritmaların standart bir ifadesi, STL (Standart Modeller Kütüphanesi) içerir. Windows'ta Microsoft, bu algoritmaların aşağıda listelenen paralel sürümlerini sunar, ilk konu std:: VE. Intel ayrıca ilk konu ile aşağıda paralel uygulamalar sunuyor dpl:: listelenmiştir. Bu paralel sürümler farklı işlemci çekirdekleri kullanır ve standart algoritmaların çoğu için çok daha hızlı performans sunar.
Algoritmaların tek bir çekirdek veya çok çekirdekli versiyonunun belirtimi, aşağıda gösterildiği gibi basittir:
sort(data.begin(), data.end()); // single-core
// or
sort(std::execution::seq, data.begin(), data.end()); // single-core
// Parallel multi-core
sort(std::execution:
ar, data.begin(), data.end()); // multi-core
İlk iki görüntüleme sort() Eşdeğerdirler ve tek bir işlemci üzerinde gerçekleştirilirler. Son çağrı sort()Birkaç tohum kullanın. Algoritmayı gerçekleştirmek için dört varyant vardır:
N/S, destek anlamına gelmez, yani varyant uygulanmaz.
48 çekirdeğe sahip bir işlemcideki referans parametreleri daha sonra gösterilecektir. Tablodaki her eleman için birimler saniyede milyonlarca tam sayıdır. Örneğin, parası sort(std:: 73 milyon tam/saniye sayı ve par versiyonu ile sort(dpl:: 109 milyon tam/saniyelik sayı ile. Her sütun, 100 milyon dizinin boyutunun seçildiği bir uygulamanın performansını gösterir. Bu boyut önbelleğin etkilerini içermez, çünkü dizi işlemci önbelleğine uyum sağlamak için çok büyüktür. Bu, çok büyük bir dizinin uygulanması için paralel iyileşmeyi ölçmenizi sağlar.
Referans ortamı
Yukarıdaki referans parametreleri, Intel C ++ derleyicisi ve Intel Oneapi 2023.1 ortamı kullanılarak sürüm modunda Visual Studio 2022 ile gerçekleştirildi. Bu etkin erişim Microsoft'ta std:: Uygulama ve Intel'de dpl:: Enstrümanlar. Referans parametreleri Windows 11 altında gerçekleştirildi.
Gözlem
Tüm standart işlevler Microsoft veya Intel tarafından uygulanmaz.
Microsoft Sıralı SIMD uygulamasını destekler (unseq) Birçok algoritma için, bu uygulama tamamlanamaz. Diğer algoritmalarla Microsoft'un uygulamaları tamamlanabilir, ancak performansa herhangi bir fayda sunmaz.
Intel, sayı (48 çekirdek ile) hariç, çoğu algoritma için daha yüksek performansa sahip daha paralel algoritmalar uygular. Paralel fonksiyonlar, artan sayıda çekirdek ile paralel bir azalma yaşar. Tüm algoritmalar farklı çekirdeklerde gerçekleştirildiklerinde hızlanır.
Daha paralel standart algoritmalar
Aşağıdaki tablo, tek çekirdekli uygulamalar için referans parametreleri ve 14 çekirdekli dizüstü bilgisayar işlemcisinde çok çekirdekli cagorithms C ++ standardı bulunmaktadır:
Daha fazla çekirdek, daha fazla performans
C ++ standart algoritmalarının bazıları, işlemci çekirdek sayısı arttığında diğerlerinden daha iyi azalır. Aşağıdaki tabloda, 100 milyon numaralı 32 bit Ganz sayısı matrisini işlediklerinde 48 çekirdekli AWS Intel Xeon 8275CL düğümlerinde tek çekirdekli ve paralel çoklu çekirdekli algoritmaların performansını göstermektedir:
Her paralel algoritma, daha fazla tohum mevcutsa ve 48 çekirdek işlemcisinde daha yüksek bellek bant genişliği varsa daha fazla hızlandırılır. Ciddi problemler durumunda, paralel algoritmanın uygulanması performansın önemli bir avantajı sunar.
Nvidia'dan paralel algoritmalar
NVIDIA, NVC ++ derleyicisi için Intel ve AMD gibi X86 komut setlerinde gerçekleştirilebilen bir C ++ paralel-STL uygulaması geliştirdi. Karşılaştırmayı derlemek için aşağıdaki tablo yakında kullanılacaktır -stdpar=multicore Güncellendi:
NVIDIA'nın paralel uygulamaları, Intel ve Microsoft'unkine kıyasla performansta önemli farklılıklara sahiptir. NVIDIA ayrıca GPU algoritmaları ile C ++ standardının hızlanmasını destekler. Bu blogdaki referans parametrelerine bakın.
Referans kodu
Karşılaştırmanın uygulanması için kaynak kodu bu depoda serbestçe kullanılabilir: https://github.com/dragonpit/ParallelStl
Daha yüksek performansa sahip kendi algoritmaları
Paralel algoritmalarınızı geliştirmek istiyorsanız, örnekleri kullanarak aşağıdaki kitapta daha fazlasını keşfedeceksiniz. Örneğin, standart algoritmalar yalnızca karşılaştırmaya dayalı bir sipariş uygular. Kitapta geliştirilen paralel -zaman radix sistemi performansı birçok kez artırır. Paralel programlamayı basitleştirmek için çeşitli stratejilerin gösterilmiştir, bu nedenle tüm kaynak kodu bir depoda serbestçe kullanılabilir:
Sırada ne var?
Bir sonraki makalemde, C ++ 23'teki yolculuğuma devam ediyorum. Bu sefer bitireceğim std::expected yazmak.
(RME)
C ++ Programlama Dili: Paralel STL algoritmalarının ölçütü
Bugün Victor J. Duvanenko'nun en sevdiğim STL fonksiyonu üzerine konuk katkılarını sunabildiğim için memnunum: Paralel STL algoritmleri. Victor, “C ++ ve C#'daki pratik paralel algoritmalar” hakkında bir kitap yayınladı. Doğrudan Victors English Guest Post'un çevirisine atlayın:

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
C ++, genel algoritmaların standart bir ifadesi, STL (Standart Modeller Kütüphanesi) içerir. Windows'ta Microsoft, bu algoritmaların aşağıda listelenen paralel sürümlerini sunar, ilk konu std:: VE. Intel ayrıca ilk konu ile aşağıda paralel uygulamalar sunuyor dpl:: listelenmiştir. Bu paralel sürümler farklı işlemci çekirdekleri kullanır ve standart algoritmaların çoğu için çok daha hızlı performans sunar.
Algoritmaların tek bir çekirdek veya çok çekirdekli versiyonunun belirtimi, aşağıda gösterildiği gibi basittir:
sort(data.begin(), data.end()); // single-core
// or
sort(std::execution::seq, data.begin(), data.end()); // single-core
// Parallel multi-core
sort(std::execution:
İlk iki görüntüleme sort() Eşdeğerdirler ve tek bir işlemci üzerinde gerçekleştirilirler. Son çağrı sort()Birkaç tohum kullanın. Algoritmayı gerçekleştirmek için dört varyant vardır:
- seq -Densiyal tek çekirdekli sürüm
- unseq – vektör SIMD/SSE
- par – Multicore versiyonu
- par_unseq – Çok çekirdekli SIMD/SSE Vector

N/S, destek anlamına gelmez, yani varyant uygulanmaz.
48 çekirdeğe sahip bir işlemcideki referans parametreleri daha sonra gösterilecektir. Tablodaki her eleman için birimler saniyede milyonlarca tam sayıdır. Örneğin, parası sort(std:: 73 milyon tam/saniye sayı ve par versiyonu ile sort(dpl:: 109 milyon tam/saniyelik sayı ile. Her sütun, 100 milyon dizinin boyutunun seçildiği bir uygulamanın performansını gösterir. Bu boyut önbelleğin etkilerini içermez, çünkü dizi işlemci önbelleğine uyum sağlamak için çok büyüktür. Bu, çok büyük bir dizinin uygulanması için paralel iyileşmeyi ölçmenizi sağlar.
Referans ortamı
Yukarıdaki referans parametreleri, Intel C ++ derleyicisi ve Intel Oneapi 2023.1 ortamı kullanılarak sürüm modunda Visual Studio 2022 ile gerçekleştirildi. Bu etkin erişim Microsoft'ta std:: Uygulama ve Intel'de dpl:: Enstrümanlar. Referans parametreleri Windows 11 altında gerçekleştirildi.
Gözlem
Tüm standart işlevler Microsoft veya Intel tarafından uygulanmaz.
Microsoft Sıralı SIMD uygulamasını destekler (unseq) Birçok algoritma için, bu uygulama tamamlanamaz. Diğer algoritmalarla Microsoft'un uygulamaları tamamlanabilir, ancak performansa herhangi bir fayda sunmaz.
Intel, sayı (48 çekirdek ile) hariç, çoğu algoritma için daha yüksek performansa sahip daha paralel algoritmalar uygular. Paralel fonksiyonlar, artan sayıda çekirdek ile paralel bir azalma yaşar. Tüm algoritmalar farklı çekirdeklerde gerçekleştirildiklerinde hızlanır.
Daha paralel standart algoritmalar
Aşağıdaki tablo, tek çekirdekli uygulamalar için referans parametreleri ve 14 çekirdekli dizüstü bilgisayar işlemcisinde çok çekirdekli cagorithms C ++ standardı bulunmaktadır:

Daha fazla çekirdek, daha fazla performans
C ++ standart algoritmalarının bazıları, işlemci çekirdek sayısı arttığında diğerlerinden daha iyi azalır. Aşağıdaki tabloda, 100 milyon numaralı 32 bit Ganz sayısı matrisini işlediklerinde 48 çekirdekli AWS Intel Xeon 8275CL düğümlerinde tek çekirdekli ve paralel çoklu çekirdekli algoritmaların performansını göstermektedir:

Her paralel algoritma, daha fazla tohum mevcutsa ve 48 çekirdek işlemcisinde daha yüksek bellek bant genişliği varsa daha fazla hızlandırılır. Ciddi problemler durumunda, paralel algoritmanın uygulanması performansın önemli bir avantajı sunar.
Nvidia'dan paralel algoritmalar
NVIDIA, NVC ++ derleyicisi için Intel ve AMD gibi X86 komut setlerinde gerçekleştirilebilen bir C ++ paralel-STL uygulaması geliştirdi. Karşılaştırmayı derlemek için aşağıdaki tablo yakında kullanılacaktır -stdpar=multicore Güncellendi:

NVIDIA'nın paralel uygulamaları, Intel ve Microsoft'unkine kıyasla performansta önemli farklılıklara sahiptir. NVIDIA ayrıca GPU algoritmaları ile C ++ standardının hızlanmasını destekler. Bu blogdaki referans parametrelerine bakın.
Referans kodu
Karşılaştırmanın uygulanması için kaynak kodu bu depoda serbestçe kullanılabilir: https://github.com/dragonpit/ParallelStl
Daha yüksek performansa sahip kendi algoritmaları
Paralel algoritmalarınızı geliştirmek istiyorsanız, örnekleri kullanarak aşağıdaki kitapta daha fazlasını keşfedeceksiniz. Örneğin, standart algoritmalar yalnızca karşılaştırmaya dayalı bir sipariş uygular. Kitapta geliştirilen paralel -zaman radix sistemi performansı birçok kez artırır. Paralel programlamayı basitleştirmek için çeşitli stratejilerin gösterilmiştir, bu nedenle tüm kaynak kodu bir depoda serbestçe kullanılabilir:

Sırada ne var?
Bir sonraki makalemde, C ++ 23'teki yolculuğuma devam ediyorum. Bu sefer bitireceğim std::expected yazmak.
(RME)