¿Cómo implementar atoi usando SIMD?

Me gustaría intentar escribir una implementación atoi usando instrucciones SIMD, para incluir enRapidJSON (una biblioteca de lector / escritor C ++ JSON). Actualmente tiene algunas optimizaciones SSE2 y SSE4.2 en otros lugares.

Si es una ganancia de velocidad, múltiplesatoi Los resultados se pueden hacer en paralelo. Las cadenas provienen originalmente de un búfer de datos JSON, por lo que una función multi-atoi tendrá que hacer cualquier swizzling requerido.

El algoritmo que se me ocurrió es el siguiente:

Puedo inicializar un vector de longitud N de la siguiente manera: [10 ^ N..10 ^ 1]Convierto cada carácter del búfer en un entero y los coloco en otro vector.Tomo cada número en el vector de dígitos significativos y lo multiplico por el número correspondiente en el vector de números y sumo los resultados.

Estoy apuntando a arquitecturas x86 y x86-64.

Sé que AVX2 es compatible con tres operandos Fusionados-Sumados, así que podré realizar Sum = Number * Significant Digit + Sum.
Ahí es donde llegué hasta ahora.
¿Es correcto mi algoritmo? ¿Hay una mejor manera?
¿Existe una implementación de referencia para atoi usando algún conjunto de instrucciones SIMD?

Respuestas a la pregunta(2)

Su respuesta a la pregunta