SlideShare ist ein Scribd-Unternehmen logo
1 von 65
Downloaden Sie, um offline zu lesen
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Обзор средств разработки для
вычислений на GPGPU
Артур Молчанов
2016
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
О чем пойдет речь?
GPGPU General Purpose Graphics Processing Unit
GPGPU General-purpose computing for graphics
processing unit
Общее в определениях — в вычислениях общего
назначения участвует графический процессор.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Зачем?
Вычислительная мощность GPU в разы выше мощности
CPU с сопоставимой ценой и потребляемой энергией.
Таблица 1: Сравнение CPU и GPU
Устройство
GFLOPS Мощ-
ность
(макс.),
Вт
Цена,
$
64
bit
32
bit
i7-5960X (8 cores@3GHz) 384 768 140 1100
GeForce GTX Titan Black 1707 5121 250 999
GeForce GTX Titan X 192 6144 250 999
Radeon R9 Fury X 537 8602 275 649
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Зачем?
Разрыв в скорости CPU и GPU в последнее время лишь
растет (знаменитые +5% у новых процессоров Intel)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Причины превосходства GPU
В CPU вычислительные блоки занимают меньшую часть
кристалла. Площадь кристалла CPU, как правило,
меньше площади GPU.
(a) i7-5960X (355
мм2, 2.6 млрд.
транзисторов)
(b) GM200 (601 мм2, 8 млрд.
транзисторов)
Рис. 1: Кристаллы CPU и GPU
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Причины превосходства GPU
CPU оптимизирован для выполнения однопоточных
приложений с малой задержкой:
• Большой кэш
• Длинный конвейер
• Сложные блоки предсказания ветвлений
Intel и GPGPU
Intel тоже хочет заработать на SIMD устройствах и
выпустила ряд решений на архитектуре MIC (Many
Integrated Core Architecture), который включает в себя и
относительно известный Xeon Phi, представляющий из
себя процессор имеющий до 61 x86 ядра с 16 GB GDDR5
и интерфейс PCI-e (только стоит это ∼$4000).
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Общее у CPU и GPU
CPU тоже является SIMD устройством — в нем
содержатся блоки, выполняющие за один такт
арифметические операции над 256-битными векторами,
что эквивалентно 16 операциям над 16-битными
числами.
Также CPU может выполнять несколько независимых
операций одновременно.
Рис. 2: Исполнительное устройство CPU Haswell
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
История развития видеокарт
2002-2003 гг. Выход видеокарт на чипах NV30 (NVIDIA
GeForce FX) и R300 (AMD (ATI) Radeon 9500). В
них была реализована программируемая
шейдерная архитектура второй версии,
точность вычислений значительно
повысилась, что заметно расширило область
применения.
2006 г. NVIDIA представила GeForce 8800 — первую
видеокарту с унифицированной шейдерной
архитектурой.
GeForce 8800 имел 128 унифицированных
потоковых процессоров, способных работать
с любыми данными в формате с плавающей
запятой.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
История развития средств разработки
2003 г. BrookGPU — компилятор, позволивший
абстрагироваться от графического API
(OpenGL, Direct3D)
2007 г. релиз публичной бета-версии CUDA SDK
2008 г. AMD официально предоставила доступ к
Stream для массовых пользователей
2009 г. релиз Mac OS X 10.6 с поддержкой OpenCL.
Релиз NVIDIA и ATI SDK с поддержкой OpenCL
2009 г. релиз DirectX 11, включающий DirectCompute
2012 г. релиз Visual Studio с поддержкой C++AMP
2012 г. релиз Android 4.2 с поддержкой ускорения
Renderscript на GPU
2015 г. релиз GCC 5.1 с поддержкой OpenACC
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
CUDA
Задачи, выполняемые на GPU, представляют собой
функции со спецификатором __global__, называемые
kernel.
Синтаксис — расширенный C99/C++11.
1 __global__ void SumVectors(float const* a, float const* b, int
size, float* c)→
2 {
3 int const i = threadIdx.x + blockIdx.x * blockDim.x;
4
5 if (i >= size)
6 {
7 return;
8 }
9
10 c[i] = a[i] + b[i];
11 }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Выполнение kernel
Вызов kernel аналогичен любой другой функции.
Отличие — в ”<<<...>>>” указывается конфигурация
потоков выполнения.
1 int main()
2 {
3 // ...
4 int const threadsPerBlock = 512;
5 int const blocksCount = (size - 1) / threadsPerBlock + 1;
6
7 dim3 const dimBlock(threadsPerBlock, 1, 1);
8 dim3 const dimGrid(blocksCount, 1, 1);
9
10 vecAdd<<<dimGrid, dimBlock>>>(deviceA, deviceB, size,
deviceC);→
11 }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Модель выполнения I
Потоки
Выполнением kernel занимаются потоки.
Блоки
Потоки группируются в блоки.
Причина — не все потоки имеют общую быструю
разделяюмую память (shared memory) и могут
синхронизироваться, а лишь те, кто выполняется на
одном мультипроцессоре.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Модель выполнения II
Грид (grid)
Блоки объединяются в грид (grid),
Блоки и грид имеют 3 измерения.
Причина — чаще всего массив данных имеет до 3
измерений.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Модель выполнения III
Рис. 3: Модель выполнения CUDA
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Сборка
Для компиляции используется nvcc.
Код, выполняемый на CPU перенаправляется системному
компилятору (GCC, MS VC++).
nvcc генерирует PTX код и/или cubin.
PTX
”Ассемблер” для GPU. Во время запуска приложения
происходит трансляция в бинарный формат cubin,
подходящий GPU.
cubin
ELF-файл, содержащий код, для выполнения на GPU,
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Состав CUDA
Помимо Runtime и Driver API в состав CUDA входят
библиотеки:
cuBLAS реализация BLAS (Basic Linear Algebra
Subprograms)
cuFFT реализация библиотеки быстрого
преобразования Фурье
cuRand библиотека генерации случайных чисел
cuSPARSE библиотека линейной алгебры разреженных
матриц
NPP набор GPU-ускоренных функций для
обработки изображений, видео и сигналов
cuSOLVER набор решателей для плотных и
разреженных матриц
Thrust STL-подобные шаблонные интерфейсы для
некоторых алгоритмов и структур данных
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Системные требования I
Аппаратное обеспечение
Видеокарты NVIDIA начиная с G80 (GeForce 8800 GTX)
Спектр поддерживаемых возможностей (compute
capability) отличается для разных поколений
видеокарт.
ОС
• Windows
• Linux
• Mac OS X
Компиляторы
• Visual C++ 10.0 - Visual C++ 12.0
• GCC 4.3.4 - 4.9.2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Системные требования II
IDE (плагин)
• Visual Studio 2010 - 2013
• Eclipse (поставляется в комплекте с SDK для Linux)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отладка I
• cuda-gdb — gdb с поддержкой отладки kernel
• cuda-memcheck — отладка ошибок доступа к памяти
• Eclipse
• Visual Studio
Выхлоп cuda-memcheck
1 ========= CUDA-MEMCHECK
2 [src/Denoise] - Starting...
3 ========= Invalid __global__ write of size 4
4 ========= at 0x00000628 in
kernels/Gaussian.cu:77:GaussianGpuKernel(float const *,
float const *, int, int, float*)
→
→
5 ========= by thread (15,3,0) in block (49,0,0)
6 ========= Address 0x0100063c is out of bounds
7 ========= Saved host backtrace up to driver entry point at
kernel launch time→
8 ========= Host Frame:/usr/lib64/libcuda.so.1 (cuLaunchKernel
+ 0x2cd) [0x15865d]→
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отладка II
9 ========= Host Frame:src/Denoise [0x25bf1]
10 ========= Host Frame:src/Denoise [0x40403]
11 ========= Host Frame:src/Denoise
(_Z17GaussianGpuKernelPKfS0_iiPf + 0xb0) [0x109a0]→
12 ========= Host Frame:src/Denoise
(_Z12GaussianGpu0RKSt6vectorIS_IfSaIfEESaIS1_EEPKfiiRS3_ +
0x311) [0x10d71]
→
→
13 ========= Host Frame:src/Denoise (main + 0x4cd) [0x988d]
14 ========= Host Frame:/lib64/libc.so.6 (__libc_start_main +
0xf5) [0x21b05]→
15 ========= Host Frame:src/Denoise [0x9d1f]
16 CUDA error at kernels/Gaussian.cu:176
code=4(cudaErrorLaunchFailure) "cudaDeviceSynchronize()"→
17 ========= Program hit cudaErrorLaunchFailure (error 4) due to
"unspecified launch failure" on CUDA API call to
cudaDeviceSynchronize.
→
→
18 ========= Saved host backtrace up to driver entry point at
error→
19 ========= Host Frame:/usr/lib64/libcuda.so.1 [0x2f31b3]
20 ========= Host Frame:src/Denoise [0x443f6]
21 ========= Host Frame:src/Denoise
(_Z12GaussianGpu0RKSt6vectorIS_IfSaIfEESaIS1_EEPKfiiRS3_ +
0x1f1) [0x10c51]
→
→
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отладка III
22 ========= Host Frame:src/Denoise (main + 0x4cd) [0x988d]
23 ========= Host Frame:/lib64/libc.so.6 (__libc_start_main +
0xf5) [0x21b05]→
24 ========= Host Frame:src/Denoise [0x9d1f]
25 =========
26 ========= ERROR SUMMARY: 33 errors
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отладка IV
Рис. 4: Отладка CUDA в Eclipse
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Профилирование I
• nvprof
• NVIDIA Visual Profiler (как отдельное приложение, так
и часть плагинов для Visual Studio и Eclipse)
Рис. 5: Профилирование CUDA в Eclipse
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Продукты использующие CUDA I
• библиотеки
cuDNN библиотека с поддержкой GPU
примитивов для глубинных нейронных
сетей
ArrayFire библиотека C/C++/Java/Fortran,
содержащая сотни функций
используемых в арифметике, линейная
алгебре, статистике, обработке сигналов,
обработке изображений и связанных с
ними алгоритмов
OpenCV библиотека для машинного зрения,
обработки изображений и машинного
обучения
NVBIO C++ фреймворк для анализа
генетических последовательностей
HiPLAR пакеты для R, позволяющие ускорить
функции линейной алгебры
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Продукты использующие CUDA II
FFmpeg набор мультимедиа библиотек, которые
позволяют записывать, конвертировать и
передавать цифровые аудио- и
видеозаписи в различных форматах
NVIDIA Video Codec SDK библиотеки для аппаратного
кодирования/декодирования H.264 и
H.265
и множество других
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
OpenCL
Фреймворк для написания параллельных приложений
без привязки к производителю.
OpenCL разрабатывается и поддерживается
некоммерческим консорциумом Khronos Group. В его
состав входит и NVIDIA. Этим объясняется схожесть с
CUDA.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отличия от CUDA I
• Широкий спектр поддерживаемых устройств
CPU Intel, AMD, IBM Power, Qualcomm
Snapdragon
GPU NVIDIA, AMD, Intel, Mali, Qualcomm Adreno
FPGA Altera, Xilinx
DSP TI AM57x, TI 66AK2H SoC
Intel MIC Xeon Phi
• Отсутствие необходимости в специальном
компиляторе
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отличия от CUDA II
Таблица 2: Эквиваленты CUDA и OpenCL
OpenCL CUDA
host host
device device
kernel kernel
host program host program
NDRange (index space) grid
work item thread
work group block
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Kernel
Задачи, выполняемые на GPU, представляют собой
функции со спецификатором __kernel, называемые
kernel.
Синтаксис — расширенный C99/C++14 (начиная с версии
2.1).
1 __kernel void SumVectors(__global float const* a, __global float
const* b, int size, __global float* c)→
2 {
3 int const i = get_global_id(0);
4
5 if (i >= size)
6 {
7 return;
8 }
9
10 c[i] = a[i] + b[i];
11 }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Выполнение kernel I
В отличие от CUDA, исходный код OpenCL компилируется
во время выполнения, т.к. используются стандартные
компиляторы.
1 int main()
2 {
3 // ...
4 char const* sumVectorsSrc =
5 "__kernel void SumVectors(__global float const* a, __global
float const* b, int size, __global float* c)"→
6 "{"
7 " int const i = get_global_id(0);"
8 ""
9 "if (i >= size)"
10 "{"
11 " return;"
12 "}"
13 ""
14 "c[i] = a[i] + b[i];"
15 "}";
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Выполнение kernel II
16
17 std::string const clCompileFlags = "-cl-mad-enable";
18
19 cl_program sumProgram = clCreateProgramWithSource(clContext,
1, &sumVectorsSrc, NULL, &clError);→
20 CL_CHECK_ERROR(clBuildProgram(sumProgram, 0, NULL,
clCompileFlags.c_str(), NULL, NULL));→
21 cl_kernel const sumKernel = clCreateKernel(sumProgram,
"SumVectors", &clError);→
После компиляции мы получили kernel — sumKernel.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Выполнение kernel III
Теперь необходимо задать значения аргументов kernel.
22 // ...
23 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 0, sizeof(deviceA),
(void *) &deviceA));→
24 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 1, sizeof(deviceB),
(void *) &deviceB));→
25 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 2, sizeof(size),
&size));→
26 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 3, sizeof(deviceC),
(void *) &deviceC));→
27 // ...
Теперь необходимо задать конфигурацию потоков и
запустить kernel.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Выполнение kernel IV
27 // ...
28 cl_event event = NULL;
29
30 size_t const localSize = 512;
31 size_t const globalSize = localSize * ((size - 1) / localSize +
1);→
32
33 CL_CHECK_ERROR(
34 clEnqueueNDRangeKernel(clCommandQueue, sumVectorsKernel, 1, NULL,
&globalSize, &localSize, 0, NULL, &event));→
35 CL_CHECK_ERROR(clWaitForEvents(1, &event));
Voilà!
Мы наконец-то запустили программу.
Такие сложности обусловлены универсальностью
OpenCL — за все приходится платить.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Сборка
Т.к. нет привязки к компилятору, то достаточно лишь
иметь заголовочные файлы и библиотеку OpenCL.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Системные требования
OpenCL не накладывает никаких ограничений. Задача
производителя оборудования обеспечить поддержку
OpenCL.
Удобство программирования и отладки зависит от IDE.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отладка
• GDB >= 7.3
• Intel OpenCL debugger для Visual Studio (только CPU)
• AMD CodeXL
• IBM OpenCL SDK
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Профилирование
• NVIDIA Visual Profiler
• Intel System Analyzer и Platform Analyzer из OpenCL
SDK
• Intel VTune Amplifier
• AMD CodeXL
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Продукты использующие OpenCL I
• библиотеки
ArrayFire библиотека C/C++/Java/Fortran,
содержащая сотни функций
используемых в арифметике, линейная
алгебре, статистике, обработке сигналов,
обработке изображений и связанных с
ними алгоритмов
Bolt STL-подобная библиотека, использующая
OpenCL или C++AMP для ускорения
алгоритмов
Boost.Compute STL-подобная библиотека,
использующая OpenCL и CUDA
clMath реализации FFT и BLAS
MainConcept SDK библиотеки для аппаратного
кодирования/декодирования H.264, H.265
и MPEG-2
и множество других
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
OpenACC I
OpenACC (Open Accelerators) — программный стандарт
для параллельного программирования.
Как и в OpenMP для указания участков кода,
выполняющихся параллельно, используются директивы
компилятора.
Отличие — код может выполняться как на CPU так и на
GPU.
1 void SumVectors(float const * a, float const * b, int size, float
* restrict c) {→
2 #pragma acc kernels copyin(a[0:size],b[0:size]),
copyout(c[0:size])→
3 for (int i = 0; i < size; ++i)
4 {
5 c[i] = a[i] + b[i];
6 }
7 }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
OpenACC II
#pragma acc kernels нижележащий блок кода будет
скомпилирован в kernel
copyin(a[0:size],b[0:size]) данные из массивов a и b
будут скопированы из локальной памяти в
память девайса
[0:size] диапазон индекса массива для
копирования
copyout(c[0:size])) данные из массива с будут
скопированы из памяти девайса в локальную
память
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Сборка
Для компиляции требуется лишь компилятор,
поддерживающий OpenACC.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Системные требования I
OpenACC не налагает никаких ограничений на
программное или аппаратное обеспечение.
Дело за разработчиками компиляторов.
Аппаратное обеспечение
• видеокарты NVIDIA Tesla с compute capability 2.0 и
выше
• видеокарты AMD Radeon HD Graphics 7x00
• AMD APU с AMD Radeon HD Graphics R7
• CPU
• Xeon Phi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Системные требования II
ОС
• Windows
• Linux
• Mac OS X
Компиляторы
• PGI Accelerator Compilers
• Cray compiler
• GCC 5.1
• NVIDIA OpenACC Toolkit (основан на компиляторе PGI)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Отладка
• GDB
• cuda-gdb (для NVIDIA)
• TotalView OpenACC debugger
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Профилирование
• запуск приложения, собранного компилятором PGI, с
переменной окружения PGI_ACC_TIME=1
• NVIDIA Visual Profiler
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Что осталось за кадром
Кроме низкоуровневых API таких как OpenCL и CUDA
существуют и вспомогательные библиотеки,
предоставляющие алгоритмы и структуры данных,
способных использовать ресурсы GPU.
C++AMP Обертка над DirectCompute. Есть ”из
коробки” в Visual Studio с версии 2012
Thrust Входит в состав CUDA
Bolt Поддерживает OpenCL и C++AMP
Boost.Compute использует OpenCL
ArrayFire CUDA, OpenCL
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Реализация Гауссова сглаживания на CUDA
Гауссово сглаживание заключается в суммировании
значения цветовых каналов соседних пикселей с
коэффициентами равными значению функции Гаусса.
0.195
0.078 0.078
0.0780.078
0.123
0.123
0.123
0.123
Рис. 6: Коэффициенты Гаусcова сглаживания
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Входной файл и железо I
В качестве входного файла использовалась
фотогорафия 24 МП (6016x4000).
Видеокарта — GeForce GTX 980 Ti
CPU — i7-5960X
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Простейшее ядро I
1 __global__ void GaussianGpuKernel(float const *src, float const *
mask, int width, int height, float *dst)→
2 {
3 int const xInImage = threadIdx.x + blockDim.x * blockIdx.x;
4 int const yInImage = threadIdx.y + blockDim.y * blockIdx.y;
5
6 if (xInImage > width - 1 || yInImage > height - 1)
7 {
8 return;
9 }
10
11 float sum = 0;
12
13 for (int yInMask = -MASK_RADIUS; yInMask <= MASK_RADIUS;
++yInMask)→
14 {
15 for (int xInMask = -MASK_RADIUS; xInMask <= MASK_RADIUS;
++xInMask)→
16 {
17 int const pixelToSumX = xInImage + xInMask;
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Простейшее ядро II
18 int const pixelToSumY = yInImage + yInMask;
19
20 if (pixelToSumX < 0 || pixelToSumX > width - 1 ||
21 pixelToSumY < 0 || pixelToSumY > height - 1)
22 {
23 continue;
24 }
25
26 float const coefficient = mask[(yInMask + MASK_RADIUS) *
MASK_SIZE + xInMask + MASK_RADIUS];→
27 float const pixelValue = src[pixelToSumY * width +
pixelToSumX] * coefficient;→
28
29 sum += pixelValue;
30 }
31 }
32
33 dst[yInImage * width + xInImage] = sum;
34 }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Простейшее ядро - профилирование I
Рис. 7: Профилирование простейшего ядра
Таблица 3: Результаты выполнения простейшего ядра
Операция Время, мс.
cudaMalloc 200
Memcpy HostToDevice 29
Memcpy DeviceToHost 23
Compute 27 (3 * 9)
Total 279 мс
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Простейшее ядро - профилирование II
Проблема
Время, затраченное на аллокацию памяти в видеокарте
(200 мс) значительно больше времени затраченного на
вычисления и передачу данных (79 мс).
Решение
Причина — инициализация контекста CUDA занимает
много времени
Инициализацию контекста можно провести
принудительно во время запуска приложения, например
вызовом cudaFree(nullptr).
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Простейшее ядро - профилирование III
Рис. 8: Профилирование простейшего ядра после
инициализации контекста
cudaMalloc вместо 200 мс заняло 0.3 мс.
Суммарное время снизилось с 279 мс до 79 мс.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с использованием кэша I
Проблема
Среди наших данных есть 2 не модифицирующихся
массива — mask и src. Они, хотя и помечены как float
const *, но компилятор не может быть уверенным, что эти
массивы или их части не модифицируется (например,
из-за перекрывающихся областей). Поэтому
кэшироваться данные в них не будут.
Решение
Пометить аргумент как __restrict__
NVIDIA Visual Profiler позволяет получить подробную
информацию об использовании ресурсов (и даже дать
советы по поводу оптимизации производительности).
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с использованием кэша II
(a) До оптимизации
(b) После оптимизации
Рис. 9: Использование кэша
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с использованием кэша III
Время выполнения ядра снизилось с 9 мс до 1.6 мс
Суммарное время выполнения — с 79 мс до 56 мс.
1 __global__ void GaussianGpuKernel(float const * __restrict__ src,
float const * __restrict__ mask, int width, int height, float
*dst)
→
→
2 {
3 // ...
4 }
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с асинхронным выполнением I
Проблема
Во время копирования данных в девайс или из девайса
GPU не выполняет следующее ядро.
В итоге вычислительная мощность простаивает.
Решение
CUDA (и видеокарты на аппаратном уровне)
поддерживает параллельное копирование и выполнение
ядер (нескольких параллельно, если позволяет
мощность).
Для этого необходимо использовать стримы плюс
пометить область памяти на хосте как non pageable.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с асинхронным выполнением II
Рис. 10: Профилирование асинхронного ядра
1 // ...
2 std::size_t const streamsCount = 3;
3 cudaStream_t streams[streamsCount];
4 checkCudaErrors(cudaStreamCreate(&streams[0]));
5 checkCudaErrors(cudaStreamCreate(&streams[1]));
6 checkCudaErrors(cudaStreamCreate(&streams[2]));
7
8 checkCudaErrors(cudaHostRegister((void*) srcRed, dataSize, 0));
9 checkCudaErrors(cudaHostRegister((void*) srcGreen, dataSize, 0));
10 checkCudaErrors(cudaHostRegister((void*) srcBlue, dataSize, 0));
11
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с асинхронным выполнением III
12 checkCudaErrors(cudaMemcpyAsync(deviceSrcRed, src[0].data(),
dataSize, cudaMemcpyHostToDevice, streams[0]));→
13 checkCudaErrors(cudaMemcpyAsync(deviceSrcBlue, src[1].data(),
dataSize, cudaMemcpyHostToDevice, streams[1]));→
14 checkCudaErrors(cudaMemcpyAsync(deviceSrcGreen, src[2].data(),
dataSize, cudaMemcpyHostToDevice, streams[2]));→
15
16 GaussianGpuKernel<<<dimGrid, dimBlock, 0,
streams[0]>>>(deviceSrc, deviceMask, width, height,
deviceDst);
→
→
17 GaussianGpuKernel<<<dimGrid, dimBlock, 0, streams[1]>>>(deviceSrc
+ pixelsCount, deviceMask, width, height,→
18 deviceDst + pixelsCount);
19 GaussianGpuKernel<<<dimGrid, dimBlock, 0, streams[2]>>>(deviceSrc
+ 2 * pixelsCount, deviceMask, width, height,→
20 deviceDst + 2 * pixelsCount);
21
22 checkCudaErrors(cudaHostRegister((void*) dst[0].data(), dataSize,
0));→
23 checkCudaErrors(cudaHostRegister((void*) dst[1].data(), dataSize,
0));→
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Ядро с асинхронным выполнением IV
24 checkCudaErrors(cudaHostRegister((void*) dst[2].data(), dataSize,
0));→
25
26 checkCudaErrors(cudaMemcpyAsync(dst[0].data(), deviceDst,
dataSize, cudaMemcpyDeviceToHost, streams[0]));→
27 checkCudaErrors(cudaMemcpyAsync(dst[1].data(), deviceDst + height
* width, dataSize, cudaMemcpyDeviceToHost, streams[1]));→
28 checkCudaErrors(cudaMemcpyAsync(dst[2].data(), deviceDst + 2 *
height * width, dataSize, cudaMemcpyDeviceToHost,
streams[2]));
→
→
29
30 checkCudaErrors(cudaDeviceSynchronize());
Суммарное время выполнения снизилось с 56 мс до
43 мс.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Оптимизация ядра. Итоги I
Что еще можно оптимизировать:
Частота обращения к глобальной памяти Нужно
использовать shared memory, т.к. для
каждого пикселя мы запрашиваем значения
9 пикселей. А скорость памяти у видеокарты
хоть и высока (∼330 GB/s), но полной
загрузки всех ядер мы не получим.
Выравнивание доступа к памяти Оперативная память
может за один запрос отдавать до 128 байт.
Для получения максимальной пропускной
способности потоки внутри warp-а должны
обращаться к регионам памяти выровненным
на величину транзакции и последовательно.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Оптимизация ядра. Итоги II
Оптимизация алгоритма Вместо использования
двухмерной матрицы с коэффициентами
можно применить последовательно 2
одномерные, что снизит число операций с
k2
wh до 2kwh, где k — ширина матрицы, w —
ширина изображения, h — высота
изображения.
Плохому алгоритму и на топовом железе
мало места.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Оптимизация ядра. Итоги III
Таблица 4: Результаты выполнения асинхронного ядра
Операция Время, мс.
MemcpyAsync HostToDevice 20
MemcpyAsync DeviceToHost 18
Compute 4.8 (3 * 1.6)
Total 43 мс
CPU 500 мс (OpenMP)
Если еще раз взглянуть на результаты, то можно
заметить, что в нашем случае оптимизация ядра ничего
не даст — мы упираемся в копирование данных между
хостом и девайсом.
Задача для GPU оказалась слишком простой.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Итого
Использование GPU может дать большой прирост
производительности. Но при разработке требуется
учитывать особенности программно-аппаратной
архитектуры.
Не все задачи смогут выполниться на GPU быстрее чем
на CPU (имеющие, например, множество ветвлений).
Однако GPGPU уже нашло широкое применение в
различных приложениях от научных и до мультимедиа.
И чтобы быть не хуже конкурентов необходимо уже
сегодня начать рассматривать GPGPU как реальный
способ увеличить производительность.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA
Конец
Спасибо за внимание.

Weitere ähnliche Inhalte

Was ist angesagt?

Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Boris Kizko
 
Лекция 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
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...rit2011
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package managercorehard_by
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
Postgresql v509
Postgresql v509Postgresql v509
Postgresql v509luis perez
 
библиотеки с поддержкой Gpu
библиотеки с поддержкой Gpuбиблиотеки с поддержкой Gpu
библиотеки с поддержкой GpuAnatoliy Sviridenkov
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)Ontico
 
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИССуперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС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
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...Mikhail Kurnosov
 
Базы данных. Hash & Cache
Базы данных. Hash & CacheБазы данных. Hash & Cache
Базы данных. Hash & CacheVadim Tsesko
 
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Ontico
 
Базы данных. Haystack
Базы данных. HaystackБазы данных. Haystack
Базы данных. HaystackVadim Tsesko
 
презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7sasha4334556
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional MemoryVadim Tsesko
 
презентацияевстафьева
презентацияевстафьевапрезентацияевстафьева
презентацияевстафьеваsasha4334556
 

Was ist angesagt? (20)

Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, paral...
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
Обзор OpenCL
Обзор OpenCLОбзор OpenCL
Обзор OpenCL
 
Postgresql v509
Postgresql v509Postgresql v509
Postgresql v509
 
библиотеки с поддержкой Gpu
библиотеки с поддержкой Gpuбиблиотеки с поддержкой Gpu
библиотеки с поддержкой Gpu
 
