Top Banner
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA Обзор средств разработки для вычислений на GPGPU Артур Молчанов 2016
65

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

Jan 11, 2017

Download

Technology

COMAQA.BY
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: обзор средств разработки для вычислений Gpgpu

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

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

Артур Молчанов

2016

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

О чем пойдет речь?

GPGPU General Purpose Graphics Processing UnitGPGPU General-purpose computing for graphics

processing unit

Общее в определениях — в вычислениях общегоназначения участвует графический процессор.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Зачем?Вычислительная мощность GPU в разы выше мощностиCPU с сопоставимой ценой и потребляемой энергией.

Таблица 1: Сравнение CPU и GPU

Устройство GFLOPS Мощ-ность(макс.),Вт

Цена,$

64bit

32bit

i7-5960X (8 cores@3GHz) 384 768 140 1100GeForce GTX Titan Black 1707 5121 250 999GeForce GTX Titan X 192 6144 250 999Radeon R9 Fury X 537 8602 275 649

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Зачем?Разрыв в скорости CPU и GPU в последнее время лишьрастет (знаменитые +5% у новых процессоров Intel)

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Причины превосходства GPUВ CPU вычислительные блоки занимают меньшую частькристалла. Площадь кристалла CPU, как правило,меньше площади GPU.

(a) i7-5960X (355мм2, 2.6 млрд.транзисторов)

(b) GM200 (601 мм2, 8 млрд.транзисторов)

Рис. 1: Кристаллы CPU и GPU

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Причины превосходства GPU

CPU оптимизирован для выполнения однопоточныхприложений с малой задержкой:• Большой кэш• Длинный конвейер• Сложные блоки предсказания ветвлений

Intel и GPGPUIntel тоже хочет заработать на SIMD устройствах ивыпустила ряд решений на архитектуре MIC (ManyIntegrated Core Architecture), который включает в себя иотносительно известный Xeon Phi, представляющий изсебя процессор имеющий до 61 x86 ядра с 16 GB GDDR5и интерфейс PCI-e (только стоит это ∼$4000).

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Общее у CPU и GPUCPU тоже является SIMD устройством — в немсодержатся блоки, выполняющие за один тактарифметические операции над 256-битными векторами,что эквивалентно 16 операциям над 16-битнымичислами.Также CPU может выполнять несколько независимыхопераций одновременно.

Рис. 2: Исполнительное устройство CPU Haswell

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

История развития видеокарт

2002-2003 гг. Выход видеокарт на чипах NV30 (NVIDIAGeForce FX) и R300 (AMD (ATI) Radeon 9500). Вних была реализована программируемаяшейдерная архитектура второй версии,точность вычислений значительноповысилась, что заметно расширило областьприменения.

2006 г. NVIDIA представила GeForce 8800 — первуювидеокарту с унифицированной шейдернойархитектурой.GeForce 8800 имел 128 унифицированныхпотоковых процессоров, способных работатьс любыми данными в формате с плавающейзапятой.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

История развития средств разработки

2003 г. BrookGPU — компилятор, позволившийабстрагироваться от графического API(OpenGL, Direct3D)

2007 г. релиз публичной бета-версии CUDA SDK2008 г. AMD официально предоставила доступ к

Stream для массовых пользователей2009 г. релиз Mac OS X 10.6 с поддержкой OpenCL.

Релиз NVIDIA и ATI SDK с поддержкой OpenCL2009 г. релиз DirectX 11, включающий DirectCompute2012 г. релиз Visual Studio с поддержкой C++AMP2012 г. релиз Android 4.2 с поддержкой ускорения

Renderscript на GPU2015 г. релиз GCC 5.1 с поддержкой OpenACC

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

CUDA

Задачи, выполняемые на GPU, представляют собойфункции со спецификатором __global__, называемыеkernel.Синтаксис — расширенный C99/C++11.

1 __global__ void SumVectors(float const* a, float const* b, intsize, 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 }

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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 }

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Модель выполнения I

ПотокиВыполнением kernel занимаются потоки.

