WebCL

WebCL — программный интерфейс (API) JavaScript-привязка к OpenCL для гетерогенных параллельных вычислений в совместимых веб-браузерах без необходимости подключения дополнительных плагинов. Впервые был анонсирован в марте 2011 года. Разрабатывается на схожих основаниях с OpenCL и рассматривается как реализация этого стандарта для браузеров. Основное назначение WebCL — обеспечить веб-приложениям ускорение за счёт использования многоядерных ЦП и ГП. С ростом популярности приложений, требующих параллельной обработки (например, редакторы изображений, приложения дополненной реальности и сложные игры), увеличивается и значение вычислительной производительности. По этой причине некоммерческая организация Khronos Group[1] разработала WebCL — JavaScript-привязку к OpenCL с поддержкой переносимого программирования ядер, что позволяет реализовать параллельные вычисления в браузерах на широком спектре устройств. WebCL включает две части: программирование ядер, выполняющееся на устройствах (процессорах), и JavaScript, связывающий веб-приложение с OpenCL. Завершённая и утверждённая спецификация WebCL 1.0 была опубликована 19 марта 2014 года[1].

Общие сведения
WebCL
Тип API
Разработчик WebCL Working Group
Операционная система кроссплатформенное
Последняя версия 1.0 (19 марта 2014)
Сайт khronos.org/webcl/

Реализация

В настоящее время ни один браузер не поддерживает WebCL на уровне ядра. Однако существуют сторонние расширения (add-on), которые позволяют реализовать поддержку WebCL. Например, Nokia разработала собственное расширение WebCL[2]. Mozilla не планирует внедрять WebCL, предпочитая WebGL с вычислительными шейдерами, однако и эта поддержка была отменена в пользу WebGPU.

Черновые реализации WebCL

Пример кода на C

Основной единицей параллельной программы является ядро (kernel) — параллелизуемое задание, реализующее определённую функцию. Программа может содержать одно или несколько ядер, каждое из которых должна быть параллелизуемой. Важно учитывать зависимости и порядок выполнения данных для эффективной распараллеливаемости. Простой пример — развёртывание цикла в C компиляторами:

for (i = 0; i < 3; i++)
	c[i] = a[i] + b[i];

можно развернуть в:

c[0] = a[0] + b[0];
c[1] = a[1] + b[1];
c[2] = a[2] + b[2];

Такие выражения можно выполнить параллельно. Ядро реализует схожий подход — внутри ядра фиксируется только текущее значение итератора.

Перепишем приведённый код с помощью ядра:

__kernel add(__global float* a, __global float* b, __global float* c)
{
	int i = get_global_id(0);

	if (i < 3)
		c[i] = a[i] + b[i];
}

Запуск приложения WebCL включает следующие этапы:

  1. Получение доступа к устройствам и создание контекста;
  2. Передача ядра устройству;
  3. Выполнение ядра на устройстве;
  4. Получение результатов от устройства;
  5. Использование данных в JavaScript.

Подробности можно найти в публикации компании IBM[4].

Список исключений

Поскольку WebCL реализован на JavaScript, при возникновении ошибок не возвращаются коды ошибок, а выбрасываются исключения, такие как OUT_OF_RESOURCES, OUT_OF_HOST_MEMORY или специфическое для WebCL WEBCL_IMPLEMENTATION_FAILURE[5]. Объект исключения содержит машиночитаемое имя и сообщение (человеко-читаемое описание ошибки). Синтаксис таков:

exception WebCLException : DOMException {
  DOMString name;     // строковое представление числового кода ошибки, например "INVALID_VALUE"
  DOMString? message; // специфичное для реализации описание причины исключения
};

Поле message может быть равно NULL. К другим часто возникающим исключениям относятся:

  1. INVALID_OPERATION — если блокирующий вариант функции вызывается из WebCLCallback;
  2. INVALID_VALUE — если eventWaitList пустой;
  3. INVALID_CONTEXT — если события в eventWaitList принадлежат разным контекстам;
  4. INVALID_DEVICE_TYPE — если deviceType не является одной из перечисленных допустимых величин;
  5. DEVICE_NOT_FOUND — если не найден соответствующий WebCLDevice для указанного типа устройства.

Подробные сведения приведены в спецификации[5].

Ещё одно исключение возникает при попытке обращения к уже «отпущенному» объекту: метод release освобождает ресурсы, но не удаляет сам объект полностью. Чтобы избежать подобных ситуаций, следует использовать метод releaseAll, который дополнительно удаляет все связанные объекты.

Безопасность

WebCL, как открытая программная платформа для веб-приложений, содержит потенциальные уязвимости на стадии проектирования и разработки. При создании WebCL вопросам безопасности уделялось приоритетное внимание. Были решены, в частности, следующие задачи:

  1. Выход за пределы выделенной памяти: атака возможна при обращении к неразрешённым областям памяти. Злоумышленник теоретически может переписать или удалить важные данные. В случае таких ошибок на этапе компиляции должна генерироваться ошибка, а во время исполнения — возвращаться ноль, не позволяя программе перезаписывать память. Для борьбы с этим была начата разработка проекта WebCL Validator[6].
  2. Инициализация памяти: предотвращает доступ приложений к памяти, занятой предыдущими программами. WebCL инициализирует все буферы и переменные нулями перед запуском приложения. В OpenCL 1.2 для этого имеется расширение cl_khr_initialize_memory[5].
  3. Отказ в обслуживании: эта атака не может быть полностью исключена средствами WebCL или браузера. Однако в OpenCL могут применяться таймеры слежения и вытесняющая многозадачность, чтобы обнаруживать и завершать контексты, потребляющие слишком много времени или ресурсов. Для этого в OpenCL 1.2 существует расширение cl_khr_terminate_context[5].

Проблемы браузеров

Примечания

  1. 1 2 Khronos Releases WebCL 1.0 Specification (англ.). Khronos Group (19 марта 2014). Дата обращения: 19 марта 2014. Архивировано 6 мая 2025 года.
  2. WebCL. Nokia Research. Дата обращения: 1 апреля 2026. Архивировано 10 мая 2012 года.
  3. Crosswalk — WebCL Overview (англ.). Дата обращения: 1 февраля 2017. Архивировано 1 февраля 2017 года.
  4. Accelerating web applications with OpenCL (англ.). IBM. Архивировано 18 сентября 2016 года.
  5. 1 2 3 4 WebCL Specification (англ.). www.khronos.org. Дата обращения: 14 сентября 2016. Архивировано 14 декабря 2013 года.
  6. KhronosGroup/webcl-validator (англ.). GitHub. Дата обращения: 14 сентября 2016. Архивировано 25 января 2025 года.

Ссылки