SlideShare a Scribd company logo
1 of 24
Download to read offline
Архитектура и программирование
потоковых многоядерных процессоров
для научных расчётов

Лекция 2. GPU в составе компьютера
Программная модель CUDA (начало)
Пример программы
Средства обмена данными в
компьютере
Обмен данными – важнейшая
составляющая компьютера
Примеры: многопроцессорные
системы, FPGA etc.

По традиции отдельные
устройства имеют разные
возможности (уровни и
способы) обмена данными
б ) б
Традиционная архитектура
ориентирована на одно,
центральное счётное
устройство
Архитектура Intel
Традиции
Сев. Мост – общение с
памятью и быстрыми
шинами
Юж. Мост – общение с
низко-скоростной
й
периферией

Юж. мост не может
напрямую общаться с
CPU
Иерархическая структура
Архитектура AMD
HyperTransport – шаг к
симметричной распределённой
архитектуре
HyperTransport
Обмен пакетами
Выделенные линии в каждом
В
из направлений
8 Gb/s по каждой линии
Сев.
Сев Мост реализован на
кристалле
Юж. Мост - общение с внешними
устройствами, сам подключен к
CPU напрямую
Меньше латентность из-за
связующей логики
Архитектура AMD
(часть 2)
Dual Socket Direct Conect
архитектура
р
ур
Каждый из CPU имеет свою
собственную память
Два независимых MCP (Media &
Communication Processors)
Распределённая архитектура
Не совсем – среди процессоров
есть вы деленый, соединённый с
MCP по двум шинам HypTrans x16
Шина PCI

Connected to the southBridge
Originally 33 MHz, 32-bit wide, 132 MB/second peak transfer rate
MHz
wide
More recently 66 MHz, 64-bit, 512 MB/second peak
Upstream bandwidth remain slow for device (256MB/s peak)
Shared bus with arbitration
Winner of arbitration becomes bus master and can connect to CPU or
DRAM through the southbridge and northbridge
Шина PCI-Express
PCI Express
Switched, point-to-point connection
Each card has a dedicated “link” to the
central switch, no b
l
h
bus arbitration.
b
Packet switches messages form virtual
channel
Prioritized 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
direction)
di
ti )
Upstream and downstream now simultaneous and symmetric
Each 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
1’s
0 s;
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
Графическая плата NVIDIA
SLI К
Коннектор

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

sVideo
TV Out

DVI x 2

16x PCI-Express

Наплатная память
640 Mb
Программный стек CUDA
Программы могут
использовать GPU
посредством:
Обращения к стандартным
Об
функциям библиотек
(BLAS, FFTW)
cublas.dll (cublasemu dll)
cublas dll (cublasemu.dll)
cufft.dll (cufftemu.dll)

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

- НЕ очень эффективно
Использования CUDA
runtime API
Использования CUDA
driver API
Application Program Interface
(кратко)
API нужен для абстракции программного интерфейса
от кода пользователя
CUDA driver API (функции cu*)
cu )
cuda.dll
Низкий уровень
Тяжелее программировать
Больший контроль над процессом

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

! Смешивать нельзя !
Интерфейс Разработчика
Необходимые элементы
1a. Драйвер видеокарты, поддерживающий CUDA
1б. Использование режима “эмуляции” (nvcc -deviceemu)
2. CUDA Toolkit - cодержит
Драйвер компилятора nvcc
Виртуальную машину ptxas
Библиотеки подключаемых исполняемых модулей (*.dll, *.o)
3. CUDA SDK - cодержит
Примеры программных проектов
р
р
р р
р
Вспомогательные утилиты (библиотеки, Occupancy Calculator)
Всё это богатство доступно для свободного скачивания
http://www.nvidia.com/object/cuda get.html
ttp //
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)
Модель программирования
графических приложений
Приложение
Обсчёт
Треугольников

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

Закрашивание
Память

Монитор
Программирование приложений
при помощи графич. процессора
GPGPU приложение
Геометрия данных

Перенос данных
Счет
Память

Схема обработки
данных схожа с
методом
обработки
графических
данных
Необходимость
планирования
“геометрии
данных” при
реализации
алгоритма
Вычислительная конфигурация
GPU
Host

Device
Grid 1

Kernel
1

Block
(0, 0)

Block
(1, 0)

Block
(2, 0)

Block
(0,
(0 1)

Block
(1,
(1 1)

Block
(2,
(2 1)

Grid 2
Kernel
2
Block (1, 1)
Thread Thread Thread Thread Thread
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(4, 0)
Thread Thread Thread Thread Thread
( )
(0, 1)
( )
(1, 1)
( )
(2, 1)
( )
(3, 1)
( )
(4, 1)
Thread Thread Thread Thread Thread
(0, 2)
(1, 2)
(2, 2)
(3, 2)
(4, 2)

Процессы объединяются в
блоки (blocks), внутри
которых они имеют общую
р
щу
память (shared memory) и
синхронное исполнение
Блоки объединяются в сетки
(grids)
Нет возможности предсказать
очерёдность запуска блоков в
сетки
Между блоками нет и не может
быть (см. выше) общей памяти
Модель памяти GPU
(Device) G id
(D i ) Grid
Block (0, 0)

Constant Memory
Texture Memory

Block (1, 0)

Shared Memory
Registers

GPU может читать

Registers

Shared Memory
Registers

Registers

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

Local
Memory

Host
H t

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

Local
Memory

Global
Gl b l
Memory
Constant
Memory
Texture
Memory

Local
Memory

Local
Memory

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

Каждый из процессов ч/п
Local Memory
L
lM
Registers

Каждый из процессов внутри
блока ч/п
Shared memory
Gather/Scatter MA pattern

Хост имеет возможность
читать/писать:
Global Memory
Constant Memory
Texture Memory
C модификация –
декларация функций
Executed
on the:

Only callable
from the:

__device__ float DeviceFunc()
()

device

device

__global__ void

device

host

host

host

__host__

KernelFunc()

float HostFunc()

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

Адрес функции __device__ нельзя использовать при
device
указании на функцию (а __global__ можно)
__global__ и __host__ не могут быть использованы
global
host
е о
б
с о зо а
одновременно
При вызове __global__ обязательно указывать
конфигурацию вызова
Конфигурация вызова
вычислительного ядра
<<<Gs,Bs,Ms>>>
Определение размерностей сетки блоков и блока тредов для
данного ядра
Gs (grid size) тип - dim3 - размерность сетки блоков
Bs (Block size) тип - dim3 - размерность ,блока тредов
блока
Ms (shared Memory size) – тип size_t – количество общей памяти
динамически аллоцированной под данный вызов (можно
опускать)
у
)
!!! GridId BlockID при исполнении указывают конкретному
треду на его контекст в рамках общей задачи
р у
р
__global___ void functionA (type argument);
functionA<<<Gs,Bs,Ms>>>(arg1);
Подготовка устройства
Инициализация устройства
cudaGetDeviceCount, cudaSetDevice, cudaGetDevice
Позволяют правильно выбрать между устройствами

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

cudaMallocPitch
if(cudaMallocPitch((void**)&wmCU,(size_t*)&wm_pitch,ins*sizeof(FLT32),neurs
)!=cudaSuccess) throw Unsupported(this->Name "CUDA has failed to allocate
Unsupported(this->Name, CUDA
WM.");
Пересылка данных
Копирование между хостом и устройством
cudaMemset
if(cudaMemset(ldCU,0,ns*sizeof(float))!=cudaSuccess)
throw

Unsupported(this->Name,"CUDA has failed to zero-init LD.");

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

Освобождение памяти
О
б
cudaFree
if(cudaFree(wmCU)!=cudaSuccess)
throw Unsupported(this->Name "CUDA has failed to de-allocate WM ");
Unsupported(this->Name, CUDA
WM. );
Вызов 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]; */
(
y
)
if(LocLayerID==1)
{
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.");
Unsupported(this Name, CUDA
LD. );
}
CUDAbackpropagate(ldCU,loCU,wmCU,wmdCU,bvdCU,inCU,indCU,inSize[0],ns,wm_pitch/sizeof(float));
}
Функция, использующая 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_pitc
h);
CUDA_SAFE_CALL( cudaThreadSynchronize() );
}
Вычислительное ядро - пример
(файл *.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)
{
wm[idx*wm_pitch+blockIdx.x]-=lr*wmd[idx*wm_pitch+blockIdx.x];
[d *
h bl k d
] l *
d[ d *
h bl k d
]
if(blockIdx.x==0) bv[idx] -= lr*bvd[idx];
}
}
__syncthreads();
}
Итоги лекции
В результате лекции Вы должны :
Понимать возможности использования GPU для расчётов
с точки зрения пропускной способности системы обмена
данными компьютера
Иметь понятие об организации разрабокти приложений
Интрефейс разработчика
API стек
Модификации языка С используемые для конфигурации
устройства

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