Как мы храним 75 млн пользователей (Денис Бирюков)
Как мы храним 75 млн пользователей  (Денис Бирюков)Как мы храним 75 млн пользователей  (Денис Бирюков)
Как мы храним 75 млн пользователей (Денис Бирюков)
 
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИССуперсилы Chrome DevTools — Роман Сальников, 2ГИС
Суперсилы Chrome DevTools — Роман Сальников, 2ГИС
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...Использование Time-Stamp Counter для измерения времени выполнения кода  на пр...
Использование Time-Stamp Counter для измерения времени выполнения кода на пр...
 
CUDA-Aware MPI
CUDA-Aware MPICUDA-Aware MPI
CUDA-Aware MPI
 
Базы данных. Hash & Cache
Базы данных. Hash & CacheБазы данных. Hash & Cache
Базы данных. Hash & Cache
 
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
Опыт разработки, отладки и внедрения системы горячего резервирования торговой...
 
Базы данных. Haystack
Базы данных. HaystackБазы данных. Haystack
Базы данных. Haystack
 
презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional Memory
 
презентацияевстафьева
презентацияевстафьевапрезентацияевстафьева
презентацияевстафьева
 

Andere mochten auch

PROTOCOLO REPORTE DE APLICACION AAMTIC
PROTOCOLO REPORTE DE APLICACION AAMTICPROTOCOLO REPORTE DE APLICACION AAMTIC
PROTOCOLO REPORTE DE APLICACION AAMTICEdward Andres
 
