Академический Документы
Профессиональный Документы
Культура Документы
для параллельных
вычислений на GPU
Александр Харламов
NVIDIA
Вычисления на GPU
Открывают новые возможности
Значительно сокращая время до получения результата
Цикл обработки данных уменьшается от дней до минут, от
недель до дней
1 TF
900 GPU 10-й
800
серии
700
600
500
400 GPU 8-й
300 серии
200
100
0
2002 2003 2004 2005 2006 2007 2008
Исследователи всего мира строят станции на основе GPU
3 GPUs
3 GPUs
Korea University of
Illinois
2 GPUs
University of
Cambridge, UK
8 GPUs
16 GPUs
University of
Antwerp,
Belgium
Параллельные вычисления на GPU
100+ млн. GPU в мире поддерживают CUDA
Max Planck GE Healthcare CEA Hess Synopsys Renault Symcor The Nokia
FDA Siemens WRF Weather TOTAL Nascentric Boeing Level 3 Mathworks RIM
Robarts Techniscan Modeling CGG/Veritas Gauda SciComp Wolfram Philips
Research Boston Scientific OptiTex Chevron CST Hanweck National Samsung
Medtronic Eli Lilly Tech-X Headwave Agilent Quant Instruments LG
AGC Silicon Elemental Acceleware Catalyst Access Sony
Technologies Analytics
Evolved Informatics Seismic City RogueWave Ericsson
Dimensional Tech-x
machines Stockholm Imaging P-Wave BNP Paribas NTT
Smith-Waterman Research Seismic RIKEN DoCoMo
Manifold
DNA sequencing Harvard Imaging SOFA Mitsubishi
Digisens
AutoDock Delaware Mercury Hitachi
General Mills
NAMD/VMD Pittsburg Computer Radio
Rapidmind
Folding@Home ETH Zurich ffA Research
MS Visual
Howard Huges Institute Atomic Laboratory
Studio
Medical Physics US Air Force
Rhythm & Hues
CRIBI Genomics
xNormal
Elcomsoft
LINZIK
Будущие прорывы в индустрии опираются
на компьютерное моделирование
Программно-аппаратный стек
для процессоров NVIDIA
threadID 0 1 2 3 4 5 6 7
…
float x = input[threadID];
float y = func(x);
output[threadID] = y;
…
Взаимодействие потоков
… … …
float x = input[threadID]; float x = input[threadID]; float x = input[threadID];
float y = func(x);
output[threadID] = y;
float y = func(x);
output[threadID] = y; … float y = func(x);
output[threadID] = y;
… … …
Прозрачная масштабируемость
Устройство A Устройство B
SM SM SM SM SM SM
Сетка блоков
Блок 0 Блок 1
Блок 4 Блок 5
Блок 2 Блок 3
Блок 4 Блок 5 Блок 6 Блок 7
Блок 6 Блок 7
Блок 4 Блок 5
Блок 6 Блок 7
Гетерогенная модель вычислений
Последовательная программа, с параллельными секциями
Последовательный код исполняется на CPU
Параллельный код исполняется блоками потоков на множестве вычислительных
модулей GPU
Последовательный код
Параллельное ядро A
…
KernelA<<< nBlk, nTid >>>(args);
Последовательный код
Параллельное ядро B …
KernelB<<< nBlk, nTid >>>(args);
Расширения C для CUDA
1
Уровни параллелизма в CUDA
Block
Thread
Регистры Разделяемая
Локальная память память
Пространство памяти CUDA
…
Глобальная
KernelB<<< nBlk, nTid >>>(args); память
…
Пространство памяти CUDA
Устройство 0
8 скалярных АЛУ
I-Cache I-Cache I-Cache
MT Issue MT Issue MT Issue
C-Cache
SP SP
C-Cache
SP SP
C-Cache
SP SP
SP SP
Операции с одинарной точностью IEEE-754 SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
Целочисленные операции
SP SP SP SP SP SP
SFU SFU
DP
SFU SFU
DP
SFU SFU
DP
SP SP
16K 32-х битных регистров Shared
Memory
Shared
Memory
Texture Unit
Shared
Memory
SP SP
sin/cos/rcp/rsq
SFU SFU
1 АЛУ для операций с двойной точностью
Поддерживает FMA DP
16KB разделяемой памяти
Shared
Memory
Архитектура NVIDIA Tesla 10
240 процессоров работают на частоте 1.5 GHz: 1 TFLOPS в пике
128 потоков на процессор: 30,720 потоков на чипе
SM
I-Cache
MT Issue
C-Cache
SP SP
Host CPU Bridge System Memory
Work Distribution
Tesla T10 SP SP
I-Cache
SMC
``
I-Cache I-Cache
SP SP
MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue MT Issue
C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache C-Cache
SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP SP SP SP ` SP SP SP
SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP SP
SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU SFU
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
DP
Shared
SFU SFU
Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory Memory
Texture Unit Texture Unit Texture Unit Texture Unit Texture Unit Texture Unit Texture Unit Texture Unit Texture Unit Texture Unit
Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1 Tex L1
Interconnection Network
DP
ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2
Shared
DRAM DRAM DRAM DRAM DRAM DRAM DRAM DRAM Memory
Программная модель & архитектура
…
Программная модель & архитектура
…
Fermi
CUDA C
Runtime API
Driver API
OpenCL
CUDA C (Runtime API)
Расширение языка C
CUDA API:
Расширения языка C
Затрагивает те части кода, которые исполняются на GPU
Runtime библиотека состоит из:
Общие компоненты (типы и функции)
Управление GPU и взаимодействие с графическими API
Функции доступные на GPU
– __syncthreads
– «быстрые» функции
Расширение языка:
Спецификаторы функций
Исполняется Вызывается
__device__ float DeviceFunc() device device
__global__ void KernelFunc() device host
__host__ float HostFunc() host host
переменные
С / C++ интерфейс
Библиотека функций
__device__
CUDA C Runtime
int main ( int argc, char * argv [] )
NVCC (cudart.lib) {
float * a = new float [N]; // CPU память
Спецификаторы float * dev = NULL; // GPU память
return 0;
}
CUDA C Runtime
#define N (256*256) // array size
#define PI 3.1415926f
float a = pSrc[start];
float b = pSrc[stop];
float r = a * (1 - t) + b * t;
pDst[idx] = r;
}
CUDA C Runtime
NVCC
-keep
.ptx
.cubin
CUDA C Runtime
__global__ void kernel ( float * data )
NVCC {
int idx = blockIdx.x * blockDim.x + threadIdx.x ;
-keep data [idx] = idx;
}
.ptx
.cubin
CUDA C Runtime
.entry _Z6kernelPf (
NVCC .param .u32 __cudaparm__Z6kernelPf_data)
{
.reg .u16 %rh<4>;
-keep .reg .u32 %r<8>;
.reg .f32 %f<3>;
.ptx .loc 14 6 0
$LBB1__Z6kernelPf:
.cubin .loc 14 10 0
mov.u16 %rh1, %ctaid.x; //
mov.u16 %rh2, %ntid.x; //
mul.wide.u16 %r1, %rh1, %rh2; //
cvt.u32.u16 %r2, %tid.x; //
add.u32 %r3, %r2, %r1; //
cvt.rn.f32.s32 %f1, %r3; //
ld.param.u32 %r4, [__cudaparm__Z6kernelPf_data]; // i
mul.lo.u32 %r5, %r3, 4; //
add.u32 %r6, %r4, %r5; //
st.global.f32 [%r6+0], %f1; // id:15
.loc 14 11 0
exit;
$LDWend__Z6kernelPf:
} // _Z6kernelPf
CUDA C Driver
Низкоуровневый API CUdevice device;
CUcontext context;
Инициализация cuInit() CUmodule module;
CUfunction function;
Поиск устройства CUdeviceptr pData;
CUdevice float * pHostData = new float[N];
Создание контекста
cuInit(0);
CUcontext
Загрузка модуля cuDeviceGetCount(&device_count);
cuDeviceGet( &device, 0 );
CUmodule
cuCtxCreate( &context, 0, device );
Загрузка функции
CUfunction cuModuleLoad( &module, "hello.cuda_runtime.ptx" );
Выделение памяти cuModuleGetFunction( &function, module, "_Z6kernelPf" );
CUdeviceptr
cuMemAlloc( &pData, N * sizeof(float) );
// …
// ...
CUDA C Driver
Низкоуровневый API // ...
// …
cuFuncSetBlockShape( function, N, 1, 1 );
Установка размеров
cuParamSeti( function, 0, pData );
блока
Установка аргументов cuParamSetSize( function, sizeof(void *) );
функции ядра cuLaunchGrid( function, 1, 1 );
Установка параметров
cuMemcpyDtoH( pHostData, pData, N * sizeof( float) );
ядра
cuMemFree( pData );
Запуск ядра cuLaunch()
Копирование памяти
Освобождение ресурсов
OpenCL
Кроссплатформенный стандарт
GPU, CPU, Cell, …
Проблема: функциональность, но не производительность
Разный код для разных платформ
Разные расширения openGL-style
CUDA vs OpenCL
Терминология
CUDA C OpenCL
Поток (thread) Элемент работы (work-item)
Блок потоков Группа работы (work-group)
(thread block) N-мерное пространство индексов (ND-
Сеть (grid) Range index space)
Ядро Ядро
CUDA vs OpenCL
Спецификаторы функций
CUDA C OpenCL
__global__ __kernel
__host__ n/a
__device__ n/a
CUDA vs OpenCL
Пространство памяти
CUDA C OpenCL
__device__ __global
__shared__ __local
__constant__ __constant
local __private
OpenCL
Низкоуровневый API cl_context ctx;
cl_command_queue cmd_q;
Создание контекста cl_program program;
cl_kernel kernel;
cl_context cl_mem mem;
cl_device_id * pDevId = NULL;
Поиск устройства
cl_device_id
ctx = clCreateContextFromType(0,CL_DEVICE_TYPE_GPU,0,0,0)
Создание очереди
комманд clGetContextInfo(ctx,CL_CONTEXT_DEVICES,0,0,&dev_cnt);
// ...
OpenCL
Низкоуровневый API // ...
PTX
PTX
2 .reg 10 .reg !
28 bytes lmem !
PTX
Occupancy
Calculator
Spreadsheet
Оптимизация
Visual
Profiler
Оптимизация
Profiler
Counter
Plot
Особенности памяти
… …
128 132 136 140 144 184 188 192
t0 t1 t2 t3 t14 t15
… …
128 132 136 140 144 184 188 192
… …
128 132 136 140 144 184 188 192
Произвольный доступ
… …
128 132 136 140 144 184 188 192
2х Конфликты 8х Конфликты
Следить за ветвлением
Интринсики
__sinf(); __cosf(); expf()
__[u]mul24()
__fdividef()
__[u]sad()
Мифы о вычислениях на GPU
Мифы о вычислениях на GPU
Режимы округления для FADD и FMUL Все 4 режима IEEE: rtne, zero, inf, -inf Все 4 режима IEEE: rtne, zero, inf, -inf Только zero/truncate
Извлечение квадратного корня Эмуляция на основе FMA Аппаратная поддержка Программная эмуляция
8
Вопросы ?
GPU
CPU
Oil & Gas Finance Medical Biophysics Numerics Audio Video Imaging
80
70
GFLOPS
60
CUFFT
50
2.x
40 CUFFT
1.1
30 • Intel FFT numbers
calculated by repeating
20
same FFT plan
10 • Real FFT performance is
~10 GFlops
0
CUDA
300
ATLAS 1
250
Thread
GFLOPS
200
150
100
50
Matrix Size
Double Precision BLAS: CPU vs GPU (10-series)
CUBLAS CUDA 2.0b2 on Tesla C1060 (10-series)
BLAS (DGEMM) on CUDA ATLAS 3.81 on Intel Xeon E5440 Quad-core, 2.83 GHz
70
CUBLAS
60
50
GFLOPS
40
30
20
10
Matrix Size
Folding@Home
Folding@Home
600
450 511
ns/day
300 369
4 150
170
4 100
CPU 0 PS3 ATI GPU Tesla 8 Tesla 10
NVIDIA GPUS
© NVIDIA Corporation 2008
National Center for Atmospheric Research
Weather Research and Forecast (WRF) model
4000+ registered users worldwide
First-ever release with GPU acceleration
12km CONUS WRF benchmark
Running on NCSA CUDA cluster
160
GFLOPS
120
80
40
0
1 4 8 128 256 384