2010-11-04 13 views
35

Nel processore ARM Cortex-A8, capisco cos'è NEON, è un coprocessore SIMD.ARM Cortex-A8: Qual è la differenza tra VFP e NEON

Ma l'unità VFP (Vector Floating Point), che è anche un coprocessore, funziona come un processore SIMD? Se sì quale è meglio usare?

ho letto alcuni collegamenti come ad esempio -

  1. Link1

  2. Link2.

Ma non proprio molto chiaro cosa significano. Dicono che il VFP non è mai stato concepito per essere utilizzato per SIMD ma su Wiki ho letto quanto segue - "L'architettura VFP supporta anche l'esecuzione di brevi istruzioni vettoriali ma queste operano su ciascun elemento vettoriale in modo sequenziale e quindi non offrono le prestazioni della vera SIMD (Parallelismo dati a singola istruzione) "

Non è così chiaro cosa credere, qualcuno può approfondire ulteriormente questo argomento?

risposta

36

Ci sono alcune differenze tra i due. Neon è un processore acceleratore SIMD (Single Instruction Multiple Data) come parte del core ARM. Significa che durante l'esecuzione di un'istruzione si verificherà la stessa operazione su un massimo di 16 serie di dati in parallelo. Dato che c'è il parallelismo all'interno del Neon, puoi ottenere più MIPS o FLOP di Neon rispetto a un processore SISD standard con la stessa frequenza di clock.

Il più grande vantaggio di Neon è se si desidera eseguire operazioni con vettori, ovvero codifica/decodifica video. Inoltre può eseguire operazioni a virgola mobile (float) di precisione singola in parallelo.

VFP è un classico acceleratore hardware a virgola mobile. Non è un'architettura parallela come Neon. Fondamentalmente esegue un'operazione su un set di input e restituisce un output. Lo scopo è accelerare i calcoli in virgola mobile. Supporta punto di virgola mobile a precisione singola e doppia.

si hanno 3 possibilità di utilizzare Neon:

  • uso intrinseche funzioni #include "arm_neon.h"
  • linea il codice assembly
  • lasciare che il gcc di fare le ottimizzazioni per voi, fornendo -mfpu=neon come argomento (gcc 4.5 è OK)
2

IIRC, il VFP è un coprocessore a virgola mobile che funziona in sequenza.

Ciò significa che è possibile utilizzare le istruzioni su un vettore di float per comportamento simile a SIMD, ma internamente, l'istruzione viene eseguita su ciascun elemento del vettore nella sequenza.

Mentre il tempo complessivo richiesto per l'istruzione viene ridotto a causa dell'istruzione a carico singolo, il VFP ha ancora bisogno di tempo per elaborare tutti gli elementi del vettore.

True SIMD otterrà più prestazioni in virgola mobile netta, ma l'utilizzo del VFP con i vettori è ancora più veloce, quindi l'uso è puramente sequenziale.

16

Architettonicamente, VFP (non è stato chiamato Vector Floating Point per niente) ha in effetti una disposizione per operare su un vettore a virgola mobile in una singola istruzione. Non penso che esegua mai contemporaneamente operazioni multiple (come il vero SIMD), ma potrebbe salvare alcune dimensioni del codice. Tuttavia, se si legge il Manuale di riferimento dell'architettura ARM nella guida dello Shark (come descritto nella mia introduzione a NEON, collegamento 1 nella domanda), nella sezione A2.6 si vedrà che la funzionalità vettoriale di VFP è deprecata in ARMv7 (che è ciò che implementa il Cortex A8), e il software dovrebbe usare Advanced SIMD per le operazioni vettoriali in virgola mobile. Ancora peggio, nell'implementazione di Cortex A8, VFP è implementato con un'unità di esecuzione VFP Lite (leggi lite come occupante una superficie di silicio più piccola, non con meno funzioni), il che significa che è in realtà più lento di ARM11, per esempio! Fortunatamente, la maggior parte delle istruzioni VFP a precisione singola vengono eseguite dall'unità NEON, ma non sono sicuro che le operazioni VFP vettoriali vengano eseguite; e anche se lo fanno, eseguono certamente più lentamente rispetto alle istruzioni NEON.