More Related Content

What's hot

Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)Mikhail Kurnosov
 
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Mikhail Kurnosov
 
лекция 5
лекция 5лекция 5
лекция 5JIuc
 
hl++ Rubtsov
hl++ Rubtsovhl++ Rubtsov
hl++ RubtsovOntico
 
Белнетэксперт - СХД
Белнетэксперт - СХДБелнетэксперт - СХД
Белнетэксперт - СХДSergey Polazhenko
 
Лекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системЛекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системpianist2317
 
Стриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD дискаСтриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD дискаRoman_Lut
 
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ontico
 
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Mikhail Kurnosov
 
Операционные системы
Операционные системыОперационные системы
Операционные системыyaevents
 
Процессоры и составляющие системного блока
Процессоры и составляющие системного блокаПроцессоры и составляющие системного блока
Процессоры и составляющие системного блокаWewillneversleep
 
Freebsd. от новичка к профессионалу (2011)
 Freebsd. от новичка к профессионалу (2011) Freebsd. от новичка к профессионалу (2011)
Freebsd. от новичка к профессионалу (2011)StAlKeRoV
 
Применение современных графических процессоров для обработки видео
Применение современных графических процессоров для обработки видеоПрименение современных графических процессоров для обработки видео
Применение современных графических процессоров для обработки видеоMSU GML VideoGroup
 
СХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуре
СХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуреСХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуре
СХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуреDEPO Computers
 
46
4646
46JIuc
 

What's hot (20)

Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
Лекция 4: Оптимизация доступа к памяти (Memory access optimization, caches)
 
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
Лекция 3: Векторизация кода (Code vectorization, SIMD, SSE, AVX)
 
лекция 5
лекция 5лекция 5
лекция 5
 
hl++ Rubtsov
hl++ Rubtsovhl++ Rubtsov
hl++ Rubtsov
 
Storage Bitblaze
Storage BitblazeStorage Bitblaze
Storage Bitblaze
 
Белнетэксперт - СХД
Белнетэксперт - СХДБелнетэксперт - СХД
Белнетэксперт - СХД
 
Лекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системЛекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и систем
 
Number 3
Number 3Number 3
Number 3
 
Стриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD дискаСтриминг и эффективное чтение с DVD диска
Стриминг и эффективное чтение с DVD диска
 
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
Ликбез по Эльбрусу, Константин Трушкин (МЦСТ)
 
Лекция № 3 Организация ЭВМ и систем
Лекция № 3 Организация ЭВМ и системЛекция № 3 Организация ЭВМ и систем
Лекция № 3 Организация ЭВМ и систем
 
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
Лекция 5: Многопоточное программирование: часть 1 (Multithreading programming...
 
Операционные системы
Операционные системыОперационные системы
Операционные системы
 
Процессоры и составляющие системного блока
Процессоры и составляющие системного блокаПроцессоры и составляющие системного блока
Процессоры и составляющие системного блока
 
Prez osob mikroproc
Prez osob mikroprocPrez osob mikroproc
Prez osob mikroproc
 
Freebsd. от новичка к профессионалу (2011)
 Freebsd. от новичка к профессионалу (2011) Freebsd. от новичка к профессионалу (2011)
Freebsd. от новичка к профессионалу (2011)
 
Применение современных графических процессоров для обработки видео
Применение современных графических процессоров для обработки видеоПрименение современных графических процессоров для обработки видео
Применение современных графических процессоров для обработки видео
 
1508 10035
1508 100351508 10035
1508 10035
 
СХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуре
СХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуреСХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуре
СХД DEPO Storage 4600 для консолидации данных в современной IT-инфраструктуре
 
46
4646
46
 

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

Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...a15464321646213
 
Параллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахПараллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахAlex Tutubalin
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPUMikhail Kurnosov
 
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDAЛекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDAMikhail Kurnosov
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)Smolensk Computer Science Club
 