БлокиПотоки группируются в блоки.Причина — не все потоки имеют общую быструюразделяюмую память (shared memory) и могутсинхронизироваться, а лишь те, кто выполняется наодном мультипроцессоре.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Модель выполнения II

Грид (grid)Блоки объединяются в грид (grid),Блоки и грид имеют 3 измерения.Причина — чаще всего массив данных имеет до 3измерений.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Модель выполнения III

Рис. 3: Модель выполнения CUDA

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Сборка

Для компиляции используется nvcc.Код, выполняемый на CPU перенаправляется системномукомпилятору (GCC, MS VC++).nvcc генерирует PTX код и/или cubin.PTX”Ассемблер” для GPU. Во время запуска приложенияпроисходит трансляция в бинарный формат cubin,подходящий GPU.

cubinELF-файл, содержащий код, для выполнения на GPU,

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Состав CUDAПомимо Runtime и Driver API в состав CUDA входятбиблиотеки:

cuBLAS реализация BLAS (Basic Linear AlgebraSubprograms)

cuFFT реализация библиотеки быстрогопреобразования Фурье

cuRand библиотека генерации случайных чиселcuSPARSE библиотека линейной алгебры разреженных

матрицNPP набор GPU-ускоренных функций для

обработки изображений, видео и сигналовcuSOLVER набор решателей для плотных и

разреженных матрицThrust STL-подобные шаблонные интерфейсы для

некоторых алгоритмов и структур данных

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Системные требования I

Аппаратное обеспечениеВидеокарты NVIDIA начиная с G80 (GeForce 8800 GTX)Спектр поддерживаемых возможностей (computecapability) отличается для разных поколенийвидеокарт.

ОС• Windows• Linux• Mac OS X

Компиляторы• Visual C++ 10.0 - Visual C++ 12.0• GCC 4.3.4 - 4.9.2

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Системные требования II

IDE (плагин)• Visual Studio 2010 - 2013• Eclipse (поставляется в комплекте с SDK для Linux)

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отладка I• cuda-gdb — gdb с поддержкой отладки kernel• cuda-memcheck — отладка ошибок доступа к памяти• Eclipse• Visual Studio

Выхлоп cuda-memcheck

1 ========= CUDA-MEMCHECK2 [src/Denoise] - Starting...3 ========= Invalid __global__ write of size 44 ========= 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 bounds7 ========= Saved host backtrace up to driver entry point at

kernel launch time↪→

8 ========= Host Frame:/usr/lib64/libcuda.so.1 (cuLaunchKernel+ 0x2cd) [0x15865d]↪→

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отладка II9 ========= 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 tocudaDeviceSynchronize.

↪→

↪→

18 ========= Saved host backtrace up to driver entry point aterror↪→

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]

↪→

↪→

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отладка IV

Рис. 4: Отладка CUDA в Eclipse

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Профилирование I• nvprof• NVIDIA Visual Profiler (как отдельное приложение, таки часть плагинов для Visual Studio и Eclipse)

Рис. 5: Профилирование CUDA в Eclipse

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Продукты использующие CUDA I• библиотеки

cuDNN библиотека с поддержкой GPUпримитивов для глубинных нейронныхсетей

ArrayFire библиотека C/C++/Java/Fortran,содержащая сотни функцийиспользуемых в арифметике, линейнаяалгебре, статистике, обработке сигналов,обработке изображений и связанных сними алгоритмов

OpenCV библиотека для машинного зрения,обработки изображений и машинногообучения

NVBIO C++ фреймворк для анализагенетических последовательностей

HiPLAR пакеты для R, позволяющие ускоритьфункции линейной алгебры

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Продукты использующие CUDA II

FFmpeg набор мультимедиа библиотек, которыепозволяют записывать, конвертировать ипередавать цифровые аудио- ивидеозаписи в различных форматах

NVIDIA Video Codec SDK библиотеки для аппаратногокодирования/декодирования H.264 иH.265и множество других

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

OpenCL

Фреймворк для написания параллельных приложенийбез привязки к производителю.OpenCL разрабатывается и поддерживаетсянекоммерческим консорциумом Khronos Group. В егосостав входит и NVIDIA. Этим объясняется схожесть сCUDA.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отличия от CUDA I

