2013-03-27 11 views
19

mi sono imbattuto in questo estratto oggi:Perché le operazioni bit a bit erano leggermente più veloci delle operazioni di addizione/sottrazione su microprocessori precedenti?

Sulla maggior parte dei microprocessori più anziani, operazioni bit per bit sono leggermente più veloce di addizione e sottrazione operazioni e di solito significativamente più veloce di moltiplicazione e divisione operazioni. Nelle architetture moderne, questo non è il caso: le operazioni bit a bit sono in genere alla stessa velocità dell'addizione (sebbene ancora più veloce della moltiplicazione).

Sono curioso di sapere perché le operazioni bit a bit erano leggermente più veloci delle operazioni di addizione/sottrazione su microprocessori precedenti.

Tutto quello che posso pensare che causerebbe la latenza è che i circuiti per implementare addizione/sottrazione dipendono da diversi livelli di porte logiche (additori paralleli e quant'altro), mentre le operazioni bit a bit hanno implementazioni circuitali molto più semplici. È questa la ragione?

So che le operazioni aritmetiche e bit a bit vengono eseguite all'interno di un clock-clo su processori moderni, ma parlando puramente del tempo di propagazione per il circuito, la latenza è ancora teoricamente presente nei processori moderni?

Infine, ho avuto una domanda concettuale C circa l'esecuzione dell'operazione di spostamento bit a bit:

unsigned x = 1; 
x <<= 5; 

unsigned y = 0; 
y += 32; 

Sia x e y dovrebbe contenere il valore 32, ma c'è voluto turni separati a sinistra per ottenere x a quel valore (come in sono gli spostamenti bit a bit implementati tramite pipe)? Per chiarire, sto chiedendo esclusivamente il comportamento del circuito, non il numero di cicli di clock.

+1

Il primo esempio restituisce zero, ma probabilmente era un errore di battitura. Il resto della tua domanda è specifico dell'hardware e probabilmente off-topic qui. –

+0

@ 500 Penso che sia importante conoscere il funzionamento di un processore in modo da poter capire meglio come funziona il codice di alto livello. – kjprice

+0

@kjprice: abbastanza giusto, noterete che non ho votato per chiudere. –

risposta

21

In qualsiasi operazione bit a bit binaria, ciascun bit di uscita dipende solo dai due bit corrispondenti negli ingressi. In un'operazione di aggiunta, ciascun bit di uscita dipende dai bit corrispondenti negli ingressi e da tutti i bit a destra (verso valori più bassi).

Ad esempio, il bit più a sinistra di 01111111 00000001 + è 1, ma il bit più a sinistra di 01111110 00000001 + è 0.

Nella sua forma più semplice, un sommatore aggiunge i due bit basse e produce un bit di uscita e un carry. Quindi vengono aggiunti i successivi due bit più bassi e viene aggiunto il carry, producendo un altro bit di output e un altro carry. Questo si ripete. Quindi il più alto bit di output è alla fine di una catena di add. Se esegui l'operazione un po 'alla volta, come hanno fatto i processori più vecchi, ci vuole tempo per arrivare alla fine.

Ci sono modi per velocizzarne alcuni, inserendo più bit di input in disposizioni logiche più complicate. Ma ovviamente richiede più spazio nel chip e più potenza.

I processori di oggi dispongono di diverse unità per l'esecuzione di vari tipi di carichi di lavoro, negozi, aggiunte, moltiplicazioni, operazioni in virgola mobile e altro.Viste le funzionalità odierne, il lavoro di aggiunta è ridotto rispetto ad altre attività, quindi si adatta a un singolo ciclo del processore.

Forse in teoria è possibile eseguire un processore che eseguisse un'operazione bit a bit più rapidamente di un add. (E ci sono, almeno sulla carta, processori esotici che operano in modo asincrono, con diverse unità che lavorano al loro ritmo.) Tuttavia, con i progetti in uso, è necessario un normale ciclo fisso per coordinare molte cose nel caricamento del processore istruzioni, inviandole alle unità di esecuzione, inviando i risultati dalle unità di esecuzione ai registri e molto altro ancora. Alcune unità di esecuzione richiedono più cicli per completare il proprio lavoro (ad esempio, alcune unità in virgola mobile impiegano circa quattro cicli per eseguire un'aggiunta in virgola mobile). Quindi puoi avere un mix. Tuttavia, con le scale di corrente, riducendo il tempo di ciclo in modo che si adatti a un'operazione bit a bit, ma non è probabile che un add non sia economico.

