Параллельное веб-программирование (ПП)
Перевод с английского Е. Золотарёвой (2017)
Техническая возможность ПП является сегодняшней реальностью и языковым расширением, которое обещает высокую эффективность работы. В контексте самых распространённых языков программирования, существует несколько специально подобранных решений, которые отвечают особым нуждам языка, используемого в аппаратном обеспечении параллельных вычислений. Тем не менее, один из широко используемых языков все еще является прототипно-ориентированных: Javacript, лингва франка мировой паутины.
Наша позиция заключается в том, что существующие решения не могут быть полностью перенесены в JavaScript по причине различий в моделях разработки, дополнительных требованиях сети, например, безопасность, и ожиданий разработчиков. Поэтому мы предлагаем River Trail — новый интерфейс приложения для параллельного программирования, созданный специально для JavaScript. В этой статье мы покажем Вам, как он удовлетворяет требованиям сети. Для того, чтобы доказать, что наш метод является жизнеспособным и конкурентным, мы применили прототип JIT-компилятор в браузере FireFox, который показал, как улучшились показатели работы одного из веб-приложений.
Введение
Несмотря на тот факт, что журнал Wired объявил о смерти всемирной паутины еще два года назад, она и ныне здравствует. Приложения на базе браузера, написанные HTML или JavaScript, продолжают развиваться. Более того, HTML или JavaScript также становятся популярными площадками для разработки независимых приложений, в частности для смартфонов и планшетов. Частично популярность HTML связана с его развивающимися возможностями: 3D-графика, аудио, видео, внешний накопитель, геолокация, режим видеоконференции — все эти характеристики традиционно присутствуют у приложений, которые уже рассматриваются или будут частью HTML5 WebGL (программная библиотека для языка программирования JavaScript), развивающиеся стандарты для следующего этапа существования всемирной паутины. Одна возможность, тем не менее, остается недоступной для родных приложений — возможность извлекать пользу из систем параллельных вычислений.
Система параллельных вычислений — это наша повседневная реальность. Большинство процессоров работают на основе векторных команд, некоторые из них имеют несколько ядер. ПО для параллельных вычислений пока еще только готовится стать мейнстримом, потому что различные характеристики и инструменты параллельного программирования появляются для самых популярных языков программирования. Но приложения с JavaScript в большинстве своем остаются прототипно-ориентированными.
Подобная нехватка приложений с параллельными вычислениями не связаны с недостаточным спросом на большую вычислительную способность для пользователя интернета. Многие приложения (фото- и видео-редакторы и др.) могли бы иметь преимущество от неиспользованных вычислительных циклов, доступных в клиентской системе параллельного программирования, поскольку у них в изобилии имеются скрытые данные параллелизма. Проблема заключается в недостатке подходящих моделей параллельного программирования.
Сообщество веб-разработчиков отказалось от принятия традиционных многопоточных моделей параллельного программирования с общей памятью, заявляя, что подобные модели представляют существенную опасность для их доменов. Во время работы модель программирования с общей памятью попадает под действие различных классических просчетов и ошибок гонки за данными, все из которых могут привести к ошибкам, связанным с параллельностью исполнения вычислений. Подобные ошибки во время просматривания веб-страниц не любят ни разработчики, ни пользователи. Программисты приняли единственную модель для параллельных вычислений в JavaScript, в характеристики которой входит обходить все эти проблемы. Но когда была достигнута цель по разгрузке долгосрочных вычислений по фоновым потокам, выяснилось, что данные модели не подходят для развития масштабных параллельных вычислений сложных задач из-за высокой стоимости коммуникации и низкого уровня абстракции.
Мы убеждены, что параллелизм не стоит использовать программистам, работающим с С, С+++ или Java. Они должны разработать аппаратное обеспечение параллельных вычислений без коренных изменений в их рабочем стиле. В частности, им нет нужды учить новый язык или брать новую семантику.
River Trail претворяет в реальность подобные убеждения. На основе хорошо известных техниках программирования с параллелизмом данных мы создали программный интерфейс приложения, который упрощает параллелизм. Мы не использовали семантику JavaScript и не использовали абсолютно новые концепты. Данный интерфейс может свободно использоваться в Java Script, но без улучшения показателей. Тем не менее, River Trail создан с таким расчетом, что он может легко вписаться в работу параллельных вычислений — от векторных юнитов до многоядерных процессоров. Мы доказали это с помощью прототипа отрытого источника, созданного для популярного браузера FireFox, который использует векторные команды и несколько ядер, чтобы достигнуть определенного возрастания ускорения на готовой системе рабочего стола.
1. JavaScript
JavaScript — это язык программирования, на который опираются современные веб-приложения. Он был создан специально для пользователей открытых веб-страниц, и его главными принципами являются безопасность и портативность.
Требование безопасности является базовым для приложений. Когда пользователь каким-либо образом приобретает ПО и устанавливает его на свое устройство, на этом устройстве моментально активируются веб-приложения. Одного нажатия на ссылку достаточно, чтобы включить приложение — таким образом настроен код в JavaScript.
Портативность также является одним из требований открытых приложений, поскольку эти приложения используются на нескольких устройствах.
Помимо этого следует помнить, что JavaScript не относится к Java. Но у них общие цели и задачи и их обоих можно назвать объектно-ориентированными языками программирования. Тем не менее, у JavaScript нет понятия типа класса. Вместо этого в нем используются прототипы, берущие свое начало еще от Self. Подобный дизайн подходит для быстрого развития цикличных приложений. ПО обновляется часто и устраняет возникающие проблемы и ошибки.
2. Дизайн River Trail
River Trail основывается на широко известных принципах программирования с параллелизмом данных. Его дизайн основан на трех понятиях: параллельный массив (ParallelArray — структура данных для предоставления массива записей), несколько методов параллельного массива и концепт элементарной функции, которая осуществляет доступ к различным структурам, сохраняя их объединение. В параллельном массиве используется несколько методов для работы с данными: map, combine, scan, filter, scatter. В сочетании c элементарными функциями эти методы создают новые параллельные массивы.
Далее мы покажем, как наш дизайн отвечает требованиям JavaScript.
2.1. Безопасность
River Trail поддерживает такой же уровень безопасности, как и JavaScript, благодаря параллельному отображению («отзеркаливанию») конструктов из JavaScript . Все параллельные коды из JavaScript обеспечивают тот же уровень безопасности, что и ступенчатые коды JavaScript. Фактически, весь интерфейс приложения может использоваться как библиотека JavaScript, но без преимуществ параллельного выполнения кода.
2.2. Портативность
Методы параллельного массива могут успешно использоваться на любой платформе, которая поддерживает настройки JavaScript. Если параллельное выполнение кода невозможно, то активируются функции, которые выполняют код поэтапно. Подобным образом обеспечивается портативность функций во всех браузерах.
2.3. Быстрая разработка прототипов (моделей)
River Trail сохраняет совместимость JavaScript с быстрым созданием моделей, потому что остается в пределах одного с JavaScript языка программирования. Параллельный массив — это не что иное как новый тип JavaScript: мы не добавляли незнакомый синтаксис или элементы из других языков программирования.
2.4. Четко структурированное выполнение
Пользователи JavaScript привыкли к поэтапному выполнению кода. Они понимают, что события могут происходит асинхронно, и порядок, в котором они будут обрабатываться, не будет детерминированным.
River Trail необходимо, чтобы начальные функции были лишены побочных эффектов, чтобы структура их выполнения была детерминированной, например, в River Trail не могут использоваться нелокальные переменные. Проблема заключается в том, что порядок выполнения функций сканирования или редукции может влиять на результат.А использование фиксированного порядка выполнения функций сокращает количество доступных стратегий реализации этих функций. Но мы нашли решение: River Trail гарантирует детерминированный результат для функций сканирования или редукции, только если подобные функции носят ассоциативный или коммуникативный порядок.
3. Экспериментальная оценка
Мы использовали River Trail компилятор и библиотеку как расширение для веб-браузера FireFox (версия 9.0.1). Прототип выполняет процесс компиляции в три этапа ( перевод кода в платформу OpenCL, создание бинарного кода в приложении Intel OpenCl SDK (версия 1.5) и выполнение кода). Подобная операция полностью прозрачна как для разработчика, так и для пользователя.
3.1. Умножение плотной матрицы
Умножение плотной матрицы является важным компонентом для многих появляющихся приложений: 3D-анимация, физическая среда передачи данных и видео обработка. В River Trail через программный интерфейс приложения мы применили стандартный алгоритм умножения O (N3), используя элементы параллельного массива, и, для сравнения, мы использовали ту же функцию O (N3), но в стардартном поэтапном JavaScript с интерфейсом С, используя стандартный тип массива соответственно.
Мы также использовали варианты этих компонентов, которые показывают, как в матрице вместо вложенного массива (является элементом другого массива) используется плоский массив. Наконец, мы создали такую реализацию JavaScript, которая базируется на типизированных массивах. Как правило, массивы JavaScript не типизированы и поэтому могут содержать элементы разных типов. Типизированные массивы были недавно добавлены к JavaScript, и их семантика имеет много общего с С массивами. В частности, все элементы этих массивов должны принадлежать к одному типу.
Эксперимент проводился при использовании матрицы 1*1 на устройстве с гиперпотоковым двухъядерным процессором Intel Core i5 второго поколения (2.5 Гц) с памятью 4 ГБ. Ось Y на рисунке показывает ускорение разных компонентов в сравнении с компонентом, который применяется в двухмерном массиве JavaScript. Без дальнейших оптимизаций, реализация River Trail превосходит JavaScript с показателями 10.9 и 9.6 для двухмерных и одномерных хранилищ соответственно. Даже лучшие показатели JavaScript больше чем в 3.5 раз медленнее. Улучшения могут произойти не только из-за параллелизма, но и из-за факта, что River Trail распознает тип и форму входных значений и использует вывод типов для установления типа всех переменных. Это можно сравнить с работой С-компилятора. По рисунку видно, что River Trail превосходит не только JavaScript по причине перегрузки; River Trail вдвое превосходит и поэтапный C.
3.2. 3D объединение частиц
Помимо малых компонентов мы изучили и приложения полностью. Мы выбрали большое реалистическое 3D приложение и перенесли его в River Trail. Эта программа реализует свойства n-тела в наборе тел (где n определяется самим пользователем). Каждое тело оказывает отталкивает или притягивает все остальные тела, и в общий объем вычислений в каждый промежуток времени входит подсчет новой скорости и позиции каждого тела под действием обозначенных сил. Мы использовали функцию, которая подсчитывает действие суммарных сил на тело, изменение его скорости и положения. Движение тел и общая обстановка анимируется с помощью приложения WebGl (gпрограммная библиотека JavaScript). Приложение постоянно переключается между поэтапным принципом работы и River Trail.
Многие сторонние факторы влияют на работу домена River Trail, включая взаимодействие с WebGl. Хоть результаты и меняются при каждом измерении, они четко показывают, что River Trail существенно обгоняет поэтапную программу выполнения.
4. Сопутствующие работы
Так называемые веб-работники ( или фоновые потоки) — это программный интерфейс, который расширяет веб-платформу многопоточными примитивами. В сравнении с River Trail, веб-работники имеют более низкий уровень разработки многопоточным конструктов, нацеленных на другой уровень детализации.
WebCl (разработка JavaScript платформы OpenCl) похожа на модель программирования River Trail, но менее адаптирована к всемирной паутине и не имеет такой четкой структуры.
Приложение Google`s NaCl справляется с проблемами еще на более низком уровне, чем вею-работники. У программы есть нехитрый код, чтобы работать в браузере. Более того, у NaCl приложений существует некоторые ограничения из-за специфичной платформы.
5. Заключение
River Trail показывает, что интерфейс параллельного программирования данных и модель параллельного программирования могут успешно сосуществовать в JavaScript. Мы продемонстрировали, как River Trail соблюдает требования веб-разработчиков. Прототип River Trail доказывает, что программный интерфейс приложения является целесообразным и может эффективно применяться.
Оригинал Parallel Programming for the Web