È possibile limitare il conteggio dei thread per C ++ 17 parallel `for_each`?


10

Uso std::for_eachcon std::execution::parper eseguire calcoli complessi su immensi input rappresentati come vettore di strutture. Il calcolo non richiede alcun ritardo relativo all'hardware (ad esempio IO di rete o del disco), è un calcolo "solo CPU". Per me sembra logico che non abbia senso creare più thread del sistema operativo di quelli hardware; tuttavia, Visual C ++ 2019 crea in media 50 thread e, talvolta, fino a 500 thread, anche se sono presenti solo 12 thread hardware.

Esiste un modo per limitare il conteggio dei thread paralleli hardware_concurrencycon std::for_eache std::execution::par, o l'unico modo per creare un conteggio di thread ragionevole è utilizzare il codice personalizzato con std::thread?


open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - ma penso che sia ancora una proposta?
Caramiriel,

1
Anche se questo diventerà un giorno standard, il problema principale del pool di thread è che è di livello molto più basso rispetto std::for_eache con altri algoritmi dall'intestazione <algorithm>. L'idea principale alla base std::execution::parè rendere il codice parallelo quasi semplice come quello sequenziale e parallelizzare gli algoritmi esistenti con modifiche minime al codice e alla semantica.
Vitalii,

Risposte:


5

È possibile limitare il numero di thread per il parallelo C ++ 17 for_each?

No, almeno non in C ++ 17. Tuttavia, esiste una proposta per executorsuno standard a venire, che sostanzialmente ti dà la possibilità di influenzare il contesto di esecuzione (in termini di posizione e tempo) per l'interfaccia dell'algoritmo STL di alto livello:

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

Fino ad allora, devi fidarti del fornitore del compilatore che sa cosa è meglio per le prestazioni complessive, come ad esempio gli sviluppatori di Visual Studio dichiarano :

La pianificazione nella nostra implementazione è gestita dal pool di thread del sistema Windows. Il pool di thread sfrutta le informazioni non disponibili per la libreria standard, ad esempio cosa stanno facendo gli altri thread sul sistema, quali thread delle risorse del kernel sono in attesa e simili. Scegli quando creare più thread e quando terminarli. È anche condiviso con altri componenti di sistema, inclusi quelli che non usano C ++.

L'altra opzione sarebbe quella di rinunciare a basarsi esclusivamente sulla libreria standard e utilizzare le implementazioni STL che già presentano la nuova proposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.