Spero che chiarisca la situazione!

+0

Ehi Pierre, occhio aperto!Ma non sono riuscito a ottenere ciò che intendi per aiuto dello squalo, puoi gentilmente postare il link? – HaggarTheHorrible

+1

Per ragioni esterne, non esiste un collegamento diretto alla documentazione dell'architettura ARM. Invece, indico gli sviluppatori iOS alla copia locale che hanno già, a/Libreria/Applicazione \ Supporto/Shark/Aiutanti/ARM \ Help.app/Contents/Resources/ARMISA.pdf (meglio ancora, quel documento omette le informazioni che sono obsolete o irrilevante per lo sviluppo di iOS, come le informazioni a livello di sistema). Se non sei uno sviluppatore iOS, vai su http://infocenter.arm.com/help/topic/com.arm.doc.ddi0406b/index.html, registrati per un account, accetta le condizioni e scarica il documento. –

14

Per ISA ARMv7 (e varianti)

Il neon è un SIMD e un'unità di elaborazione dati in parallelo per i dati interi e virgola mobile e il VFP è un'unità in virgola mobile completamente IEEE-754 compatibile. In particolare su A8, l'unità NEON è molto più veloce per quasi tutto, anche se non si dispone di dati altamente paralleli, dal momento che il VFP non ha pipeline.

Quindi, perché mai utilizzeresti il ​​VFP ?!

La differenza principale è che il VFP fornisce un punto in virgola mobile a doppia precisione.

In secondo luogo, ci sono alcune istruzioni specializzate che VFP offre che non ci sono implementazioni equivalenti per l'unità NEON. Mi viene in mente SQRT, forse alcune conversioni di tipo.

Ma la differenza più importante non menzionata nella risposta di Cosmin è che la pipeline in virgola mobile NEON non è interamente conforme allo standard IEEE-754. La migliore descrizione delle differenze si trova nello FPSCR Register Description.

Poiché non è conforme allo standard IEEE-754, un compilatore non può generare queste istruzioni a meno che non si dica al compilatore che non si è interessati alla piena conformità. Questo può essere fatto in diversi modi.

  1. Utilizzo di una funzione intrinseca per forzare l'utilizzo di NEON, ad esempio vedere GCC Neon Intrinsic Function List.
  2. Chiedi al compilatore, molto bene. Anche le versioni GCC più recenti con -mfpu=neon non generano istruzioni NEON a virgola mobile a meno che non si specifichi anche -funsafe-math-optimizations.

Per ARMv8 + ISA (e varianti) [Update]

NEON è ora completamente IEE-754 compliant, e da un programmatore (e del compilatore) punto di vista, v'è in realtà non è troppa differenza . La doppia precisione è stata vettorializzata. Dal punto di vista della microarchitettura, dubito che siano anche unità hardware diverse. ARM documenta separatamente le istruzioni scalari e vettoriali, ma entrambe fanno parte di "Advanced SIMD".

+1

Un altro motivo per utilizzare VFP è quando è necessaria una doppia precisione poiché NEON non supporta la doppia precessione. Anche quando VFP non è pipeline (ad esempio in Cortex A-8) sarà più veloce di implementare il doppio nel software usando NEON (non penso nemmeno [double-float] (https://en.wikipedia.org/wiki/ Quadruple-precision_floating-point_format # Double-double_arithmetic) usando NEON batterebbe VFP). –

+0

Non posso credere di averlo dimenticato nella mia risposta. Grazie! –

+0

Ho appena saputo che ARM64 NEON supporta il doppio. Suppongo che sia sostanzialmente come SSE2 per x86 quindi. –