C'è qualcosa che DEVE essere fatto su una CPU multi-core?


45

Quando consideriamo quanto il nostro programma sia multi-thread-friendly, il mio team si è preoccupato del fatto che ci sia qualcosa che non può assolutamente essere fatto su una CPU single-core. Ho ipotizzato che l'elaborazione grafica richieda un'elaborazione parallela massiccia, ma sostengono che cose come DOOM sono state fatte su CPU single-core senza GPU.

C'è qualcosa che deve essere fatto su un processore multi-core?

Supponiamo che ci sia un tempo infinito sia per lo sviluppo che per l'esecuzione.


8
Mentre le risposte che seguono sembrano in gran parte "no", ci sono storicamente sistemi che letteralmente non avrebbero potuto funzionare senza un coprocessore che gestisse alcune attività. Un esempio forte che conosco è il Nintendo DS, che include una CPU ARM9 a 67 MHz e una CPU ARM7 a 33 MHz (utilizzata anche per la retrocompatibilità durante i giochi GBA). Per i giochi DS, ARM7 gestisce la riproduzione di comunicazioni audio e Wi-Fi perché ARM9 non è in grado di elaborare e disegnare nulla di importante sullo schermo, mantenendo il passo con l'alimentazione diretta dell'audio al chip audio. Così come afferma @jmite "sotto quali vincoli", la mancanza di velocità può richiedere più CPU.
Slipp D. Thompson

10
Nel mio lavoro utilizziamo Xeons multicore e le estensioni Linux in tempo reale Xenomai per eseguire l'elaborazione audio a bassa latenza. Abbiamo una pipeline di elaborazione audio a tre fasi e ogni fase ha il proprio core dedicato, che utilizza circa il 70% dei cicli di. Le attività non in tempo reale utilizzano il quarto core e tutti i cicli rimanenti sui primi tre. Ciò sarebbe possibile solo su una CPU single-core se quel singolo core fosse 3+ volte più veloce di un core sulla CPU attuale a 4 core; dato che l'attuale CPU funziona a 2GHz, ciò potrebbe essere difficile da raggiungere.
Jeremy Friesner,

19
Il software su una CPU single-core può emulare una CPU multi-core. La differenza è quasi interamente della velocità.
user253751

24
Una cosa che deve essere fatta su un sistema multi core è testare software multithread. Perché alcuni difetti non accadranno (quasi) su un sistema single-core. Non sono sicuro che si qualifichi come una risposta, però ...
Nikie

13
@nikie Un sistema single-core può emulare anche l'ordinamento della memoria e cache stantie - ma immagino che questo sarebbe estremamente inefficiente (come 10 × rallentamento)
Nayuki

Risposte:


47

Se non ti interessa il tempo di esecuzione, tutto ciò che puoi fare su una macchina multi-core, puoi farlo su una macchina single-core. Una macchina multi-core è solo un modo per accelerare alcuni tipi di calcoli.

Se riesci a risolvere un problema nel tempo su una macchina multi-core con core, allora puoi risolverlo time (o meno guardare la legge di Amdahl ) su una macchina single-core. La macchina single-core può emulare una macchina multi-core usando time-slicing / time-sharing .n T nTnTn


3
Non sono del tutto sicuro che sia assolutamente corretto. Non penso che i bug di coerenza della memoria possano essere generati su un singolo core (Sì, si potrebbe emulare un sistema multicache su un unicore, ma tale indiretto è un po 'imbroglio). (Forse un equivalente dell'implementazione dello swap del registro mediante operazioni di spostamento in un VLIW, sfruttando il || ismo garantito?) Suppongo che anche su un core a thread singolo sarebbe ancora possibile estrarre l'entropia dalla variabilità di temporizzazione multithread, ma la quantità di l'entropia sarebbe più piccola per unità di tempo (che in realtà è solo una questione di prestazioni come le altre differenze).
Paul A. Clayton,

6
@ PaulA.Clayton I bug di coerenza della memoria sono generalmente indesiderati e il software ben scritto non dovrebbe mostrarli. Tuttavia, se lo volessi davvero , potresti emularli su una singola CPU. (Anche se potrebbe essere lento)
user253751

4
A volte il tempo su un singolo core sarà più di volte più lungo rispetto a una macchina -core, ad esempio per la ricerca con riavvii casuali o se i pezzi si adattano alla cache su più core ma non sul singolo core. nnn
András Salamon,

11
"La macchina single-core può emulare una macchina multi-core usando time-slicing / time-sharing." E infatti lo hanno fatto fin dagli albori del "moderno" sistema operativo.
Lightness Races con Monica