nada adel cv
nada adel cvnada adel cv
nada adel cvnada adel
 
Nano-niosomes in drug, vaccine and gene delivery: a rapid overview
Nano-niosomes in drug, vaccine and gene delivery: a rapid overviewNano-niosomes in drug, vaccine and gene delivery: a rapid overview
Nano-niosomes in drug, vaccine and gene delivery: a rapid overviewNanomedicine Journal (NMJ)
 
Scpdf agencia
Scpdf agenciaScpdf agencia
Scpdf agenciacatb24
 
Продвижение региональных сайтов в нише септиков
Продвижение региональных сайтов в нише септиковПродвижение региональных сайтов в нише септиков
Продвижение региональных сайтов в нише септиковСергей Погодаев
 
Chitosan nanoparticle synthesis
Chitosan nanoparticle synthesisChitosan nanoparticle synthesis
Chitosan nanoparticle synthesisChandrika Jram
 
Recent advances in formulation aspects & manufacturing of semisolids
Recent advances in formulation aspects & manufacturing of semisolidsRecent advances in formulation aspects & manufacturing of semisolids
Recent advances in formulation aspects & manufacturing of semisolidsPriyanka Modugu
 

Andere mochten auch (13)

Linkedin
LinkedinLinkedin
Linkedin
 
CV
CVCV
CV
 
Robotryst (certificate)
Robotryst (certificate)Robotryst (certificate)
Robotryst (certificate)
 
Marketing Operations
Marketing OperationsMarketing Operations
Marketing Operations
 
PROTOCOLO REPORTE DE APLICACION AAMTIC
PROTOCOLO REPORTE DE APLICACION AAMTICPROTOCOLO REPORTE DE APLICACION AAMTIC
PROTOCOLO REPORTE DE APLICACION AAMTIC
 
K Buday Resume
K Buday ResumeK Buday Resume
K Buday Resume
 
nada adel cv
nada adel cvnada adel cv
nada adel cv
 
Nano-niosomes in drug, vaccine and gene delivery: a rapid overview
Nano-niosomes in drug, vaccine and gene delivery: a rapid overviewNano-niosomes in drug, vaccine and gene delivery: a rapid overview
Nano-niosomes in drug, vaccine and gene delivery: a rapid overview
 
Scpdf agencia
Scpdf agenciaScpdf agencia
Scpdf agencia
 
Etihad Letter.PDF
Etihad Letter.PDFEtihad Letter.PDF
Etihad Letter.PDF
 
Продвижение региональных сайтов в нише септиков
Продвижение региональных сайтов в нише септиковПродвижение региональных сайтов в нише септиков
Продвижение региональных сайтов в нише септиков
 
Chitosan nanoparticle synthesis
Chitosan nanoparticle synthesisChitosan nanoparticle synthesis
Chitosan nanoparticle synthesis
 
Recent advances in formulation aspects & manufacturing of semisolids
Recent advances in formulation aspects & manufacturing of semisolidsRecent advances in formulation aspects & manufacturing of semisolids
Recent advances in formulation aspects & manufacturing of semisolids
 

Ähnlich wie обзор средств разработки для вычислений Gpgpu

Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктурыОбработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктурыVsevolod Shabad
 
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...IBS
 
Современные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO StorageСовременные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO StorageDEPO Computers
 
Hpc 1.24.02.2013.
Hpc 1.24.02.2013.Hpc 1.24.02.2013.
Hpc 1.24.02.2013.Boris Kizko
 
DirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDevGAMM Conference
 
Инструментарий Nvidia для deep learning
Инструментарий Nvidia для deep learningИнструментарий Nvidia для deep learning
Инструментарий Nvidia для deep learningSkolkovo Robotics Center
 
Cisco UCS полный обзор
Cisco UCS полный обзорCisco UCS полный обзор
Cisco UCS полный обзорLiubov Belousova
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
Как повысить доступность данных с помощью IBM SAN Volume Controller
Как повысить доступность данных с помощью IBM SAN Volume ControllerКак повысить доступность данных с помощью IBM SAN Volume Controller
Как повысить доступность данных с помощью IBM SAN Volume ControllerКРОК
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015OSLL
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeARCCN
 
Новости семейства Cisco UCS
Новости семейства Cisco UCSНовости семейства Cisco UCS
Новости семейства Cisco UCSCisco Russia
 
озеров в. Delphi. советы программистов (2004)
озеров в. Delphi. советы программистов (2004)озеров в. Delphi. советы программистов (2004)
озеров в. Delphi. советы программистов (2004)StAlKeRoV
 
Гиперконвергентное решение Cisco HyperFlex
Гиперконвергентное решение Cisco HyperFlexГиперконвергентное решение Cisco HyperFlex
Гиперконвергентное решение Cisco HyperFlexCisco Russia
 
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...VThn18
 

Ähnlich wie обзор средств разработки для вычислений Gpgpu (20)

Gpgpu
GpgpuGpgpu
Gpgpu
 
OpenACC short review
OpenACC short reviewOpenACC short review
OpenACC short review
 
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктурыОбработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
Обработка спйсмоданных: возможности оптимизации ИТ-инфраструктуры
 
Conflux: GPGPU .NET
Conflux: GPGPU .NETConflux: GPGPU .NET
Conflux: GPGPU .NET
 
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
Максим Исаев, IBS. Практика использования комплекса Veritas NetBackup для мод...
 
Современные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO StorageСовременные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO Storage
 
Hpc 1.24.02.2013.
Hpc 1.24.02.2013.Hpc 1.24.02.2013.
Hpc 1.24.02.2013.
 
DirectX12 Graphics and Performance
DirectX12 Graphics and PerformanceDirectX12 Graphics and Performance
DirectX12 Graphics and Performance
 
Efficiency vvv
Efficiency vvvEfficiency vvv
Efficiency vvv
 
Инструментарий Nvidia для deep learning
Инструментарий Nvidia для deep learningИнструментарий Nvidia для deep learning
Инструментарий Nvidia для deep learning
 
Cisco UCS полный обзор
Cisco UCS полный обзорCisco UCS полный обзор
Cisco UCS полный обзор
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
Как повысить доступность данных с помощью IBM SAN Volume Controller
Как повысить доступность данных с помощью IBM SAN Volume ControllerКак повысить доступность данных с помощью IBM SAN Volume Controller
Как повысить доступность данных с помощью IBM SAN Volume Controller
 
Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015Linuxvirt seminar-csc-2015
Linuxvirt seminar-csc-2015
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
GRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network InitiativeGRANIT — Global Russian Advanced Network Initiative
GRANIT — Global Russian Advanced Network Initiative
 
Новости семейства Cisco UCS
Новости семейства Cisco UCSНовости семейства Cisco UCS
Новости семейства Cisco UCS
 
озеров в. Delphi. советы программистов (2004)
озеров в. Delphi. советы программистов (2004)озеров в. Delphi. советы программистов (2004)
озеров в. Delphi. советы программистов (2004)
 
Гиперконвергентное решение Cisco HyperFlex
Гиперконвергентное решение Cisco HyperFlexГиперконвергентное решение Cisco HyperFlex
Гиперконвергентное решение Cisco HyperFlex
 
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
 

Mehr von COMAQA.BY

Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...COMAQA.BY
 
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...COMAQA.BY
 
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...COMAQA.BY
 
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьRoman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьCOMAQA.BY
 
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...COMAQA.BY
 
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...COMAQA.BY
 
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...COMAQA.BY
 
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...COMAQA.BY
 
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.COMAQA.BY
 
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.COMAQA.BY
 
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...COMAQA.BY
 
Моя роль в конфликте
Моя роль в конфликтеМоя роль в конфликте
Моя роль в конфликтеCOMAQA.BY
 
Организация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковОрганизация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковCOMAQA.BY
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смертьCOMAQA.BY
 
Системный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестовСистемный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестовCOMAQA.BY
 
Эффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиЭффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиCOMAQA.BY
 
Как стать синьором
Как стать синьоромКак стать синьором
Как стать синьоромCOMAQA.BY
 
Open your mind for OpenSource
Open your mind for OpenSourceOpen your mind for OpenSource
Open your mind for OpenSourceCOMAQA.BY
 
JDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingJDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingCOMAQA.BY
 
Out of box page object design pattern, java
Out of box page object design pattern, javaOut of box page object design pattern, java
Out of box page object design pattern, javaCOMAQA.BY
 

Mehr von COMAQA.BY (20)

Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
 
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
 
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
 
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьRoman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
 
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
 
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
 
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
 
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
 
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
 
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
 
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
 
Моя роль в конфликте
Моя роль в конфликтеМоя роль в конфликте
Моя роль в конфликте
 
Организация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковОрганизация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиков
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смерть
 
Системный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестовСистемный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестов
 
Эффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиЭффективная работа с рутинными задачами
Эффективная работа с рутинными задачами
 
Как стать синьором
Как стать синьоромКак стать синьором
Как стать синьором
 
Open your mind for OpenSource
Open your mind for OpenSourceOpen your mind for OpenSource
Open your mind for OpenSource
 
JDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingJDI 2.0. Not only UI testing
JDI 2.0. Not only UI testing
 
Out of box page object design pattern, java
Out of box page object design pattern, javaOut of box page object design pattern, java
Out of box page object design pattern, java
 

