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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage