Прогресс на JavaScript SIMD


Хотя большинство горячих новостей в области быстрых вычислений сосредоточено вокруг графического процессора, в большинстве процессоров есть неиспользованные возможности. В настоящее время JavaScript получает новый набор команд, обеспечивающих параллельную обработку с аппаратной поддержкой.

Задолго до того, как графические процессоры стали центром внимания для параллельных вычислений, большинство процессоров приобрели набор низкоуровневых инструкций, которые позволяли обрабатывать несколько элементов данных в одной инструкции. SIMD (Single Instruction Multiple Data) – один из самых простых и легких механизмов параллельной обработки.

По сути, все сводится к упаковке нескольких значений в один регистр и последующему выполнению операции, как если бы это было одно значение. Конечно, есть некоторые накладные расходы – вам нужно упаковать и распаковать данные, но в большинстве случаев их можно минимизировать.

Инструкции SIMD отлично подходят для векторной арифметики и могут использоваться для ускорения таких задач, как матричные операции и декодирование мультимедиа. Если у вас есть кодек, который не совсем работает в реальном времени, то его изменение для использования инструкций SIMD процессора может сделать его в реальном времени. Конечно, для досадно параллельных задач, таких как манипуляции с изображениями и большой объем графики, вы, как правило, не можете добиться большего, чем графический процессор, который может выполнять гораздо больше операций параллельно, чем оборудование SIMD. Преимущество SIMD в том, что вам не нужно отправлять данные на графический процессор, и это намного проще для понимания.

Кроме того, компиляторы C поддерживают SIMD, и многие высокопроизводительные программы C используют его. Это особая проблема для JavaScript, потому что компилятор emscripten C ++ to asm.js в настоящее время не может справиться с инструкциями SIMD.

По этой и другим причинам SIMD.js разрабатывается, чтобы позволить программистам JavaScript получить доступ к оборудованию SIMD на x86 с SSE и ARM с NEON – двумя из наиболее распространенных разновидностей SIMD. Intel, Google и Mozilla работают над SIMD.js, и он находится на рассмотрении команды Microsoft IE. Проект основан на спецификации Google Dart SIMD. Версия, которую вы можете попробовать, в настоящее время находится в Firefox Nightly.

Если вы планируете использовать SIMD.js, вам нужно быть готовым к уровню программирования, который вы обычно не получаете в JavaScript – это ближе к металлу, чем обычно. Например, чтобы сложить два вектора из четырех 32-битных чисел с плавающей запятой, вы должны использовать:

var a = float32x4 (1.0, 2.0, 3.0, 4.0); var b = float32x4 (5.0, 6.0, 7.0, 8.0); var c = SIMD.float32x4.add (a, b);

Обратите внимание, что у вас есть конструкторы для новых типов данных SIMD, а операции предоставляются как методы нового объекта SIMD. Четыре 32-битных числа с плавающей запятой упаковываются в векторы, а затем складываются за одну операцию.

На данный момент SIMD.js поддерживает float32x4 и int32x4 и представляет два новых типизированных массива, которые позволяют получить доступ к отдельным значениям и предоставить псевдонимы с другими типизированными массивами для преобразования данных.

Вы можете увидеть какое-то ускорение в результате использования SIMD.js в Firefox:

Поскольку SIMD.js имеет низкий уровень, предполагается, что другие библиотеки будут построены поверх него, чтобы обеспечить представление более высокого уровня:

«SIMD.js сегодня ускоряет работу широкого спектра требовательных приложений, включая игры, обработку видео и аудио, научное моделирование и многое другое, в Интернете. Приложения смогут напрямую использовать SIMD.js API, библиотеки смогут используйте SIMD.js для предоставления интерфейсов более высокого уровня, которые могут использовать приложения, а Emscripten скомпилирует C ++ с популярными идиомами SIMD в оптимизированный код SIMD.js “.

Все это хорошо, и это должно сделать asm.js еще более важным для Интернета, но многие спросят, разумно ли это вообще. Возможно, лучше всего было бы пойти другим путем. Все было бы намного проще, если бы все браузеры поставлялись с хорошо спроектированной виртуальной машиной с байтовым кодом.

Также возникает вопрос, стоит ли добавлять такие низкоуровневые функции в JavaScript, который является языком высокого уровня.


Добавить комментарий