Wie implementiere ich atoi mit SIMD?

Ich möchte versuchen, eine atoi-Implementierung mithilfe von SIMD-Anweisungen zu schreiben, die in @ enthalten sein sol RapidJSON (eine C ++ - JSON-Lese- / Schreibbibliothek). Derzeit wurden an anderen Stellen einige SSE2- und SSE4.2-Optimierungen vorgenommen.

Wenn es ein Geschwindigkeitsgewinn ist, mehrereatoi Ergebnisse können parallel erfolgen. Die Zeichenfolgen stammen ursprünglich aus einem Puffer mit JSON-Daten, sodass eine Multi-Atoi-Funktion alle erforderlichen Änderungen vornehmen muss.

Der Algorithmus, den ich mir ausgedacht habe, ist der folgende:

Ich kann einen Vektor der Länge N folgendermaßen initialisieren: [10 ^ N..10 ^ 1]Ich konvertiere jedes Zeichen im Puffer in eine Ganzzahl und platziere sie in einem anderen Vektor.Ich nehme jede Zahl im signifikanten Ziffernvektor und multipliziere sie mit der übereinstimmenden Zahl im Zahlenvektor und summiere die Ergebnisse.

Ich bin auf x86- und x86-64-Architekturen ausgerichtet.

Ich weiß, dass AVX2 Fused Multiply-Add mit drei Operanden unterstützt, daher kann ich Sum = Number * Significant Digit + Sum ausführen.
Das ist, wo ich so weit gekommen bin.
Ist mein Algorithmus korrekt? Gibt es einen besseren Weg?
Gibt es eine Referenzimplementierung für atoi, die einen SIMD-Befehlssatz verwendet?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage