24
Архитектура и программирование Архитектура и программирование потоковых многоядерных процессоров для научных расчётов для научных расчётов Лекция 2. GPU в составе компьютера Программная модель CUDA (начало) Программная модель CUDA (начало) Пример программы

Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Embed Size (px)

DESCRIPTION

Слайды лекции курса "Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов".

Citation preview

Page 1: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Архитектура и программирование Архитектура и программирование потоковых многоядерных процессоров

для научных расчётовдля научных расчётов

Лекция 2. GPU в составе компьютераПрограммная модель CUDA (начало)Программная модель CUDA (начало)Пример программы

Page 2: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Средства обмена данными в Средства обмена данными в компьютере

Обмен данными – важнейшая составляющая компьютера

Примеры: многопроцессорные системы, FPGA etc.

По традиции отдельные устройства имеют разные возможности (уровни и

б ) б способы) обмена данными

Традиционная архитектура ориентирована на одно, центральное счётное устройство

Page 3: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Архитектура IntelАрхитектура Intel

ТрадицииСев. Мост – общение с памятью и быстрыми шинами

Юж. Мост – общение с й низко-скоростной

периферией

Юж. мост не может напрямую общаться с CPU

Иерархическая структура

Page 4: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Архитектура AMDАрхитектура AMD

HyperTransport – шаг к симметричной распределённой архитектуре

HyperTransportОбмен пакетамиВ Выделенные линии в каждом из направлений8 Gb/s по каждой линииСев Мост реализован на Сев. Мост реализован на кристалле

Юж. Мост - общение с внешними устройствами, сам подключен к CPU напрямую

Меньше латентность из-за связующей логикисвязующей логики

Page 5: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Архитектура AMDАрхитектура AMD(часть 2)

Dual Socket Direct Conect архитектура р ур

Каждый из CPU имеет свою собственную память

Два независимых MCP (Media & Communication Processors)

Распределённая архитектура

Не совсем – среди процессоров есть вы деленый, соединённый с MCP по двум шинам HypTrans x16

Page 6: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Шина PCIШина PCI

Connected to the southBridgeOriginally 33 MHz 32-bit wide 132 MB/second peak transfer rateOriginally 33 MHz, 32-bit wide, 132 MB/second peak transfer rateMore recently 66 MHz, 64-bit, 512 MB/second peakUpstream bandwidth remain slow for device (256MB/s peak)Shared bus with arbitrationShared bus with arbitrationWinner of arbitration becomes bus master and can connect to CPU or DRAM through the southbridge and northbridge

Page 7: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Шина PCI-ExpressШина PCI Express

Switched, point-to-point connection

Each card has a dedicated “link” to the l h b bcentral switch, no bus arbitration.

Packet switches messages form virtual channel

Prioritized packets for QoSPrioritized packets for QoS

Each link consists of one more lanes

Each lane is 1-bit wide (4 wires, each 2-wire pair can transmit 2.5Gb/s in one di ti )direction)Upstream and downstream now simultaneous and symmetricEach Link can combine 1, 2, 4, 8, 12, 16 lanes- x1, x2, etc.Each byte data is 8b/10b encoded into 10 bits with equal number of 1’s and 0’s; net Each byte data is 8b/10b encoded into 10 bits with equal number of 1 s and 0 s; net data rate 2 Gb/s per lane each way.Thus, the net data rates are 250 MB/s (x1) 500 MB/s (x2), 1GB/s (x4), 2 GB/s (x8), 4 GB/s (x16), each way

Page 8: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Графическая плата NVIDIAГрафическая плата NVIDIA

SLI КSLI Коннектор

sVideo

Интегрированный Радиатор

sVideoTV Out

DVI x 2

16x PCI-Express

Наплатная память 640 Mb

16x PCI-Express

Page 9: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Программный стек CUDAПрограммный стек CUDA

Программы могут использовать GPU посредством:

Об Обращения к стандартным функциям библиотек (BLAS, FFTW)

cublas dll (cublasemu dll)cublas.dll (cublasemu.dll)cufft.dll (cufftemu.dll)

+ очень просто

- НЕ очень эффективно

Использования CUDA Использования CUDA runtime APIИспользования CUDA driver API

Page 10: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Application Program InterfaceApplication Program Interface(кратко)

API нужен для абстракции программного интерфейса от кода пользователяCUDA driver API (функции cu*)CUDA driver API (функции cu )

cuda.dllНизкий уровень

Тяжелее программироватьБольший контроль над процессом

CUDA runtime API (функции cuda*)CUDA runtime API (функции cuda )cudart.dllБолее абстрактно чем driver API (простота)В йВозможность использовать эмуляцию устройства

! Смешивать нельзя !

Page 11: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Интерфейс РазработчикаИнтерфейс Разработчика

Необходимые элементы1a. Драйвер видеокарты, поддерживающий CUDA1б. Использование режима “эмуляции” (nvcc -deviceemu)2. CUDA Toolkit - cодержит

