Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Реализация [ править ]

В настоящее время никакие браузеры не поддерживают WebCL. Однако для реализации WebCL используются неродные надстройки. Например, Nokia разработала расширение WebCL. [3] Mozilla не планирует внедрять WebCL в пользу вычислительных шейдеров OpenGL ES 3.1 .

  • Mozilla (Firefox) - hg .mozilla .org / projects / webcl /

Рабочий проект WebCL [ править ]

  • Samsung ( WebKit ) - github .com / SRA-SiliconValley / webkit-webcl (недоступно)
  • Nokia (Firefox) - github .com / toaarnio / webcl-firefox (не работает с ноября 2014 г., последняя версия для FF 34)
  • Intel (Crosswalk) - www .crosswalk-project .org [4]

Пример cCode [ править ]

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

для  ( я  =  0 ;  я <  3  ;  я ++ ) с [ я ]  =  а [ я ]  +  b [ я ];

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

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

Вышеупомянутые операторы могут быть распараллелены и могут выполняться одновременно. Ядро следует аналогичному подходу, когда внутри ядра сохраняется только моментальный снимок i- й итерации. Давайте перепишем приведенный выше код, используя ядро:

__kernel  add ( __global  float *  a ,  __global  float *  b ,  __global  float * c ) { int  i  =  get_global_id ( 0 );если  ( i < 3 ) c [ i ]  =  a [ i ]  +  b [ i ]; }

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

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

Более подробную информацию об этом можно найти в [5]

Список исключений [ править ]

WebCL, будучи реализацией на основе JavaScript, не возвращает код ошибки при возникновении ошибки. Вместо этого он генерирует исключение, такое как OUT_OF_RESOURCES, OUT_OF_HOST_MEMORY или специфичный для WebCL WEBCL_IMPLEMENTATION_FAILURE. [6] Объект исключения описывает машиночитаемое имя и удобочитаемое сообщение с описанием ошибки. Синтаксис следующий:

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

Из приведенного выше кода можно заметить, что поле сообщения может иметь значение NULL.

Список нескольких других исключений:

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

Более подробную информацию об исключениях можно найти в документе со спецификациями. [6]

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

Безопасность [ править ]

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

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

Связанные ошибки браузера [ править ]

  • Ошибка 664147 - [WebCL] добавить openCL в gecko , Mozilla
  • Ошибка 115457: [Meta] Поддержка WebCL для WebKit , WebKit Bugzilla.

См. Также [ править ]

  • WebGL
  • HTML5
  • OpenGL
  • OpenCL
  • ГПГПУ
  • WebGPU

Ссылки [ править ]

  1. ^ "Khronos выпускает спецификацию WebCL 1.0" .
  2. ^ a b «Спецификация Khronos Releases WebCL 1.0» . Хронос Групп . Проверено 19 марта 2014 года .
  3. ^ "WebCL" . Nokia Research . Проверено 6 мая 2012 года .
  4. ^ "Crosswalk - Обзор WebCL" .
  5. ^ «Ускорение веб-приложений с помощью OpenCL» .
  6. ^ a b c d "Спецификация WebCL" . www.khronos.org . Проверено 14 сентября 2016 .
  7. ^ "KhronosGroup / webcl-валидатор" . GitHub . Проверено 14 сентября 2016 .

Внешние ссылки [ править ]

  • Официальный веб-сайт
  • Спецификация WebCL
  • WebCL Wiki