SIMD-Vektorisierung von atan2 mithilfe der ARM NEON-Assembly
Ich möchte die Größe und den Winkel von 4 Punkten mit Hilfe der Neonanweisungen SIMD und Armaufbau berechnen. In den meisten Sprachen gibt es eine eingebaute Bibliothek, in meinem Fall C ++, die den Winkel (atan2) berechnet, jedoch nur für ein Paar Gleitkommavariablen (x und y). Ich möchte SIMD-Anweisungen, die sich mit q-Registern befassen, ausnutzen, um atan2 für einen Vektor von 4 Werten zu berechnen.
Die Genauigkeit darf nicht hoch sein, die Geschwindigkeit ist wichtiger.
Ich habe bereits einige Montageanleitungen, die die Größe von 4 Gleitkommaregistern mit einer für meine Anwendung akzeptablen Genauigkeit berechnen. q1 enthält 4 "x" -Werte (x1, x2, x3, x4). q2 enthält 4 "y" -Werte (y1, y2, y3, y4). q7 enthält die Größe der 4 Ergebnisse (x1 ^ 2 + y1 ^ 2, x2 ^ 2 + y2 ^ 2, x3 ^ 2 + y3 ^ 2, x4 ^ 2 + y4 ^ 2).
vmul.f32 q7, q1, q1
vmla.f32 q7, q2, q2
vrecpe.f32 q7, q7
vrsqrte.f32 q7, q7
Was ist der schnellste Weg, um mit Hilfe von SIMD-Anweisungen einen ungefähren atan2 für zwei Vektoren zu berechnen?