Ich habe versucht, meinen älteren Code schneller laufen zu lassen, als ich entdeckte, dass der RPi 2 Prozessor NEON Befehle unterstützt. Also schrieb ich diesen Code:Raspberry Pi 2 NEON Inline-Montageanleitung funktioniert nicht
__asm__ __volatile__(
"vld1.8 {%%d2, %%d3}, [%1];"
"vld1.8 {%%d4, %%d5}, [%2];"
"vaba.u8 %%q0, %%q1, %%q2;"
"vst1.64 %%d0, [%0];"
: "=r" (address_sad_intermediary)
: "r" (address_big_pic), "r" (address_small_pic)
:
);
Dann in C die Haupt traurig Variable mit sad_intermediary summiert.
Das Hauptziel ist, die Summe der absoluten Differenzen zu berechnen, also lade ich 16 B von big_pic in q1 Register, 16 B von small_pic in q2 Register, berechne die SAD in q0 und lade dann die unteren 8 B von q0 in die Zwischenvariable. Das Problem ist, dass die resultierende Traurigkeit Null ist.
Ich benutze GCC 4.9.2 mit -std = c99 -pthread O3 -Im -Wall -march = ARMv7-a -mfpu = neon-vfpv4 -mfloat-abi = hart Optionen.
Haben Sie Probleme mit dem Code? Vielen Dank.
Aber warum bin ich nicht nichts zum q0 Laden? In diesem [Dokument, p58] (https://people.xiph.org/~tterribe/daala/neon_tutorial.pdf) können Sie sehen, dass das Ergebnis im ersten Register gespeichert wird, in meinem Fall q0. Ich wollte nicht intrinsics verwenden, weil ich gelesen habe, dass die Leistung nicht ideal mit ihnen ist. –
Die Leistung kann bei Inline-Montage schlechter sein. Intrinsics Performance war historisch schrecklich, aber gcc-6.1 ist jetzt verfügbar, und das und der moderne Clang machen beide einen vernünftigen Job. Solange der Code einfach ist, sollten sie nicht durcheinander kommen, und sie werden Pipelines planen, ohne dass Sie darüber nachdenken müssen. – sh1
'vaba' liest von q0 und addiert dazu die absolute Differenz von q1 und q2. Sie müssen etwas in q0 haben, bevor Sie den Vorgang ausführen können, sonst erhalten Sie ein Nonsense-Ergebnis. – sh1