SlideShare a Scribd company logo
Анатолий Свириденков
(сodedgers.com)
SC{2}
Введение в GP GPU
Проблематика
Где нужна вычислительная мощность:
- Ускорение вычислений
- Переход в реальное время
- Разгрузка CPU
- Улучшение качества
Чего ожидать от параллелизма
Закон Амдала (ускорение от параллелизма):
Sp = 1 / (a + (1 – a) / p)
p – количество потоков
a – доля последовательных вычислений
p = 2 p = 8 p = 1000
a = 0,9 1,05 1,1 1,11
a = 0,5 1,33 1,77 2,0
a = 0,1 1,81 4,71 9,91
- Параллелизм данных, DPL: MMX, SSE, и т. д.
- Параллелизм кода, IPL: спекулятивные вычисления и
конвейер, VLIW
- Квази многопоточность, многоядерность, hyper threading
- Кластеры
Примеры параллелизма
Предыстория к GPGPU
1990 1995 2000 2005 2010
Сопроцессор
Видео-
ускоритель
Шейдеры
GPU
Рост производительностиGigaFLOPS
годы
500
1000
1500
2002 2004 2006 2008 2010
GPU
CPU
Core DUO
CORE CORE
L1 L1
L2
Memory
L2 - общий кэш
L1 - отдельный кэш у каждого ядра
Необходима синхронизация образа памяти для каждого ядра
Cell
SPU SPU SPU SPU SPU SPU SPU SPU
BUS
CPU Memory
SPU - Synergistic Processing Unit, векторный процессор
Cell сложен в программировании, не распространен
Терминология
- host - CPU
- device - GPU
- ядро — код запускаемого на GPU из основного приложения
- поток — часть вычислений исполняемых параллельно
- сетка (grid) — все множество потоков для одного ядра
- блок — набор потоков исполняемых на одном SM
- warp — набор потоков физически исполняемых
параллельно
Обобщенная архитектура GPU
TPC TPC TPC TPC TPC TPC
DRAM (на видео карте)
PCI-Express
CPU RAM
SM — Streaming Multiprocessor TPC — Texture Processor Cluster
TeX — Блок доступа к текстурам
SMSMTeX
TPC
GPU
device
host
Обобщенная архитектра SM
CU0 CU1 CU2 CU3 CU4 CU5 CU6 CU7
Кеш текстурной и константной памяти
Регистры
Разделяемая память
Выборка
инструкций
(Instructions fetch)
К DRAM
SFU
вычисление функций (sin, cos, exp)
SFU
вычисление функций (sin, cos, exp)
CU — вычислительный модуль
GPU GeForce 8800GTX
Hardware:
- 16 мультипроцессоров (SM) / 128 вычислительных модулей (CU)
- до 8 блоков исполняются на каждом SM
- до 24 варпов исполняются на каждом SM
- до 768 потоков исполняются на каждом SM
- 8192 регистра на SM
- 16k общей памяти на SM / 16 банков
- 64k памяти констант (кэшируется по 8k на SM)
Программная модель потоков
B
(0:0)
B
(0:1)
B
(0:2)
B
(0:3)
B
(1:0)
B
(1:1)
B
(1:2)
B
(1:3)
B
(2:0)
B
(2:1)
B
(2:2)
B
(2:3)
B
(3:0)
B
(3:1)
B
(3:2)
B
(3:3)
B
(4:0)
B
(4:1)
B
(4:2)
B
(4:3)
Grid Block
T
(0:0:0)
T
(0:1:0)
T
(0:2:0)
T
(1:0:0)
T
(1:1:0)
T
(1:2:0)
T
(2:0:0)
T
(2:1:0)
T
(2:2:0)
Приведен пример сетки из 20 блоков (5x4), в каждом
блоке 18 (3x3x2) потоков. Всего в сетке 360 потоков.
Программная модель памяти
Тип Доступ Расположение Латентность
Регистры Поток GPU (RW) SM 2-4 такта
Локальная Поток GPU (RW) DRAM ~500 тактов
Разделяемая Блок потоков GPU (RW) SM 2-4 такта
Глобальная CPU(RW), GPU(RW) DRAM ~500 тактов
Константная CPU(RW), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM
2-4 к кешу
Текстурная CPU(RW), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM
2-4 к кешу
Особенности программирования
- функция ядро возвращает только void
- память — узкое место в вычисленях и требует особого
внимания
- шина PCI-Express — узкое место в вычислениях
- ветвления внутри warp снижают быстродействие
Программный стек CUDA
Device
Host
CUDA Driver
CUDA Driver API
CUDA Runtime API
Libraries
Application
Последняя версия CUDA Toolkit 5.5 RC
- https://nvdeveloper.nvidia.com
Состав:
- Драйвер для разработчиков
- GPU Computing SDK
GPU Computing SDK:
- Компилятор
- Набор утилит
- Документация
- Библиотеки (CUBLAS, CUSPARSE)
- Примеры
CUDA Toolkit
Самый важный параметр:
--help (-help) — печатает справку
Основные выходные форматы (и ключи компиляции):
--cubin (-cubin) — компилирует в виртуальный формат cubin
--ptx (-ptx) — компиляция в ассемблер для gpu
--gpu (-gpu) — компиляция в бинарный формат
NVIDIA Parallel nSight специально разработан для работы в
Visual Studio
Компилятор NVCC
Типы функций
Обозначение Где расположена
Кто может
вызывать
__global__ GPU CPU
__device__ GPU GPU
__host__ CPU CPU
- по умолчанию все функции __host__
- __host__ и __device__ совместимы, компилятор создаст
две версии: для CPU и GPU
__global__ void sum(float *c, float *a, float b);
__host__ __device__ float add(float a, float b);
Hello World! Сложение массивов.
#define N 1024
// GPU
__global__ void sum(float *c, float *a, float *b)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
c[index] = a[index] + b[index];
}
// CPU
void sum(float *c, float *a, float b)
{
for(int i = 0; i < N; i++)
{
c[i] = a[i] + b[i];
}
}
Встроеные константы:
blockIdx — номер блока у текущего
потока;
blockDim — количество блоков;
threadIdx — номер потока в блоке.
Hello World! CPU инициализация
int main(int argc, char **argv)
{
float *a, *b, *c;
float *A, *B, *C;
a = (float*) malloc(N * sizeof(float));
b = (float*) malloc(N * sizeof(float));
c = (float*) malloc(N * sizeof(float));
cudaMalloc((void **)&A, N * sizeof(float));
cudaMalloc((void **)&B, N * sizeof(float));
cudaMalloc((void **)&C, N * sizeof(float));
for(int i = 0; i < N; i++)
{
a[i] = RandFloat(0.0f, 1.0f);
b[i] = RandFloat(0.0f, 1.0f);
}
Hello World! CPU вызов ядра
cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice);
sum<<<N/256, 256>>>(C, A, B);
cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(A);
cudaFree(B);
cudaFree(C);
free(a);
free(b);
free(c);
}
Hello World! CPU вызов ядра
cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice);
sum<<<N/256, 256>>>(C, A, B);
cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(A);
cudaFree(B);
cudaFree(C);
free(a);
free(b);
free(c);
}
Hello World! CPU вызов ядра
cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice);
sum<<<N/256, 256>>>(C, A, B);
cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(A);
cudaFree(B);
cudaFree(C);
free(a);
free(b);
free(c);
}
Hello World! CPU вызов ядра
cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice);
sum<<<N/256, 256>>>(C, A, B);
cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(A);
cudaFree(B);
cudaFree(C);
free(a);
free(b);
free(c);
}
GPGPU прочее
DirectCompute — библиотека от Microsoft. Часть DirectX;
OpenCL — кроссплатформенная библиотека;
Готовые библиотеки с поддержкой GPGPU:
- OpenCV — обработка изображения и компьютерное зрение
- CUBLAS — математические вычисления
- CUFFT — быстрые преобразования фурье
- CUSPARSE — библиотека линейной алгебры
Пакеты ПО со встроенной поддержкой GPU, например Matlab
OpenCV
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/gpu/gpu.hpp"
int main (int argc, char* argv[])
{
cv::gpu::GpuMat dst, src = cv::imread("file.png",
CV_LOAD_IMAGE_GRAYSCALE);
cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
cv::imshow("Result", dst);
cv::waitKey();
return 0;
}
OpenCL обзор
Особенности языка:
- Отсутствие указателей на функции, рекурсии, битовых полей, массивов
переменной длины, стандартных заголовочных файлов;
- Расширения языка для параллелизма: векторные типы, синхронизация,
функции для Work-items/Work-Groups;
- Квалификаторы типов памяти: __global, __local, __constant, __private;
- Свой набор встроенных функций;
- Для работы на целевой системе нужен OpenCL драйвер.
OpenCL инициализация
// создание вычислительного контекста для GPU (видеокарты)
context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);
// создание очереди команд
queue = clCreateCommandQueue(context, NULL, 0, NULL);
// выделение памяти в виде буферов
memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY |
CL_MEM_COPY_HOST_PTR,
sizeof(float) * 2 * numElem, src, NULL);
memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE,
sizeof(float) * 2 * numElem, NULL, NULL);
// создание программы из исходных текстов
program = clCreateProgramWithSource(context, 1, &sourcesStr, NULL, NULL);
// компиляция программы
clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
OpenCL подготовка
// создание объекта kernel из скомпилированной программы
kernel = clCreateKernel(program, "kernel", NULL);
// подготовка аргументов
clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);
clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);
// задание N-D диапазона
globalWorkSize[0] = numElem / 64;
localWorkSize[0] = 64;
// отправка в очередь исполнения
clEnqueueNDRangeKernel(queue, kernel, 1, NULL, globalWorkSize,
localWorkSize, 0, NULL, NULL);
OpenCL ядро
__kernel void kernel(__global float *in, __global float *out)
{
int tid = get_local_id(0);
int blockIdx = get_group_id(0) * 1024 + tid;
// адрес начала обрабатываемых данных в глобальной памяти
in = in + blockIdx;
out = out + blockIdx;
*out = 2 * (*in);
}
Полезные источники:
- GPU Gems 1- 3
- https://www.coursera.org/course/hetero - курс от Coursera
- https://www.udacity.com/course/cs344 - курс от Udacity
- http://www.nvidia.ru/object/cuda_home_new_ru.html - о CUDA
- http://www.nvidia.ru/object/cuda_opencl_new_ru.html - OpenCL
- http://www.nvidia.ru/object/directcompute_ru.html - DirectCompute
- http://gpgpu.org/ - подборка информации по GPGPU
- http://www.gpgpu.ru - GPGPU по-русски
- skype: sviridenkov.anatoliy
- e-mail: Anatoliy.Sviridenkov@gmail.com
- группа vk http://vk.com/smolensk_csc
Контакты:

