Coding für ARM NEON: Wie fange ich an?

BACKGROUND (Überspringen Sie dies, wenn Sie möchten)

Lassen Sie mich zunächst sagen, dass ich kein Experte Programmierer bin. Ich bin ein junger Junior Computer Vision (CV) Ingenieur, und ich bin ziemlich erfahren in der C ++ Programmierung, hauptsächlich aufgrund der umfangreichen Nutzung der großartigen OpenCV2 C ++ API. Alles, was ich gelernt habe, war die Notwendigkeit, Projekte durchzuführen, Probleme zu lösen und Termine einzuhalten, wie es die Realität in der Branche is

Vor kurzem haben wir mit der Entwicklung von CV-Software für eingebettete Systeme (ARM-Boards) begonnen und verwenden dazu einfachen C ++ -optimierten Code. Es ist jedoch eine große Herausforderung, ein Echtzeit-CV-System in dieser Art von Architektur zu erstellen, da die Ressourcen im Vergleich zu herkömmlichen Computern begrenzt sin

Thats, als ich über NEON fand. Ich habe eine Reihe von Artikeln darüber gelesen, aber dies ist ein relativ neues Thema, daher gibt es nicht viele Informationen darüber und je mehr ich lese, desto verwirrter werde ich.

Die Frag

Ich bin auf der Suche nach C ++ - Code zu optimieren (hauptsächlich einigefor Schleifen) Verwenden der NEON-Fähigkeit, 4 oder 8 Array-Elemente gleichzeitig zu berechnen. Gibt es eine Bibliothek oder eine Reihe von Funktionen, die in einer C ++ - Umgebung verwendet werden können? Die Hauptursache für meine Verwirrung ist die Tatsache, dass fast alle Code-Snipets, die ich sehe, in Assembly vorliegen, für die ich keinerlei Hintergrundinformationen habe und die ich mir derzeit möglicherweise nicht leisten kann, etwas zu lernen. Ich verwende Eclipse IDE in Linux Gentoo, um C ++ - Code zu schreiben.

AKTUALISIERE

Nach dem Lesen der Antworten habe ich einige Tests mit der Software durchgeführt. Ich habe mein Projekt mit folgenden Flags kompiliert:

-O3 -mcpu=cortex-a9 -ftree-vectorize -mfloat-abi=hard -mfpu=neon 

Beachten Sie, dass dieses Projekt umfangreiche Bibliotheken wie openframeworks, OpenCV und OpenNI enthält und alles mit diesen Flags kompiliert wurde. Zum Kompilieren für das ARM-Board verwenden wir einen Linaro-Toolchain-Crosscompiler. Die Version von GCC ist 4.8.3. Würden Sie erwarten, dass dies die Leistung des Projekts verbessert? Weil wir überhaupt keine Veränderungen erlebt haben, was bei all den Antworten, die ich hier lese, ziemlich seltsam ist.

Eine andere Frage: allefür Zyklen hat eine scheinbare Anzahl von Iteratonen, aber viele von ihnen durchlaufen benutzerdefinierte Datentypen (Strukturen oder Klassen). Kann GCC diese Zyklen optimieren, obwohl sie benutzerdefinierte Datentypen durchlaufen?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage