2010-05-18 14 views
18

Su un singolo processore, Multi-threading aumenterà la velocità del calcolo. Come tutti sappiamo, il multi-threading è utilizzato per aumentare la reattività dell'utente e raggiunto attraverso la discussione del thread dell'interfaccia utente e del calcolo. Ma parliamo solo dell'applicazione console. Il multi-threading aumenterà la velocità del calcolo. Otteniamo risultati della cululazione più velocemente quando calcoliamo attraverso il multi-threading.Multi threading aumenterà la velocità del calcolo su Single Processor

che dire su multi core, multi threading aumenterà la velocità o meno.

Per favore aiutatemi. Se hai del materiale per saperne di più sul threading. per favore post.

Modifica: Mi è stata fatta una domanda, in qualsiasi momento, è consentito eseguire un solo thread su un singolo core. In tal caso, perché le persone utilizzano il multithreading in un'applicazione console.

Grazie in anticipo, Harsha

+0

Il multithreading è stato intorno un lungo più lungo rispetto a più core. – DanDan

risposta

18

In termini generali, no, non potrà accelerare nulla.

Presumibilmente si sta svolgendo lo stesso lavoro in generale, ma ora c'è il sovraccarico di thread aggiuntivi e interruttori di contesto.

Su un singolo processore con HyperThreading (due processori virtuali), la risposta diventa "forse".

Infine, anche se c'è solo una CPU, forse alcuni thread possono essere trasferiti alla GPU o ad altro hardware? Questo è un po 'come scappare dallo scenario "single processor" ma tecnicamente potrebbe essere un modo per ottenere un aumento di velocità dal multithreading su un singolo PC core.

Modifica: la tua domanda ora menziona app multithread su una macchina multicore. Ancora una volta, in termini molto generali, questo fornirà un aumento della velocità generale al calcolo. Tuttavia, l'aumento (o la sua mancanza) dipenderà dalla parallelizzazione dell'algoritmo, dalla contesa per memoria e cache e dall'abilità del programmatore quando si tratta di scrivere codice parallelo senza problemi di blocco o di inedia.

+1

Si noti che ciò vale per le attività a uso intensivo della CPU, per le attività che eseguono operazioni di blocco (IO associato/colloqui a un database/ecc.) Il multithreading può accelerare le cose, anche se le operazioni asincrone o non bloccanti possono accelerare le cose, ma non tutte le apis hanno varianti non bloccanti e chi lo fa può essere più difficile da programmare. – nos

+0

Questo non è completamente vero, dopo aver fatto la compilazione parallela è quasi sempre più veloce, non importa quale sia l'hardware – Earlz

1

No, no e no.

A meno che non si scriva il codice di parallelizzazione per sfruttare i multicore, sarà sempre più lento se non si dispone di altre funzioni di blocco.

+0

Come @coxymla sottolinea che potrebbe esserci una CPU con HyperThreading. Ciò potrebbe infatti aumentare la velocità di esecuzione, anche se la CPU ha un solo core. –

+0

In realtà, non hai ragione qui =/ –

+0

Grazie per la risposta, per il momento dimentichiamo Multicores. Mi sono state poste domande come: Se il calcolo non ha velocizzato, si ha il multithreading su single core. Ho spiegato loro che il multithreading è per la reattività, il lavoro legato alla comunicazione e al DB. Ma molte persone credono che il multi-threading aumenti la velocità di calcolo. piacerebbe sapere come Grazie per il tuo tempo. – Harsha

5

Se l'attività è legata al calcolo, il threading non lo renderà più veloce a meno che il calcolo non possa essere suddiviso in più parti indipendenti. Anche così potrai ottenere guadagni in termini di prestazioni solo se disponi di più core disponibili. Dallo sfondo della tua domanda aggiungerà solo un sovraccarico.

Tuttavia, è possibile eseguire comunque calcoli complessi e di lunga durata su un thread separato per mantenere l'applicazione reattiva.

+0

+1 Per la semplice risposta sensata :) – Rusty

+0

+1 Per reattività, un'applicazione potrebbe apparire più veloce se l'utente può interagire con l'applicazione e fare altre cose mentre un grande calcolo è in corso. –

7

Che cosa sta facendo il calcolo? Non sarai in grado di accelerarlo usando il multithreading se è legato a un processore, ma se per qualche motivo il tuo calcolo scrive su disco o aspetta qualche altro tipo di IO potresti essere in grado di migliorare le prestazioni usando il threading. Tuttavia, quando si dice "calcolo", suppongo si intenda una sorta di algoritmo intensivo del processore, quindi è improbabile che l'aggiunta di thread aiuti, e potrebbe rallentare anche il passaggio del contesto tra i thread.

1

Esattamente come nell'esempio di input dell'utente, un thread potrebbe essere in attesa del completamento di un'operazione del disco e altri thread possono richiedere tale tempo.

12

Poche le discussioni su 1 CPU:

  • possono aumentare le prestazioni nel caso in cui si continua con un altro thread, invece di aspettare che il funzionamento bound/O
  • può ridurre le prestazioni se diciamo ci sono troppe discussioni e lavoro è sprecato contesto commutazione

Poche filettature sulla CPU N:

  • potrebbe aumentare le prestazioni se si è in grado di tagliare il lavoro in blocchi indipent e elaborarli in modo indipendente
  • potrebbe diminuire le prestazioni se si fa molto affidamento sulla comunicazione tra thread e bus diventa un collo di bottiglia.