More Related Content

PPT
введение в Gpu
PDF
Лекция 9. Программирование GPU
PDF
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
PDF
обзор средств разработки для вычислений Gpgpu
PDF
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
PDF
Лекция 6. Стандарт OpenMP
PDF
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
введение в Gpu
Лекция 9. Программирование GPU
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
обзор средств разработки для вычислений Gpgpu
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Лекция 6. Стандарт OpenMP
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Семинар 5. Многопоточное программирование на OpenMP (часть 5)

What's hot (20)

PDF
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
PPT
CUDA Course 2010 at MSU
PDF
Лекция 7. Язык параллельного программирования Intel Cilk Plus
PPTX
OpenACC short review
PDF
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
PDF
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
PDF
Модель памяти C++ - Андрей Янковский, Яндекс
PDF
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
PDF
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
PPTX
PDF
Семинар 11. Параллельное программирование на MPI (часть 4)
PDF
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
PDF
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
PDF
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
PDF
Семинар 12. Параллельное программирование на MPI (часть 5)
PDF
Лекция 8. Intel Threading Building Blocks
PPTX
разработка серверов и серверных приложений лекция №2
PPTX
разработка серверов и серверных приложений лекция №3
PDF
Сложности микробенчмаркинга
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
CUDA Course 2010 at MSU
Лекция 7. Язык параллельного программирования Intel Cilk Plus
OpenACC short review
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Модель памяти C++ - Андрей Янковский, Яндекс
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 11. Параллельное программирование на MPI (часть 4)
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Семинар 12. Параллельное программирование на MPI (часть 5)
Лекция 8. Intel Threading Building Blocks
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №3
Сложности микробенчмаркинга
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Ad

