Speach
Приветствие. Кто нибудь слышал про openCL? Для начала разберемся что такое этот openCL.
slide 1: Что такое openCL?
OpenCL (Open Computing Language) является открытым стандартом для кросс-платформенного параллельного программирования различных процессоров, имеющихся на персональных компьютерах, серверах, мобильных устройствах и встроенных платформах.
Посмотрим красивую картинку с сайта openCL. Тут представленны крупные компании-члены консорциума, которые учавствуют в разработке или активно используют данную технологию. А, также, интересные и перспективные разработки, базирующиеся на openCL.
slide 1.1: Цель openCL
OpenCL является открытой стандартизированной технологией для вычислений на специализированных (CPU) и неспециализированных (GPU, APU и др.) устройствах. Это позволяет писать программы для сложных вычислений независимо от используемого оборудования. Открытость данной технологии обеспечивает независимость от разработчика, быстрое исправление ошибок разного рода и поддержку обширного коммьюнити (будь то how-to гайды или обертки для разных языков программирования)
Тут также представлены логотипы компаний, учавствующих в разработке. Если кто-то не успел их рассмотреть. Если столько компаний разрабатывает один продукт, кто же следит за всем этим счастьем?
slide 1.2: Khronos Group
Khronos Group — промышленный консорциум, состоящий из более чем 100 компаний. Целью данной организации является разработка открытых стандартов и интерфейсов программирования в области создания и воспроизведения динамической графики и звука на широком спектре платформ и устройств, с поддержкой аппаратного ускорения. Каждый участник вносит в технологии свой вклад, что обеспечивает хорошую совместимость с платформами разных производителей и позволяет охватывать как можно больше областей применения.
OpenVG предназначен для аппаратно-ускоряемой двухмерной векторной графики мобильных телефонов и смартфонов, медиа- и игровых консолей, и для других электронных устройств.
OpenGL спецификация, определяющая платформонезависимый программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику.
Vulkan кроссплатформенный API для 2D- и 3D-графики, впервые представленный Khronos Group в рамках конференции GDC 2015. Другое название glNext.
OpenVX стандарт компьютерного зрения.
NNEF стандарт для нейронный сетей.
slide 0: Overview
Почему стоит использовать именно openCL, а не другие технологии для вычисления на неспециализированных устройствах?
slide 2: Почему стоит использовать openCL
+ Открытое ПО, разрабатываемое сообществом разработчиков.
+ Хорошая переносимость и высокий уровень абстракции над конкретным оборудованием.
+ Легкая адаптация под различные языки программирования высокого уровня
+ Технология гетерогенного программирования SYCL разрабатывается на базе openCL
Но у всего есть минусы..
slide 2.1: Минусы openCL
— Отсутствие богатой стандартной библиотеки алгоритмов.
— Требует более высокой подготовки программиста для написания оптимального кода.
— Хорошая переносимость достигается за счет небольшого снижения производительности.
slide 2.2: SYCL
SYCL — открытый, кросс-платформенный уровень абстракции, основанный на базовых концепциях, мобильности и эффективности OpenCL, который позволяет писать код для гетерогенных процессоров, используя стандартные функции C++. Гетерогенность — подход, позволяющий выполнять программный код абстрагируясь от специализации процессоров. Таким образом, написанная программа будет выполняться автоматически и на CPU, и на GPU, а работа по менедменту ресурсами ложиться на SYCL.
Ответ на вопрос «почему openCL?» очень прост. На openGL переписывают игры, потому что это более универсльный и мощный инструмент. Такая-же ситуация и с openCL — вполне возможно, что, спустя некоторое количество времени, openCL станет стандартом для крупных компаний, а через еще какой то временной период изчезнет и openCL, сменившись SYCL’ом, попробовать первыми смогут знатоки openCL.
slide 0: Overview
Рассмотрим основные принципы и архитектуру openCL
slide 3: Основные принципы
Слева представлена официальная диаграмма кардинальности архитектуры openCL. Справа упрощенная диаграмма, достаточная для написания программ базового и среднего уровней, использующих данную технологию.
На самом деле это все довольно понятно и не так страшно как на этих картинках.
slide 3.1: clPlatform, clDevice & clContext
Для достижения кросс-платформенности, разработчики openCL внедрили уровень абстракции над оборудованием.
- clPlatform — содержит данные производителя (AMD, NVIDIA, Intel) и соединяет вызовы программного кода с соответствующами участками микрокода драйвера производителя.
- clDevice — инкапсулирует конкретное устройство, принадлежащее платформе и содержит еще больше конкретики относительно платформы.
- clContext — абстрактный объект, объединяющий платформу, устройство, kernel и очередь выполнения.
slide 3.2: clProgram & clKernel
*В целом, программа с использованием openCL, состоит из двух (и более) программ. Host — является главной и отвечает за создание контекста и kernel’ей, подготовку данных и интероперабельность с другими технологиями (например openGL). Kernel — второстепенная программа, выполняющаяся непосредственно на устройстве. Kernel’ей может быть несколько, они могут обмениваться данными между собой. Kernel компилируется непосредственно перед запуском исходя из окружения (clContext), что и обеспечивает кроссплатформенность. Также, программа, написанная на openCL, может полностью использовать память устройств. Для этого существуют модификаторы памяти:
- global — видеопамять, общая для контекста (достаточно медленная);
- local — память виртуального ядра, общая для всех виртуальных ядер (бастрая, меньший объем);
- private — кеш виртуального процессора (очень быстрая, очень маленький объем);
- constant — отдельный логический раздел для констант, распологается или в global, или в local, что определяется производителем.*
slide 0: Overview
«Хватит болтать — покажи мне код!»
slide 4: Примеры
openCL имеет огромный функционал, в основном, за счет того, что имеет достаточно мало ограничений. Host программы может быть написан на любом языке программирования, так как любой язык программирования может обращаться к системным библиотекам. Kernel — должен быть написан на языке openCL C 14. Хотя, kernel лишен стандартной библиотеки языка C, но имеет встроенные функции, позволяющие более гибко использовать ресурсы устройства.
slide 4.1: Складывание векторов С
Тривиальная программа складывающая два вектора длинны N, реализованная на языке программирования С.
- Создание clPlatform и clDevice исходя из аргументов запуска;
- Создание clContext ;
- Создание clCommandQueue ;
- Создание clProgram и ее компиляция;
- Создание и заполнение массивов данных, перенос данных на устройство;
- Создание clKernel ;
- Заполнение clQueue операциями выполнение kernel’я и считывания данных с устройства;
- Вывод информации о времени выполнения;
- Проверка правильности выполнения;
- Освобождение ресурсов и завершение программы.
А вот как выглядит вывод этой программы.
slide 4.2: Складывание векторов С++
Программа из предидущего примера, но реализованная на языке программирования C++.
- Создание cl::Platform и cl::Device исходя из аргументов запуска;
- Создание cl::Context ;
- Создание cl::CommandQueue ;
- Создание cl::Program и ее компиляция;
- Создание и заполнение массивов данных, перенос данных на устройство;
- Создание cl::Kernel ;
- Заполнение cl::Queue операциями выполнение kernel’я и считывания данных с устройства;
- Проверка правильности выполнения.
slide 4.3: Рассчет интегралла Kotlin
- Создание CLContext исходя из мощности доступных устройств;
- Создание CLCommandQueue ;
- Создание и заполнение массивов выходных данных, ассоциация данных с памятью на устройстве;
- Создание CLKernel ;
- Заполнение CLQueue операциями выполнение kernel’я и считывания данных с устройства;
А вот как выглядит вывод этой программы.
slide 4.4: Другие примеры
- Перемножение матриц (С++):
https://github.com/modelflat/ProgrammingTechnologiesOpenCL/blob/master/matrix_multiplication.cpp - Интероперабельность с openGL:
https://github.com/modelflat/coursework2/blob/master/src/main/java/com/github/modelflat/coursework2/core/MyGLCanvasWrapper.java#L108
slide 0: Overview
Ну вот и все. Все, кто хочет более подробно ознакомиться к исходными кодами запысывайте ссылочки)
slide 5: Код тут)
Полные версии исходных текстов и некоторые примеры можно посмотреть по следующим ссылкам:
slide 0: Overview
Спасибо за внимание!
- Создано системой
1.8.13
OpenCL. Что это такое и зачем он нужен? (если есть CUDA)

Многие, наверное, слышали или читали на хабре об OpenCL – новом стандарте для разработки приложений для гетерогенных систем. Именно так, это не стандарт для разработки приложений для GPU, как многие считают, OpenCL изначально задумывался как нечто большее: единый стандарт для написания приложений, которые должны исполняться в системе, где установлены различные по архитектуре процессоры, ускорители и платы расширения.
Предпосылки появления OpenCL
CUDA стала набирать обороты, а между тем (а точнее несколько ранее) в кузнице, расположенной глубоко под землей, у подножия горы Фуджи (Fuji), японскими инженерами был выкован процессор всевластия Cell (родился он в сотрудничестве IBM, Sony и Toshiba). В настоящее время Cell используется во всех суперкомпьютерах, поставляемых IBM, на его основе постоены самые производительные в мире суперкомпьютеры (по данным top500). Чуть менее года назад компания Toshiba объявила о выпуске платы расширения SpursEngine для PC для ускорения декодирования видео и прочих ресурсоемких операций, используя вычислительные блоки (SPE), разработанные для Cell. В википедии есть статья, в кратце описывающая SpursEngine и его отличия от Cell.
Примерно в то же время (около года назад) оживилась и S3 Graphics (на самом деле VIA), представив на суд общественности свой новый графический адаптер S3 Graphics Chrome 500. По заявлениям самой компании этот адаптер так же умеет ускорять всяческие вычисления. В комплекте с ним поставляется программный продукт (графический редактор), который использует все прелести такого ускорения. Описание технологии на сайте производителя.
Итак, что мы имеем: машина, на которой проводятся вычисления может содержать процессоры x86, x86-64, Itanium, SpursEngine (Cell), NVidia GPU, AMD GPU, VIA (S3 Graphics) GPU. Для каждого из этих типов процессов существует свой SDK (ну кроме разве что VIA), свой язык программирования и программная модель. То есть если Вы захотите чтобы ваш движок рендеринга или программа расчета нагрузок на крыло боинга 787 работала на простой рабочей станции, суперкомпьютере BlueGene, или компьютере оборудованном двумя ускорителями NVidia Tesla – Вам будет необходимо переписывать достаточно большую часть программы, так как каждая из платформ в силу своей архитектуры имеет набор жестких ограничений.
Так как программисты – народ ленивый, и не хотят писать одно и то же для 5 различных платформ с учетом всех особенностей и учиться использовать разные программные средства и модели, а заказчики – народ жадный и не хотят платить за программу для каждой платформы как за отдельный продукт и оплачивать курсы обучения для программистов, было решено создать некий единый стандарт для программ, исполняющихся в гетерогенной среде. Это означает, что программа, вообще говоря, должна быть способна исполняться на компьютере, в котором установлены одновременно GPU NVidia и AMD, Toshiba SpursEngine итд.
Решение проблемы
Для разработки открытого стандарта решили привлечь людей, у которых уже есть опыт (весьма успешный) в разработке подобного стандарта: Khronos Group, на чьей совести уже OpenGL и OpenML и еще много всего. OpenCL является торговой маркой Apple Inc., как сказано на сайте Khronos Group: «OpenCL is a trademark of Apple Inc., and is used under license by Khronos. The OpenCL logo and guidelines for its usage in association with Conformant products can be found here:
http://developer.apple.com/softwarelicensing/agreements/opencl.html». В разработке (и финансировании, конечно же), кроме Apple, участвовали такие воротилы IT как AMD, IBM, Activision Blizzard, Intel, NVidia итд. (полный список тут).
Компания NVidia особо не афишировала свое участие в проекте, и быстрыми темпами наращивала функциональность и производительность CUDA. Тем временем несколько ведущих инженеров NVidia участвовали в создании OpenCL. Вероятно, именно участие NVidia в большой мере определило синтаксическую и идеологическую схожесть OpenCL и CUDA. Впрочем программисты от этого только выиграли – проще будет перейти от CUDA к OpenCL при необходимости.
Первая версия стандарта была опубликована в конце 2008 года и с тех пор уже успела претерпеть несколько ревизий.
Почти сразу после того как стандарт был опубликован, компания NVidia заявила что поддержка OpenCL не составит никакой сложности для нее и в скором времени будет реализована в рамках GPU Computing SDK поверх CUDA Driver API. Ничего подобного от главного конкурента NVidia – AMD слышно не было.
Драйвер для OpenCL был выпущен NVidia и прошел проверку на совместимость со стандартом, но все еще доступен только для ограниченного круга людей – зарегистрированных разработчиков (заявку на регистрацию подать может любой желающий, в моем случае рассмотрение заняло 2 недели, после чего по почте пришло приглашение). Ограничения доступа к SDK и драйверам заставляют задуматься о том, что на данный момент существуют какие-то проблемы или ошибки, которые пока не удается исправить, то есть продукт все еще находится в стадии бета-тестирования.
Реализация OpenCL для NVidia была достаточно легкой задачей, так как основные идеи сходны: и CUDA и OpenCL – некоторые расширения языка С, со сходным синтаксисом, использующие одинаковую программную модель в качестве основной: Data Parallel (SIMD), так же OpenCL поддерживает Task Parallel programming model – модель, когда одновременно могут выполняться различные kernel (work-group содержит один элемент). О схожести двух технологий говорит даже то что NVidia выпустила специальный документ о том как писать для CUDA так, чтобы потом легко перейти на OpenCL.
Как обстоят дела на настоящий момент
Основной проблемой реализации OpenCL от NVidia является низкая производительность по сравнению с CUDA, но с каждым новым релизом драйверов производительность OpenCL под управлением CUDA все ближе подбирается к производительности CUDA приложений. По заявлениям разработчиков такой же путь проделала и производительность самих CUDA приложений – от сравнительно невысокой на ранний версиях драйверов до впечатляющей в настоящее время.
А что же делала в этот момент AMD? Ведь именно AMD (как сторонник открытых стандартов – закрытый PhysX vs. открытый Havoc; дорогой Intel Thread Profiler vs. бесплатный AMD CodeAnalyst) делала большие ставки на новую технологию, учитывая что AMD Stream не удавалось хоть сколь-нибудь соревноваться в популярности с NVidia CUDA – виною тому отставание Stream от CUDA в техническом плане.
Летом 2009 года компания AMD сделала заявление о поддержке и соответствии стандарту OpenCL в новой версии Stream SDK. На деле же оказалось, что поддержка была реализована только для CPU. Да, именно так, это ничему не противоречит – OpenCL стандарт для гетерогенных систем и ничего не мешает Вам запустить kernel на CPU, более того – это очень удобно в случае если в системе нет другого OpenCL устройства. В таком случае программа будет продолжать работать, только медленнее. Или же вы можете задействовать все вычислительные мощности, которые есть в компьютере – как GPU так и CPU, хотя на практике это не имеет особого смысла, так как время исполнения kernel’ов которые исполняются на CPU будет намного больше тех что исполняются на GPU – скорость процессора станет узким местом. Зато для отладки приложений это более чем удобно.
Поддержка OpenCL для графических адаптеров AMD так же не заставила себя долго ждать – по последним сообщениям компании версия для графических чипов сейчас находится на стадии подтверждения соответствия спецификациям стандарта. После чего она станет доступна всем желающим.
Так как OpenCL должен работать поверх некоторой специфической для железа оболочки, а значит для того чтобы можно этот стандарт действительно стал единым для различных гетерогенных систем – надо чтобы соответствующие оболочки (драйверы) были выпущены и для IBM Cell и для Intel Larrabie. Пока от этих гигантов IT ничего не слышно, таким образом OpenCL остается еще одним средством разработки для GPU на ряду с CUDA, Stream и DirectX Compute.
-
— библиотека-обертка над OpenGL, OpenAL и OpenCL для .Net. – обертка над OpenCL для Pyton. обертка для OpenCL.
Заключение
Технология OpenCL представляет интерес для различных компания IT сферы – от разработчиков игр до производителей чипов, а это означает что у нее большие шансы стать фактическим стандартом для разработки высокопроизводительных вычислений, отобрав этот титул у главенствующей в этом секторе CUDA.
В будущем я планирую более подробную статью о самом OpenCL, описывающую что из себя представляет эта технология, ее особенности, достоинства и недостатки.
Спасибо за внимание.
OpenCL, что это за API для CPU и GPU?

