Numero di thread: calcolo intensivo vs operazioni intensive di IO?

3

Mi sono imbattuto in questa affermazione blog

Le operazioni intensive di calcolo dovrebbero utilizzare un numero di thread inferiore o uguale al numero di core, mentre le operazioni intensive di IO come copiare i file non hanno alcun utilizzo per la CPU e possono quindi utilizzare un numero maggiore di thread

Non sto ottenendo la logica / il ragionamento dietro il perché il numero di thread può essere maggiore del funzionamento intenso dei core IO mentre dovrebbe essere inferiore in caso di Operazioni intensive di calcolo?

    
posta user3198603 26.07.2018 - 14:23
fonte

2 risposte

4

I thread competono per alcune risorse. Se più thread vogliono la risorsa di quante siano le risorse disponibili, si bloccano l'un l'altra e si ha un sovraccarico dal cambio di attività. La domanda è, che tipo di risorsa è coinvolta qui?

Per i thread associati alla CPU, la risorsa è in genere un core della CPU. In alcuni casi i core condividono alcune risorse, ad es. cache o FPU. In particolare, l'Hyperthreading di Intel spesso non aiuta con i thread associati alla CPU. Quindi potresti smettere di vedere gli speedup molto prima di "usare" tutti i tuoi core.

Per i thread con I / O-bound, la domanda è quale tipo preciso di I / O è coinvolto qui. Se la risorsa contestata è un disco rigido, più di un accesso concorrente rallenterà le cose. Se la risorsa contestata è un'interfaccia di rete, qualsiasi numero di thread può accedervi senza problemi a condizione che non venga superata la larghezza di banda totale dell'interfaccia.

Per i thread legati I / O il numero di core della CPU è completamente irrilevante. In effetti non hai bisogno di più thread per eseguire l'I / O parallelo: I / O asincroni e sistemi basati su eventi sono completamente sufficienti qui.

    
risposta data 26.07.2018 - 14:54
fonte
1

La prescrizione sul numero di thread non ha nulla a che fare con la logica della tua applicazione. Potrebbe avere senso avere MOLTI thread in più rispetto ai nuclei dell'applicazione, indipendentemente dal fatto che siano vincolati all'elaborazione o al limite I / O.

Il motivo della prescrizione è che quando si hanno più thread legati all'elaborazione rispetto ai core, i thread aggiuntivi di calcolo extra sono in attesa e non stanno facendo progressi in avanti sul loro calcolo.

Considera di avere T = 20 thread e C = 8 core. Considera il tuo run-q (l'elenco dei thread disponibili da eseguire). Al massimo 8 possono essere in esecuzione, e il resto sarà seduto in coda in attesa della possibilità di correre.

Se una grande percentuale dei tuoi thread fosse vincolata all'I / O (o bloccasse realmente qualcosa), allora non sarebbero comunque "pronti per essere eseguiti" e non influenzeranno l'utilizzo della CPU.

Se pensi che il lavoro della tua applicazione sia quello di mantenere tutti i core della CPU (completamente funzionanti al 100%), non c'è alcun guadagno nell'utilizzo della CPU aggiungendo più thread ad alta intensità di calcolo dopo averne avuto abbastanza (compute intensive ) thread per ogni core (logico).

NOTA: questo è il processo mentale dietro questa teoria (e probabilmente il blogger). Non è proprio vero. Ci sono MOLTI altri fattori che vengono presi in considerazione nel decidere come ottenere il massimo dal tuo processore. Una considerazione è che rallenta ogni core per far funzionare tutti i core. Così ANCORA fino al punto in cui hai abbastanza thread di calcolo per ogni core, l'aggiunta di più thread di calcolo può rallentarti tanto quanto velocizzarti.

E c'è un sovraccarico significativo della CPU nella gestione dei thread (e possono essere problemi di localizzazione della memoria, a seconda di come allocare / gestire i thread).

UN CONSIGLIO / SOMMARIO Quindi - personalmente - consiglierei di preoccuparmi meno di questo tipo di ragionamento, e di più sulla struttura logica della tua applicazione - che cosa ha senso e come farlo funzionare. Utilizzare i pool di thread. E rendi le loro dimensioni configurabili.

My $ 0.02.

    
risposta data 26.07.2018 - 15:40
fonte

Leggi altre domande sui tag