2010-11-26 28 views
4

Ich versuche mein Bildverarbeitungsprojekt zu verbessern, das auf einem ARM Cortex-a8-Prozessor läuft.ARM Cortex-A8: Wie viele Bytes werden in einem Speicher gelesen?

Ich habe auf 8-Bit-Graustufen-Bilddaten aus dem Speicher zugegriffen. In meiner Funktion greife ich jetzt Byte für Byte auf den einzelnen Pixelwert zu.

Ich dachte, dass durch die Verwendung von NEON kann ich dies durch den Zugriff 128/8 = 16 Bytes in einem Schuss aus dem Speicher verbessern und dann von ihnen in meiner Funktion verwenden. Aber beim Ausführen der geänderten Version sehe ich, dass dies tatsächlich MEHR Zeit als byteweise Zugriff ist. Ich denke, dass das Abrufen mit NEON zu einem Flaschenhals wird, der mehr Zeit in Anspruch nimmt als meine Rechenzeit.

Wie groß ist die Datenbusgröße von ARM Cortex-A8? Wie viele Bytes werden vom Speicher in einem Speicher abgerufen?

+0

Der Cache wird dies in der Regel abstrahiert haben. Von SDRAM wird es Burst Reads und schreibt. Wenn Sie direkten Bildschirmspeicher verwenden, dann kann der Cache * durch * schreiben. Die Antwort hängt davon ab, welchen Speicher Sie verwenden. Sie sollten die Speicherleistung * immer vergleichen und dann mit Ihrem Code vergleichen. Siehe: [Cortex-A8-Speicherkopie] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html). –

Antwort

3

Aus dem Cortex A8 TRM:

"Sie können den Prozessor so konfigurieren, dass entweder eine 64-Bit- oder 128-Bit-AXI-Verbindung, die Flexibilität zu Systemdesign bietet verbinden"

Ist NEON notwendig, vielleicht Sie vergleichen Äpfel mit Orangen? Anstelle von ldrb/strb können Sie lrdd/strd oder ldm/stm verwenden, um 64-Bit-Übertragungen zu erhalten. Der ARM/AXI kann schlau genug sein, nach vorne zu schauen und kleinere Übertragungen in größere Übertragungen zu gruppieren, beispielsweise zwei 32-Bit-Übertragungen in ein 64-Bit-Format. Aber ich würde mich nicht darauf verlassen. Ich erwähne es nur für den Fall, dass du feststellst, dass du keine Leistungsgewinne machst, wenn du zu einem ldr/str oder lrdd/strd wechselst.

Haben Sie die Lese- oder Schreibschleife isoliert (keine Datenverarbeitung) und versuchen, Bytes vs Wörter vs Doppelwörter? Es kann sein, dass der Code zum Extrahieren von Bytes aus Wörtern die Einsparungen auf dem Bus überwältigt.

Welche Art von Speicher ist das? Ist das auf dem Chip oder außerhalb des Chips, was für eine Geschwindigkeit ist dieser Speicher relativ zur AXI (ARM) -Taktgeschwindigkeit?

Haben Sie den Datencache für diese Region aktiviert? Wenn dies ein Mute-Punkt ist, führt das Lesen des ersten Bytes eine Cache-Zeilenfüllung unter Verwendung einer optimalen Datenbusgröße aus, nachfolgende Lesevorgänge innerhalb dieser Cache-Zeile erreichen den AXI-Bus nicht viel weniger als den Zielspeicher. Ebenso sollten die Schreibvorgänge nur so weit wie der Cache gehen und später in eine größere busoptimierte Größe zum Ziel gehen. Hängt davon ab, wie der Cache/Schreibpuffer konfiguriert ist.

+0

müssen Sie vom Hersteller herausfinden, ob es ein 64 oder 128 Bit breiter axi Bus ist oder nicht. –

+0

Sie wahrscheinlich * versuchen * mit einem Idm mit Vielfachen von 128 Bits auf 128 Bit Grenzen, ich glaube, die 64-Bit-Axi-Bus auf dem Prozessor, den ich kenne, führt mehrere Busbreite liest auf einem einzigen Axi-Befehl (nicht so für schreibt aber) aber was der Verkäufer mit diesem axi Bus verdrahtete und wie sie ihn einführte, kann dich noch beißen. –

+0

Ich weiß, ich hätte meine Antwort bearbeiten können, entschied sich nicht.Das LDM wird dazu führen, dass man dann jedes Byte verschieben und isolieren muss, was eine Menge Arbeit ist, und dann ausführen, was auch immer man an jedem dieser Bytes ausführen möchte, wo man einzelne Bytes lesen kann und nicht haben kann um die Verschiebungen zu machen, aber individuelle Axi-Übertragungen zu verursachen, falls l2 oder vielleicht keine Axi-Übertragungen wenn l1. Wenn Sie simd Anweisungen tun müssen, dann ist vielleicht der Fixpunkt ldm usw. ein Problem. –

0

Es könnte sein, dass Sie Pipelinestände erleben. Wenn Sie Neon durchlesen wollen, wird es eine gewisse Latenz geben, bevor Sie diese Daten im CPU-Kern verwenden können.