BC/NW 2014 №2 (25):9.2

 

РАСПАРАЛЛЕЛИВАНИЕ КЛИЕНТСКОЙ ЧАСТИ ВЕБ-ПРИЛОЖЕНИЯ ДЛЯ ЗАДАЧИ ВОСПРОИЗВЕДЕНИЯ НАСЫЩЕННОГО ИЗОБРАЖЕНИЯ

Капуркин А.А.

(ФГБОУ ВПО «Национальный исследовательский университет «МЭИ», Москва, Россия)

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

Исследования области распараллеливания веб-приложений показали, что к данной тематике присутствует большой интерес сообщества веб-разработчиков и различных гигантов IT-индустрии. Развиваются несколько проектов [1][2][3], реализующих распараллеливание клиентской части веб-приложения с использованием возможностей современных CPU (центральных процессоров) и GPU (графических процессоров). Ключевой особенностью этих проектов является обеспечение возможности значительного повышения производительности приложений без ухода от стандартных веб-технологий, используя только специальный набор расширений к языку программирования JavaScript.

JavaScript является де-факто стандартом для использования в браузере (то есть на клиентской части веб-приложения) в качестве языка сценариев для придания интерактивности веб-приложениям. Постепенное повышение быстродействия выполнения JavaScript-кода в веб-браузере, а также выход новой спецификации  HTML 5 [4][5]  (спецификация основного языка для структурирования и представления содержимого всемирной паутины, значительно расширившая уровень поддержки мультимедиа-технологий)  позволило с помощью стандартных веб-технологий работать с двух- и трехмерной графикой в браузере. Параллельно с этим возникла необходимость в ускорении выполнения JavaScript-программ путем их распараллеливания. Распараллеливание JavaScript-программ необходимо для того, чтобы при выполнении JavaScript-кода можно было бы задействовать возможности современных многоядерных центральных, а также мощных графических процессоров. Использование современных вычислительных ресурсов позволяет реализовывать в веб-браузере интенсивные вычисления, необходимые для решения задач воспроизведения в веб-браузере насыщенного изображения.

Первым этапом в задействовании современных вычислительных ресурсов в JavaScript стал выход спецификации Web Workers [6], реализующий многопоточное выполнение кода. Многопоточность в данном случае реализуется путем вынесения ресурсозатратных и длительно выполняющихся JavaScript-сценариев в отдельный файл, который исполняется в отдельном от главного потоке.

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

•        River Trail (Parallel Javascript) [1][7] – открытый проект, в рамках которого разработано расширение для языка программирования JavaScript, позволяющее задействовать технику параллельного программирования для создания высокопроизводительных веб-приложений (Intel и Mozilla),

•        WebCL [3] – JavaScript-интерфейс к стандарту OpenCL (доступны реализации WebCL от Samsung Electronics для JavaScript-движка WebKit и от Nokia Research в виде расширения для браузера Firefox),

•        SIMD in Javascript [2] – расширение языка JavaScript, реализующее векторные (Simple Instruction Multiple Data) операции [8] (проект Intel).

Именно перечисленные разработки позволяют эффективно использовать возможности многоядерных процессоров и графических ускорителей.

Наибольший прогресс в реализации параллельного программирования для языка JavaScript на данный момент достигнут в рамках проекта River Trail. Планируется внедрение реализации этого расширения в основные версии браузеров, а также оно уже работает в тестовой версии браузера Firefox (Firefox Nightly). Реализация параллельного программирования в рамках данного проекта основана на плотном задействовании распараллеливания на многоядерных CPU и использовании векторных инструкций SSE/AVX [8]. Для работы с функциями параллельного программирования подготовлена специальная JavaScript-библиотека, реализующая уровень абстракции ParallelArray. Можно создавать новые объекты с типом  ParallelArray или же преобразовать обычные массивы в тип ParallelArray. В дальнейшем, для работы с объектами ParallelArray используются его различные параллельные методы (map, combine, reduce, filter, scatter, scan).

River Trail включает в себя модифицированный компилятор, который преобразует вышеперечисленные конструкции с ParallelArray в OpenCL-представление [9], которое в дальнейшем компилируется в инструкции SSE или параллельные инструкции GPU.  Таким образом, отличительной особенностью проекта River Trail от WebCL и SIMD in JavaScript является достаточно высокий уровень абстракции, значительно упрощающий работу программиста, но с другой стороны снижающий гибкость при разработке JavaScript-решения с использованием распараллеливания. Одновременно повышается значимость модифицированного компилятора: быстродействие во многом будет зависеть от оптимальности преобразований конструкций с объектом ParallelArray в представление на OpenCL.