Современные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO StorageСовременные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO StorageDEPO Computers
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессовstudent_SSGA
 
Scalablehw Лагунцов
Scalablehw ЛагунцовScalablehw Лагунцов
Scalablehw ЛагунцовOntico
 
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...VThn18
 
Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Boris Kizko
 
Hardware maintenance of_the_computer
Hardware maintenance of_the_computerHardware maintenance of_the_computer
Hardware maintenance of_the_computerVitusKK
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Ontico
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XCPostgreSQL-Consulting
 

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

Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...Архитектура и программирование потоковых многоядерных процессоров для научных...
Архитектура и программирование потоковых многоядерных процессоров для научных...
 
Параллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартахПараллельное программирование на современных видеокартах
Параллельное программирование на современных видеокартах
 
Лекция 9. Программирование GPU
Лекция 9. Программирование GPUЛекция 9. Программирование GPU
Лекция 9. Программирование GPU
 
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDAЛекция 11: Программирование графических процессоров на NVIDIA CUDA
Лекция 11: Программирование графических процессоров на NVIDIA CUDA
 
11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)11 встреча — Введение в GPGPU (А. Свириденков)
11 встреча — Введение в GPGPU (А. Свириденков)
 
Современные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO StorageСовременные серверы DEPO Storm и системы хранения DEPO Storage
Современные серверы DEPO Storm и системы хранения DEPO Storage
 
Технические средства реализации информационных процессов
Технические средства реализации информационных процессовТехнические средства реализации информационных процессов
Технические средства реализации информационных процессов
 
Scalablehw Лагунцов
Scalablehw ЛагунцовScalablehw Лагунцов
Scalablehw Лагунцов
 
введение в Gpu
введение в Gpuвведение в Gpu
введение в Gpu
 
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
Лекция 2 Разработка программно-аппаратного обеспечения информационных и автом...
 
Hpc 2.26.03.2013.
Hpc 2.26.03.2013.Hpc 2.26.03.2013.
Hpc 2.26.03.2013.
 
Hardware maintenance of_the_computer
Hardware maintenance of_the_computerHardware maintenance of_the_computer
Hardware maintenance of_the_computer
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XC
 
Presentation
PresentationPresentation
Presentation
 
Data storage systems
Data storage systemsData storage systems
Data storage systems
 
2056
20562056
2056
 
