É possível limitar a contagem de threads para o C ++ 17 paralelo `for_each`?

10

Eu uso std::for_eachcom std::execution::parpara executar computação complexa em entradas enormes representadas como vetor de estruturas. O cálculo não precisa de atrasos relacionados ao hardware (E / S de rede ou disco, por exemplo), é "apenas CPU". Para mim, parece lógico que não faz sentido criar mais threads de SO do que as de hardware; no entanto, o Visual C ++ 2019 cria, em média, 50 threads e, às vezes, até 500, mesmo que existam apenas 12 threads de hardware.

Existe uma maneira de limitar a contagem de threads paralelos para hardware_concurrencywith std::for_eache std::execution::par, ou a única maneira de criar uma contagem razoável de threads é usar código personalizado std::thread?

Vitalii
fonte
open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - mas acho que ainda é uma proposta?
Caramiriel 18/11/19
11
Mesmo que isso se torne padrão algum dia, o principal problema do pool de encadeamentos é que ele é um nível muito mais baixo do que std::for_eachoutros algoritmos do <algorithm>cabeçalho. A principal idéia por trás disso std::execution::paré tornar o código paralelo quase tão simples quanto o seqüencial e paralelizar os algoritmos existentes com alterações mínimas de código e semântica.
Vitalii

Respostas:

5

É possível limitar a contagem de threads para o C ++ 17 paralelo for_each?

Não, pelo menos não em C ++ 17. No entanto, existe uma proposta executorsem um padrão por vir, que basicamente oferece a capacidade de influenciar o contexto de execução (em termos de local e horário) para a interface do algoritmo STL de alto nível:

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

Até então, você tem que quer confiança com o fornecedor compilador que ele sabe o que é melhor para o desempenho geral, como por exemplo, os desenvolvedores do Visual Studio estado :

O agendamento em nossa implementação é tratado pelo pool de encadeamentos do sistema Windows. O conjunto de encadeamentos aproveita as informações não disponíveis para a biblioteca padrão, como o que outros encadeamentos estão fazendo no sistema, quais encadeamentos de recursos do kernel estão aguardando e similares. Ele escolhe quando criar mais threads e quando finalizá-los. Também é compartilhado com outros componentes do sistema, incluindo aqueles que não usam C ++.

A outra opção seria desistir de confiar apenas na biblioteca padrão e usar implementações STL que já apresentam a nova proposta.

Jodocus
fonte