Я хотел бы попробовать написать реализацию atoi с помощью инструкций SIMD, которые будут включены в RapidJSON (С++ JSON reader/writer библиотека). В настоящее время он имеет некоторые оптимизации SSE2 и SSE4.2 в других местах.
Если это коэффициент усиления, несколько результатов atoi
могут быть выполнены параллельно. Строки изначально поступают из буфера данных JSON, поэтому функция multi-atoi должна выполнять любые требуемые swizzling.
Приведенный мной алгоритм следующий:
- Я могу инициализировать вектор длины N следующим образом: [10 ^ N..10 ^ 1]
- Я конвертирую каждый символ в буфер в целое число и помещаю его в другой вектор.
- Я беру каждое число в знаковый знак цифр и умножаю его на число совпадений в векторе чисел и суммируем результаты.
Я нацелен на архитектуры x86 и x86-64.
Я знаю, что AVX2 поддерживает три операнда Fused Multiply-Add, поэтому я смогу выполнить Sum = Number * Значительная цифра + Sum.
То, что я получил до сих пор.
Правильно ли мой алгоритм? Есть ли лучший способ?
Существует ли эталонная реализация для atoi с использованием любого набора инструкций SIMD?