Обзор OpenCL

1,772 views
1,713 views

Published on

New OpenCL technology review

Published in: Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,772
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
28
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Обзор OpenCL

  1. 1. Обзор OpenCL Илья Цветков Video Group CS MSU Graphics & Media Lab
  2. 2. Only for Maxus  Содержание  Введение  Модель OpenCL  Платформа OpenCL  Модель памяти  Модель вычислений  Возможности OpenCL  Использование локальной памяти  Использование изображений  Средства языка  Расширения OpenCL CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 2
  3. 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. 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. 5. Only for Maxus  Особенности OpenCL  Использование всех вычислительных ресурсов системы  GPU, CPU и другие процессоры  Параллелизм на уровне данных и на уровне задач  Эффективная модель параллельных вычислений  Абстрагирование от оборудования  Основан на языке C  Специфицирует точность вычислений  Режимы округления IEEE 754  Определена точность встроенных функций  Возможность добавления расширений CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 5
  6. 6. Only for Maxus  Содержание  Введение  Модель OpenCL  Платформа OpenCL  Модель памяти  Модель вычислений  Возможности OpenCL  Расширения OpenCL CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 6
  7. 7. Only for Maxus  Программный стек  Platform  Определение устройств в системе  Инициализация устройств  Создание контекста и очередей задач  Runtime  Управление ресурсами  Исполнение вычислительных ядер  Compiler  Подмножество языка C с расширениями  Компиляция вычислительных ядер CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 7
  8. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 20. Only for Maxus  Работа с памятью Global Constant Local Private Host Динамическое Динамическое Динамическое — выделение выделение выделение Чтение и запись Чтение и запись Нет доступа Нет доступа Kernel Статическое Статическое Статическое — выделение выделение выделение Чтение и запись Только чтение Чтение и запись Чтение и запись CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 20
  21. 21. Only for Maxus  Содержание  Введение  Модель OpenCL  Возможности OpenCL  Использование локальной памяти  Использование изображений  Средства языка  Расширения OpenCL CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 21
  22. 22. Only for Maxus  Использование локальной памяти  Проблемы глобальной памяти Загрузить данные в локальную память  Большая латентность  Отсутствие кэша Синхронизация Синхронизация  Решение 1. Предварительная загрузка данных в Обработка данных в локальной памяти локальную память 2. Обработка Сохранение 3. Сохранение результата результата CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 22
  23. 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. 24. Only for Maxus  Пример: свѐртка Свѐртка с ядром 9×9  Сложности:  Много обращений к глобальной памяти  Мало вычислений  Реализация:  Разбиение на группы 8×8  Каждая группа работает в локальной памяти CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 24
  25. 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. 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. 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. 28. Only for Maxus  Текстуры в GPGPU  Достоинства  Многомерное кэширование  Обработка обращений за границы изображения  Интерполяция на лету  Недостатки  Нормализованные данные  Нормализованные координаты CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 28
  29. 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. 30. Only for Maxus  Использование изображений Свѐртка 9×9  Проблемы:  Обработка краѐв  Перекрытие блоков  Решение — изображения  Кэширование  Обработка адресации вне изображения CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 30
  31. 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. 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. 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. 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. 35. Only for Maxus  Содержание  Введение  Модель OpenCL  Возможности OpenCL  Расширения OpenCL CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 35
  36. 36. Only for Maxus  Ограничения в OpenCL 1.0  Не поддерживается рекурсия  Минимальный объѐм записываемых данных — 32 бита  Отсутствуют вычисления с двойной точностью  Не поддерживается запись в 3D-изображения  Отсутствуют указатели на функции  Указатели на указатели не могут быть параметрами  Битовые поля не поддерживаются  Не поддерживаются динамические структуры данных CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 36
  37. 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. 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. 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. 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. 41. Only for Maxus  Вопросы ? CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 41
  42. 42. Only for Maxus  Лаборатория компьютерной графики и мультимедиа Видеогруппа это:  Выпускники в аспирантурах Англии, Франции, Швейцарии (в России в МГУ и ИПМ им. Келдыша)  Выпускниками защищено 5 диссертаций  Наиболее популярные в мире сравнения видеокодеков  Более 3 миллионов скачанных фильтров обработки видео CS MSU Graphics & Media Lab (Video Group) www.compression.ru/video/ 42

×