Maison >développement back-end >C++ >Comment implémenter efficacement atoi à l'aide des instructions SIMD ?
Comment implémenter atoi à l'aide de SIMD ?
Problème :
J'aimerais essayer d'écrire un atoi implémentation à l'aide d'instructions SIMD, à inclure dans RapidJSON. L'algorithme que j'ai proposé est le suivant :
Mon algorithme est correct ? Existe-t-il une meilleure façon ? Existe-t-il une implémentation de référence pour atoi utilisant un jeu d'instructions SIMD ?
Réponse :
L'algorithme est correct et complet. Il fonctionne pour int et uint, de MIN_INT=-2147483648 à MAX_INT=2147483647 et de MIN_UINT=0 à MAX_UINT=4294967295.
Une implémentation de référence est fournie, écrite en GNU Assembler avec la syntaxe Intel.
Les propriétés de ce code sont les suivantes suit :
L'approche de l'algorithme est la suivante suit :
La dernière étape consiste à ajouter ces quatre DWORD avec 2PHADDD émulé par 2(PSHUFD PADDD)
Le résultat de l'analyse du débit Intel-IACA pour Haswell 32 bits :
Débit de blocs : goulot d'étranglement du débit de cycles 16.10 : interitération
N - numéro de port ou nombre de cycles de conflits de ressources provoqués par un retard, DV - Tuyau de séparation (sur le port 0)
D - Tuyau de récupération de données (sur les ports 2 et 3), CP - sur un chemin critique
F - Macro Fusion avec l'instruction précédente s'est produite
instruction micro-ops non liés à un port
^ - Micro Fusion s'est produite
@ - L'instruction SSE a suivi une instruction AVX256, une pénalité de dizaines de cycles est attendue
! - instruction non prise en charge, n'a pas été comptabilisée dans Analyse
| Nombre de | Pression des ports en cycles | |
| 0* | | | | | | | | | | xor eax, eax
| 0* | | | | | | | | | | xor ecx, ecx
| 0* | | | | | | | | | | xor edx, edx
| 1 | | 0,1 | | | | | 0,9 |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!