Heim >Backend-Entwicklung >C++ >Wie kann Atoi mithilfe von SIMD-Anweisungen effizient implementiert werden?
Wie implementiert man Atoi mit SIMD?
Problem:
Ich würde gerne versuchen, ein Atoi zu schreiben Implementierung mithilfe von SIMD-Anweisungen, die in RapidJSON enthalten sein sollen. Der Algorithmus, den ich mir ausgedacht habe, lautet wie folgt:
Mein Algorithmus ist korrekt? Gibt es einen besseren Weg? Gibt es eine Referenzimplementierung für Atoi, die einen SIMD-Befehlssatz verwendet?
Antwort:
Der Algorithmus ist korrekt und vollständig. Es funktioniert für int und uint, von MIN_INT=-2147483648 bis MAX_INT=2147483647 und von MIN_UINT=0 bis MAX_UINT=4294967295.
Eine Referenzimplementierung wird bereitgestellt, geschrieben in GNU Assembler mit Intel-Syntax.
Die Eigenschaften dieses Codes sind wie folgt folgt:
Der Ansatz des Algorithmus ist wie folgt folgt:
PHADDD emuliert durch 2(PSHUFD PADDD)
Die Ergebnis der Intel-IACA-Durchsatzanalyse für Haswell 32-Bit:
Durchsatzanalyse BerichtBlockdurchsatz: 16,10 Zyklen Durchsatzengpass: InterIterationN – Portnummer oder Anzahl der Zyklen, die durch einen Ressourcenkonflikt verursacht wurden, DV – Divider Pipe (auf Port 0)
D – Datenabrufpipe (auf Port 2 und 3), CP – auf a Kritischer Pfad
F – Makrofusion mit der vorherigen Anweisung ist aufgetreten
Anweisung Micro-Ops sind nicht an einen Port gebunden
^ - Micro Fusion ist aufgetreten
@ - SSE-Anweisung folgte einer AVX256-Anweisung, Dutzende Zyklen Strafe werden erwartet
! - Anleitung nicht unterstützt, wurde in der Analyse nicht berücksichtigt
| Anzahl | Anschlussdruck in Zyklen | |
| 0* | | | | | | | | | | xor eax, eax
| 0* | | | | | | | | | | xor ecx, ecx
| 0* | | | | | | | | | | xor edx, edx
| 1 | | 0,1 | | | | | 0,9 |
Das obige ist der detaillierte Inhalt vonWie kann Atoi mithilfe von SIMD-Anweisungen effizient implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!