• Широкий спектр поддерживаемых устройствCPU Intel, AMD, IBM Power, Qualcomm

SnapdragonGPU NVIDIA, AMD, Intel, Mali, Qualcomm AdrenoFPGA Altera, XilinxDSP TI AM57x, TI 66AK2H SoC

Intel MIC Xeon Phi• Отсутствие необходимости в специальномкомпиляторе

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отличия от CUDA II

Таблица 2: Эквиваленты CUDA и OpenCL

OpenCL CUDAhost hostdevice devicekernel kernelhost program host programNDRange (index space) gridwork item threadwork group block

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

KernelЗадачи, выполняемые на GPU, представляют собойфункции со спецификатором __kernel, называемыеkernel.Синтаксис — расширенный C99/C++14 (начиная с версии2.1).

1 __kernel void SumVectors(__global float const* a, __global floatconst* 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 }

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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 "}";

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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 — за все приходится платить.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Сборка

Т.к. нет привязки к компилятору, то достаточно лишьиметь заголовочные файлы и библиотеку OpenCL.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Системные требования

OpenCL не накладывает никаких ограничений. Задачапроизводителя оборудования обеспечить поддержкуOpenCL.Удобство программирования и отладки зависит от IDE.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отладка

• GDB >= 7.3• Intel OpenCL debugger для Visual Studio (только CPU)• AMD CodeXL• IBM OpenCL SDK

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Профилирование

• NVIDIA Visual Profiler• Intel System Analyzer и Platform Analyzer из OpenCLSDK

• Intel VTune Amplifier• AMD CodeXL

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Продукты использующие OpenCL I• библиотеки

ArrayFire библиотека C/C++/Java/Fortran,содержащая сотни функцийиспользуемых в арифметике, линейнаяалгебре, статистике, обработке сигналов,обработке изображений и связанных сними алгоритмов

Bolt STL-подобная библиотека, использующаяOpenCL или C++AMP для ускоренияалгоритмов

Boost.Compute STL-подобная библиотека,использующая OpenCL и CUDA

clMath реализации FFT и BLASMainConcept SDK библиотеки для аппаратного

кодирования/декодирования H.264, H.265и MPEG-2и множество других

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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 }

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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])) данные из массива с будутскопированы из памяти девайса в локальнуюпамять

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Сборка

Для компиляции требуется лишь компилятор,поддерживающий OpenACC.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Системные требования II

ОС• Windows• Linux• Mac OS X

Компиляторы• PGI Accelerator Compilers• Cray compiler• GCC 5.1• NVIDIA OpenACC Toolkit (основан на компиляторе PGI)

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Отладка

• GDB• cuda-gdb (для NVIDIA)• TotalView OpenACC debugger

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Профилирование

• запуск приложения, собранного компилятором PGI, спеременной окружения PGI_ACC_TIME=1

• NVIDIA Visual Profiler

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Что осталось за кадром

Кроме низкоуровневых API таких как OpenCL и CUDAсуществуют и вспомогательные библиотеки,предоставляющие алгоритмы и структуры данных,способных использовать ресурсы GPU.C++AMP Обертка над DirectCompute. Есть ”из

коробки” в Visual Studio с версии 2012Thrust Входит в состав CUDABolt Поддерживает OpenCL и C++AMP

Boost.Compute использует OpenCLArrayFire CUDA, OpenCL

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Реализация Гауссова сглаживания на CUDAГауссово сглаживание заключается в суммированиизначения цветовых каналов соседних пикселей скоэффициентами равными значению функции Гаусса.

0.195

0.078 0.078

0.0780.078

0.123

0.123

0.123

0.123

Рис. 6: Коэффициенты Гаусcова сглаживания

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Входной файл и железо I

В качестве входного файла использоваласьфотогорафия 24 МП (6016x4000).Видеокарта — GeForce GTX 980 TiCPU — i7-5960X

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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;

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Простейшее ядро II18 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 }

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Простейшее ядро - профилирование I

Рис. 7: Профилирование простейшего ядра

Таблица 3: Результаты выполнения простейшего ядра