Драйвер компилятора nvccВиртуальную машину ptxasБиблиотеки подключаемых исполняемых модулей (*.dll, *.o)

3. CUDA SDK - cодержитПримеры программных проектовр р р р рВспомогательные утилиты (библиотеки, Occupancy Calculator)

Всё это богатство доступно для свободного скачиванияhttp://www.nvidia.com/object/cuda get.htmlttp // d a co /object/cuda_get tИсполняемые модули (без исходных листингов) для WinXP (x86, x86_64), Fedora, RHEL, SUSE, Open SUSE (x86, x86_64), Mac OS X (10.5.2)

Page 12: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Модель программирования Модель программирования графических приложений

Приложение

Обсчёт Треугольников

Растеризация

ЗакрашиваниеЗакрашивание

Память МониторПамять Монитор

Page 13: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Программирование приложений Программирование приложений при помощи графич. процессора

Схема обработки данных схожа с методом

GPGPU приложение

методом обработки графических данных

Геометрия данных

данных

Необходимость планирования

Перенос данныхпланирования “геометрии данных” при реализации Счет реализации алгоритма

Счет

Память

Page 14: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Вычислительная конфигурация Вычислительная конфигурация GPU

Процессы объединяются в блоки (blocks), внутри которых они имеют общую

Host Device

Grid 1р щу

память (shared memory) и синхронное исполнение

Kernel 1

Block(0, 0)

Block(1, 0)

Block(2, 0)

Block(0 1)

Block(1 1)

Block(2 1)

Блоки объединяются в сетки (grids)

Нет возможности предсказать очерёдность запуска блоков в Kernel

(0, 1) (1, 1) (2, 1)

Grid 2

очерёдность запуска блоков в сеткиМежду блоками нет и не может быть (см. выше) общей памяти

2

Block (1, 1)

Thread(0, 1)

Thread(1, 1)

Thread(2, 1)

Thread(3, 1)

Thread(4, 1)

Thread(0, 0)

Thread(1, 0)

Thread(2, 0)

Thread(3, 0)

Thread(4, 0)

( ) ( ) ( ) ( ) ( )

Thread(0, 2)

Thread(1, 2)

Thread(2, 2)

Thread(3, 2)

Thread(4, 2)

Page 15: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Модель памяти GPUМодель памяти GPU

(D i ) G idGPU может читать

Constant MemoryTexture Memory

(Device) Grid

Block (0, 0) Block (1, 0)

GPU может читать/писать Global Memory

Каждый из процессов ч/пL l M

Shared Memory

Registers Registers

Shared Memory

Registers Registers

Local MemoryRegisters

Каждый из процессов внутри блока ч/п

Thread (0, 0) Thread (1, 0) Thread (0, 0) Thread (1, 0)

блока ч/пShared memoryGather/Scatter MA pattern

Хост имеет возможность Gl b l

LocalMemory

LocalMemory

LocalMemory

LocalMemory

H tчитать/писать:

Global MemoryConstant Memory

ConstantMemory

GlobalMemory

Host

Texture MemoryTextureMemory

Page 16: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

C модификация –C модификация декларация функций

Executed on the:

Only callable from the:

device float DeviceFunc() device device__ __ () device device

__global__ void KernelFunc() device host

__host__ float HostFunc() host host

__global__ определяет вычислительное ядро, исполняемое устройством и вызываемое хостом

Ядро обязательно должно возвращать void__device__ и __host__ можно использовать совместно

host можно опускать__host__ можно опускать

Page 17: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Ограничения на С в программах Ограничения на С в программах устройства

__device__ и __global__ не могут содержать рекурсийОбъявлять static переменных внутри себяОб stat c ере е у р себИметь переменное количество аргументов

Адрес функции device нельзя использовать при Адрес функции __device__ нельзя использовать при указании на функцию (а __global__ можно)

global host е о б с о зо а __global__ и __host__ не могут быть использованы одновременно

При вызове __global__ обязательно указывать конфигурацию вызова

Page 18: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Конфигурация вызоваКонфигурация вызовавычислительного ядра

<<<Gs,Bs,Ms>>>

Определение размерностей сетки блоков и блока тредов для Определение размерностей сетки блоков и блока тредов для данного ядра

Gs (grid size) тип - dim3 - размерность сетки блоковBs (Block size) тип - dim3 - размерность блока тредовBs (Block size) тип - dim3 - размерность ,блока тредовMs (shared Memory size) – тип size_t – количество общей памяти динамически аллоцированной под данный вызов (можно опускать)у )

!!! GridId BlockID при исполнении указывают конкретному треду на его контекст в рамках общей задачир у р

__global___ void functionA (type argument);functionA<<<Gs,Bs,Ms>>>(arg1);

Page 19: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Подготовка устройстваПодготовка устройства

Инициализация устройстваcudaGetDeviceCount, cudaSetDevice, cudaGetDevice

