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

What's hot

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

What's hot (20)

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

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

Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Доклад в Mail.ru 01.11.12
Доклад в Mail.ru 01.11.12Alex Tutubalin
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Yandex
 
Параллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахПараллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартах
Alex Tutubalin
 
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonovComputer Science Club
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Boris Kizko
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
GetDev.NET
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
Tatyanazaxarova
 
ADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кодаADD 2011: Статический анализ Си++ кода
ADD 2011: Статический анализ Си++ кода
Andrey Karpov
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
a15464321646213
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...rit2011
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
DirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDirectX12 Graphics and Performance
DirectX12 Graphics and Performance
DevGAMM Conference
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Mikhail Kurnosov
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
overview of development tools for computing Gpgpu
overview of development tools for computing Gpgpuoverview of development tools for computing Gpgpu
overview of development tools for computing Gpgpu
corehard_by
 

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

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

More from Smolensk Computer Science Club

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

More from Smolensk Computer Science Club (9)

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