ARM-Intrinsics enthalten Funktionen zum Extrahieren von Skalaren unterschiedlicher Größe. Die Funktionen sind dokumentiert die meisten vollständig im ARM® C Language Extensions:vgetq_lane_u64 (x, 0) versus vget_low_u64 (x)
ET vgetQ_lane_ST(T vec, const int lane);
erhält den Wert aus der angegebenen Spur eines Eingangsvektors. Es gibt 24 intrinsics.
Und:
T vget_high_ST(T2 a); T vget_low_ST(T2 a);
erhält die hoch oder niedrig ist, die Hälfte eines 128-Bit-Vektor. Es gibt 24 intrinsics.
Ich weiß, dass unter bestimmten Umständen eine Gleichwertigkeit existiert. Zum Beispiel auf einer Little-Endian-Maschine gilt die folgende gilt für 64-Bit-Werte:
uint64x2_t x = ...;
vgetq_lane_u64(x, 0) == vget_low_u64(x);
Eine ähnliche Äquivalenz ist für die hohe Spur:
uint64x2_t x = ...;
vgetq_lane_u64(x, 1) == vget_high_u64(x);
Meine Frage ist, was sind die praktische Unterschiede, da beide Funktionen einen Skalar liefern? Sollte man dem anderen vorgezogen werden?
'auf einer Little-Endian-Maschine' ist wahrscheinlich nicht relevant, da Sie zu keinem Zeitpunkt ein Array indizieren. Indexelemente in einem Vektorregister sind eher Links/Rechts-Verschiebungen einer Ganzzahl in einem Skalarregister. Ich habe nicht geschaut, aber ich gehe davon aus, dass Architekturen, die in beiden Endianen laufen können, nicht das Verhalten von Anweisungen ändern, die Vektoren mischen oder einen Skalar in einen Vektor einfügen oder aus ihm extrahieren. (Natürlich, wenn der Skalar aus dem Speicher kommt, ist die Endianess für die Reihenfolge der Bytes innerhalb des Skalars wichtig, aber nicht die Elementposition innerhalb des Vektors.) –