Научные вычисления претерпели улучшения с использованием графических процессоров и API, таких как OpenCL. Именно о том, что это за API, мы поговорим с вами в этой статье, чтобы вы знали о различиях с другими «графическими» API, в каких областях используется этот API и какова его текущая ситуация.
Прежде всего, мы должны уточнить, что OpenCL — это не тип оборудования, а скорее программное обеспечение или, скорее, API, который служит для связи приложений с GPU / ГРАФИЧЕСКИЙ ПРОЦЕССОР за счет использования абстракции на программном уровне самого графического процессора. Его отличие от остальных API-интерфейсов, которыми приложения взаимодействуют с графическим процессором, состоит в том, что это не то, что можно назвать графическим API, а API для научных вычислений.
Графические процессоры для вычислений
Please enable JavaScript
Что такое вычисления на GPU? Имейте в виду, что графические процессоры могут запускать программы, называемые шейдерами, которые используются для управления характеристиками различных примитивов в трехмерном конвейере, независимо от их формы. Очевидно, что любой процессор видит только серию данных в двоичном формате, поэтому, когда модуль шейдера выполняет программу шейдера, он обрабатывает набор данных и, следовательно, может использоваться для обработки любого типа данных.
В середине 2000-х, с появлением графических процессоров с унифицированными шейдерами, появилась возможность их использования на рынках, выходящих за рамки компьютерных игр, главным из которых были научные вычисления, что позволило отказаться от NVIDIA Диапазон Tesla по состоянию на 2007 год.
Разница между этими графическими процессорами и графическими процессорами, используемыми для игр, заключается в их способности работать с плавающей запятой двойной точности, что необходимо не в играх, а в мире науки во всех его аспектах. Либо для астрономических расчетов, либо для производства лекарства следующего поколения.
OpenCL, API для вычислений на GPU

