Domanda

Nel processore ARM Cortex-A8, capisco quello che NEON è, si tratta di un co-processore SIMD.

Ma è VFP (Vector Floating Point) unità, che è anche un co-processore, funziona come un processore SIMD? Se è così che uno è meglio utilizzare?

Ho letto alcuni collegamenti, come -

  1. Link1

  2. Link2 .

Ma in realtà non molto chiaro che cosa significano. Si dice che VFP è mai stato destinato ad essere utilizzato per SIMD, ma su Wiki ho letto la seguente - " l'architettura VFP supporta anche l'esecuzione di istruzioni vettoriali brevi ma questi operano su ogni elemento del vettore in sequenza e, quindi, non offrono le prestazioni di vera SIMD (single Instruction multiple Data) parallelismo. "

E 'quindi non era chiaro che cosa credere, qualcuno può elaborare più su questo argomento?

È stato utile?

Soluzione

Ci sono un bel po 'differenza tra i due. Neon è un processore acceleratore SIMD (Single Instruction Multiplo Data) come parte del nucleo ARM. Ciò significa che durante l'esecuzione di un'istruzione si verificherà la stessa operazione su un massimo di 16 insiemi di dati in parallelo. Poiché non v'è il parallelismo all'interno del Neon, è possibile ottenere più MIPS o flop di Neon di quanto si possa un processore SISD standard di esecuzione alla stessa velocità di clock.

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

VFP è un classico floating point acceleratore hardware. Non è un'architettura parallela come neon. Fondamentalmente si esegue un'operazione su un gruppo di ingressi e restituisce un'uscita. Il suo scopo è quello di accelerare i calcoli in virgola mobile. Supporta in virgola mobile di precisione singola e doppia.

Hai 3 possibilità di utilizzare Neon:

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

Altri suggerimenti

punto di vista architettonico, VFP (non è stato chiamato Vector Floating Point per niente) ha infatti una disposizione per operare su un floating-point vettore in una singola istruzione. Io non credo che sia mai effettivamente esegue operazioni multiple contemporaneamente (come vero SIMD), ma potrebbe risparmiare un po 'le dimensioni del codice. Tuttavia, se si legge l'ARM Architecture Manuale di riferimento nella guida Shark (come ho descritto nella mia introduzione al NEON, collegamento 1 in questione), si vedrà nella sezione A2.6 che la caratteristica vettore di VFP è deprecato in ARMv7 (che è ciò che gli strumenti Cortex A8), e il software dovrebbe utilizzare Advanced SIMD per le operazioni su vettori in virgola mobile.

Peggio ancora, nell'attuazione Cortex A8, VFP è implementata con un'unità di esecuzione VFP Lite (lite letto che occupa una superficie di silicio più piccolo, non come aventi meno funzioni), il che significa che in realtà è più lento rispetto alla ARM11, per esempio! Fortunatamente, la maggior parte delle istruzioni VFP singola precisione sono eseguite dall'unità NEON, ma non sono sicuro operazioni vettore VFP fanno; e anche se lo fanno, certamente eseguire più lento di quello con le istruzioni NEON.

La speranza che cancella cosa in su!

Per ARMv7 ISA (e varianti)

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

Quindi, perché mai utilizzare il VFP?!

La differenza più importante è che il VFP fornisce doppia precisione in virgola mobile.

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

Ma la differenza più importante non menzionato nella risposta di Cosmin è che il NEON virgola mobile gasdotto non è del tutto IEEE-754 compliant. La migliore descrizione delle differenze sono nella FPSCR Registro Descrizione .

Perché non è IEEE-754 compatibile, un compilatore non può generare queste istruzioni a meno che non si dica al compilatore che non sono interessati nel pieno rispetto. Questo può essere fatto in diversi modi.

  1. uso di una funzione intrinseca di forzare l'utilizzo NEON, per esempio, si veda la GCC Neon intrinseca Lista delle funzioni .
  2. Fai il compilatore, molto bene. Anche le versioni più recenti con GCC -mfpu=neon non genereranno istruzioni in virgola mobile NEON meno che non si specifichi anche -funsafe-math-optimizations.

Per ARMv8 + ISA (e varianti) [Aggiornamento]

NEON è ora completamente IEE-754 compliant, e da un programmatore (e del compilatore) punto di vista, non v'è in realtà troppa differenza. Doppia precisione è stato vettorializzare. Da un punto di micro-architettura di vista I tipi di dubbio sono anche diverse unità hardware. ARM fa istruzioni documento scalari e vettoriali separatamente, ma entrambi sono parte della "Advanced SIMD".

IIRC, VFP è un punto coprocessore galleggiante che funziona in modo sequenziale.

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

Mentre il tempo complessivo necessario per l'istruzione è diminuito di questo a causa della istruzione carico singolo, VFP ha ancora bisogno di tempo per elaborare tutti gli elementi del vettore.

La vera SIMD guadagnerà prestazione più netta in virgola mobile, ma usando il VFP con vettori è ancora più veloce quindi utilizzando puramente sequenziale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top