1
@ PaulA.Clayton Penso che potresti avere problemi di consistenza della memoria (come un incremento non atomico) se dovessi avere due processi diversi che hanno modificato entrambi la stessa memoria condivisa. Hai solo bisogno del multi-tasking preventivo. Naturalmente, questo è generalmente il motivo per cui i moderni sistemi operativi non hanno processi che condividono la stessa memoria scrivibile a meno che non lo chiedano esplicitamente.
Patrick M,

58

La domanda è: sotto quali vincoli?

Vi sono certamente problemi in cui, se poniamo la domanda "possiamo risolvere questo problema sull'hardware X in un determinato lasso di tempo", la risposta sarà no.

Ma questa non è una risposta "a prova di futuro": le cose che in passato non potevano essere fatte abbastanza velocemente in un singolo core probabilmente possono essere ora, e non possiamo prevedere di cosa sarà capace l'hardware futuro.

In termini di calcolabilità, sappiamo che una Turing Machine a nastro singolo è in grado di calcolare tutte le stesse funzioni di un computer singolo o multi-core, quindi, a parte il runtime, non ci sono problemi che un computer multi-core può risolvere che un single-core non può.

In termini di qualcosa come la grafica, letteralmente tutto ciò che è sulla GPU potrebbe essere fatto sulla CPU ... se sei disposto ad aspettare abbastanza a lungo.


3
@JanDvorak In realtà direi che ciò non è stato fatto affatto dalla GPU;)
TomTom

15
Se il tempo non è un vincolo, è possibile eseguire tutti i calcoli a mano, penna e carta.
matematico

2
@mathreadler Sì, perché il cervello è Turing completo. Qualcosa che si è trasformato in un lungo dibattito su Physics Stackexchange.
JBentley,

4
In realtà, @JanDvorak, generando VGA è abbastanza semplice e può essere realizzata in software su un microcontrollore modesto 16 MHz, come Questo progetto mostra: pyroelectro.com/tutorials/arduino_basic_vga
axello

3
@mathreadler Questa è in realtà una domanda più complicata di quanto sembri inizialmente. Una risposta breve potrebbe essere "sì" perché una macchina specializzata può costruire un computer senza richiedere strumenti completi di turing per farlo. Una risposta più lunga potrebbe essere "no", poiché la capacità di costruire una macchina da turismo può implicare che una macchina da turismo più grande si trova in uno stato di "inizializzazione" dove costruisce il resto della macchina a stati. La risposta completa è ancora più complicata perché non abbiamo mai costruito un dispositivo Turing Complete. Abbiamo sviluppato idee astratte per macchine che sono ...
Cort Ammon

17

Come hanno indicato altre risposte, una singola CPU può sempre emulare più CPU tagliando il tempo e giocando il ruolo di ogni CPU virtuale. Questa emulazione calcolerà sicuramente le risposte corrette.

Nel mondo reale, i tempi di esecuzione possono essere importanti. Potrebbe significare la differenza tra un frame rate mediocre e un'esperienza visiva stellare. O la differenza tra profitti e perdite nel trading.

Una situazione patologica in cui un multiprocessore è notevolmente più veloce di un uniprocessore è quella in cui l'elaborazione è una pipeline di dati, il cambio di contesto è costoso e il codice macchina per ogni fase della pipeline si adatta a malapena alla cache della CPU.

Vorrei illustrare con alcuni numeri. Supponiamo di avere una pipeline di dati (rendering 3D, ecc.) Con 4 fasi di elaborazione, ogni fase ha 256 KiB di codice programma e si hanno convenientemente 4 CPU con 256 KiB di cache L2. Se si tenta di eseguire questa elaborazione su una singola CPU, la commutazione tra le 4 attività sarà costosa e comporterà notevoli perdite di cache. D'altro canto, se lo si esegue su un sistema a 4 core, il calcolo potrebbe essere potenzialmente molto fluido, i mancati errori nella cache sono minimi e gli switch di contesto sono inesistenti. (Come nota a margine, ciò è correlato all'idea di bloccare determinate applicazioni su determinati core, ad esempio eseguendo solo le operazioni del kernel del sistema operativo in un core, o la gestione TCP / IP, ecc.)


7

È molto più difficile sviluppare gare di dati davvero nefasti con una singola CPU. Voglio dire, certo, puoi interrompere lo strappo tra le parole se interrompi una singola CPU, ma puoi costruire scenari esotici in cui non esiste un singolo interfogliamento di thread che fa quello che vuoi?

