quanti core dovrei usare per i calcoli? #cores o #cores -1?


12

Ho un grande calcolo da fare. Mentre posso utilizzare tutti i core, ho pensato che ci fosse qualche motivo per lasciare fuori 1 core e non utilizzarlo? (calcolo cpu solo no IO). O sto sottovalutando il sistema operativo che non saprebbe gestire e fare il cambio di contesto corretto anche se utilizzo tutti i core?


8
L'utilizzo di tutti i core è un buon inizio, e alcune superstizioni sul funzionamento del sistema operativo con "-1 core" sono probabilmente solo superstizioni, ma in realtà dovresti profilarlo, come si comporta per i tuoi calcoli, il tuo hardware, il tuo sistema operativo.
Doc Brown,

In molti casi, l'uso di # core + 1 ha molto senso. Se usi solo #cores, qualsiasi blocco imprevisto (come un errore di pagina) forza inutilmente un core inattivo.
David Schwartz,

Risposte:


28

I principali sistemi operativi sono abbastanza maturi da sapere come gestire i processi che utilizzano ogni core disponibile. Altri processi possono (e spesso saranno) influenzati, ma il calcolo non diventerà più lento perché hai utilizzato tutti i core disponibili.

La scelta del numero di core dipende maggiormente dall'intenzione di fare qualcos'altro mentre viene eseguito il calcolo.

Se, su un computer desktop, vuoi essere in grado di utilizzare il tuo browser web o guardare un video mentre il calcolo è in corso, ti conviene mantenere un core libero per esso. Allo stesso modo, se il server sta facendo due cose (come fare calcoli e, allo stesso tempo, elaborare e riportare le sue metriche), mantenere un core libero per l'attività secondaria potrebbe essere una buona idea.

D'altra parte, se la tua priorità è quella di rendere il calcolo il più veloce possibile, devi usare tutti i core.


7
I moderni programmatori di sistemi operativi sono in realtà abbastanza bravi a mantenere interattivi i programmi interattivi quando c'è un elevato utilizzo della CPU, purché i programmi interattivi non utilizzino anche molta CPU (che, garantito, può essere un problema con le moderne app web
gonfiate

Nota: anche sui server, se si desidera essere in grado di inviare ssh e ottenere una risposta rapida, lasciare solo il core 0 potrebbe essere utile.
Matthieu M.

11

Dipende.

Se la macchina è dedicata a questo calcolo, è necessario utilizzare tutti i core: le risorse di elaborazione inutilizzate non accelerano le cose .

Se stai utilizzando uno scheduler in tempo reale, uno scheduler non preventivo o l'affinità del processore, dovresti fare un po 'più attenzione perché è facile far morire di fame accidentalmente altri processi da tutte le risorse di elaborazione. Tuttavia, dovresti modificare manualmente queste impostazioni affinché qualcosa vada storto, quindi per impostazione predefinita non ci sono problemi qui sulla maggior parte dei sistemi operativi.

Se la macchina non è dedicata al calcolo, dare il 100% al calcolo potrebbe non essere l'ideale. Ad esempio, se si utilizza un browser Web mentre il calcolo è in esecuzione. Poiché il carico della tua macchina raggiungerà occasionalmente un picco superiore al 100%, sembrerà lento. Le attività orientate alla velocità effettiva come il calcolo non saranno realmente rallentate, ma le attività sensibili alla latenza come le GUI non reagiranno così rapidamente. È quindi sensato avviare solo thread / processi NPROC-1 per il calcolo. In alternativa, l'utilizzo esplicito di una priorità inferiore per il calcolo rispetto alle attività normali potrebbe risolvere questo problema, nel qual caso il calcolo dovrebbe utilizzare i processi NPROC per non sprecare alcuna risorsa.


3
"se stai utilizzando un browser web mentre il calcolo è in esecuzione […] sembrerà lento. Le attività orientate al rendimento come il calcolo non saranno realmente rallentate, ma le attività sensibili alla latenza come le GUI non reagiranno così rapidamente. [ …] L'uso esplicito di una priorità inferiore per il calcolo rispetto alle normali attività potrebbe risolvere questo problema "- Ed è per questo che il valore di priorità del processo su Unix è chiamato" gentilezza "ed è configurato usando un'utilità denominata nice.
Jörg W Mittag,

2
"tecnicamente le risorse informatiche inutilizzate non accelerano le cose", potrebbero. L'uso di meno core può consentire una frequenza di clock superiore e ridurre la sincronizzazione, che può accelerare o meno le cose.
Davidmh,

