Frage

In ARM Cortex-A8-Prozessor, ich verstehe, was NEON ist, es ist ein SIMD-Coprozessor.

Aber ist VFP (Vector Floating Point-Einheit), die auch ein Co-Prozessor, arbeitet als SIMD-Prozessor? Wenn dies der Fall ist eine, besser zu nutzen?

Ich lese einige Verbindungen wie -

  1. Link1

  2. Link2 .

Aber nicht wirklich sehr klar, was sie bedeuten. Sie sagen, dass VFP war nie für SIMD verwendet werden soll, sondern auf Wiki Ich las die folgende - „ die VFP-Architektur unterstützt auch die Ausführung von kurzen Vektorbefehle, aber diese funktionieren auf jedem Vektorelement sequentiell und somit bieten nicht die Leistung des wahren SIMD (Single Instruction Multiple Data) Parallelität. "

Es ist so nicht so klar, was zu glauben, kann jeder erarbeiten mehr zu diesem Thema?

War es hilfreich?

Lösung

Es gibt durchaus einige Unterschiede zwischen den beiden. Neon ist ein SIMD (Single Instruction Multiple Data) Beschleuniger Prozessor als Teil des ARM-Kern. Es bedeutet, dass während der Ausführung eines Befehls der gleiche Vorgang auf bis zu 16 Datensätzen in parallel auftreten. Da es Parallelität in dem Neon ist, können Sie mehr MIPS oder FLOPS aus Neon zu bekommen, als Sie einen Standard SISD- Prozessor bei gleicher Taktrate laufen.

Der größte Vorteil von Neon ist, wenn man mit Vektoren auszuführen Operation will, das heißt Video-Codierung / Decodierung. Auch kann es single precision floating point (float) Operationen parallel auszuführen.

VFP ist ein klassischer Gleitkomma-Hardware-Beschleuniger. Es ist nicht eine parallele Architektur wie Neon. Grundsätzlich führt er eine Operation auf einem Satz von Eingängen und liefert einen Ausgang. Sein Zweck ist es Gleitkomma-Berechnungen zu beschleunigen. Es unterstützt einfacher und doppelter Genauigkeit Gleitkomma-.

Sie haben 3 Möglichkeiten Neon zu verwenden:

  • Verwendung intrinsics Funktionen # include "arm_neon.h"
  • Inline der Assembler-Code
  • die gcc lassen die Optimierungen für Sie zu tun, indem -mfpu=neon als Argument setzt (gcc 4.5 ist gut auf diese)

Andere Tipps

Architektonisch VFP (es war nicht Vector Floating Point umsonst genannt) hat in der Tat eine Rückstellung für den Betrieb auf einem Floating-Point-Vektor in einem einzigen Befehl. Ich glaube nicht, dass es jemals tatsächlich ausführt Multiples Operationen gleichzeitig (wie wahr SIMD), aber es könnte einige Codegröße speichern. Wenn Sie jedoch das ARM-Architektur-Referenzhandbuch in der Shark-Hilfe lesen (wie ich in meiner Einführung in NEON, link 1 in der Frage beschreiben), können Sie in Abschnitt A2.6 sehen werden, dass die Vektor-Funktion von VFP in ARMv7 ist veraltet (das ist, was die Cortex A8 Geräte) und Software sollten Erweiterte SIMD für verwenden Gleitkomma-Vektoroperationen.

Schlimmer noch, in dem Cortex A8 Implementierung wird VFP mit einer VFP Lite Ausführungseinheit implementiert (read lite als eine kleinere Siliziumfläche einnimmt, nicht weniger Merkmale aufweisen), was bedeutet, dass es tatsächlich langsamer als auf der ARM11, für Beispiel! Zum Glück bekommen die meisten Single-Precision VFP Anweisungen der NEON-Einheit ausgeführt wird, aber ich bin nicht sicher, Vektor VFP-Operationen zu tun; und selbst wenn sie es tun, sie sicher ausführen langsamer als mit NEON Anweisungen.

Hoffnung, dass Clears Ding!

Für ARMv7 ISA (und Varianten)

Neon ist eine SIMD und parallele Datenverarbeitungseinheit für Ganzzahl- und Gleitkomma-Daten und die VFP ist ein vollständig IEEE-754-kompatibel Gleitkommaeinheit. Insbesondere auf der A8 ist die NEON-Einheit viel schneller für fast alles, auch wenn Sie nicht hochparallele Daten haben, da die VFP Nicht-Pipeline ist.

Also warum sollten Sie jemals die Verwendung VFP?!

Der wesentliche Unterschied besteht darin, dass die VFP Gleitkomma doppelte Genauigkeit bietet.

Zweitens gibt es einige spezialisierte Anweisungen, dass VFP Angebote, dass es keine äquivalenten Implementierungen für die NEON-Einheit. SQRT in den Sinn kommt, vielleicht einige Typkonvertierungen.

Aber der wichtigste Unterschied nicht in Cosmin Antwort erwähnt ist, dass das NEON Gleitkomma-Pipeline ist nicht vollständig IEEE-754-konform. Die beste Beschreibung der Unterschiede sind in der FPSCR Register Beschreibung .

Weil es nicht IEEE-754 kompatibel ist, ein Compiler diese Anweisungen nicht erzeugen kann, wenn Sie die Compiler sagen, dass Sie nicht in voller Übereinstimmung interessiert sind. Dies kann auf verschiedene Arten erfolgen.

  1. eine eigene Funktion Mit NEON Nutzung zu zwingen, zum Beispiel finden Sie in der GCC Neon Intrinsic Funktionsliste .
  2. Stellen Sie die Compiler, sehr schön. Auch neuere GCC-Versionen mit -mfpu=neon erzeugen keinen Punkt NEON Anweisungen Floating, wenn Sie auch -funsafe-math-optimizations angeben.

Für ARMv8 + ISA (und Varianten) [Update]

NEON ist jetzt vollständig IEE-754-konform und von einem Programmierer (und Compiler) Sicht, gibt es eigentlich nicht zu viel Unterschied. Doppelte Genauigkeit hat vektorisiert worden. Von einer Mikroarchitektur Sicht Art ich Zweifel sind sie auch verschiedene Hardware-Einheiten. ARM tut Dokument Skalar und Vektorinstruktionen getrennt, aber beide sind Teil des „Advanced SIMD.“

IIRC ist das VFP ein Gleitkomma-Coprozessor, der sequentiell arbeitet.

Das bedeutet, dass Sie Anweisung auf einem Vektor von Schwimmern für SIMD-ähnliches Verhalten verwenden können, aber intern wird der Befehl auf jedem Element des Vektors in Sequenz .

Während die Gesamtzeit für den Unterricht benötigte dadurch reduziert wird, weil der einzigen Ladeanweisung, die VFP braucht noch Zeit, um alle Elemente des Vektors zu verarbeiten.

True SIMD gewinnt mehr Netto-Floating-Point-Leistung, aber mit Vektoren, die VFP ist noch schneller als es rein sequenzielle Verwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top