Apakah mungkin untuk membatasi jumlah utas untuk C ++ 17 paralel `for_each`?

10

Saya gunakan std::for_eachdengan std::execution::paruntuk melakukan perhitungan kompleks pada input besar yang direpresentasikan sebagai vektor struktur. Perhitungan tidak memerlukan penundaan yang terkait dengan perangkat keras (misalnya jaringan atau disk IO), itu adalah komputasi "hanya CPU". Bagi saya kelihatannya logis bahwa tidak ada gunanya membuat lebih banyak utas OS yang kami miliki yang perangkat kerasnya; namun, Visual C ++ 2019 menciptakan rata-rata 50 utas, dan terkadang hingga 500 utas bahkan hanya ada 12 utas perangkat keras.

Apakah ada cara untuk membatasi jumlah thread paralel hardware_concurrencydengan std::for_eachdan std::execution::par, atau satu-satunya cara untuk membuat jumlah thread yang masuk akal adalah dengan menggunakan kode khusus std::thread?

Vitalii
sumber
open-std.org/jtc1/sc22/wg21/docs/papers/2016/... - tapi saya pikir ini masih proposal?
Caramiriel
1
Bahkan jika ini akan menjadi standar suatu hari nanti, masalah utama thread pool adalah bahwa itu jauh lebih rendah daripada tingkat std::for_eachdan algoritma lainnya dari <algorithm>header. Gagasan utama di belakang std::execution::paradalah membuat kode paralel dekat sesederhana yang berurutan, dan memparalelkan algoritma yang ada dengan kode minimal dan perubahan semantik.
Vitalii

Jawaban:

5

Apakah mungkin untuk membatasi jumlah utas untuk C ++ 17 paralel for_each?

Tidak, setidaknya tidak di C ++ 17. Namun, ada proposal untuk executorsstandar yang akan datang, yang pada dasarnya memberi Anda kemampuan untuk mempengaruhi konteks eksekusi (dalam hal lokasi dan waktu) untuk antarmuka algoritma STL tingkat tinggi:

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

Hingga saat itu, Anda harus memercayai vendor kompiler Anda bahwa ia tahu apa yang terbaik untuk kinerja keseluruhan, seperti misalnya pengembang keadaan Visual Studio :

Penjadwalan dalam implementasi kami ditangani oleh kumpulan utas sistem Windows. Kumpulan thread mengambil keuntungan dari informasi yang tidak tersedia untuk perpustakaan standar, seperti apa yang dilakukan thread lain pada sistem, apa yang ditunggu-tunggu oleh thread sumber kernel, dan yang serupa. Itu memilih kapan untuk membuat lebih banyak utas, dan kapan untuk menghentikannya. Ini juga dibagikan dengan komponen sistem lainnya, termasuk yang tidak menggunakan C ++.

Pilihan lain adalah menyerah hanya mengandalkan perpustakaan standar dan menggunakan implementasi STL yang sudah menampilkan proposal baru.

Jodocus
sumber