2011-11-23 8 views
25

A causa dell'enorme impatto sulle prestazioni, non mi chiedo mai se la mia CPU del giorno corrente abbia una previsione delle filiali. Certo che lo fa. Ma che dire delle varie offerte ARM? IPhone o telefoni Android hanno una previsione di ramo? Il vecchio Nintendo DS? Che ne dici di Wii basato su PowerPC? PS 3?Quanto è prevalente la previsione delle filiali sulle attuali CPU?

Se hanno un'unità di previsione complesso non è così importante, ma se hanno almeno qualche dinamica predizione, e se lo fanno alcuni esecuzione di istruzioni a seguito di un ramo previsto.

Qual è il limite per le CPU con previsione del ramo? Una calcolatrice palmare di decenni fa ovviamente non ne ha uno, mentre il mio desktop lo fa. Ma qualcuno può più chiaramente delineare dove ci si può aspettare la previsione del ramo dinamico?

Se non è chiaro, sto parlando del tipo di previsione in cui la condizione sta cambiando, variando il percorso previsto durante il runtime.

+0

Questa è una domanda davvero interessante! Mi piacerebbe conoscere anche i processori embedded più popolari. – hippietrail

risposta

0

Non tanto per l'ARM Cortex-A8 (sebbene abbia qualche previsione di ramo), ma credo che il Cortex-A9 sia super-scalare out-of-order, con una previsione di branch complessa.

+0

Grazie, ma sto cercando una risposta più generale. Dicendo che Cortex-A8 ha "non così tanto, ma alcuni" non aiuta neanche. – porgarmingduod

+2

Inoltre, ho appena scoperto che ARM Cortex-A8 ha una penalità di 13 cicli per i rami mancanti, quindi penso che sia sicuro dire che prende seriamente la previsione delle branch. – porgarmingduod

10

Le moderne CPU superscalari di fascia alta con pipeline lunghe (che significa quasi tutte le CPU comunemente presenti nei desktop e server) hanno una previsione di branch piuttosto sofisticata al giorno d'oggi.

La maggior parte delle CPU ARM non ha una previsione di branch, che risparmia il silicio e il consumo di energia, ma le CPU ARM hanno generalmente pipeline relativamente brevi. Anche il supporto per l'esecuzione condizionale della maggior parte delle istruzioni nell'ARM ISA aiuta a ridurre il numero di rami necessari (e quindi riduce il costo delle bancarelle di malversazione delle filiali).

+1

Poiché la pipeline NEON si trova dietro la pipeline ARM principale, se si esegue il calcolo NEON si ha una penalità significativa per la mancanza di ramo. –

+0

@Anthony Blake: buon punto - quindi usare l'esecuzione condizionale piuttosto che i rami è probabilmente una buona idea quando si hanno istruzioni NEON nel mix. –

10

Qualsiasi CPU con una pipeline oltre alcuni stadi richiede almeno una previsione di ramo primitiva, altrimenti può ritardare l'attesa dei risultati di calcolo per decidere in che direzione andare. Intel Atom è un core in-order, ma con una pipeline abbastanza profonda, e quindi richiede un predittore di ramo abbastanza decente.

I vecchi modelli ARM 7 erano solo tre. Combinalo con cose come gli slot di delay branch (richiesti su MIPS, opzionali su SPARC), e la previsione di branch non è così utile.

Per inciso, quando MIPS ha deciso di ottenere più prestazioni superando i 4 stadi della pipeline, lo slot di ritardo del ramo è diventato un fastidio. Nel progetto originale, era necessario, perché non c'era alcun predittore di ramo. Pertanto, è necessario sequenziare le istruzioni di salto prima dell'ultima istruzione da eseguire prima del ramo. Con la pipeline più lunga, avevano bisogno di un predittore di ramo, ovviando alla necessità di uno slot di delay branch, ma dovevano comunque emularlo per eseguire codice più vecchio.

Il problema con uno slot di ritardo del ramo è che può essere riempito solo con un'istruzione utile circa il 50% del tempo. Il resto del tempo, o lo riempi con un'istruzione il cui risultato è probabile che venga gettato via, o usi un NO-OP.

+1

Informativo. Mi avvicina un po 'a capire dove potrebbe essere il "cutoff" approssimativo. – porgarmingduod

4

La previsione filiale diventa sempre più importante ed enfatizzata mentre ARM diventa sempre più complicato.

Ad esempio, la nuova architettura ARM a 64 bit denominata ARMv8 riduce la maggior parte dell'utilizzo dell'esecuzione condizionale (principalmente a causa delle limitazioni di spazio per la codifica delle istruzioni con un numero maggiore di registri) e fa affidamento sulla previsione delle filiali per mantenere le prestazioni a livelli accettabili.

Anche per i nuovi ARMv7-un dispositivo è possibile controllare casi terribili come unsorted data question on SO, il cui miglioramento della previsione dei rami è di circa 3 volte.

0

È possibile prevedere il predittore di Dynamic Branch in qualsiasi processore fuori servizio, tali processori non solo fanno affidamento sul pipelining ma recuperano anche più istruzioni al momento e dispongono di più unità di esecuzione (unità in virgola mobile, ALU), più registri; per aumentare l'esecuzione delle istruzioni, si hanno più istruzioni al volo in un dato momento, naturalmente i rami sono un problema se si desidera mantenere alto l'utilizzo di tutti i macchinari, in questo tipo di processori, fare affidamento sulla previsione dinamica delle filiali per mantenere il throughput e utilizzo molto alto.

È possibile aspettarsi che qualsiasi server abbia previsione dinamica delle diramazioni, anche desktop, in passato i sistemi embedded come i chip ARM negli smartphone attuali non avevano previsioni sulle filiali poiché avevano pipeline più piccole e non avevano un'esecuzione fuori servizio , ma dato che la legge di Moore ci dà più transistor per area, inizierai a vedere sempre più processori aumentare la loro architettura. Quindi, per rispondere alla tua domanda, oltre all'evidente ricerca delle specifiche della CPU, puoi aspettarti di avere una previsione di branch su chip di 32 Bits, pipeline più grandi, exection non funzionante. I chip più recenti di ARM si stanno spostando in qualche modo in questa direzione.