C ++ 17 paralel `for_each` için konu sayısını sınırlamak mümkün müdür?


10

Kullanmak std::for_eacholan std::execution::paryapıların vektör olarak temsil büyük giriş karmaşık hesaplama yapmak için. Hesaplamanın donanım ile ilgili herhangi bir gecikmeye ihtiyacı yoktur (örneğin ağ veya disk IO), "sadece CPU" hesaplamasıdır. Benim için, donanım olanlara sahip daha fazla işletim sistemi iş parçacığı oluşturmanın bir anlamı olmadığı mantıklı görünüyor; ancak, Visual C ++ 2019 ortalama 50 iş parçacığı oluşturur ve bazen yalnızca 12 donanım iş parçacığı olsa bile 500'e kadar iş parçacığı oluşturur.

Paralel konuları sınırlamak için bir yol var mı sayısı hardware_concurrencyile std::for_eachve std::execution::parya saymak makul konuları ile kullanım özel koduna oluşturmak için tek yol std::thread?



1
Bu bir gün standart olacak olsa bile, iş parçacığı havuzu ana sorun daha çok daha düşük düzey std::for_eachve <algorithm>üstbilgi diğer algoritmalar olmasıdır . Arkadaki ana fikir std::execution::par, paralel kodu sıralı olana kadar basit hale getirmek ve mevcut algoritmaların minimum kod ve anlambilim değişiklikleri ile paralelleştirilmesidir.
Vitalii

Yanıtlar:


5

C ++ 17 paralel için iplik sayısını sınırlamak mümkün müdür for_each?

Hayır, en azından C ++ 17'de değil. Bununla birlikte, executorsbir standartta gelmek için bir öneri var , bu da size temel olarak üst düzey STL algoritması arabirimi için yürütme bağlamını (konum ve zaman açısından) etkileme yeteneği verir:

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);

O zamana kadar, derleyici satıcınıza, örneğin Visual Studio durumu geliştiricileri gibi genel performans için en iyi olanı bildiğine güvenmeniz gerekir :

Uygulamamızdaki zamanlama Windows sistem iş parçacığı havuzu tarafından gerçekleştirilir. İş parçacığı havuzu, sistemdeki diğer iş parçacıklarının ne yaptığı, iş parçacıklarının beklediği çekirdek kaynakları ve benzerleri gibi standart kitaplıkta bulunmayan bilgilerden yararlanır. Ne zaman daha fazla iş parçacığı oluşturulacağını ve ne zaman sonlandırılacağını seçer. Ayrıca C ++ kullanmayanlar da dahil olmak üzere diğer sistem bileşenleri ile paylaşılır.

Diğer seçenek, yalnızca standart kütüphaneye güvenmekten vazgeçmek ve yeni teklifi zaten içeren STL uygulamalarını kullanmak olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.