directx
directxdirectx
directx
 

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

  • 1. Архитектура и программирование потоковых многоядерных процессоров для научных расчётов Лекция 2. GPU в составе компьютера Программная модель CUDA (начало) Пример программы
  • 2. Средства обмена данными в компьютере Обмен данными – важнейшая составляющая компьютера Примеры: многопроцессорные системы, FPGA etc. По традиции отдельные устройства имеют разные возможности (уровни и способы) обмена данными б ) б Традиционная архитектура ориентирована на одно, центральное счётное устройство
  • 3. Архитектура Intel Традиции Сев. Мост – общение с памятью и быстрыми шинами Юж. Мост – общение с низко-скоростной й периферией Юж. мост не может напрямую общаться с CPU Иерархическая структура
  • 4. Архитектура AMD HyperTransport – шаг к симметричной распределённой архитектуре HyperTransport Обмен пакетами Выделенные линии в каждом В из направлений 8 Gb/s по каждой линии Сев. Сев Мост реализован на кристалле Юж. Мост - общение с внешними устройствами, сам подключен к CPU напрямую Меньше латентность из-за связующей логики
  • 5. Архитектура AMD (часть 2) Dual Socket Direct Conect архитектура р ур Каждый из CPU имеет свою собственную память Два независимых MCP (Media & Communication Processors) Распределённая архитектура Не совсем – среди процессоров есть вы деленый, соединённый с MCP по двум шинам HypTrans x16
  • 6. Шина PCI Connected to the southBridge Originally 33 MHz, 32-bit wide, 132 MB/second peak transfer rate MHz wide More recently 66 MHz, 64-bit, 512 MB/second peak Upstream bandwidth remain slow for device (256MB/s peak) Shared bus with arbitration Winner of arbitration becomes bus master and can connect to CPU or DRAM through the southbridge and northbridge
  • 7. Шина PCI-Express PCI Express Switched, point-to-point connection Each card has a dedicated “link” to the central switch, no b l h bus arbitration. b Packet switches messages form virtual channel Prioritized 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 direction) di ti ) Upstream and downstream now simultaneous and symmetric Each 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 1’s 0 s; 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
  • 8. Графическая плата NVIDIA SLI К Коннектор Интегрированный Радиатор sVideo TV Out DVI x 2 16x PCI-Express Наплатная память 640 Mb
  • 9. Программный стек CUDA Программы могут использовать GPU посредством: Обращения к стандартным Об функциям библиотек (BLAS, FFTW) cublas.dll (cublasemu dll) cublas dll (cublasemu.dll) cufft.dll (cufftemu.dll) + очень просто - НЕ очень эффективно Использования CUDA runtime API Использования CUDA driver API
  • 10. Application Program Interface (кратко) API нужен для абстракции программного интерфейса от кода пользователя CUDA driver API (функции cu*) cu ) cuda.dll Низкий уровень Тяжелее программировать Больший контроль над процессом CUDA runtime API (функции cuda*) cuda ) cudart.dll Более абстрактно чем driver API (простота) Возможность использовать эмуляцию устройства В й ! Смешивать нельзя !
  • 11. Интерфейс Разработчика Необходимые элементы 1a. Драйвер видеокарты, поддерживающий CUDA 1б. Использование режима “эмуляции” (nvcc -deviceemu) 2. CUDA Toolkit - cодержит Драйвер компилятора nvcc Виртуальную машину ptxas Библиотеки подключаемых исполняемых модулей (*.dll, *.o) 3. CUDA SDK - cодержит Примеры программных проектов р р р р р Вспомогательные утилиты (библиотеки, Occupancy Calculator) Всё это богатство доступно для свободного скачивания http://www.nvidia.com/object/cuda get.html ttp // 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)
  • 13. Программирование приложений при помощи графич. процессора GPGPU приложение Геометрия данных Перенос данных Счет Память Схема обработки данных схожа с методом обработки графических данных Необходимость планирования “геометрии данных” при реализации алгоритма
  • 14. Вычислительная конфигурация GPU Host Device Grid 1 Kernel 1 Block (0, 0) Block (1, 0) Block (2, 0) Block (0, (0 1) Block (1, (1 1) Block (2, (2 1) Grid 2 Kernel 2 Block (1, 1) Thread Thread Thread Thread Thread (0, 0) (1, 0) (2, 0) (3, 0) (4, 0) Thread Thread Thread Thread Thread ( ) (0, 1) ( ) (1, 1) ( ) (2, 1) ( ) (3, 1) ( ) (4, 1) Thread Thread Thread Thread Thread (0, 2) (1, 2) (2, 2) (3, 2) (4, 2) Процессы объединяются в блоки (blocks), внутри которых они имеют общую р щу память (shared memory) и синхронное исполнение Блоки объединяются в сетки (grids) Нет возможности предсказать очерёдность запуска блоков в сетки Между блоками нет и не может быть (см. выше) общей памяти
  • 15. Модель памяти GPU (Device) G id (D i ) Grid Block (0, 0) Constant Memory Texture Memory Block (1, 0) Shared Memory Registers GPU может читать Registers Shared Memory Registers Registers Thread (0, 0) Thread (1, 0) Local Memory Host H t Thread (0, 0) Thread (1, 0) Local Memory Global Gl b l Memory Constant Memory Texture Memory Local Memory Local Memory GPU может читать/писать Global Memory Каждый из процессов ч/п Local Memory L lM Registers Каждый из процессов внутри блока ч/п Shared memory Gather/Scatter MA pattern Хост имеет возможность читать/писать: Global Memory Constant Memory Texture Memory
  • 16. C модификация – декларация функций Executed on the: Only callable from the: __device__ float DeviceFunc() () device device __global__ void device host host host __host__ KernelFunc() float HostFunc() __global__ определяет вычислительное ядро, исполняемое устройством и вызываемое хостом Ядро обязательно должно возвращать void __device__ и __host__ можно использовать совместно __host__ можно опускать host
  • 17. Ограничения на С в программах устройства __device__ и __global__ не могут содержать рекурсий Об Объявлять static переменных внутри себя stat c ере е у р себ Иметь переменное количество аргументов Адрес функции __device__ нельзя использовать при device указании на функцию (а __global__ можно) __global__ и __host__ не могут быть использованы global host е о б с о зо а одновременно При вызове __global__ обязательно указывать конфигурацию вызова
  • 18. Конфигурация вызова вычислительного ядра <<<Gs,Bs,Ms>>> Определение размерностей сетки блоков и блока тредов для данного ядра Gs (grid size) тип - dim3 - размерность сетки блоков Bs (Block size) тип - dim3 - размерность ,блока тредов блока Ms (shared Memory size) – тип size_t – количество общей памяти динамически аллоцированной под данный вызов (можно опускать) у ) !!! GridId BlockID при исполнении указывают конкретному треду на его контекст в рамках общей задачи р у р __global___ void functionA (type argument); functionA<<<Gs,Bs,Ms>>>(arg1);
  • 19. Подготовка устройства Инициализация устройства cudaGetDeviceCount, cudaSetDevice, cudaGetDevice Позволяют правильно выбрать между устройствами Выделение памяти cudaMalloc if(cudaMalloc((void**)&bvCU,(size_t)neurs*sizeof(FLT32))!=cudaSuccess) throw Unsupported(this->Name,"CUDA has failed to allocate BV."); cudaMallocPitch if(cudaMallocPitch((void**)&wmCU,(size_t*)&wm_pitch,ins*sizeof(FLT32),neurs )!=cudaSuccess) throw Unsupported(this->Name "CUDA has failed to allocate Unsupported(this->Name, CUDA WM.");
  • 20. Пересылка данных Копирование между хостом и устройством cudaMemset if(cudaMemset(ldCU,0,ns*sizeof(float))!=cudaSuccess) throw Unsupported(this->Name,"CUDA has failed to zero-init LD."); cudaMemcpy if(cudaMemcpy(bvCU,bvF32,ns*sizeof(FLT32),cudaMemcpyHostToDevice)!=cudaSucc ess) throw Unsupported(this->Name,"CUDA failed to upload BV."); Освобождение памяти О б cudaFree if(cudaFree(wmCU)!=cudaSuccess) throw Unsupported(this->Name "CUDA has failed to de-allocate WM "); Unsupported(this->Name, CUDA WM. );
  • 21. Вызов 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]; */ ( y ) if(LocLayerID==1) { 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."); Unsupported(this Name, CUDA LD. ); } CUDAbackpropagate(ldCU,loCU,wmCU,wmdCU,bvdCU,inCU,indCU,inSize[0],ns,wm_pitch/sizeof(float)); }
  • 22. Функция, использующая 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_pitc h); CUDA_SAFE_CALL( cudaThreadSynchronize() ); }
  • 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) { wm[idx*wm_pitch+blockIdx.x]-=lr*wmd[idx*wm_pitch+blockIdx.x]; [d * h bl k d ] l * d[ d * h bl k d ] if(blockIdx.x==0) bv[idx] -= lr*bvd[idx]; } } __syncthreads(); }
  • 24. Итоги лекции В результате лекции Вы должны : Понимать возможности использования GPU для расчётов с точки зрения пропускной способности системы обмена данными компьютера Иметь понятие об организации разрабокти приложений Интрефейс разработчика API стек Модификации языка С используемые для конфигурации устройства Понять приведенный пример программы использующей CUDA Достаточные знания для начала самостоятельной работы