Similar to 11 встреча — Введение в GPGPU (А. Свириденков) (20)

PPTX
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
PPTX
Доклад на Highload-2012
PPTX
Доклад в Mail.ru 01.11.12
PDF
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
PPTX
Параллельное программирование на современных видеокартах
PDF
20130429 dynamic c_c++_program_analysis-alexey_samsonov
PPTX
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
PPTX
Hpc 2.26.03.2013.
PDF
Лекция 6. Стандарт OpenMP
PPTX
Гирлянда для программистов
PPTX
ADD 2011: Статический анализ Си++ кода
PPTX
Статический анализ Си++ кода
PDF
Архитектура и программирование потоковых многоядерных процессоров для научных...
PDF
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
PPT
Conflux: GPGPU .NET
PDF
C++ весна 2014 лекция 2
PPTX
DirectX12 Graphics and Performance
PDF
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
PDF
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
PDF
overview of development tools for computing Gpgpu
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Доклад на Highload-2012
Доклад в Mail.ru 01.11.12
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Параллельное программирование на современных видеокартах
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Hpc 2.26.03.2013.
Лекция 6. Стандарт OpenMP
Гирлянда для программистов
ADD 2011: Статический анализ Си++ кода
Статический анализ Си++ кода
Архитектура и программирование потоковых многоядерных процессоров для научных...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
Conflux: GPGPU .NET
C++ весна 2014 лекция 2
DirectX12 Graphics and Performance
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
overview of development tools for computing Gpgpu
Ad

