2013-04-06 15 views
6

Sto lavorando su un controller ARM Cortex-M3 che ha il set di istruzioni Thumb-2.ARM Thumb/Thumb-2 performance

La modalità pollice viene utilizzata per comprimere l'istruzione in una dimensione a 16 bit. Quindi la dimensione del codice è ridotta. Ma con la normale modalità Thumb, perché si dice che le prestazioni sono ridotte?

In caso di Thumb-2, si dice prestazioni migliorano secondo questi due link:

migliorare le prestazioni in casi in cui un singolo 16 -bit istruzione limita le funzioni disponibili per il compilatore.

Uno scopo dichiarato per Thumb-2 era ottenere densità di codice simile a Thumb con prestazioni simili all'istruzione ARM impostata su memoria a 32 bit.

Che cosa è esattamente questa prestazione? Qualcuno può fornire alcuni esempi relativi ad esso?

+1

Le prestazioni sono sempre relative. Ci sono molti casi in cui il codice 'thumb' funziona meglio di' arm'. Principalmente se il bus di memoria è un collo di bottiglia. Generalmente il 'pollice' non ha tanti registri, quindi anche se il set di istruzioni è più compatto, con alcuni algoritmi, dovrà accedere alla memoria più spesso per versare i registri. –

+1

Se ho un camion di consegna A e un camion di consegna B che è la metà di A. Se la quantità di materiale consegnato si adatta al camion A ma è grande per il camion B, il camion B impiegherà il doppio del numero di viaggi da effettuare lo stesso lavoro. Il pollice non è altrettanto efficiente quanto ARM, è più simile al 10-15% in più di istruzioni per fare la stessa cosa di ARM. –

+0