Операция Время, мс.cudaMalloc 200Memcpy HostToDevice 29Memcpy DeviceToHost 23Compute 27 (3 * 9)Total 279 мс

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Простейшее ядро - профилирование II

ПроблемаВремя, затраченное на аллокацию памяти в видеокарте(200 мс) значительно больше времени затраченного навычисления и передачу данных (79 мс).

РешениеПричина — инициализация контекста CUDA занимаетмного времениИнициализацию контекста можно провестипринудительно во время запуска приложения, напримервызовом cudaFree(nullptr).

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Простейшее ядро - профилирование III

Рис. 8: Профилирование простейшего ядра послеинициализации контекста

cudaMalloc вместо 200 мс заняло 0.3 мс.Суммарное время снизилось с 279 мс до 79 мс.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Ядро с использованием кэша I

ПроблемаСреди наших данных есть 2 не модифицирующихсямассива — mask и src. Они, хотя и помечены как floatconst *, но компилятор не может быть уверенным, что этимассивы или их части не модифицируется (например,из-за перекрывающихся областей). Поэтомукэшироваться данные в них не будут.

РешениеПометить аргумент как __restrict__

NVIDIA Visual Profiler позволяет получить подробнуюинформацию об использовании ресурсов (и даже датьсоветы по поводу оптимизации производительности).

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Ядро с использованием кэша II

(a) До оптимизации

(b) После оптимизации

Рис. 9: Использование кэша

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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 }

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Ядро с асинхронным выполнением I

ПроблемаВо время копирования данных в девайс или из девайсаGPU не выполняет следующее ядро.В итоге вычислительная мощность простаивает.

РешениеCUDA (и видеокарты на аппаратном уровне)поддерживает параллельное копирование и выполнениеядер (нескольких параллельно, если позволяетмощность).Для этого необходимо использовать стримы плюспометить область памяти на хосте как non pageable.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Ядро с асинхронным выполнением III12 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));↪→

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История 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 мс.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Оптимизация ядра. Итоги I

Что еще можно оптимизировать:Частота обращения к глобальной памяти Нужно

использовать shared memory, т.к. длякаждого пикселя мы запрашиваем значения9 пикселей. А скорость памяти у видеокартыхоть и высока (∼330 GB/s), но полнойзагрузки всех ядер мы не получим.

Выравнивание доступа к памяти Оперативная памятьможет за один запрос отдавать до 128 байт.Для получения максимальной пропускнойспособности потоки внутри warp-а должныобращаться к регионам памяти выровненнымна величину транзакции и последовательно.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Оптимизация ядра. Итоги II

Оптимизация алгоритма Вместо использованиядвухмерной матрицы с коэффициентамиможно применить последовательно 2одномерные, что снизит число операций сk2wh до 2kwh, где k — ширина матрицы, w —ширина изображения, h — высотаизображения.Плохому алгоритму и на топовом железемало места.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Оптимизация ядра. Итоги III

Таблица 4: Результаты выполнения асинхронного ядра

Операция Время, мс.MemcpyAsync HostToDevice 20MemcpyAsync DeviceToHost 18Compute 4.8 (3 * 1.6)Total 43 мсCPU 500 мс (OpenMP)

Если еще раз взглянуть на результаты, то можнозаметить, что в нашем случае оптимизация ядра ничегоне даст — мы упираемся в копирование данных междухостом и девайсом.Задача для GPU оказалась слишком простой.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Итого

Использование GPU может дать большой приростпроизводительности. Но при разработке требуетсяучитывать особенности программно-аппаратнойархитектуры.Не все задачи смогут выполниться на GPU быстрее чемна CPU (имеющие, например, множество ветвлений).Однако GPGPU уже нашло широкое применение вразличных приложениях от научных и до мультимедиа.И чтобы быть не хуже конкурентов необходимо ужесегодня начать рассматривать GPGPU как реальныйспособ увеличить производительность.

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

...

.

...........................

.

...

.

...

.

Пролог Мотивация История CUDA OpenCL OpenACC Реализация Гауссова сглаживания на CUDA

Конец

Спасибо за внимание.