More from Smolensk Computer Science Club (9)

PDF
13 встреча — Сжатие данных (Р. Одинцов)
PDF
12 встреча — Многопоточность-2 (А. Свириденков)
PDF
8 встреча — Язык программирования Python (В. Ананьев)
PDF
7 встреча — Программирование компьютерных сетей (А. Свириденков)
ODP
5 встреча — Информационная безопастность (А. Свириденков)
PPTX
4 встреча — Компьютерная лингвистика (А. Катинская)
PPTX
3 встреча — Биоинформатика (продолжение) (А. Фединцев)
PPTX
2 встреча — Биоинформатика (А. Фединцев)
PDF
1 встреча — Параллельное программирование (А. Свириденков)
13 встреча — Сжатие данных (Р. Одинцов)
12 встреча — Многопоточность-2 (А. Свириденков)
8 встреча — Язык программирования Python (В. Ананьев)
7 встреча — Программирование компьютерных сетей (А. Свириденков)
5 встреча — Информационная безопастность (А. Свириденков)
4 встреча — Компьютерная лингвистика (А. Катинская)
3 встреча — Биоинформатика (продолжение) (А. Фединцев)
2 встреча — Биоинформатика (А. Фединцев)
1 встреча — Параллельное программирование (А. Свириденков)

11 встреча — Введение в GPGPU (А. Свириденков)

  • 2. Проблематика Где нужна вычислительная мощность: - Ускорение вычислений - Переход в реальное время - Разгрузка CPU - Улучшение качества
  • 3. Чего ожидать от параллелизма Закон Амдала (ускорение от параллелизма): Sp = 1 / (a + (1 – a) / p) p – количество потоков a – доля последовательных вычислений p = 2 p = 8 p = 1000 a = 0,9 1,05 1,1 1,11 a = 0,5 1,33 1,77 2,0 a = 0,1 1,81 4,71 9,91
  • 4. - Параллелизм данных, DPL: MMX, SSE, и т. д. - Параллелизм кода, IPL: спекулятивные вычисления и конвейер, VLIW - Квази многопоточность, многоядерность, hyper threading - Кластеры Примеры параллелизма
  • 5. Предыстория к GPGPU 1990 1995 2000 2005 2010 Сопроцессор Видео- ускоритель Шейдеры GPU
  • 7. Core DUO CORE CORE L1 L1 L2 Memory L2 - общий кэш L1 - отдельный кэш у каждого ядра Необходима синхронизация образа памяти для каждого ядра
  • 8. Cell SPU SPU SPU SPU SPU SPU SPU SPU BUS CPU Memory SPU - Synergistic Processing Unit, векторный процессор Cell сложен в программировании, не распространен
  • 9. Терминология - host - CPU - device - GPU - ядро — код запускаемого на GPU из основного приложения - поток — часть вычислений исполняемых параллельно - сетка (grid) — все множество потоков для одного ядра - блок — набор потоков исполняемых на одном SM - warp — набор потоков физически исполняемых параллельно
  • 10. Обобщенная архитектура GPU TPC TPC TPC TPC TPC TPC DRAM (на видео карте) PCI-Express CPU RAM SM — Streaming Multiprocessor TPC — Texture Processor Cluster TeX — Блок доступа к текстурам SMSMTeX TPC GPU device host
  • 11. Обобщенная архитектра SM CU0 CU1 CU2 CU3 CU4 CU5 CU6 CU7 Кеш текстурной и константной памяти Регистры Разделяемая память Выборка инструкций (Instructions fetch) К DRAM SFU вычисление функций (sin, cos, exp) SFU вычисление функций (sin, cos, exp) CU — вычислительный модуль
  • 12. GPU GeForce 8800GTX Hardware: - 16 мультипроцессоров (SM) / 128 вычислительных модулей (CU) - до 8 блоков исполняются на каждом SM - до 24 варпов исполняются на каждом SM - до 768 потоков исполняются на каждом SM - 8192 регистра на SM - 16k общей памяти на SM / 16 банков - 64k памяти констант (кэшируется по 8k на SM)
  • 13. Программная модель потоков B (0:0) B (0:1) B (0:2) B (0:3) B (1:0) B (1:1) B (1:2) B (1:3) B (2:0) B (2:1) B (2:2) B (2:3) B (3:0) B (3:1) B (3:2) B (3:3) B (4:0) B (4:1) B (4:2) B (4:3) Grid Block T (0:0:0) T (0:1:0) T (0:2:0) T (1:0:0) T (1:1:0) T (1:2:0) T (2:0:0) T (2:1:0) T (2:2:0) Приведен пример сетки из 20 блоков (5x4), в каждом блоке 18 (3x3x2) потоков. Всего в сетке 360 потоков.
  • 14. Программная модель памяти Тип Доступ Расположение Латентность Регистры Поток GPU (RW) SM 2-4 такта Локальная Поток GPU (RW) DRAM ~500 тактов Разделяемая Блок потоков GPU (RW) SM 2-4 такта Глобальная CPU(RW), GPU(RW) DRAM ~500 тактов Константная CPU(RW), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM 2-4 к кешу Текстурная CPU(RW), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM 2-4 к кешу
  • 15. Особенности программирования - функция ядро возвращает только void - память — узкое место в вычисленях и требует особого внимания - шина PCI-Express — узкое место в вычислениях - ветвления внутри warp снижают быстродействие
  • 16. Программный стек CUDA Device Host CUDA Driver CUDA Driver API CUDA Runtime API Libraries Application
  • 17. Последняя версия CUDA Toolkit 5.5 RC - https://nvdeveloper.nvidia.com Состав: - Драйвер для разработчиков - GPU Computing SDK GPU Computing SDK: - Компилятор - Набор утилит - Документация - Библиотеки (CUBLAS, CUSPARSE) - Примеры CUDA Toolkit
  • 18. Самый важный параметр: --help (-help) — печатает справку Основные выходные форматы (и ключи компиляции): --cubin (-cubin) — компилирует в виртуальный формат cubin --ptx (-ptx) — компиляция в ассемблер для gpu --gpu (-gpu) — компиляция в бинарный формат NVIDIA Parallel nSight специально разработан для работы в Visual Studio Компилятор NVCC
  • 19. Типы функций Обозначение Где расположена Кто может вызывать __global__ GPU CPU __device__ GPU GPU __host__ CPU CPU - по умолчанию все функции __host__ - __host__ и __device__ совместимы, компилятор создаст две версии: для CPU и GPU __global__ void sum(float *c, float *a, float b); __host__ __device__ float add(float a, float b);
  • 20. Hello World! Сложение массивов. #define N 1024 // GPU __global__ void sum(float *c, float *a, float *b) { int index = blockIdx.x * blockDim.x + threadIdx.x; c[index] = a[index] + b[index]; } // CPU void sum(float *c, float *a, float b) { for(int i = 0; i < N; i++) { c[i] = a[i] + b[i]; } } Встроеные константы: blockIdx — номер блока у текущего потока; blockDim — количество блоков; threadIdx — номер потока в блоке.
  • 21. Hello World! CPU инициализация int main(int argc, char **argv) { float *a, *b, *c; float *A, *B, *C; a = (float*) malloc(N * sizeof(float)); b = (float*) malloc(N * sizeof(float)); c = (float*) malloc(N * sizeof(float)); cudaMalloc((void **)&A, N * sizeof(float)); cudaMalloc((void **)&B, N * sizeof(float)); cudaMalloc((void **)&C, N * sizeof(float)); for(int i = 0; i < N; i++) { a[i] = RandFloat(0.0f, 1.0f); b[i] = RandFloat(0.0f, 1.0f); }
  • 22. Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum<<<N/256, 256>>>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }
  • 23. Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum<<<N/256, 256>>>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }
  • 24. Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum<<<N/256, 256>>>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }
  • 25. Hello World! CPU вызов ядра cudaMemcpy(A, a, N * sizeof(float), cudaMemcpyHostToDevice); cudaMemcpy(B, b, N * sizeof(float), cudaMemcpyHostToDevice); sum<<<N/256, 256>>>(C, A, B); cudaMemcpy(c, C, N * sizeof(float), cudaMemcpyDeviceToHost); cudaFree(A); cudaFree(B); cudaFree(C); free(a); free(b); free(c); }
  • 26. GPGPU прочее DirectCompute — библиотека от Microsoft. Часть DirectX; OpenCL — кроссплатформенная библиотека; Готовые библиотеки с поддержкой GPGPU: - OpenCV — обработка изображения и компьютерное зрение - CUBLAS — математические вычисления - CUFFT — быстрые преобразования фурье - CUSPARSE — библиотека линейной алгебры Пакеты ПО со встроенной поддержкой GPU, например Matlab
  • 27. OpenCV #include <iostream> #include "opencv2/opencv.hpp" #include "opencv2/gpu/gpu.hpp" int main (int argc, char* argv[]) { cv::gpu::GpuMat dst, src = cv::imread("file.png", CV_LOAD_IMAGE_GRAYSCALE); cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY); cv::imshow("Result", dst); cv::waitKey(); return 0; }
  • 28. OpenCL обзор Особенности языка: - Отсутствие указателей на функции, рекурсии, битовых полей, массивов переменной длины, стандартных заголовочных файлов; - Расширения языка для параллелизма: векторные типы, синхронизация, функции для Work-items/Work-Groups; - Квалификаторы типов памяти: __global, __local, __constant, __private; - Свой набор встроенных функций; - Для работы на целевой системе нужен OpenCL драйвер.
  • 29. OpenCL инициализация // создание вычислительного контекста для GPU (видеокарты) context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL); // создание очереди команд queue = clCreateCommandQueue(context, NULL, 0, NULL); // выделение памяти в виде буферов memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float) * 2 * numElem, src, NULL); memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float) * 2 * numElem, NULL, NULL); // создание программы из исходных текстов program = clCreateProgramWithSource(context, 1, &sourcesStr, NULL, NULL); // компиляция программы clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
  • 30. OpenCL подготовка // создание объекта kernel из скомпилированной программы kernel = clCreateKernel(program, "kernel", NULL); // подготовка аргументов clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]); clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]); // задание N-D диапазона globalWorkSize[0] = numElem / 64; localWorkSize[0] = 64; // отправка в очередь исполнения clEnqueueNDRangeKernel(queue, kernel, 1, NULL, globalWorkSize, localWorkSize, 0, NULL, NULL);
  • 31. OpenCL ядро __kernel void kernel(__global float *in, __global float *out) { int tid = get_local_id(0); int blockIdx = get_group_id(0) * 1024 + tid; // адрес начала обрабатываемых данных в глобальной памяти in = in + blockIdx; out = out + blockIdx; *out = 2 * (*in); }
  • 32. Полезные источники: - GPU Gems 1- 3 - https://www.coursera.org/course/hetero - курс от Coursera - https://www.udacity.com/course/cs344 - курс от Udacity - http://www.nvidia.ru/object/cuda_home_new_ru.html - о CUDA - http://www.nvidia.ru/object/cuda_opencl_new_ru.html - OpenCL - http://www.nvidia.ru/object/directcompute_ru.html - DirectCompute - http://gpgpu.org/ - подборка информации по GPGPU - http://www.gpgpu.ru - GPGPU по-русски
  • 33. - skype: sviridenkov.anatoliy - e-mail: Anatoliy.Sviridenkov@gmail.com - группа vk http://vk.com/smolensk_csc Контакты: