Помощь WebAssembly в достижении скорости, близкой к исходной, станет большим шагом вперед к широкому распространению.
Текущее предложение WebAssembly SIMD сокращает разрыв в производительности, позволяя программам WebAssembly с большим количеством чисел использовать SIMD для повышения производительности их выполнения.
За последние пару месяцев в Wasmer мы усердно работали над внедрением SIMD в нашу серверную среду выполнения WebAssembly и получили отличные результаты из нашего анализа скорости нативного и WASM-SIMD против WASM-without-SIMD в нашей новой реализации SIMD.
Wasmer - первая среда выполнения Wasm, полностью поддерживающая WASI и SIMD! 🎉
Что такое SIMD?
SIMD расшифровывается как «одна инструкция, несколько данных».
С помощью всего одной инструкции мы можем выполнять арифметические операции в нескольких дорожках данных.
Допустим, мы хотим умножить четыре числа (i32
) на два и получить результат:
1 × 2 = 2 2 × 2 = 4 3 × 2 = 6 4 × 2 = 8
Обычно, чтобы получить результаты (2, 4, 6, 8), нам нужно выполнить четыре операции умножения (по одной для каждого числа).
Используя SIMD, мы можем сделать то же умножение всего за одну операцию ЦП.
(1, 2, 3, 4) × (2, 2, 2, 2) = (2, 4, 6, 8)
Это будет намного быстрее для вычисления ⚡️.
В этом примере мы используем 128-битные регистры SIMD с 4 полосами данных (по 32 бита каждая), однако мы можем изменять количество линий данных (и общее количество битов регистра) в зависимости от наших потребностей.
Где может пригодиться SIMD?
SIMD может быть особенно полезен для программ, которые очень интенсивно выполняют числовые операции (сложение, вычитание, умножение и т. Д.) Над большим набором чисел.
Примеры этого:
- Обработка изображений / аудио / видео
- Крипто / Хеширование
- Физические двигатели
Используя SIMD, программа WebAssembly может иметь ускорение до 16 раз при операциях с 8-битными числами (255) или до 2 раз, если мы работаем с 64-битными числами (поскольку WebAssembly SIMD работает на 128 бит)
Примечание: вне инструкций WebAssembly SIMD может работать с регистрами, длина которых превышает 128 бит. Таким образом, в некоторых нативных реализациях ускорение может быть даже выше.
Наша работа
Wasmer имеет 3 разных бэкэнда: Singlepass, Cranelift и LLVM.
Мы решили запустить реализацию SIMD в бэкэнде LLVM, чтобы воспользоваться преимуществами реализации инструкций SIMD в LLVM.
Добавление поддержки SIMD в Wasmer коснулось других внешних проектов с открытым исходным кодом, таких как:
- WABT: бинарный инструментарий WebAssembly.
- WABT-rs: привязки Rust к WABT
- Wasmparser: быстрый парсер Rust WebAssembly
В процессе работы над функцией SIMD для среды выполнения Wasmer WebAssembly мы создали (и успешно объединили) более 10 различных PR в эти проекты.
Мы также добавили интенсивный набор тестов SIMD, чтобы убедиться, что мы соблюдаем исходную спецификацию.
Мы хотели бы использовать эту статью, чтобы лично поблагодарить всех разработчиков этих репозиториев за их невероятную поддержку и быстрое время отклика: Юрий Делендик (проект wasmparser
), Бен Смит и Томас Лайвли (wabt
) и Сергей Пепякин (wabt-rs
).
Анализ скорости SIMD
Теперь, когда поддержка SIMD появилась в Wasmer (серверная часть LLVM), мы можем проанализировать ускорение, которого мы можем достичь с ее помощью.
Мы создали пример SIMD, который имитирует физику элементарных частиц с использованием C ++, WASI и, конечно же ... WebAssembly!
Вот время запуска нашего физического моделирования:
Как видите, скорость при запуске SIMD в собственном исполняемом файле по сравнению с его запуском с Wasmer… почти то же то же!
Как это можно использовать?
Последняя версия Wasmer (0.6.0
) поставляется с поддержкой SIMD.
Вы можете установить Wasmer с помощью:
curl https://get.wasmer.io -sSfL | sh
Примечание: вы также можете использовать Wasmer с SIMD в Windows - Загрузите установщик Wasmer
Запускать программы WebAssembly-SIMD в Wasmer так же просто, как выбрать серверную часть LLVM и передать флаг --enable-simd
при выполнении программы .wasm
с wasmer
:
wasmer run --backend=llvm --enable-simd particle-repel-simd.wasm
Скоро мы включим SIMD в другие серверные ВМ. Будьте на связи! 🙂