Qual è il codice / operazioni minimi da avere in un thread separato?

4

Comprendo che il threading è necessario per ottenere le massime prestazioni dai processori multicore di oggi, ma l'avvio di un thread è piuttosto costoso, quindi non è possibile inserire tutti i singoli calcoli che possono essere eseguiti in parallelo in una propria discussione. Ad esempio

answer = new thread(plus(1,2)) + new thread(plus(3,4))

funzionerà molto più lentamente rispetto al semplice single-threaded

answer = 1+2+3+4

ma se plus era un calcolo davvero complicato, la variante filettata potrebbe essere più veloce.

Ora alle domande

  • Esistono convenzioni o standard su quale sia la lunghezza minima di codice, operazioni o tempo di esecuzione che è difendibile da inserire in una propria discussione?
  • Devo anche preoccuparmi di questo o il compilatore / processore è così intelligente da fare tutto il lavoro per me?

Il motivo per cui ho posto questa domanda è che ho visto un'implementazione di quicksort che ha iniziato un nuovo thread per ogni chiamata ricorsiva che termina con (n²) thread e molti di questi thread hanno appena restituito un valore.

    
posta nist 23.04.2012 - 20:50
fonte

5 risposte

4

quando parallelizzi ci sono 3 tempi diversi da tenere in considerazione

  1. l'ora seriale: questo è il tempo speso per fare cose che non possono essere parallelizzate e dove non puoi scendere (ottenere l'input, scrivere l'output)

  2. il tempo parallelo: questa è la parte in cui puoi parallelizzare, questo puoi arrivare a 0 lanciando più processori

  3. overhead: il tempo impiegato per comunicare tra processi / thread, dipende molto dall'algoritmo usato e dalla distribuzione del lavoro

in pratica puoi aggiungere thread fino a che il sovraccarico diventa troppo grande rispetto al guadagno effettivo dalla parallelizzazione ci sono formule per questo

ma in realtà questo è un lavoro di profilazione poiché ogni algoritmo è diverso

    
risposta data 23.04.2012 - 22:31
fonte
2
  1. Non ci sono convenzioni, ogni programma è una storia diversa, non esiste una regola rapida e sporca che ti consenta di saltare la parte "attenta pianificazione".

  2. Purtroppo no. Per sfruttare i thread devi usarli manualmente. Tuttavia, ci sono linguaggi o librerie che facilitano questo ad es. un costrutto che esegue un ciclo in parallelo (ma devi comunque assicurarti che abbia senso).

risposta data 23.04.2012 - 21:23
fonte
1

Se crei solo un paio di thread, il sovraccarico è trascurabile. Quindi nel tuo esempio, answer = new thread(plus(1,2)) + new thread(plus(3,4)) equivale approssimativamente a answer = 1+2+3+4 (a condizione che tu non stia eseguendo più volte). Questa operazione viene eseguita in un numero costante di istruzioni, quindi non c'è davvero bisogno di thread.

Il threading è più appropriato quando si eseguono calcoli su insiemi di dati grandi (variabili) in cui il tempo di esecuzione dell'algoritmo non è costante. Per qualsiasi calcolo di questo tipo, l'obiettivo dovrebbe essere quello di avere tutti i core al 100% per tutta la durata del calcolo, in modo che non sia necessario creare 8000 thread per ordinare un elenco. Crea un thread per processore e dividi il lavoro in modo uniforme.

    
risposta data 23.04.2012 - 21:08
fonte
0

Il multithreading non riguarda solo le prestazioni. Riguarda anche l'esperienza dell'utente. Uno dei motivi principali per utilizzare il multithreading è che le applicazioni restino reattive. Non vorresti che il tuo browser diventasse totalmente insensibile fino a quando la tua pagina web successiva non è stata caricata.

Quindi quelle situazioni hanno bisogno della loro metrica.

    
risposta data 24.04.2012 - 00:38
fonte
0

Anche se dipendono molto dai tuoi strumenti reali, le seguenti linee guida della documentazione TBB di Intel possono dare un'idea utile del campo:

A rule of thumb is that grainsize iterations of operator() should take at least 10,000-100,000 instructions to execute.

TBB non è esattamente pesante.

    
risposta data 12.03.2013 - 22:39
fonte

Leggi altre domande sui tag