Va bene, forse fare bug insidiosi non conta come un uso valido di avanzamenti multi-codice. A quanto pare, non c'è molto che il multi-core può fare a quel singolo core non può avere tempo. Il motivo è semplice Se si tenta di evitare quelle razze di dati malvagi, è necessario disporre di punti di sincronizzazione nel codice. Se modelli il tuo codice come un reticolo di calcoli in cui i tuoi input devono essere completi e sincronizzati prima di poter calcolare e produrre output, è facile vedere che una singola CPU può semplicemente farsi strada lungo il reticolo, calcolando il successivo blocco di lavoro disponibile .

Infatti, se puoi dimostrare che il tuo algoritmo può essere risolto da una macchina di Turing (che è praticamente ogni algoritmo che ci interessa), si può dimostrare che l'algoritmo può essere fatto non solo da una singola CPU core, ma in realtà un macchina a stati con un pezzo di nastro molto lungo per la memoria!

Il rilevatore di gara CHESS in realtà sfrutta questo per trovare i casi di gara. Esegue tutto singlethreaded ed esplora sistematicamente tutte le possibili interfacce tra i thread, cercando di trovare casi in cui un test fallisce a causa di un caso di gara. CHESS dipende dal fatto che è possibile eseguire qualsiasi applicazione multithread su un singolo core.

I casi in cui è necessario il multicore vengono visualizzati quando si inizia a estendere i limiti dell'hardware. Quello ovvio è quando hai vincoli di tempo. Alcuni problemi con vincoli di tempo in tempo reale sono impossibili da eseguire single core perché semplicemente non riescono a guidare l'orologio di un singolo core abbastanza velocemente. C'è un motivo per cui le CPU sono salite fino a 4 Ghz e poi si sono stabilizzate un po ', preferendo più core a velocità inferiori.

Una versione più esotica di questo vincolo di temporizzazione è nei sistemi in tempo reale. In alcuni sistemi in tempo reale difficile, il servizio di interrupt è così impegnativo che devi effettivamente scegliere una CPU multi-core che ti consenta di dividere gli interrupt su tutti i core o di incontrare limiti di temporizzazione.

Un altro limite sorge con i bus di dati. Considera il Blue Gene / P come esempio. JUGENE, un particolare supercomputer Blue Gene / P, ha 144 terabyte di memoria. Semplicemente non creano singoli computer CPU che possono accedere a tutta quella memoria.


1
Ri, semplicemente non creano computer con CPU singola che possono accedere a [tanta] memoria. "Non" non è lo stesso di "impossibile". È possibile progettare e costruire un uniprocessore con 144 terabyte o più di memoria principale. L'unico motivo per cui le persone non lo fanno è a causa dei rendimenti decrescenti: il valore incrementale e pratico dell'aggiunta di più memoria a un design a processore unico raggiunge un picco ad un certo punto e poi diminuisce con l'aumentare della dimensione della memoria, mentre il costo incrementale rimane costante .
Solomon Slow

@jameslarge Questo sarebbe il motivo per cui quella frase è arrivata nella parte della mia risposta che parla dell'hardware pratico della vita reale e perché non è apparsa nei primi 2/3 della risposta che ha discusso delle capacità teoriche.
Cort Ammon,

"Don't" vs. "Can't" è illustrato da due sistemi nel mio seminterrato. Se potessi aggiungere fisicamente tanta memoria nelle loro configurazioni hardware, le loro CPU "potrebbero" accedere a ciascun byte. Ma non posso, quindi "non possono". Le capacità delle CPU vanno oltre la praticità.
user2338816

Stavo pensando a qualcosa di simile a questa risposta. Sembra che le condizioni di gara sarebbero impossibili (o accadere il 100% delle volte) in un ambiente single-core. Per quanto riguarda un'applicazione pratica, teorizzo che uno sviluppatore di software potrebbe progettare una forma unica di protezione dalla copia mediante la codifica di uno strano test delle condizioni di gara che passerebbe sempre sull'hardware di destinazione specifico, ma fallirebbe sull'hardware emulato gestito da un singolo core . In questo caso, l'emulazione da parte di un sistema multi-core passerebbe probabilmente a volte, ma in modo non gradevole.
Dan Henderson,

6

Se devi osservare un processo in esecuzione su un singolo elemento di elaborazione senza disturbare il suo comportamento in tempo reale (o il meno possibile), come per il benchmarking o la registrazione delle attività, probabilmente avrai bisogno di una risorsa di elaborazione separata.


Bell'esempio conciso di qualcosa che richiederebbe un'emulazione precisa se non processori multipli
Ben Leggiero

Ehi, questo è il tuo account? Mayby vuoi fonderlo?
Male