До появления OpenCL графические API были разработаны только для рендеринга графики, но не для вычислительных целей, поэтому они не были полностью эффективны для выполнения неграфических алгоритмов на GPU. Решение? Очевидно, разработка API для вычислений, который они назвали OpenCL, где CL происходит из Compute Library.
Но чем отличаются OpenCL и другие API? Мы можем запускать OpenCL на процессорах любого типа, не только на графических процессорах, но если мы хотим, мы можем запускать код OpenCL, это ЦП если нам это нужно, помимо этого мы также можем запускать его на DSP, FPGA, нейронных сетях и т. д.
Причина этого в том, что их модель основана на распределенных вычислениях, где у нас есть узел хоста, которым является ЦП, и ряд блоков обработки, которые могут быть графическими процессорами, DSP, FPGA и т. Д., На которые отправляются задачи, которые должны быть выполнены. Каждая задача является элементом обработки, результат обработки которого отправляется на хост и / или подтверждение того, что она выполнила указанную задачу. Каждый элемент обработки — это отдельная программа, следовательно, поток со своим собственным счетчиком программ.
OpenCL — это не графический API

Следует уточнить, что OpenCL не управляет графическим конвейером и, следовательно, не используется для выполнения графиков, поскольку имеет большую часть функций, которые имеют OpenGL и другие API, такие как Direct3D, Vulkan и т. Д. Их нет в OpenCL. Более того, OpenCL изначально был разработан для совместной работы с OpenGL и в настоящее время предназначен для работы с Vulkan, текущим графическим API от группы Khronos.
Еще одно отличие связано с языком программирования, на котором запускаются программы шейдеров. В случае графических API-интерфейсов используются шейдерные языки высокого уровня, такие как GLSL в случае OpenGL и Vulkan, HLSL в случае DirectX и так далее.
С другой стороны, с OpenCL это не так, используются языки общего и неспецифического назначения, такие как C и C ++, что позволяет переносить программы и алгоритмы, написанные на этих языках, в OpenCL, чтобы они могли быть выполняется на всех типах устройств, поддерживающих этот API. и иметь возможность использовать преимущества его большей универсальности, чем ограниченные языки для шейдеров.
Как OpenCL применяется в повседневных приложениях?

OpenCL широко используется в некоторых приложениях для ПК, особенно в мультимедийных. Когда, например, в Photoshop мы говорим программе запустить фильтр изображений сегодня, это делается через OpenCL, и алгоритм работает на наиболее подходящем оборудовании, поддерживающем API, поэтому, если у нас есть наиболее подходящий компонент, то часть OpenCL будет работать на нем.
Другими типами повседневных приложений, использующих OpenCL, являются видеокодеки, такие как AV1, HEVC, H.264 и т. Д. Большинство из них запрограммированы в OpenCL по тем же причинам, которые мы обсуждали ранее. Это позволяет процессору запускать их, и разработчикам не нужно ломать себе голову, если в оборудовании есть видеокодек и оптимизировать для него.
Интересно, что OpenCL также является причиной того, почему 2D-часть, основанная на VGA, исчезла с видеокарт, и это то, что, хотя это кажется противоречивым, гораздо лучше запускать 2D-графический интерфейс операционной системы посредством вычислений через GPU.
Вычисления DirectX и бойкот NVIDIA с CUDA

Использование OpenCL сокращается, особенно после того, как DirectX 11 включил вычислительные шейдеры в свой репертуар и Яблоко также включил его Metal API. Появление графических API-интерфейсов с частичной поддержкой вычислений привело к тому, что OpenCL начал терять важность.
Именно с появлением вычислительных шейдеров отказ от OpenCL стал постепенным. Последняя широко используемая версия — 1.2 стандарта. Это очень элементарная версия по сравнению с тем, что могут делать другие API, поскольку она не поддерживает такие вещи, как общая виртуальная память, SPIR-V для лучшего взаимодействия с Vulkan.

Но CUDA — главный враг OpenCL. Причина в том, что NVIDIA доминировала в мире высокопроизводительных графических процессоров в течение многих лет, и они воспользовались этим, чтобы заставить научные вычисления работать вокруг CUDA, а не под OpenCL, поскольку это связывает программы с их оборудованием. NVIDIA смогла это сделать из-за полного отсутствия конкуренции с NVIDIA Tesla,
Как бойкотировать OpenCL со стороны NVIDIA? Официально не поддерживает улучшения в OpenCL 2.0, которые также были в CUDA. Более того, NVIDIA никогда не поддерживала OpenCL на своих графических процессорах NVIDIA Tesla, Quadro или GeForce.
В третий раз повезло?

В конце концов, чтобы избежать окончательного краха OpenCL для его третьей версии, им пришлось переосмыслить весь API в его третьей версии. В этой версии значительная часть элементов, входивших в основную ветвь OpenCL 2.x, была понижена до дополнительных расширений, и поэтому базовое оборудование не должно поддерживать их снова. Итак, теперь можно запускать OpenCL 3.0 на оборудовании с драйверами OpenCL 1.2 и добавлять расширения, которые мы хотим использовать сами, — способ обойти цензуру NVIDIA.
Вся проблема, с которой сталкивается OpenCL, заключается в том, что за пределами мира научных вычислений он наиболее широко используется в видеоиграх. Особенно при расчете физики видеоигр, а также при обнаружении столкновений. Тот факт, что вычислительные шейдеры существуют как в Vulkan, так и в DirectX, относит использование OpenCL к научным вычислениям, которые в настоящее время являются абсолютной областью CUDA.
Один рынок, на котором API мог бы выйти и преуспеть, — это Raspberry Pi-подобные встроенным устройствам, но версия 2.0 отодвинула их в сторону, поскольку слишком много внимания уделяла научным вычислениям. Версия 3.0 не предназначена для внедрения OpenCL во встроенные системы, которые могли бы без проблем принять его для множества приложений, а скорее стремится выиграть войну, уже проигранную заранее, и что внутри самой группы Khronos уже существует конкуренция OpenCL в форме Вулкана.
OpenCL

OpenCL™ (Open Computing Language) is a low-level API for heterogeneous computing that runs on CUDA-powered GPUs. Using the OpenCL API, developers can launch compute kernels written using a limited subset of the C programming language on a GPU.
NVIDIA is now OpenCL 3.0 conformant and is available on R465 and later drivers. This is supported on x86/x86_64 Linux and Windows only and available at www.nvidia.com/drivers
In addition to OpenCL, NVIDIA supports a variety of GPU-accelerated libraries and high-level programming solutions that enable developers to get started quickly with GPU Computing.