Позволяют правильно выбрать между устройствами

Выделение памятиcudaMallocif(cudaMalloc((void**)&bvCU,(size_t)neurs*sizeof(FLT32))!=cudaSuccess) throw Unsupported(this->Name,"CUDA has failed to allocate BV.");

cudaMallocPitchif(cudaMallocPitch((void**)&wmCU,(size_t*)&wm_pitch,ins*sizeof(FLT32),neurs)!=cudaSuccess) throw Unsupported(this->Name "CUDA has failed to allocate)!=cudaSuccess) throw Unsupported(this->Name, CUDA has failed to allocate WM.");

Page 20: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Пересылка данныхПересылка данных

Копирование между хостом и устройством

cudaMemsetcudaMemsetif(cudaMemset(ldCU,0,ns*sizeof(float))!=cudaSuccess)throw Unsupported(this->Name,"CUDA has failed to zero-init LD.");

cudaMemcpycudaMemcpyif(cudaMemcpy(bvCU,bvF32,ns*sizeof(FLT32),cudaMemcpyHostToDevice)!=cudaSuccess) throw Unsupported(this->Name,"CUDA failed to upload BV.");

О бОсвобождение памятиcudaFreeif(cudaFree(wmCU)!=cudaSuccess) throw Unsupported(this->Name "CUDA has failed to de-allocate WM ");throw Unsupported(this->Name, CUDA has failed to de-allocate WM. );

Page 21: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Вызов CUDA из произвольного Вызов CUDA из произвольного хост-кода (пример)

void fflayerCUDA::backpropagate(){/* U16 i;

for(i=0;i<ns;i++)for(U16 k=0;k<outSize[0]/ns;k++)

ld[i]+=Output[0][i+k];(…)

memset(Input[0],0,inSize[0]*memSize[0]*sizeof(FLT64));for (i=0;i<ns;i++)

for(U16 k=0;k<inSize[0];k++)Input[0][k]+=ld[i]*wm[i+k*ns]; */

if(LocLayerID==1) ( y ){

for(U32 ii=0;ii<ns;ii++) ldF32[ii]=(FLT32)((FLT64**)Output)[0][ii];if(cudaMemcpy(ldCU,ldF32,ns*sizeof(FLT32),cudaMemcpyHostToDevice)!=cudaSuccess)

throw Unsupported(this->Name,"CUDA failed to upload LD.");throw Unsupported(this Name, CUDA failed to upload LD. );}

CUDAbackpropagate(ldCU,loCU,wmCU,wmdCU,bvdCU,inCU,indCU,inSize[0],ns,wm_pitch/sizeof(float));

}

Page 22: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Функция, использующая CUDA –Функция, использующая CUDAпример (файл *.cu)

void CUDAbackpropagate(float *ld,float *lo,float *wm,float *wmd,float *bvd,float *in, float*ind, int insize,int outsize,int wm_pitch)

{dim3 threads;dim3 grid;int repetit=1;threads.x = MAX_THREAD_PER_BLOCK;repetit = outsize/MAX_THREAD_PER_BLOCK;if(repetit*MAX_THREAD_PER_BLOCK<outsize) repetit++; if(insize<=MAX_BLOCKS_PER_GRID_DIM) {grid.x = insize;}else {printf("CUDA device: Can't handle layers with more than 65535 inputs (extendible to

65535^3)\n");return;}

CUDA_SAFE_CALL( cudaThreadSynchronize() );CUDAbackpropagateCALC<<<grid,

threads,threads.x*sizeof(float)>>>(ld,lo,wm,wmd,bvd,in,ind,insize,outsize,repetit,wm_pitch);

CUDA_SAFE_CALL( cudaThreadSynchronize() );}

Page 23: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Вычислительное ядро - пример Вычислительное ядро пример (файл *.cu)__global__ void CUDAupdateCALC(float *wm,float *wmd,float *bv,float *bvd,float

lr,float mom, int insize,int outsize,int r,int wm_pitch)

{{int i=0;for(i=0;i<r;i++) {

int idx = threadIdx.x+blockDim.x*i;if(idx<outsize) {

[ d * h bl k d ] l * d[ d * h bl k d ]wm[idx*wm_pitch+blockIdx.x]-=lr*wmd[idx*wm_pitch+blockIdx.x];if(blockIdx.x==0) bv[idx] -= lr*bvd[idx];

}}}__syncthreads();

}

Page 24: Архитектура и программирование потоковых многоядерных процессоров для научных рассчетов. Лекция

Итоги лекцииИтоги лекции

В результате лекции Вы должны :Понимать возможности использования GPU для расчётов с точки зрения пропускной способности системы обмена данными компьютераИметь понятие об организации разрабокти приложений

Интрефейс разработчикаAPI стекМодификации языка С используемые для конфигурации устройства

Понять приведенный пример программы использующей Понять приведенный пример программы использующей CUDAДостаточные знания для начала самостоятельной работы