4

Le altre risposte aderiscono alla visione limitata del parallelismo come "concorrenza distribuita". Questo dà alcune risposte: in un modello pulito di calcolo alla Turing, più core non offrono alcun vantaggio; l'unico vantaggio che potresti ottenere è l'efficienza.

C'è i molteplici unità di elaborazione una cosa (PUS) possono fare che uno solo non può, però: eseguire operazioni in parallelo , che è allo stesso tempo .

Ciò è molto utile se si eseguono più programmi contemporaneamente. Certo, è solo raramente che tu abbia assolutamente bisogno di qualcosa di più dell'esecuzione simultanea e la maggior parte degli usi si riduce a una maggiore efficienza. Ma v'è questa differenza.

Supponiamo che tu debba elaborare i dati del sensore di dati da più fonti in tempo reale. Qualunque cosa significhi esattamente nella tua applicazione, una PU può gestire solo così tanti flussi di input contemporaneamente senza violare il suo limite di tempo di risposta. Quindi hai bisogno di più PU una volta che hai troppi sensori per la tua attuale generazione di PU.

k

kkk


0

da un punto di vista CS, "multicore" non è molto diverso in teoria dal "calcolo distribuito". il concetto di base è "elementi di calcolo indipendenti (che calcolano in parallelo". Quindi riformulare leggermente la domanda ("multicore" non è proprio un concetto teorico in CS) porta ad altre possibilità. Come sottolineato in altre risposte, la programmazione sequenziale è equivalente alla programmazione parallela da un punto di vista CS. questo risale alla definizione del sistema teorico per l'informatica, vale a dire una macchina di Turing. L'analisi teorica delle prestazioni CS è in definitiva in termini di TM in cui la distinzione tra parallelo e sequenziale non si applica realmente ( sebbene vi sia una certa analogia con le multitape TM ).

ma considerando questa domanda in modo meno astratto, il calcolo distribuito è davvero superiore o forse quasi addirittura richiesto per alcuni problemi che coinvolgono la tolleranza agli errori . in quest'area esiste un concetto che si applica quando / dove si ritiene che gli elementi di calcolo indipendenti abbiano un certo grado di inaffidabilità (questo non è in realtà un presupposto universalmente applicabile per tutti i contesti). qui ci sono diversi casi in cui la tolleranza agli errori è migliorata o richiede persino elementi di calcolo indipendenti.

  • considera che ogni processore ha una probabilità "[x]%" indipendente di fallire durante il calcolo. un sistema può essere ideato in base al quale attraverso la comunicazione la tolleranza d'errore globale del sistema è superiore ai singoli componenti. questo è stato applicato molti decenni fa, ad esempio nei sistemi Space Shuttle. più recentemente ci sono protocolli di base progettati per utilizzarlo, ad esempio Paxos, che risolvono il cosiddetto problema del consenso . un esempio più concreto è Google che ha molti algoritmi proprietari per costruire essenzialmente i loro supercomputer da elementi individualmente inaffidabili accoppiati con algoritmi tolleranti ai guasti.

  • Bitcoin implica transazioni distribuite per calcolare il libro mastro e ciò non è semplicemente dovuto a problemi di carico di elaborazione. l'algoritmo è progettato con cura per contrastare i nodi corrotti. in breve "risolve" / attua il problema dei generali bizantini che non si limita semplicemente a massimizzare le prestazioni parallele, implica entità indipendenti che "si controllano" a vicenda e "rifiutano algoritmicamente / crittograficamente / in modo sicuro" il rifiuto di calcoli non validi, ovvero una sorta di "imbroglio" o " corruzione".

  • un'analisi classica del parallelismo conclude che esistono circa 7 tipi di schemi di problemi "fondamentali" che si decompongono in particolari interruzioni dell'esecuzione parallela. vedi Il panorama della ricerca informatica parallela: una vista da Berkeley

  • c'è qualche elemento di una domanda teorica aperta qui rispetto alle considerazioni sulle prestazioni affrontate nella maggior parte delle altre risposte. la questione se ci siano problemi "intrinsecamente più veloci" in parallelo rispetto a quelli sequenziali è anche conosciuta approssimativamente come il problema P =? NC in cui NC è considerata la classe di algoritmi "parallelamente efficienti" e P è "algoritmi [sequenziali] efficienti "


1
Adoro questa risposta! Ho imparato molto dai tuoi esempi: D
Ben Leggiero

+1 per la tolleranza ai guasti in ambienti mission-critical con radiazioni, -1 per mancanza di tappi e ridondanza.
Cees Timmerman,
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.