обзор средств разработки для вычислений Gpgpu

  • 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Обзор средств разработки для вычислений на GPGPU Артур Молчанов 2016
  • 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA О чем пойдет речь? GPGPU General Purpose Graphics Processing Unit GPGPU General-purpose computing for graphics processing unit Общее в определениях — в вычислениях общего назначения участвует графический процессор.
  • 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Зачем? Вычислительная мощность GPU в разы выше мощности CPU с сопоставимой ценой и потребляемой энергией. Таблица 1: Сравнение CPU и GPU Устройство GFLOPS Мощ- ность (макс.), Вт Цена, $ 64 bit 32 bit i7-5960X (8 cores@3GHz) 384 768 140 1100 GeForce GTX Titan Black 1707 5121 250 999 GeForce GTX Titan X 192 6144 250 999 Radeon R9 Fury X 537 8602 275 649
  • 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Зачем? Разрыв в скорости CPU и GPU в последнее время лишь растет (знаменитые +5% у новых процессоров Intel)
  • 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Причины превосходства GPU В CPU вычислительные блоки занимают меньшую часть кристалла. Площадь кристалла CPU, как правило, меньше площади GPU. (a) i7-5960X (355 мм2, 2.6 млрд. транзисторов) (b) GM200 (601 мм2, 8 млрд. транзисторов) Рис. 1: Кристаллы CPU и GPU
  • 6. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Причины превосходства GPU CPU оптимизирован для выполнения однопоточных приложений с малой задержкой: • Большой кэш • Длинный конвейер • Сложные блоки предсказания ветвлений Intel и GPGPU Intel тоже хочет заработать на SIMD устройствах и выпустила ряд решений на архитектуре MIC (Many Integrated Core Architecture), который включает в себя и относительно известный Xeon Phi, представляющий из себя процессор имеющий до 61 x86 ядра с 16 GB GDDR5 и интерфейс PCI-e (только стоит это ∼$4000).
  • 7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Общее у CPU и GPU CPU тоже является SIMD устройством — в нем содержатся блоки, выполняющие за один такт арифметические операции над 256-битными векторами, что эквивалентно 16 операциям над 16-битными числами. Также CPU может выполнять несколько независимых операций одновременно. Рис. 2: Исполнительное устройство CPU Haswell
  • 8. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA История развития видеокарт 2002-2003 гг. Выход видеокарт на чипах NV30 (NVIDIA GeForce FX) и R300 (AMD (ATI) Radeon 9500). В них была реализована программируемая шейдерная архитектура второй версии, точность вычислений значительно повысилась, что заметно расширило область применения. 2006 г. NVIDIA представила GeForce 8800 — первую видеокарту с унифицированной шейдерной архитектурой. GeForce 8800 имел 128 унифицированных потоковых процессоров, способных работать с любыми данными в формате с плавающей запятой.
  • 9. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA История развития средств разработки 2003 г. BrookGPU — компилятор, позволивший абстрагироваться от графического API (OpenGL, Direct3D) 2007 г. релиз публичной бета-версии CUDA SDK 2008 г. AMD официально предоставила доступ к Stream для массовых пользователей 2009 г. релиз Mac OS X 10.6 с поддержкой OpenCL. Релиз NVIDIA и ATI SDK с поддержкой OpenCL 2009 г. релиз DirectX 11, включающий DirectCompute 2012 г. релиз Visual Studio с поддержкой C++AMP 2012 г. релиз Android 4.2 с поддержкой ускорения Renderscript на GPU 2015 г. релиз GCC 5.1 с поддержкой OpenACC
  • 10. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA CUDA Задачи, выполняемые на GPU, представляют собой функции со спецификатором __global__, называемые kernel. Синтаксис — расширенный C99/C++11. 1 __global__ void SumVectors(float const* a, float const* b, int size, float* c)→ 2 { 3 int const i = threadIdx.x + blockIdx.x * blockDim.x; 4 5 if (i >= size) 6 { 7 return; 8 } 9 10 c[i] = a[i] + b[i]; 11 }
  • 11. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Выполнение kernel Вызов kernel аналогичен любой другой функции. Отличие — в ”<<<...>>>” указывается конфигурация потоков выполнения. 1 int main() 2 { 3 // ... 4 int const threadsPerBlock = 512; 5 int const blocksCount = (size - 1) / threadsPerBlock + 1; 6 7 dim3 const dimBlock(threadsPerBlock, 1, 1); 8 dim3 const dimGrid(blocksCount, 1, 1); 9 10 vecAdd<<<dimGrid, dimBlock>>>(deviceA, deviceB, size, deviceC);→ 11 }
  • 12. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Модель выполнения I Потоки Выполнением kernel занимаются потоки. Блоки Потоки группируются в блоки. Причина — не все потоки имеют общую быструю разделяюмую память (shared memory) и могут синхронизироваться, а лишь те, кто выполняется на одном мультипроцессоре.
  • 13. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Модель выполнения II Грид (grid) Блоки объединяются в грид (grid), Блоки и грид имеют 3 измерения. Причина — чаще всего массив данных имеет до 3 измерений.
  • 14. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Модель выполнения III Рис. 3: Модель выполнения CUDA
  • 15. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Сборка Для компиляции используется nvcc. Код, выполняемый на CPU перенаправляется системному компилятору (GCC, MS VC++). nvcc генерирует PTX код и/или cubin. PTX ”Ассемблер” для GPU. Во время запуска приложения происходит трансляция в бинарный формат cubin, подходящий GPU. cubin ELF-файл, содержащий код, для выполнения на GPU,
  • 16. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Состав CUDA Помимо Runtime и Driver API в состав CUDA входят библиотеки: cuBLAS реализация BLAS (Basic Linear Algebra Subprograms) cuFFT реализация библиотеки быстрого преобразования Фурье cuRand библиотека генерации случайных чисел cuSPARSE библиотека линейной алгебры разреженных матриц NPP набор GPU-ускоренных функций для обработки изображений, видео и сигналов cuSOLVER набор решателей для плотных и разреженных матриц Thrust STL-подобные шаблонные интерфейсы для некоторых алгоритмов и структур данных
  • 17. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Системные требования I Аппаратное обеспечение Видеокарты NVIDIA начиная с G80 (GeForce 8800 GTX) Спектр поддерживаемых возможностей (compute capability) отличается для разных поколений видеокарт. ОС • Windows • Linux • Mac OS X Компиляторы • Visual C++ 10.0 - Visual C++ 12.0 • GCC 4.3.4 - 4.9.2
  • 18. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Системные требования II IDE (плагин) • Visual Studio 2010 - 2013 • Eclipse (поставляется в комплекте с SDK для Linux)
  • 19. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отладка I • cuda-gdb — gdb с поддержкой отладки kernel • cuda-memcheck — отладка ошибок доступа к памяти • Eclipse • Visual Studio Выхлоп cuda-memcheck 1 ========= CUDA-MEMCHECK 2 [src/Denoise] - Starting... 3 ========= Invalid __global__ write of size 4 4 ========= at 0x00000628 in kernels/Gaussian.cu:77:GaussianGpuKernel(float const *, float const *, int, int, float*) → → 5 ========= by thread (15,3,0) in block (49,0,0) 6 ========= Address 0x0100063c is out of bounds 7 ========= Saved host backtrace up to driver entry point at kernel launch time→ 8 ========= Host Frame:/usr/lib64/libcuda.so.1 (cuLaunchKernel + 0x2cd) [0x15865d]→
  • 20. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отладка II 9 ========= Host Frame:src/Denoise [0x25bf1] 10 ========= Host Frame:src/Denoise [0x40403] 11 ========= Host Frame:src/Denoise (_Z17GaussianGpuKernelPKfS0_iiPf + 0xb0) [0x109a0]→ 12 ========= Host Frame:src/Denoise (_Z12GaussianGpu0RKSt6vectorIS_IfSaIfEESaIS1_EEPKfiiRS3_ + 0x311) [0x10d71] → → 13 ========= Host Frame:src/Denoise (main + 0x4cd) [0x988d] 14 ========= Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b05]→ 15 ========= Host Frame:src/Denoise [0x9d1f] 16 CUDA error at kernels/Gaussian.cu:176 code=4(cudaErrorLaunchFailure) "cudaDeviceSynchronize()"→ 17 ========= Program hit cudaErrorLaunchFailure (error 4) due to "unspecified launch failure" on CUDA API call to cudaDeviceSynchronize. → → 18 ========= Saved host backtrace up to driver entry point at error→ 19 ========= Host Frame:/usr/lib64/libcuda.so.1 [0x2f31b3] 20 ========= Host Frame:src/Denoise [0x443f6] 21 ========= Host Frame:src/Denoise (_Z12GaussianGpu0RKSt6vectorIS_IfSaIfEESaIS1_EEPKfiiRS3_ + 0x1f1) [0x10c51] → →
  • 21. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отладка III 22 ========= Host Frame:src/Denoise (main + 0x4cd) [0x988d] 23 ========= Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b05]→ 24 ========= Host Frame:src/Denoise [0x9d1f] 25 ========= 26 ========= ERROR SUMMARY: 33 errors
  • 22. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отладка IV Рис. 4: Отладка CUDA в Eclipse
  • 23. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Профилирование I • nvprof • NVIDIA Visual Profiler (как отдельное приложение, так и часть плагинов для Visual Studio и Eclipse) Рис. 5: Профилирование CUDA в Eclipse
  • 24. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Продукты использующие CUDA I • библиотеки cuDNN библиотека с поддержкой GPU примитивов для глубинных нейронных сетей ArrayFire библиотека C/C++/Java/Fortran, содержащая сотни функций используемых в арифметике, линейная алгебре, статистике, обработке сигналов, обработке изображений и связанных с ними алгоритмов OpenCV библиотека для машинного зрения, обработки изображений и машинного обучения NVBIO C++ фреймворк для анализа генетических последовательностей HiPLAR пакеты для R, позволяющие ускорить функции линейной алгебры
  • 25. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Продукты использующие CUDA II FFmpeg набор мультимедиа библиотек, которые позволяют записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах NVIDIA Video Codec SDK библиотеки для аппаратного кодирования/декодирования H.264 и H.265 и множество других
  • 26. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA OpenCL Фреймворк для написания параллельных приложений без привязки к производителю. OpenCL разрабатывается и поддерживается некоммерческим консорциумом Khronos Group. В его состав входит и NVIDIA. Этим объясняется схожесть с CUDA.
  • 27. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отличия от CUDA I • Широкий спектр поддерживаемых устройств CPU Intel, AMD, IBM Power, Qualcomm Snapdragon GPU NVIDIA, AMD, Intel, Mali, Qualcomm Adreno FPGA Altera, Xilinx DSP TI AM57x, TI 66AK2H SoC Intel MIC Xeon Phi • Отсутствие необходимости в специальном компиляторе
  • 28. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отличия от CUDA II Таблица 2: Эквиваленты CUDA и OpenCL OpenCL CUDA host host device device kernel kernel host program host program NDRange (index space) grid work item thread work group block
  • 29. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Kernel Задачи, выполняемые на GPU, представляют собой функции со спецификатором __kernel, называемые kernel. Синтаксис — расширенный C99/C++14 (начиная с версии 2.1). 1 __kernel void SumVectors(__global float const* a, __global float const* b, int size, __global float* c)→ 2 { 3 int const i = get_global_id(0); 4 5 if (i >= size) 6 { 7 return; 8 } 9 10 c[i] = a[i] + b[i]; 11 }
  • 30. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Выполнение kernel I В отличие от CUDA, исходный код OpenCL компилируется во время выполнения, т.к. используются стандартные компиляторы. 1 int main() 2 { 3 // ... 4 char const* sumVectorsSrc = 5 "__kernel void SumVectors(__global float const* a, __global float const* b, int size, __global float* c)"→ 6 "{" 7 " int const i = get_global_id(0);" 8 "" 9 "if (i >= size)" 10 "{" 11 " return;" 12 "}" 13 "" 14 "c[i] = a[i] + b[i];" 15 "}";
  • 31. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Выполнение kernel II 16 17 std::string const clCompileFlags = "-cl-mad-enable"; 18 19 cl_program sumProgram = clCreateProgramWithSource(clContext, 1, &sumVectorsSrc, NULL, &clError);→ 20 CL_CHECK_ERROR(clBuildProgram(sumProgram, 0, NULL, clCompileFlags.c_str(), NULL, NULL));→ 21 cl_kernel const sumKernel = clCreateKernel(sumProgram, "SumVectors", &clError);→ После компиляции мы получили kernel — sumKernel.
  • 32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Выполнение kernel III Теперь необходимо задать значения аргументов kernel. 22 // ... 23 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 0, sizeof(deviceA), (void *) &deviceA));→ 24 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 1, sizeof(deviceB), (void *) &deviceB));→ 25 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 2, sizeof(size), &size));→ 26 CL_CHECK_ERROR(clSetKernelArg(sumKernel, 3, sizeof(deviceC), (void *) &deviceC));→ 27 // ... Теперь необходимо задать конфигурацию потоков и запустить kernel.
  • 33. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Выполнение kernel IV 27 // ... 28 cl_event event = NULL; 29 30 size_t const localSize = 512; 31 size_t const globalSize = localSize * ((size - 1) / localSize + 1);→ 32 33 CL_CHECK_ERROR( 34 clEnqueueNDRangeKernel(clCommandQueue, sumVectorsKernel, 1, NULL, &globalSize, &localSize, 0, NULL, &event));→ 35 CL_CHECK_ERROR(clWaitForEvents(1, &event)); Voilà! Мы наконец-то запустили программу. Такие сложности обусловлены универсальностью OpenCL — за все приходится платить.
  • 34. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Сборка Т.к. нет привязки к компилятору, то достаточно лишь иметь заголовочные файлы и библиотеку OpenCL.
  • 35. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Системные требования OpenCL не накладывает никаких ограничений. Задача производителя оборудования обеспечить поддержку OpenCL. Удобство программирования и отладки зависит от IDE.
  • 36. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отладка • GDB >= 7.3 • Intel OpenCL debugger для Visual Studio (только CPU) • AMD CodeXL • IBM OpenCL SDK
  • 37. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Профилирование • NVIDIA Visual Profiler • Intel System Analyzer и Platform Analyzer из OpenCL SDK • Intel VTune Amplifier • AMD CodeXL
  • 38. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Продукты использующие OpenCL I • библиотеки ArrayFire библиотека C/C++/Java/Fortran, содержащая сотни функций используемых в арифметике, линейная алгебре, статистике, обработке сигналов, обработке изображений и связанных с ними алгоритмов Bolt STL-подобная библиотека, использующая OpenCL или C++AMP для ускорения алгоритмов Boost.Compute STL-подобная библиотека, использующая OpenCL и CUDA clMath реализации FFT и BLAS MainConcept SDK библиотеки для аппаратного кодирования/декодирования H.264, H.265 и MPEG-2 и множество других
  • 39. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA OpenACC I OpenACC (Open Accelerators) — программный стандарт для параллельного программирования. Как и в OpenMP для указания участков кода, выполняющихся параллельно, используются директивы компилятора. Отличие — код может выполняться как на CPU так и на GPU. 1 void SumVectors(float const * a, float const * b, int size, float * restrict c) {→ 2 #pragma acc kernels copyin(a[0:size],b[0:size]), copyout(c[0:size])→ 3 for (int i = 0; i < size; ++i) 4 { 5 c[i] = a[i] + b[i]; 6 } 7 }
  • 40. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA OpenACC II #pragma acc kernels нижележащий блок кода будет скомпилирован в kernel copyin(a[0:size],b[0:size]) данные из массивов a и b будут скопированы из локальной памяти в память девайса [0:size] диапазон индекса массива для копирования copyout(c[0:size])) данные из массива с будут скопированы из памяти девайса в локальную память
  • 41. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Сборка Для компиляции требуется лишь компилятор, поддерживающий OpenACC.
  • 42. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Системные требования I OpenACC не налагает никаких ограничений на программное или аппаратное обеспечение. Дело за разработчиками компиляторов. Аппаратное обеспечение • видеокарты NVIDIA Tesla с compute capability 2.0 и выше • видеокарты AMD Radeon HD Graphics 7x00 • AMD APU с AMD Radeon HD Graphics R7 • CPU • Xeon Phi
  • 43. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Системные требования II ОС • Windows • Linux • Mac OS X Компиляторы • PGI Accelerator Compilers • Cray compiler • GCC 5.1 • NVIDIA OpenACC Toolkit (основан на компиляторе PGI)
  • 44. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Отладка • GDB • cuda-gdb (для NVIDIA) • TotalView OpenACC debugger
  • 45. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Профилирование • запуск приложения, собранного компилятором PGI, с переменной окружения PGI_ACC_TIME=1 • NVIDIA Visual Profiler
  • 46. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Что осталось за кадром Кроме низкоуровневых API таких как OpenCL и CUDA существуют и вспомогательные библиотеки, предоставляющие алгоритмы и структуры данных, способных использовать ресурсы GPU. C++AMP Обертка над DirectCompute. Есть ”из коробки” в Visual Studio с версии 2012 Thrust Входит в состав CUDA Bolt Поддерживает OpenCL и C++AMP Boost.Compute использует OpenCL ArrayFire CUDA, OpenCL
  • 47. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Реализация Гауссова сглаживания на CUDA Гауссово сглаживание заключается в суммировании значения цветовых каналов соседних пикселей с коэффициентами равными значению функции Гаусса. 0.195 0.078 0.078 0.0780.078 0.123 0.123 0.123 0.123 Рис. 6: Коэффициенты Гаусcова сглаживания
  • 48. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Входной файл и железо I В качестве входного файла использовалась фотогорафия 24 МП (6016x4000). Видеокарта — GeForce GTX 980 Ti CPU — i7-5960X
  • 49. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Простейшее ядро I 1 __global__ void GaussianGpuKernel(float const *src, float const * mask, int width, int height, float *dst)→ 2 { 3 int const xInImage = threadIdx.x + blockDim.x * blockIdx.x; 4 int const yInImage = threadIdx.y + blockDim.y * blockIdx.y; 5 6 if (xInImage > width - 1 || yInImage > height - 1) 7 { 8 return; 9 } 10 11 float sum = 0; 12 13 for (int yInMask = -MASK_RADIUS; yInMask <= MASK_RADIUS; ++yInMask)→ 14 { 15 for (int xInMask = -MASK_RADIUS; xInMask <= MASK_RADIUS; ++xInMask)→ 16 { 17 int const pixelToSumX = xInImage + xInMask;
  • 50. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Простейшее ядро II 18 int const pixelToSumY = yInImage + yInMask; 19 20 if (pixelToSumX < 0 || pixelToSumX > width - 1 || 21 pixelToSumY < 0 || pixelToSumY > height - 1) 22 { 23 continue; 24 } 25 26 float const coefficient = mask[(yInMask + MASK_RADIUS) * MASK_SIZE + xInMask + MASK_RADIUS];→ 27 float const pixelValue = src[pixelToSumY * width + pixelToSumX] * coefficient;→ 28 29 sum += pixelValue; 30 } 31 } 32 33 dst[yInImage * width + xInImage] = sum; 34 }
  • 51. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Простейшее ядро - профилирование I Рис. 7: Профилирование простейшего ядра Таблица 3: Результаты выполнения простейшего ядра Операция Время, мс. cudaMalloc 200 Memcpy HostToDevice 29 Memcpy DeviceToHost 23 Compute 27 (3 * 9) Total 279 мс
  • 52. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Простейшее ядро - профилирование II Проблема Время, затраченное на аллокацию памяти в видеокарте (200 мс) значительно больше времени затраченного на вычисления и передачу данных (79 мс). Решение Причина — инициализация контекста CUDA занимает много времени Инициализацию контекста можно провести принудительно во время запуска приложения, например вызовом cudaFree(nullptr).
  • 53. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Простейшее ядро - профилирование III Рис. 8: Профилирование простейшего ядра после инициализации контекста cudaMalloc вместо 200 мс заняло 0.3 мс. Суммарное время снизилось с 279 мс до 79 мс.
  • 54. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с использованием кэша I Проблема Среди наших данных есть 2 не модифицирующихся массива — mask и src. Они, хотя и помечены как float const *, но компилятор не может быть уверенным, что эти массивы или их части не модифицируется (например, из-за перекрывающихся областей). Поэтому кэшироваться данные в них не будут. Решение Пометить аргумент как __restrict__ NVIDIA Visual Profiler позволяет получить подробную информацию об использовании ресурсов (и даже дать советы по поводу оптимизации производительности).
  • 55. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с использованием кэша II (a) До оптимизации (b) После оптимизации Рис. 9: Использование кэша
  • 56. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с использованием кэша III Время выполнения ядра снизилось с 9 мс до 1.6 мс Суммарное время выполнения — с 79 мс до 56 мс. 1 __global__ void GaussianGpuKernel(float const * __restrict__ src, float const * __restrict__ mask, int width, int height, float *dst) → → 2 { 3 // ... 4 }
  • 57. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с асинхронным выполнением I Проблема Во время копирования данных в девайс или из девайса GPU не выполняет следующее ядро. В итоге вычислительная мощность простаивает. Решение CUDA (и видеокарты на аппаратном уровне) поддерживает параллельное копирование и выполнение ядер (нескольких параллельно, если позволяет мощность). Для этого необходимо использовать стримы плюс пометить область памяти на хосте как non pageable.
  • 58. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с асинхронным выполнением II Рис. 10: Профилирование асинхронного ядра 1 // ... 2 std::size_t const streamsCount = 3; 3 cudaStream_t streams[streamsCount]; 4 checkCudaErrors(cudaStreamCreate(&streams[0])); 5 checkCudaErrors(cudaStreamCreate(&streams[1])); 6 checkCudaErrors(cudaStreamCreate(&streams[2])); 7 8 checkCudaErrors(cudaHostRegister((void*) srcRed, dataSize, 0)); 9 checkCudaErrors(cudaHostRegister((void*) srcGreen, dataSize, 0)); 10 checkCudaErrors(cudaHostRegister((void*) srcBlue, dataSize, 0)); 11
  • 59. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с асинхронным выполнением III 12 checkCudaErrors(cudaMemcpyAsync(deviceSrcRed, src[0].data(), dataSize, cudaMemcpyHostToDevice, streams[0]));→ 13 checkCudaErrors(cudaMemcpyAsync(deviceSrcBlue, src[1].data(), dataSize, cudaMemcpyHostToDevice, streams[1]));→ 14 checkCudaErrors(cudaMemcpyAsync(deviceSrcGreen, src[2].data(), dataSize, cudaMemcpyHostToDevice, streams[2]));→ 15 16 GaussianGpuKernel<<<dimGrid, dimBlock, 0, streams[0]>>>(deviceSrc, deviceMask, width, height, deviceDst); → → 17 GaussianGpuKernel<<<dimGrid, dimBlock, 0, streams[1]>>>(deviceSrc + pixelsCount, deviceMask, width, height,→ 18 deviceDst + pixelsCount); 19 GaussianGpuKernel<<<dimGrid, dimBlock, 0, streams[2]>>>(deviceSrc + 2 * pixelsCount, deviceMask, width, height,→ 20 deviceDst + 2 * pixelsCount); 21 22 checkCudaErrors(cudaHostRegister((void*) dst[0].data(), dataSize, 0));→ 23 checkCudaErrors(cudaHostRegister((void*) dst[1].data(), dataSize, 0));→
  • 60. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Ядро с асинхронным выполнением IV 24 checkCudaErrors(cudaHostRegister((void*) dst[2].data(), dataSize, 0));→ 25 26 checkCudaErrors(cudaMemcpyAsync(dst[0].data(), deviceDst, dataSize, cudaMemcpyDeviceToHost, streams[0]));→ 27 checkCudaErrors(cudaMemcpyAsync(dst[1].data(), deviceDst + height * width, dataSize, cudaMemcpyDeviceToHost, streams[1]));→ 28 checkCudaErrors(cudaMemcpyAsync(dst[2].data(), deviceDst + 2 * height * width, dataSize, cudaMemcpyDeviceToHost, streams[2])); → → 29 30 checkCudaErrors(cudaDeviceSynchronize()); Суммарное время выполнения снизилось с 56 мс до 43 мс.
  • 61. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Оптимизация ядра. Итоги I Что еще можно оптимизировать: Частота обращения к глобальной памяти Нужно использовать shared memory, т.к. для каждого пикселя мы запрашиваем значения 9 пикселей. А скорость памяти у видеокарты хоть и высока (∼330 GB/s), но полной загрузки всех ядер мы не получим. Выравнивание доступа к памяти Оперативная память может за один запрос отдавать до 128 байт. Для получения максимальной пропускной способности потоки внутри warp-а должны обращаться к регионам памяти выровненным на величину транзакции и последовательно.
  • 62. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Оптимизация ядра. Итоги II Оптимизация алгоритма Вместо использования двухмерной матрицы с коэффициентами можно применить последовательно 2 одномерные, что снизит число операций с k2 wh до 2kwh, где k — ширина матрицы, w — ширина изображения, h — высота изображения. Плохому алгоритму и на топовом железе мало места.
  • 63. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Оптимизация ядра. Итоги III Таблица 4: Результаты выполнения асинхронного ядра Операция Время, мс. MemcpyAsync HostToDevice 20 MemcpyAsync DeviceToHost 18 Compute 4.8 (3 * 1.6) Total 43 мс CPU 500 мс (OpenMP) Если еще раз взглянуть на результаты, то можно заметить, что в нашем случае оптимизация ядра ничего не даст — мы упираемся в копирование данных между хостом и девайсом. Задача для GPU оказалась слишком простой.
  • 64. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Итого Использование GPU может дать большой прирост производительности. Но при разработке требуется учитывать особенности программно-аппаратной архитектуры. Не все задачи смогут выполниться на GPU быстрее чем на CPU (имеющие, например, множество ветвлений). Однако GPGPU уже нашло широкое применение в различных приложениях от научных и до мультимедиа. И чтобы быть не хуже конкурентов необходимо уже сегодня начать рассматривать GPGPU как реальный способ увеличить производительность.
  • 65. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Конец Спасибо за внимание.