Как SIMD позволяет использовать в Интернете ресурсоемкие инструменты

Если вы новичок в WebAssembly, сначала ознакомьтесь с этой статьей.

WebAssembly может быть мощным способом ускорить ускорение веб-приложений, и скоро он станет намного лучше благодаря предстоящей функции WebAssembly SIMD. SIMD - это метод ускорения вычислений (подробнее об этом позже), но он пока не поддерживается в браузерах. В результате утилиты SIMD, перенесенные в Интернет, не могут использовать инструкции SIMD и, следовательно, работают намного медленнее, чем в командной строке.

Чтобы проиллюстрировать, насколько мощной может быть SIMD WebAssembly, здесь я компилирую инструмент на основе SIMD из C в WebAssembly и показываю, что SIMD необходим для высокой производительности в браузере.

Что такое SIMD?

SIMD, используемый такими инструментами, как NumPy, Tensorflow и PyTorch, представляет собой подход для распараллеливания кода. В то время как многопоточность работает с несколькими данными в разных потоках, SIMD работает с несколькими данными в рамках одной инструкции ЦП, отсюда и название Одна инструкция, несколько данных .

Например, вы вычисляете манхэттенское расстояние между двумя векторами: |x2 – x1| + |y2 – y1|. Вместо того, чтобы вычислять два вычитания по одному, SIMD позволяет вам выполнять эти вычитания параллельно, в рамках одной инструкции ЦП! (предполагается, что 64-битные числа и процессор со 128-битными регистрами, т. е. 128/64 = 2).

В моей области геномики SIMD часто используется в инструментах, которые выравнивают последовательности ДНК с геномом, включая SSW, bowtie2 и minimap2.

Тест-драйв WebAssembly SIMD

В качестве эксперимента я решил скомпилировать инструмент геномики SSW из C в WebAssembly, чтобы он мог работать в браузере. SSW реализует SIMD-версию Smith-Waterman, фундаментального алгоритма в биоинформатике для выравнивания последовательностей друг с другом.

С этой целью я использовал Emscripten для компиляции SSW дважды с C на WebAssembly: один раз с включенным SIMD, а другой раз с использованием SIMDe, чтобы код компилировался в отсутствие SIMD (подробности здесь). В качестве эталона я измерил время выполнения SSW при выравнивании коротких последовательностей ДНК с эталонным геномом лямбда-фага (а не AWS-типа Lambda 😉). Тесты выполнялись в Chrome 87.0.4280.67 с флагом # enable-webassembly-simd на MacBook Pro i7 2,3 ГГц с 8 ГБ ОЗУ.

Результаты поразительны: без WebAssembly SIMD код запускается в браузере в сотни раз медленнее, чем изначально в командной строке:

Достаточно интересно, что собственная среда выполнения без SIMD «всего» в 20 раз медленнее, чем собственная среда выполнения с SIMD; Если у кого-то есть идеи, почему это так, я хотел бы их услышать.

📕 📗 📘 Если вы новичок в WebAssembly и задаетесь вопросом, с чего начать, ознакомьтесь с моей книгой Повышение уровня с помощью WebAssembly, практическим и доступным руководством по использованию WebAssembly. в ваших собственных приложениях.

Могу ли я использовать SIMD WebAssembly сегодня?

В основном нет, но тоже да. SIMD WebAssembly еще не поддерживается ни в одном браузере по умолчанию, но Firefox и Chrome имеют флаги для включения SIMD (javascript.options.wasm_simd и enable-webassembly-simd соответственно). Chrome также имеет Origin Trials, который позволяет разработчикам включать SIMD в своих приложениях, не требуя от пользователей явного включения флагов.

Однако обратите внимание, что если SIMD не включен, ваше приложение просто выйдет из строя. Чтобы решить эту проблему, вы можете скомпилировать две версии своего приложения: одну с SIMD, а другую без. Затем вы можете использовать wasm-feature-detect, чтобы загрузить правильную версию. Просто убедитесь, что вы не используете слишком много таких новых функций, иначе вы получите много изменений в вашем приложении 😬.

Следует использовать WebAssembly SIMD?

Тот факт, что вы используете WebAssembly, не означает, что ваше приложение будет быстрее, и то же самое верно и для SIMD. Решите ли вы его использовать, зависит от того, что делает ваше приложение. Хотя приложение со списком дел может быть не лучшим вариантом использования, приложения с ресурсоемкими потребностями, такими как обработка изображений, игры, моделирование или биоинформатика, особенно хорошо подходят для WebAssembly и SIMD.

Заключительное слово

Как мы видели здесь, WebAssembly сделал его возможным для запуска существующего инструмента геномики в браузере, тогда как производительность SIMD сделала его практичным для этого. Для вычислений, которые «до неприличия параллельны» (часто случается в биоинформатике), использование SIMD вместе с многопоточностью - мощная комбинация - смею ли я сказать, синергия? - для ускорения работы веб-приложений.

Наконец, большое спасибо разработчикам, которые заставляют SIMD работать в Интернете, и я с нетерпением жду, когда он будет включен во всех браузерах!

Спасибо командам Emscripten и SIMDe за их фантастические инструменты, Zhao et al. за реализацию SIMD Смита-Уотермана, а также Марию Наттестад и Томас Лайвли за обсуждения.

📕 📗 📘 Если вам понравилась эта статья и вы ищете практическое руководство по WebAssembly, посмотрите мою книгу Повышение уровня с помощью WebAssembly.

Узнать больше о WebAssembly SIMD

Переговоры

Статьи