Были проведены эксперименты и рассмотрены основные сценарии применения JavaScript-библиотеки River Trail (табл.1). Эксперименты проводились с помощью браузера Firefox версии 25.0.1 и расширения River Trail for Firefox версии 0.25. Указанная версия библиотеки River Trail требует также на компьютере установленного комплекта средств разработки Intel SDK for OpenCL Applications. Для проведения экспериментов использовалась рабочая станция с CPU Intel Core i5 3317U и GPU Intel HD Graphics 4000. Расширение River Trail for Firefox позволяет выбрать, для какого устройства (GPU или CPU) будет создаваться и компилироваться OpenCL-представление. Полученные результаты экспериментов свидетельствуют о том, что с помощью данной библиотеки можно реализовывать интенсивные вычисления и продуктивно комбинировать их со стандартными техниками формирования 2D и 3D графики в веб-браузере (Canvas [5] и WebGL [10]). Наибольшего повышения производительности по сравнению с последовательным JavaScript удается достигнуть при использовании вычислительных мощностей GPU при расчете сложной 3D-графики с помощью WebGL, в таком случае происходит ускорение  в 9 раз. Также достигается высокое быстродействие при имитации гравитационного взаимодействия 4000 тел с использованием CPU – происходит ускорение по сравнению с последовательным JavaScript (8 кадров/c) почти в 6 раз (48 кадров/c).

Таблица 1.

Результаты экспериментов с  JavaScript-библиотекой River trail на рабочей станции с Intel Core i5 3317U и Intel HD Graphics 4000

Реализации  алгоритмов

River Trail не используется

(Mozilla Firefox 25.0.1)

River Trail, используется CPU (Intel Core i5 3317U)

River Trail, используется GPU (Intel HD 4000)

Изображение множества Мандельброта

2 кадра/c

8 кадров/c

13 кадров/с

Сложная 3D графика с помощью WebGL

4 кадра/c

7 кадров/c

27 кадров/c

Гравитационное взаимодействие 4000 тел

8 кадров/c

46 кадров/с

26 кадров/c

 

Рассмотрим, каким образом обеспечивается ускорение по сравнению с последовательным JavaScript на примере изображения гравитационного взаимодействия тел. Еще Исаак Ньютон выдвинул предположение, что между любыми телами в природе существует силы взаимного притяжения, которые теперь называют силами гравитации или силами всемирного тяготения. Для изображения гравитационного взаимодействия тел во времени необходимо в каждый момент отрисовки кадра рассчитывать скорость и будущее положение каждого из тел. Так как на скорость каждого тела в каждый момент времени влияют все остальные тела, положение которых также меняется с каждым моментом времени, то необходимо для расчета скорости и будущего положения каждого тела учесть его гравитационное взаимодействие со всеми остальными телами в каждый момент времени. В классическом последовательном JavaScript для расчета скорости и положения тел используется цикл, который последовательно выполняет расчеты для каждого из тел. Этот цикл необходимо выполнять в каждый момент отрисовки кадра сцены. В случае использования библиотеки River Trail все скорости и координаты тел удобно хранить в массивах типа ParallelArray и с помощью метода combine (одной из разновидностей операции параллельной обработки элементов массива) объекта ParallelArray рассчитывать новые координаты и скорости всех тел параллельно. В дальнейшем при выполнении JavaScript-кода данные конструкции будут автоматически преобразованы в промежуточное представление на языке OpenCL и скомпилированы из него в машинный код с использованием векторных SSE/AVX инструкций для выполнения на GPU или CPU.

JavaScript-библиотека River Trail путем задействования возможностей гетерогенных вычислительных ресурсов позволяет веб-приложениям, работающим внутри браузера, достигать вычислительных возможностей нативных приложений. Высокий уровень абстракции библиотеки River Trail позволяет программисту легко манипулировать объектами ParallelArray и их методами, не требуя знаний языка программирования OpenCL. Проведенные эксперименты показывают, что при распараллеливании повторяющихся однотипных операций с помощью объектов типа ParallelArray происходит многократное увеличение быстродействия JavaScript-сценариев. Таким образом, веб-приложения, а именно, их клиентскую часть можно продуктивно использовать для решения задач, требующих интенсивных вычислений: для обработки аудио, видеоданных, генерации насыщенных изображений в реальном времени, симуляции физических процессов и даже для создания современных 3D-игр. При этом снимается нагрузка на серверную часть веб-приложения и сеть передачи данных, а также эффективно задействуются вычислительные мощности с клиентской стороны веб-приложения.

Литература

1.     River Trail Wiki [Электронный ресурс]. URL: https://github.com/RiverTrail/RiverTrail/wiki

2.     SIMD in JavaScript [Электронный ресурс]. URL: https://01.org/node/1495

3.     WebCL – Heterogeneous parallel computing in HTML5 web browsers [Электронный ресурс]. URL: http://www.khronos.org/webcl/

4.     HTML5 Differences from HTML4 [Электронный ресурс]. URL: http://www.w3.org/TR/html5-diff/

5.     HTML Standard [Электронный ресурс]. URLhttp://www.whatwg.org/specs/web-apps/current-work/

6.     Web workers – HTML Standard [Электронный ресурс]. URL: http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html

7.     Cade Metz, Intel extends JavaScript for parallel programming  [Электронный ресурс]. // The Register. 17 сентября 2011. URL: http://www.theregister.co.uk/2011/09/17/intel_parallel_javascript/

8.     SIMD – [Электронный ресурс]. URL:   http://ru.wikipedia.org/wiki/SIMD

9.     OpenCL – The open standard for parallel programming of heterogeneous systems [Электронный ресурс]. URL:   http://www.khronos.org/opencl/

10.  WebGL Specification [Электронный ресурс]. URL:   https://www.khronos.org/registry/webgl/specs/1.0/