-1

Questo ho brillato da una introduzione alla classe di assemblaggio. Ma lo spostamento è solo l'istruzione più veloce che un processore può eseguire. L'aggiunta e la sottrazione richiedono alcune istruzioni da eseguire. Immagino che i processori moderni siano meglio ottimizzati.

Presumibilmente, qualcuno può rispondere a questo in modo più accurato e completo.

0

Bit operatore saggio eseguito in meno tempo, perché

  • processore prendere uno un'istruzione per eseguire l'operazione bit saggio e (diciamo dire) prelevare un ciclo di esecuzione, d'altra parte altre istruzioni aritmetiche (specialmente, moltiplicare e dividere) prendere più cicli di esecuzione
  • maggior parte del tempo di funzionamento bit saggio viene eseguita con in un registro, e altre istruzioni aritmetiche necessarie per gestire più di uno registri

Ecco perché i bit di spostamento sono più veloci di altre operazioni aritmetiche

3

La cosa complicata dell'aggiunta (di solito si ottiene sottrarre gratuitamente) è che c'è quel fastidioso problema di trasporto.

Quindi, si finisce con la soluzione ingenua essere N volte Full-Adders dove N è il numero di bit di larghezza della ALU.

Queste trappole fastidiose significano un ritardo di propagazione molto lungo. E, poiché un singolo riporto può rendere inaccurato l'intero risultato, si finisce per dover aspettare un periodo di tempo abbastanza significativo per tutti i valori di carry e a turno, tutti gli altri full-down della catena da regolare.

Ci sono molti modi per aggirare questo particolare collo di bottiglia, ma nessuno è semplice o a basso costo di risorse da implementare come una catena di full-adder. (Il più veloce essendo una tabella di ricerca implementato in silicio)

Se volete maggiori dettagli, avrete probabilmente bisogno di chiedere questo su http://electronics.stackexchange.com invece

+0

Se pensi a come sarebbe implementata una tabella di ricerca, con i suoi demultiplexer che selezionano un segnale che si combina con un segnale proveniente da un altro operando, in una delle porte 2^N, che si alimentano di nuovo in un multiplexer, ti renderai conto che Il sommatore completamente combinatorio * è * solo una tabella di ricerca, fortemente ottimizzata per eliminare tutta la logica duplicata. –

+0

@BerndJendrissek Tutto si riduce ad una tabella di ricerca ad un certo punto. Vedi anche ["La bomba tattica del design logico"] (http://www.6502.org/users/dieter/a1/a1_4.htm) – Earlz

0

Alcune implementazioni aggiunta devono fare un ciclo aggiuntivo per il bit di riporto. Ad esempio: un intero a 16 bit richiede più istruzioni su un processore a 8 bit. Questo vale anche per il turno. Ma lo spostamento può sempre spostare i bit di altezza sui bit inferiori del byte successivo. L'aggiunta deve aggiungere la punta inferiore in un round aggiuntivo.

1

Per rispondere alla tua ultima domanda, dipende. Alcune architetture hanno solo spostamenti di 1 (come z80), alcune architetture espongono spostamenti di costanti e/o variabili più grandi ma implementano internamente come un gruppo di "shift by 1" (come le vecchie implementazioni di x86), ci sono alcune architetture che possono spostarsi di più di 1 in un singolo ciclo ma solo se la quantità di spostamento è una costante, ci sono alcune architetture (come le moderne implementazioni di x86) che usano uno barrel shifter e possono spostarsi di una variabile in un singolo ciclo, e ci sono ancora più possibilità.

La profondità del circuito di un barrel shifter è logaritmica nel massimo spostamento che può fare, che non è necessariamente la larghezza di un registro - a volte è inferiore alla larghezza ed è concepibile che sia ancora meno.

Problemi correlati