Парсим числа через SIMD, Сергей Слотин

В современных CPU есть один мощный, но глубоко недооценённый механизм - SIMD (single instruction, multiple data). Это такие специальные инструкции, которые могут за раз применить одну и ту же операцию к целому блоку данных размером 16, 32 или 64 байт и ускорить однопоточную программу в соответствующее число раз. Как обычная многопоточность, но с важным ограничением, что применяемая операция должна быть везде одна и та же. Из-за этой особенности использовать SIMD для нетривиальных задач сильно сложнее и требует гораздо более творческого подхода. В докладе мы углубимся в нюансы SIMD-программирования, решая задачу парсинга чисел (в очень упрощённом виде: считать из stdin последовательность разделённых пробелами неотрицательных интов). Обсудим реализации из стандартной библиотеки и почему они тормозят, напишем свою с нуля и будем итеративно оптимизировать её с помощью SIMD, придя в конце к алгоритму, работающему в 50-100 раз быстрее scanf(). Также обсудим, как, не теряя производительности, расширить этот подход на более общий случай и как подобные техники используются в реальных парсерах вроде simdjson.
Back to Top