Некоторые методы сопоставления и трекинга границ во времени
Обзор OpenCL
1. Обзор OpenCL
Илья Цветков
Video Group
CS MSU Graphics & Media Lab
2. Only for
Maxus
Содержание
Введение
Модель OpenCL
Платформа OpenCL
Модель памяти
Модель вычислений
Возможности OpenCL
Использование локальной памяти
Использование изображений
Средства языка
Расширения OpenCL
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
2
3. Only for
Maxus
Развитие GPGPU
BrookGPU — язык
программирования Релиз ATI
Первые GPGPU, основанный Close to Metal —
исследования в на графических низкоуровневого Готовится к выходу
области GPGPU билиотеках средства для GPGPU NVIDIA CUDA 2.2
2003 Октябрь 2006 2008
2002 2004 Ноябрь 2006 Апрель 2009
Создание библиотек Релиз NVIDIA CUDA 1.0 Появление платформы
для GPGPU, основанных ATI Steam
на OpenGL и DirectX
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
3
4. Only for
Maxus
Open Computing Language
OpenCL предложен компанией Apple
Сотрудничество с другими компаниями (AMD, Intel,
NVIDIA)
Стандартизацией занимается группа Khronos
В декабре 2008 года выпущен стандарт OpenCL 1.0
http://www.khronos.org/
http://www.khronos.org/registry/cl/
На данный момент реализации нет
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
4
5. Only for
Maxus
Особенности OpenCL
Использование всех вычислительных ресурсов
системы
GPU, CPU и другие процессоры
Параллелизм на уровне данных и на уровне задач
Эффективная модель параллельных вычислений
Абстрагирование от оборудования
Основан на языке C
Специфицирует точность вычислений
Режимы округления IEEE 754
Определена точность встроенных функций
Возможность добавления расширений
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
5
6. Only for
Maxus
Содержание
Введение
Модель OpenCL
Платформа OpenCL
Модель памяти
Модель вычислений
Возможности OpenCL
Расширения OpenCL
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
6
7. Only for
Maxus
Программный стек
Platform
Определение устройств в системе
Инициализация устройств
Создание контекста и очередей задач
Runtime
Управление ресурсами
Исполнение вычислительных ядер
Compiler
Подмножество языка C с расширениями
Компиляция вычислительных ядер
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
7
8. Only for
Maxus
Платформа OpenCL
…
…
Processing Element …
…
…
…
…
… Host
… …
Compute Unit
…
… …
Compute Device … …
…
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
8
9. Only for
Maxus
Пример: NVIDIA GT200
1 compute device
30 compute units
240 processing elements
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
9
10. Only for
Maxus
Модель вычислений
Work Work Work Work
Item Item Item Item
Work Work Work Work
Item Item Item Item
Sy
Gy
Work Work Work Work
Item Item Item Item
Work Work Work Work
Item Item Item Item
Gx
Sx
for (int x = 0; x < gx; ++x)
for (int y = 0; y < gy; ++y)
runKernel(x, y);
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
10
11. Only for
Maxus
Простейший пример
Код на C:
int nIndex;
for (nIndex = 0; nIndex < gx; ++nIndex)
{
c[nIndex] = a[nIndex] + b[nIndex];
}
Ядро OpenCL:
__kernel void
vectorAdd(__global const float * a,
__global const float * b,
__global float * c)
{
int nIndex = get_global_id(0);
c[nIndex] = a[nIndex] + b[nIndex];
}
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
11
12. Only for
Maxus
Выполнение ядра
cl_int clEnqueueNDRangeKernel(
cl_command_queue command_queue, // Очередь команд
cl_kernel kernel, // Ядро
cl_uint work_dim, // Размерность пространства
const size_t *global_work_offset,
const size_t *global_work_size, // Размер индексного пространства
const size_t *local_work_size, // Размер группы
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list, // Ожидаемые события
cl_event *event)
Для приведенного примера:
clEnqueueNDRangeKernel(hQueue, hKernel, 1, NULL,
&gx, NULL, NULL,
NULL, NULL);
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
12
13. Only for
Maxus
Ядро
__kernel void
vectorAdd(__global const float * a,
__global const float * b,
__global float * c)
{
int nIndex = get_global_id(0);
c[nIndex] = a[nIndex] + b[nIndex];
}
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
13
14. Only for
Maxus
Инициализация контекста
// Создание контекста OpenCL
cl_context hContext;
hContext = clCreateContextFromType(0, CL_DEVICE_TYPE_GPU,
0, 0, 0);
// Получение списка доступных в контексте устройств
size_t nContextDescriptorSize;
clGetContextInfo(hContext, CL_CONTEXT_DEVICES,
0, 0, &nContextDescriptorSize);
cl_device_id * aDevices = malloc(nContextDescriptorSize);
clGetContextInfo(hContext, CL_CONTEXT_DEVICES,
nContextDescriptorSize, aDevices, 0);
// Создание очереди команд для первого из устройств
cl_command_queue hQueue;
hQueue = clCreateCommandQueue(hContext, aDevices[0], 0, 0);
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
14
15. Only for
Maxus
Инициализация памяти
// Выделение памяти на устройстве
cl_mem hDevMemA, hDevMemB, hDevMemC;
hDevMemA = clCreateBuffer(hContext,
CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
dataSize * sizeof(cl_float), pA, 0);
hDevMemB = clCreateBuffer(hContext,
CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
dataSize * sizeof(cl_float), pB, 0);
hDevMemC = clCreateBuffer(hContext,
CL_MEM_WRITE_ONLY,
dataSize * sizeof(cl_float), 0, 0);
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
15
16. Only for
Maxus
Выполнение ядра
// Компиляция OpenCL-программы
cl_program hProgram;
hProgram = clCreateProgramWithSource(hContext, 1, sProgramSource, 0, 0);
clBuildProgram(hProgram, 0, 0, 0, 0, 0);
// Создание ядра
cl_kernel hKernel;
hKernel = clCreateKernel(hProgram, "vectorAdd", 0);
// Установка параметров ядра
clSetKernelArg(hKernel, 0, sizeof(cl_mem), (void *)&hDevMemA);
clSetKernelArg(hKernel, 1, sizeof(cl_mem), (void *)&hDevMemB);
clSetKernelArg(hKernel, 2, sizeof(cl_mem), (void *)&hDevMemC);
// Выполнение ядра
clEnqueueNDRangeKernel(hQueue, hKernel, 1, 0, &dataSize, 0, 0, 0, 0);
// Чтение результатов в оперативную память
clEnqueueReadBuffer(hContext, hDevMemC, CL_TRUE, 0,
dataSize * sizeof(cl_float), pC, 0, 0, 0);
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
16
17. Only for
Maxus
Организация памяти
Private Memory
Private Private Private Private
Memory Memory Memory Memory Выделяется компилятором
Work Work Work Work
Item 1 Item N Item 1 Item N Чтение и запись для work-
Compute Unit 1 Compute Unit N item
Высокая скорость доступа
Local Memory Local Memory Для платформы CUDA:
Global/Constant Memory Data Cache Аналог — регистровый
Compute Device файл
Около 32 регистров на
Global Memory
work-item
Compute Device Memory
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
17
18. Only for
Maxus
Организация памяти
Local Memory
Private Private Private Private
Memory Memory Memory Memory Чтение и запись для всех
Work
Item 1
Work
Item N
Work
Item 1
Work
Item N
work-item одной группы
Compute Unit 1 Compute Unit N Высокая скорость доступа
Необходима синхронизация
Local Memory Local Memory Для платформы CUDA:
Global/Constant Memory Data Cache Аналог — разделяемая
Compute Device память
Около 8 КБ на work-group
Global Memory
(на compute unit)
Compute Device Memory
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
18
19. Only for
Maxus
Организация памяти
Global Memory
Private Private Private Private
Memory Memory Memory Memory Чтение и запись
Work Work Work Work
Item 1 Item N Item 1 Item N Низкая скорость доступа
Compute Unit 1 Compute Unit N Необходима синхронизация
Для платформы CUDA:
Local Memory Local Memory
Аналог — глобальная
Global/Constant Memory Data Cache память
Compute Device Типичный объѐм — 1 ГБ
Global Memory
Compute Device Memory
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
19
20. Only for
Maxus
Работа с памятью
Global Constant Local Private
Host Динамическое Динамическое Динамическое
—
выделение выделение выделение
Чтение и запись Чтение и запись Нет доступа Нет доступа
Kernel Статическое Статическое Статическое
—
выделение выделение выделение
Чтение и запись Только чтение Чтение и запись Чтение и запись
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
20
21. Only for
Maxus
Содержание
Введение
Модель OpenCL
Возможности OpenCL
Использование локальной памяти
Использование изображений
Средства языка
Расширения OpenCL
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
21
22. Only for
Maxus Использование
локальной памяти
Проблемы глобальной
памяти Загрузить данные в
локальную память
Большая латентность
Отсутствие кэша
Синхронизация Синхронизация
Решение
1. Предварительная
загрузка данных в Обработка данных
в локальной памяти
локальную память
2. Обработка Сохранение
3. Сохранение результата
результата
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
22
23. Only for
Maxus
Синхронизация
Точка синхронизации:
void barrier(cl_mem_fence_flags flags)
Особенности:
Точка синхронизации должна быть достигнута либо всеми
потоками, либо ни одним из потоков в группе
Флаг является подсказкой компилятору:
CLK_LOCAL_MEM_FENCE
CLK_GLOBAL_MEM_FENCE
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
23
24. Only for
Maxus
Пример: свѐртка
Свѐртка с ядром 9×9
Сложности:
Много обращений к
глобальной памяти
Мало вычислений
Реализация:
Разбиение на группы
8×8
Каждая группа работает
в локальной памяти
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
24
25. Only for
Maxus
Пример: свѐртка
Свѐртка с ядром 9×9
Реализация:
В локальную память
загружается блок 16×16
Каждый поток
загружает по 4
значения
#define BRD_SIZE 4
#define BLK_SIZE 16
#define GRP_SIZE 8
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
25
26. Only for
Maxus
Реализация
__kernel void convolution(__global float *dst, __global const float *src,
__local float *block)
{
int gx = get_global_id(0); int gy = get_global_id(1);
int lx = get_local_id(0); int ly = get_local_id(1);
int bx = gx - BRD_SIZE; int by = gy - BRD_SIZE;
int sid = by * SRC_STRIDE + bx; int bid = ly * BLK_SIZE + lx;
block[bid] = src[sid];
block[bid + GRP_SIZE] = src[sid + GRP_SIZE];
sid += GRP_SIZE * SRC_STRIDE; bid += GRP_SIZE * BLK_SIZE;
block[bid] = src[sid];
block[bid + GRP_SIZE] = src[sid + GRP_SIZE];
barrier(CLK_LOCAL_MEM_FENCE);
// Вычисления в локальной памяти
dst[gy * SRC_STRIDE + gx] = result;
}
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
26
27. Only for
Maxus Функции для работы с
памятью
Функция Описание
event_t async_work_group_copy( Асинхронное копирование данных между локальной
__local gentype *dst, и глобальной памятью. Возвращает объект для
const __global gentype *src, синхронизации.
size_t num_elements,
event_t event)
event_t async_work_group_copy(
__global gentype *dst,
const __local gentype *src,
size_t num_elements,
event_t event)
void wait_group_events( Синхронизация по определѐнному событию
int num_events,
event_t *event_list)
void prefetch( Упреждающая загрузка данных в кэш
const __global gentype *p,
size_t num_elements)
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
27
28. Only for
Maxus
Текстуры в GPGPU
Достоинства
Многомерное кэширование
Обработка обращений за границы изображения
Интерполяция на лету
Недостатки
Нормализованные данные
Нормализованные координаты
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
28
29. Only for
Maxus
Изображения в OpenCL
Обладают достоинствами текстур
Нормализация координат и данных опциональна
Доступные форматы — от 1 до 4 компонент на
пиксель:
CL_SIGNED_INT8
CL_SIGNED_INT16
CL_SIGNED_INT32
CL_HALF_FLOAT
CL_FLOAT
Функции для работы с изображениями:
float4 read_imagef(image2d_t image, sampler_t sampler, int2
coord)
void write_imagef(image2d_t image, int2 coord, float4 color)
Возможна работа с 3D-изображениями
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
29
30. Only for
Maxus Использование
изображений
Свѐртка 9×9
Проблемы:
Обработка краѐв
Перекрытие блоков
Решение —
изображения
Кэширование
Обработка адресации
вне изображения
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
30
31. Only for
Maxus
Пример
__kernel void convolution(__write_only image2d_t *dst, __read_only image2d_t *src,
__local float *block)
{
const sampler_t smplr = CLK_NORMALIZED_COORDS_FALSE |
CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
int gx = get_global_id(0); int gy = get_global_id(1);
int lx = get_local_id(0); int ly = get_local_id(1);
int bx = gx - BRD_SIZE; int by = gy - BRD_SIZE;
int bid = ly * BLK_SIZE + lx;
block[bid] = read_imagef(src, smplr, (int2)(bx, by)).x;
block[bid + GRP_SIZE] = read_imagef(src, smplr, (int2)(bx + GRP_SIZE, by)).x;
bid += GRP_SIZE * BLK_SIZE;
block[bid] = read_imagef(src, smplr, (int2)(bx, by + GRP_SIZE)).x;
block[bid + GRP_SIZE] = read_imagef(src, smplr, (int2)(bx + GRP_SIZE,
by + GRP_SIZE)).x;
barrier(CLK_LOCAL_MEM_FENCE);
// Вычисления в локальной памяти
write_imagef(dst, (int2)(gx, gy), result);
}
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
31
32. Only for
Maxus
Типы данных
Скалярные
bool
char, uchar, short, ushort, int, uint, long, ulong
float
size_t и другие вспомогательные типы
Векторные
Состоят из 2, 4, 8 или 16 элементов
Именуются charn, ucharn, shortn, ushortn, intn, uintn, longn,
ulongn, floatn, где n — количество элементов
Доступ к элементам с помощью .xyzw, .odd, .even, .lo, .hi,
.s0123456789ABCDEF
Пример
uchar16 a; uchar4 b = a.s6789;
float4 c; float4 d = c.zyxw;
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
32
33. Only for
Maxus
Функции
Математические функции из math.h языка C
Целочисленные вычисления
ugentype abs(gentype x)
ugentype abs_diff(gentype x, gentype y)
gentype hadd(gentype x, gentype y) — (x + y) ›› 1
gentype rhadd(gentype x, gentype y) — (x + y + 1) ›› 1
Вспомогательные функции для работы с float
gentype clamp(gentype x, gentype minval, gentype maxval)
gentype {min|max}(gentype x, gentype y)
gentype mix(gentype x, gentype y, gentype a) — x + (y − x) · a
gentype step(gentype edge, gentype x)
Геометрические функции
Функции чтения и записи изображений
Определение индексов work-item
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
33
34. Only for
Maxus
Определение индексов
Функция Описание
uint get_work_dim() Размерность индексного пространства
size_t get_global_size(uint ind) Количество work-item в измерении ind
size_t get_global_id(uint ind) Индекс work-item в измерении ind
size_t get_local_size(uint ind) Размер work-group в измерении ind
size_t get_local_id(uint ind) Локальный индекс work-item внутри work-group в
измерении ind
size_t get_num_groups(uint ind) Количество work-group в измерении ind
size_t get_group_id(uint ind) Индекс work-group в измерении ind
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
34
35. Only for
Maxus
Содержание
Введение
Модель OpenCL
Возможности OpenCL
Расширения OpenCL
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
35
36. Only for
Maxus
Ограничения в OpenCL 1.0
Не поддерживается рекурсия
Минимальный объѐм записываемых данных — 32 бита
Отсутствуют вычисления с двойной точностью
Не поддерживается запись в 3D-изображения
Отсутствуют указатели на функции
Указатели на указатели не могут быть параметрами
Битовые поля не поддерживаются
Не поддерживаются динамические структуры данных
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
36
37. Only for
Maxus
Расширения OpenCL
Название Описание
cl_khr_fp64 Вычисления с двойной точностью
cl_khr_select_fprounding_mode Выбор режимов округления
cl_khr_global_int32_base_atomics, Атомарные функции для работы с 32-битыми целыми в
cl_khr_global_int32_extended_atomics глобальной памяти
cl_khr_local_int32_base_atomics, Атомарные функции для работы с 32-битыми целыми в
cl_khr_local_int32_extended_atomics локальной памяти
cl_khr_int64_base_atomics, Атомарные функции для работы с 64-битыми целыми в
cl_khr_int64_extended_atomics глобальной и локальной памяти
cl_khr_3d_image_writes Запись в 3D-изображение
cl_khr_byte_addressable_store Запись с побайтовой адресацией
cl_khr_fp16 Вычисления с половинной точностью
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
37
38. Only for
Maxus
Атомарные функции
Типы памяти:
Локальная
Глобальная
Типы данных:
32-разрядные целые
64-разрядные целые
Набор функций:
Базовый
int atom_{add|sub|xchg}(int *p, int val)
int atom_{inc|dec}(int *p)
int atom_cmpxchg(int *p, int cmp, int val)
Расширенный
int atom_{min|max}(int *p, int val)
int atom_{and|or|xor}(int *p, int val)
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
38
39. Only for
Maxus
Выводы
Позволяет распараллеливать задачи обработки
изображений и видео
Поддержка большого количества устройств
GPU
CPU
PS3, XBOX
Embedded profile
Один код для всех устройств
Сходство с CUDA
Реализации ожидаются в ближайшее время
NVIDIA
AMD
Intel
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
39
40. Only for
Maxus
Список литературы
1. http://www.khronos.org/registry/cl/
2. http://www.nvidia.com/object/cuda_opencl.html
3. http://www.nvidia.com/object/cuda_home.html
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
40
41. Only for
Maxus
Вопросы
?
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
41
42. Only for
Maxus
Лаборатория компьютерной
графики и мультимедиа
Видеогруппа это:
Выпускники в аспирантурах Англии,
Франции, Швейцарии (в России в МГУ и
ИПМ им. Келдыша)
Выпускниками защищено 5 диссертаций
Наиболее популярные в мире сравнения
видеокодеков
Более 3 миллионов скачанных фильтров
обработки видео
CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/
42