Vedere anche: Stackoverflow [Gcc -mthumb vs -marm] (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) e [Arizona paper] (http: //www.cs.arizona .edu/~ arvind/papers/lctes02.pdf) su compilazione guidata Thumb e ARM. –

risposta

6

Se confrontato con il set di istruzioni ARM a 32 bit, il set di istruzioni a 16 bit pollice (non si parla ancora di estensioni thumb2) occupa meno spazio perché le istruzioni sono la metà delle dimensioni, ma c'è un calo delle prestazioni, in generale, perché ci vogliono più istruzioni per fare la stessa cosa che sul braccio. Ci sono meno funzioni per il set di istruzioni e la maggior parte delle istruzioni funziona solo sui registri r0-r7. Il confronto tra le mele e le mele più istruzioni per fare la stessa cosa è più lento.

Ora le estensioni thumb2 prendono istruzioni pollice in precedenza non definite e creano istruzioni in pollici a 32 bit. Comprendi che esiste più di un set di estensioni thumb2. ARMv6m aggiunge forse un paio di dozzine. ARMv7m aggiunge qualcosa come 150 istruzioni al set di istruzioni del pollice, non so cosa manterrà ARMv8 o il futuro. Quindi, supponendo ARMv7m, hanno colmato il divario tra ciò che si può fare in pollici e ciò che si può fare in ARM. Quindi thumb2 è un'istruzione ARM ridotta impostata come pollice, ma non come ridotta. Quindi potrebbe richiedere ancora più istruzioni per fare la stessa cosa in thumb2 (assumere più pollice) rispetto a ARM che fa la stessa cosa.

Questo dà un assaggio del problema, una singola istruzione in braccio e il suo equivalente in pollice.

ARM 

and r8,r9,r10 

THUMB 

push {r0,r1} 
mov r0,r8 
mov r1,r9 
and r0,r1 
mov r1,r10 
and r0,r1 
mov r8,r0 
pop {r0,r1} 

Ora un compilatore wouldnt farlo, il compilatore sarebbe sapere che si rivolge pollice e fare le cose in modo diverso, scegliendo altri registri. Ancora meno registri e meno funzioni per istruzione:

mov r0,r1 
and r0,r2 

vuole ancora due istruzioni/cicli di esecuzione ae due registri insieme, senza modificare gli operandi, e mettere il risultato in un terzo registro. Thumb2 ha un registro tre e quindi si torna ad una singola istruzione usando le estensioni thumb2. E quell'istruzione thumb2 consente r0-r15 su uno di quei tre registri in cui il pollice è limitato a r0-r7.

Consultare il Manuale di riferimento di architettura ARMv5, sotto ogni istruzione di pollice mostra l'istruzione ARM equivalente. Quindi vai a quella istruzione ARM e confronta quello che puoi fare con quella istruzione di braccio che non puoi fare con le istruzioni del pollice. È un percorso a senso unico le istruzioni del pollice (non thumb2) hanno una relazione uno a uno con un'istruzione ARM.tutte le istruzioni del pollice hanno un'istruzione equivalente al braccio. ma non tutte le istruzioni del braccio hanno un'istruzione equivalente al pollice. Dovresti essere in grado di vedere da questo esercizio la limitazione sui compilatori quando si utilizza il set di istruzioni del pollice. Quindi prendi il Manuale di riferimento architettonico ARMv7m e guarda il set di istruzioni e confronta le codifiche "tutte le varianti di pollice" (quelle che includono ARMv4T) e quelle che sono limitate a ARMv6 e/o v7 e vedi l'espansione delle caratteristiche tra pollice e thumb2 e le istruzioni solo thumb2 che non hanno controparte del pollice. Questo dovrebbe chiarire che cosa devono lavorare i compilatori tra pollice e pollice2. È quindi possibile andare fino al punto di confrontare pollice + pollice2 con le istruzioni ARM complete (ARMv7 AR è ciò che viene chiamato?). E vedi che thumb2 diventa molto più vicino a ARM, ma per esempio, perdi condizionali su ogni istruzione, quindi l'esecuzione condizionata in pollice diventa paragone con il branching sul codice, dove in ARM a volte puoi avere un if-then-else senza branching ..

+0

state anche molto attenti, corteccia-m3 e corteccia-m4 sono ARMv7m, la corteccia -m0 e -m1 sono ARMv6m, molta differenza tra le estensioni thumb2 su quelle serie di istruzioni, anche i compilatori in avanti con la cortex-m3 e aggiunto un po 'di roba thumb2, e non si poteva usare thumb2 sulla corteccia-m0 quando usciva. Non sono sicuro che i compilatori (gcc/clang) siano stati catturati ancora completamente. Allo stesso modo la corteccia-m4 ha (può avere) un punto fluttuante che è un sapore ridotto del Cortex-A, e i compilatori stavano lottando con il punto fluttuante sulla corteccia-m4 quando uscì. non sono sicuro se hanno raggiunto –

+0

se il pollice può accedere solo al registro R0-R7 ... allora come nel tuo esempio stai usando le istruzioni mov sul registro r8, r9 e r10 ... per favore suggerisci? – Katoch

+0

* MOST * le istruzioni pollice alcune possono in particolare una mossa specifica alta/bassa –

6

Thumb-2 ha introdotto istruzioni di lunghezza variabile sul pollice originale; ora le istruzioni possono essere un misto di 16-bit e 32-bit. Ciò significa che si mantiene il vantaggio delle dimensioni del Thumb originale nel codice di tutti i giorni, ma ora si ha accesso a quasi tutte le funzionalità ARM nel codice più complesso, ma senza il sovraccarico di ARM-interworking precedentemente sostenuto da Thumb.

Oltre al già citato accesso al registro completo impostato da tutte le operazioni di registro, Thumb-2 ha aggiunto l'esecuzione condizionale senza ramo nella forma del blocco IF-THEN (IT). Il Thumb originale rimosso la caratteristica ARM marchio di esecuzione condizionale su quasi tutte le istruzioni; questo è ora ottenuto in Thumb-2 anteponendo all'istruzione IT le condizioni per un massimo di quattro istruzioni successive.

Inoltre, il set di istruzioni è stato ampiamente ampliato; ad esempio, Cortex-M4F implementa l'estensione DSP e l'estensione in virgola mobile FPv4-SP. In effetti, credo che anche NEON possa essere codificato in Thumb2.