обзор средств разработки для вычислений GpgpuCOMAQA.BY
Производительность современных графических процессоров растет гораздо быстрее производительности центральных и в настоящее время в некоторых задачах уже превосходит их на порядок. Поэтому для создания приложений с производительностью опережающей решения конкурентов компании все чаще начинают использовать этот ресурс. GPGPU - неспециализированные (т.е. связанные не только с графикой) вычисления на графических процессорах. Рассмотрим актуальные технологии для написания GPGPU приложений (CUDA, OpenCL, OpenACC и не только). В качестве критериев оценки будут выступать - функционал, скорость разработки, спектр поддерживаемых устройств, языков и компиляторов, удобство отладки и профилирования. Примером практического применения GPGPU выступит реализация алгоритма подавления шума на изображениях.
обзор средств разработки для вычислений GpgpuCOMAQA.BY
Производительность современных графических процессоров растет гораздо быстрее производительности центральных и в настоящее время в некоторых задачах уже превосходит их на порядок. Поэтому для создания приложений с производительностью опережающей решения конкурентов компании все чаще начинают использовать этот ресурс. GPGPU - неспециализированные (т.е. связанные не только с графикой) вычисления на графических процессорах. Рассмотрим актуальные технологии для написания GPGPU приложений (CUDA, OpenCL, OpenACC и не только). В качестве критериев оценки будут выступать - функционал, скорость разработки, спектр поддерживаемых устройств, языков и компиляторов, удобство отладки и профилирования. Примером практического применения GPGPU выступит реализация алгоритма подавления шума на изображениях.
Модель памяти C++ - Андрей Янковский, ЯндексYandex
В докладе Андрей расскажет о моделях памяти различных процессоров, о тонкостях реализации неблокирующих алгоритмов и о том, какое отношение всё это имеет к С++.
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey Paznikov
ЛЕКЦИЯ 7. Модель памяти С++. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Модель памяти C++ - Андрей Янковский, ЯндексYandex
В докладе Андрей расскажет о моделях памяти различных процессоров, о тонкостях реализации неблокирующих алгоритмов и о том, какое отношение всё это имеет к С++.
ПВТ - весна 2015 - Лекция 7. Модель памяти С++. Внеочередное выполнение инстр...Alexey Paznikov
ЛЕКЦИЯ 7. Модель памяти С++. Атомарные операции. Внеочередное выполнение инструкций. Барьеры памяти. Семантика захвата-освобождения
Курс "Параллельные вычислительные технологии" (ПВТ), весна 2015
Сибирский государственный университет телекоммуникаций и информатики
Пазников Алексей Александрович
к.т.н., доцент кафедры вычислительных систем СибГУТИ
http://cpct.sibsutis.ru/~apaznikov
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
Евгений Крутько, НИЦ «Курчатовский институт».
В докладе на примере программы моделирования динамики движения конструкций по методу конечных элементов рассматриваются возможности и практика распараллеливания вычислений. Речь в нём пойдёт как о технике создания новых вычислительных потоков, так и об использовании стандартов openMP и MPI.
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Нескучная гирлянда на новогодние праздники и приятная подсветка в течение года. Программируем ардуино со смартфона по блютусу.
Материалы со встречи:
https://getdev.net/Event/arduino
Мы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
Языки C, C++ и C++0x как набор ножей по дереву. С их помощью создаются великолепные изделия, но немного неаккуратности и можно глубоко порезаться. Одной из самых ранних методик обнаружения ошибок в коде программ является статический анализ кода. Запуская анализ сразу после написания нового кода или во время ночных сборок, можно выявить множество ошибок еще до этапа тестирования. Это сокращает стоимость и время их исправления. Также могут быть обнаружены дефекты, редко проявляющие себя, которые могут являться головной болью на протяжении многих месяцев сопровождения программы.
В докладе будет продемонстрировано множество примеров ошибок в известных open source программах и библиотеках, которые можно обнаружить с помощью статических анализаторов.
Dmitry Andreev, Microsoft
DirectX12 enables graphics intensive apps to deliver better performance with greater flexibility and control. This technical session goes deep into the DirectX12 APIs you can use to reduce CPU rendering overhead, manage GPU resource usage more efficiently, and express the most cutting-edge 3D graphics possible across the spectrum of Windows devices.
overview of development tools for computing Gpgpucorehard_by
Производительность современных графических процессоров растет гораздо быстрее производительности центральных и в настоящее время в некоторых задачах уже превосходит их на порядок. Поэтому для создания приложений с производительностью опережающей решения конкурентов компании все чаще начинают использовать этот ресурс. GPGPU - неспециализированные (т.е. связанные не только с графикой) вычисления на графических процессорах. Рассмотрим актуальные технологии для написания GPGPU приложений (CUDA, OpenCL, OpenACC и не только). В качестве критериев оценки будут выступать - функционал, скорость разработки, спектр поддерживаемых устройств, языков и компиляторов, удобство отладки и профилирования. Примером практического применения GPGPU выступит реализация алгоритма подавления шума на изображениях.
Similar to 11 встреча — Введение в GPGPU (А. Свириденков) (20)
5 встреча Smolensk Computer Science Club
Презентация Анатолий Свириденкова про информационную безопасность
ВКонтакте: http://vk.com/scsc5
Видео (фрагмент): http://www.youtube.com/watch?v=YmORMZGFvgo
2 встреча Smolensk Computer Science Club
Презентация Александра Фединцева про биоинформатику
ВКонтакте: http://vk.com/scsc2
Видео: https://www.youtube.com/watch?v=b3TZEeeIQ1c
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
- Кластеры
Примеры параллелизма
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)
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 снижают быстродействие
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
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 по-русски