Слайд 2
![Гетерогенные vs гомогенные параллельные вычисления](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-1.jpg)
Гетерогенные vs гомогенные параллельные вычисления
Слайд 3
![Что такое OpenCL? OpenCL (от англ. Open Computing Language —](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-2.jpg)
Что такое OpenCL?
OpenCL (от англ. Open Computing Language — открытый язык
вычислений) — фреймворк для написания компьютерных программ, связанных с параллельными вычислениями на различных графических (англ. GPU) и центральных процессорах (англ. CPU).
Цель OpenCL - дополнить OpenGL и OpenAL, которые являются открытыми отраслевыми стандартами для трёхмерной компьютерной графики и звука, пользуясь возможностями GPU.
Консорциум Khronos Group, в который входят много крупных компаний, включая Apple, AMD, Intel, nVidia, ARM, Sun Microsystems, Sony Computer Entertainment и другие.
Первая версия стандарта – ноябрь 2008 г.
Текущая документация - https://www.khronos.org/registry/OpenCL/specs/opencl-2.2.pdf
Полезная ссылка: http://docplayer.ru/37490743-Programmirovanie-na-opencl.html
Слайд 4
![Типовая модель использования OpenCL Распараллеливание по задачам (единицы/десятки сложных производительных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-3.jpg)
Типовая модель использования OpenCL
Распараллеливание по задачам
(единицы/десятки сложных производительных ядер)
Распараллеливание по данным
(тысячи простых медленных ядер).
Слайд 5
![Язык программирования в OpenCL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-4.jpg)
Язык программирования в OpenCL
Слайд 6
![Как OpenCL видит аппаратуру (платформу)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-5.jpg)
Как OpenCL видит аппаратуру (платформу)
Слайд 7
![Принцип работы OpenCL Обычно один элемент Work-Group приходится на один Compute Unit.](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-6.jpg)
Принцип работы OpenCL
Обычно один элемент Work-Group приходится на один Compute Unit.
Слайд 8
![Очередь команд OpenCL Host направляет команды на устройства. Эти команды](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-7.jpg)
Очередь команд OpenCL
Host направляет команды на устройства. Эти команды становятся в
очередь аналогичных команд. Можно реализовать очередь с соблюдением порядка и без соблюдения.
Слайд 9
![Виды памяти в OpenCL-устройствах Программист должен явным образом отдавать команды](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-8.jpg)
Виды памяти в OpenCL-устройствах
Программист должен явным образом отдавать команды копирования данных
между Local, Global и Private Memory.
hhttp://habrahabr.ru/post/55461/ - память в CUDA.
Слайд 10
![Понятие вычислительного контекста в OpenCL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-9.jpg)
Понятие вычислительного контекста в OpenCL
Слайд 11
![Понятие контекста в OpenCL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-10.jpg)
Понятие контекста в OpenCL
Слайд 12
![Создание контекста в OpenCL](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-11.jpg)
Создание контекста в OpenCL
Слайд 13
![Принципы работы OpenCL (для 2.2): оболочка на С 1. Выбор](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-12.jpg)
Принципы работы OpenCL (для 2.2):
оболочка на С
1. Выбор платформы:
clGetPlatformIDs, clGetPlatformInfo
(c. 53, # 4.1)
2. Выбор устройства:
clGetDeviceIDs, clGetDeviceInfo (c. 55, # 4.2)
3. Создание вычислительного контекста:
clCreateContextFromType (с. 77, # 4.4)
4. Создание очереди команд:
clCreateCommandQueueWithProperties (с. 81, # 5.1)
5. Выделение памяти в виде буферов:
clCreateBuffer (с. 86, # 5.2.1)
6. Создание объекта «программа»:
clCreateProgramWithSource (с. 146, # 5.8.1)
Слайд 14
![Простой пример ядра OpenCL n = 1024 – это число](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-13.jpg)
Простой пример ядра OpenCL
n = 1024 – это число work items.
m
= 1024/cores – это число work groups.
Работа в рамках одной work group выполняется одновременно всеми work items. 1 WG –> 1 Compute Unit.
Слайд 15
![Work group и Work item](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-14.jpg)
Слайд 16
![Нецелое число Work group?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-15.jpg)
Нецелое число Work group?
Слайд 17
![Компиляция kernel](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-16.jpg)
Слайд 18
![Копирование данных с/на device](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-17.jpg)
Копирование данных с/на device
Слайд 19
![Запуск kernel](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-18.jpg)
Слайд 20
![Запуск kernel](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-19.jpg)
Слайд 21
![Принципы работы OpenCL (для 2.2): оболочка на С 7. Компиляция](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-20.jpg)
Принципы работы OpenCL (для 2.2):
оболочка на С
7. Компиляция кода:
clBuildProgram (с.
151, # 5.8.4)
CL_BUILD_PROGRAM_FAILURE = код ошибки, тогда вызов clGetProgramBuildInfo с аргументом CL_PROGRAM_BUILD_LOG
8. Создание «ядра» (объект kernel):
clCreateKernel (c. 170, # 5.9.1)
9. Работа c Work-Group:
clGetKernelWorkGroupInfo – с. 238 (# 5.9.4)
Слайд 22
![Принципы работы OpenCL (для 2.2): оболочка на С 10. Выполнение](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/432396/slide-21.jpg)
Принципы работы OpenCL (для 2.2):
оболочка на С
10. Выполнение ядра:
clEnqueueNDRangeKernel (с.
187, # 5.10)
11. Ожидание выполнения ядра:
clWaitForEvents (c. 193, # 5.11)
12. Profiling:
clGetEventProfilingInfo (c. 201, # 5.14)