Quindi in realtà è molto specifico: è possibile parallelizzare una cosa molto facilmente mentre è quasi impossibile per gli altri. Forse è un po 'avanzata lettura per persona nuova, ma ci sono 2 grandi risorse su questo argomento in C# mondo:

1

Sopra menzione più.

L'esecuzione di più thread su un processore può aumentare le prestazioni, se è possibile ottenere più lavoro contemporaneamente, invece di attendere che il processore attenda tra operazioni diverse. Tuttavia, potrebbe anche essere una grave perdita di prestazioni dovuta ad esempio alla sincronizzazione o al sovraccarico del processore e al mancato rispetto dei requisiti.

Come per i nuclei multipli, la filettatura può migliorare significativamente le prestazioni. Tuttavia, molto dipende dal trovare gli hotspot e non esagerare. L'utilizzo di thread in tutto il mondo e la necessità di sincronizzazione possono persino ridurre le prestazioni. L'ottimizzazione dell'utilizzo di thread con più core richiede numerosi pre-studi e pianificazione per ottenere un buon risultato. Ad esempio, è necessario pensare a quanti thread utilizzare in situazioni diverse. Non vuoi che i thread si siedano e attendi le informazioni utilizzate da un altro thread.

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf
https://computing.llnl.gov/tutorials/parallel_comp/
https://computing.llnl.gov/tutorials/pthreads/
http://en.wikipedia.org/wiki/Superscalar
http://en.wikipedia.org/wiki/Simultaneous_multithreading

+0

Ciao Jakob, grazie per aver pubblicato la risposta e il file PDF. Ho un paio di richieste/domande: 1. Avete qualche file di progetto o codice sorgente, attraverso il quale si può imparare il multi-threading su un singolo processore per aumentare le prestazioni. Se hai materiale o link per questa domanda. 2.Qualsiasi linea guida per il threading, qualsiasi collegamento per favore mandami. 3. Esistono strumenti di debug di threading. Grazie per il vostro tempo e la risposta di invio. – Harsha

+0

Ciao! Mi dispiace ma non ho alcun codice sorgente. Gran parte di ciò che decide come funziona il tuo programma dipende da come è l'architettura della tua CPU. Non ho alcun codice sorgente o strumento di debug, mi dispiace, ma ho modificato il mio post con altri link! – user373455

0

Anche un compito CPU bound potrebbe correre più veloce multi-threaded se adeguatamente progettata per sfruttare memoria cache e pipelineing svolto dal processore.I processori moderni dedicano molto tempo allo a giocherellare con i pollici, anche se nominalmente "occupati".

Immaginate un processo che utilizzava un piccolo frammento di memoria molto intensamente. Elaborazione la stessa porzione di memoria 1000 volte sarebbe molto più veloce dell'elaborazione di 1000 blocchi di memoria simile.

Si potrebbe certamente progettare un programma multi-thread che sarebbe più veloce di un singolo thread.

0

I battistrada non aumentano le prestazioni. Thread sacrificio prestazioni a favore del mantenimento di parti del codice reattivo.

L'unica eccezione è se si sta eseguendo un calcolo che è così parallelizzabile che è possibile eseguire diversi thread su core diversi (che è l'eccezione, non la regola).

1

Ho eseguito alcune intense prove di simulazione matematica in C++ utilizzando 24 server core. Se eseguo 24 simulazioni separate in parallelo sui 24 core di un singolo server, ottengo un runtime per ciascuna delle mie simulazioni di dire X secondi.

La cosa bizzarra che ho notato è che, quando si eseguono solo 12 simulazioni, utilizzando 12 dei 24 core, con gli altri 12 core in attesa, ciascuna delle simulazioni viene eseguita a un tempo di esecuzione di Y secondi, dove Y è molto maggiore di X! Quando si visualizza il grafico del task manager sull'utilizzo del processore, è ovvio che un processo non si attacca solo a un core, ma si alterna tra un numero di core. Vale a dire, il passaggio tra i core per utilizzare tutti i core rallenta il processo di calcolo.

Il modo in cui ho mantenuto il runtime quando si eseguono solo 12 simulazioni, è di eseguire altre 12 "junk" simulazioni sul lato, utilizzando i restanti 12 core!

Conclusione: quando si utilizzano i multi-core, li usano tutti al 100%, per un utilizzo inferiore, il tempo di esecuzione aumenta!

+0

L'overhead sembra provenire da cache fredde dopo che il thread è stato spostato in un altro core. Idealmente, il sistema operativo dovrebbe sapere che non ha senso spostare quei fili. –

1

Per CPU single core, In realtà le prestazioni dipendono dal lavoro a cui ci si sta riferendo. Nel tuo caso, per il calcolo eseguito dalla CPU, in tal caso l'OverClocking sarebbe di aiuto se il tuo parentBoard lo supporta. Altrimenti non è possibile per la CPU eseguire calcoli più veloci della velocità della CPU.

Per motivi di multicore CPU Come dicono le risposte di cui sopra, se adeguatamente progettato il rendimento può aumentare, se tutti i nuclei sono pienamente utilizzati.

Nella CPU single core, se i thread sono implementati in Livello utente, il multithreading non ha importanza se ci sono blocchi di chiamate di sistema nel thread, come un'operazione di I/O. Perché il kernel non conoscerà i thread di livello utente.

Quindi, se il processo esegue I/O, è possibile implementare i thread nello spazio Kernel e quindi è possibile implementare thread diversi per un lavoro diverso. (La risposta qui è basata sulla teoria.)

Problemi correlati