2
Oltre alle note @Davidmh, di solito sul lato CPU L1 $ e L2 $ sono condivisi in una certa misura tra i thread e L3 $ è condiviso su tutti i socket, quindi l'uso di più thread potrebbe causare un aumento dei $ $ rallentando i processi. Soprattutto se il processo è associato alla memoria anziché al processore.
Maciej Piechotka,

Se si impostano i livelli di priorità thread / processo in modo appropriato, è possibile mitigare l'impatto del lavoro in background sui processi interattivi. Ho eseguito app di elaborazione distribuita sul mio computer personale per oltre un decennio; e con le attività di calcolo della CPU eseguite a bassa priorità, la mia capacità di utilizzare browser e altre normali app desktop non è compromessa. La condivisione delle risorse sulla GPU non è così avanzata e ho riscontrato occasionali problemi con il video HTML5 accelerato dalla GPU (non importa giochi) durante l'esecuzione del calcolo della GPU in background. I giochi multi-thread possono essere problematici anche con GFX leggero; vinci la fame 2+
Dan è Fiddling di Firelight il

1

Sono un po 'avveduto nel concordare con @motoDrizzt, di seguito, a causa dei suoi voti negativi :), ma questa è stata davvero la mia esperienza reale - più è meglio, anche oltre il numero effettivo di core (ma non migliaia). Ad esempio, dai un'occhiata a http://www.forkosh.com/images/avoronoi.gif dove ogni piano 2D di quel diagramma 3D voronoi_ può essere generato in modo indipendente. E il programma accetta un attributo nfork = n query_string per eseguire il fork dei calcoli per n piani "contemporaneamente".

Con un processore a quattro core, il tempo (dell'utente) per completare il diagramma diminuisce in modo quasi lineare con nfork, fino a circa nfork = 8 (quattro core hyperthreaded). Ma oltre le 8, il tempo diminuisce ancora, anche se più lentamente. E oltre circa 16, circa, nessun ulteriore miglioramento evidente. Non ho analizzato affatto questo comportamento, ma lo attribuisco ingenuamente ai processi di giocoleria os (slackware linux 14.2x64 in questo caso) per ridurre ulteriormente il tempo di inattività complessivo.


0

La scelta migliore dipende dal sistema. Quindi, quello che vuoi fare è eseguire entrambe le versioni su un sistema reale e quindi controllare come risponde il sistema. Puoi ancora usare browser, editor di testo, altre cose sul tuo sistema? E le prestazioni sono migliori quando si usano n thread e non n-1? Cosa succede se si esegue l'app insieme a un'altra app che tenta di utilizzare tutte le CPU?

E poi devi considerare l'hyperthreading. Con quattro core più hyperthreading, è possibile utilizzare 8 core o 7 core. Ancora una volta, prova la reattività del sistema e il tempo di finire.

E infine, considera di dividere il tuo lavoro in più blocchi che thread. Il motivo è che thread diversi finiscono il lavoro in momenti diversi e quindi si desidera che un po 'di lavoro venga lasciato ai thread più veloci. Altrimenti dovrai aspettare fino al termine dell'ultimo thread.

PS. "L'hyperthreading non può essere d'aiuto con il codice intensivo FPU perché esiste solo una FPU". Assolutamente sbagliato È incredibilmente difficile, anche con il codice intensivo della FPU, sfruttare appieno la FPU a causa delle latenze. L'hyperthreading aiuta perché ci sono il doppio delle operazioni indipendenti disponibili per la pianificazione.


-4

Non so come scrivere questo in un modo che non suona "cattivo", quindi prendilo come un'osservazione amichevole, ok?

Dato che un PC medio ha già di solito migliaia o più thread, cosa ti fa pensare che l'utilizzo di 8 vs 7 farà la differenza? :-)

Usa il maggior numero di thread possibile. E se non devi preoccuparti della risposta del sistema operativo e i tuoi thread funzionano per un tempo piuttosto lungo (più di un secondo), puoi persino sperimentare l'uso del doppio del numero di core.


3
Ma la maggior parte di queste migliaia di thread non utilizza CPU al 100%, vero?
Andreas Rejbrand,

1
L'uso del doppio del numero di core generalmente non migliora i tempi di calcolo. In effetti, l'utilizzo di più del numero di core fisici non è generalmente vantaggioso, anche se si hanno più core logici (tramite HyperThreading ecc; sebbene ciò possa dipendere dall'esatto compito che si sta eseguendo). Fonte: esperienza del passato, utilizzando MATLAB Parallel Processing.
Sanchises,

1
@Sanchises Questo perché l'hyperthreading sfrutta l'interleaving di istruzioni quasi parallele - è efficace per il codice pesante e ramificato della memoria. I calcoli con Matrix sono molto intensi in FPU e c'è solo una FPU per core fisico, quindi l'hyperthreading non può aiutarti.
J ...
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.