Wpis z mikrobloga

Mirki z #cpp

Mam dlugi vector danych. Dziele go na kawalki i procesuje na osobnym korzystajac z std::launch::async. Nie ma data dependencies. Jezeli kawalkow jest 1000 to 1000 threadow zostanie odpalonych. Pytanie, czy moge zaufac schedulerowi, ze to jakos ogarnie, czy lepiej napisac semafor taki jak tu: https://www.reddit.com/r/cpp_questions/comments/5ih1g8/how_do_i_limit_the_number_of_threads_used_by/ i ograniczyc liczbe watkow do liczny rdzeni cpu? Martwie sie o to ze wzgledu na context switching.

  • 9
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@erwit: Raczej nie możesz zaufać, odpalenie 1000 wątków na jednej maszynie może ją bardzo mocno spowolnić. Dodatkowo nie masz za bardzo kontroli nad ilością tych wątków. tak przynajmniej zrozumiałem (bo to zależy od ilości kawałków, które zależą od danych wejściowych). Ja bym proponował zrobić jakiś thread pool, np. z użyciem boost::asio:

https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/thread_pool/thread_pool.html

ogólny tutorial boost::asio: https://www.gamedev.net/blogs/entry/2249317-a-guide-to-getting-started-with-boostasio/
  • Odpowiedz
@ponton: dzieki, niestety nie moge dodac boosta do projektu

@KrzaQ2: jest w standardwej bibliotece jakies standardowe, proste rozwiazanie out of the box do tego, czy musze sam pisac? Problem wydaje mi sie na tyle typowy, ze spodziewalbym sie jakiegos gotowego rozwiazania
  • Odpowiedz
@erwit: Najlepiej użyć sensownej biblioteki. Programowanie na wątkach nie jest proste i bardzo łatwo o trudny do wykrycia błąd. Jeśli nie Boost, to może TBB albo przynajmniej OpenMP? W icc and gcc dostępny domyślnie, w clang też już powinien być standardowo.

Niestety, ale obecnie algorytmy w C++17 są mocno ograniczone i trudno określić liczbę wątków lub chunk size.
  • Odpowiedz
chyba jednak zalatwie to w ten sposob

for (...) {
jobs.push_back(
std::async(
std::launch::async,
  • Odpowiedz