3. Вычисления на GPU
Открывают новые возможности для исследователя
Значительно сокращая время “до открытия”
Цикл обработки данных уменьшается от дней до минут, от
недель до дней
Новый взгляд на вычислительные архитектуры
Активизируя исследования в области параллельных
алгоритмов, новых программных моделей и вычислительных
архитектур
NVIDIA Confidential
6. CUDA для параллельных вычислений
Программно-аппаратный стек
для процессоров NVIDIA
Раскрывает потенциал GPU для
вычислений общего назначения
Спроектирован для поддержки
любого вычислительного
интерфейса ATI’s Compute “Solution”
OpenCL, C, и т.д.
NVIDIA Confidential
7. Программная модель CUDA
Масштабируемость на десятки ядер, сотни параллельных
потоков
Позволяет сфокусироваться на разработке параллельных
алгоритмов
А не внутренней механике языка программирования
Поддерживает гетерогенные вычисления
CPU для последовательного кода, GPU – для параллельного
NVIDIA Confidential
8. Ключевые абстракции CUDA
Потоки CUDA выражают мелкозернистый параллелизм данных
Упрощают параллельную декомпозицию задач
Виртуализируют физические процессоры
Блоки потоков CUDA выражают крупнозернистый параллелизм
Простая модель исполнения
Обеспечивают прозрачную масштабируемость
Легковесные примитивы синхронизации
Простая модель синхронизации
Разделяемая память для обмена данными между потоками
Кооперативное исполнение потоков
NVIDIA Confidential
9. Потоки CUDA
Ядро CUDA исполняется массивом потоков
Все потоки исполняют одну программу
Каждый поток использует свой индекс для вычислений и
управления исполнением
threadID 01234567
…
float x = input[threadID];
float y = func(x);
output[threadID] = y;
…
NVIDIA Confidential
10. Взаимодействие потоков
Потоки могут быть не полностью независимы
Обмениваются результатами вычислений
Разделяют доступ к внешней памяти
Возможность взаимодействия потоков – ключевая
особенность программной модели CUDA
Потоки кооперируют, используя разделяемую память и примитивы
синхронизации
NVIDIA Confidential
11. Блоки потоков: масштабируемость
Монолитный массив потоков разделяется на блоки
Потоки внутри блока взаимодействуют через разделяемую память
Потоки в разных блоках не могут синхронизироваться
Позволяет программам прозрачно масштабироваться
Блок 0 Блок 1 Блок N-1
threadID 0 1 2 3 4 5 6 01234567 01234567
7
… … …
float x = input[threadID]; float x = input[threadID]; float x = input[threadID];
…
float y = func(x); float y = func(x); float y = func(x);
output[threadID] = y; output[threadID] = y; output[threadID] = y;
… … …
NVIDIA Confidential
12. Прозрачная масштабируемость
Блоки могут быть распределены на любой процессор
Код на CUDA масштабируется на любое количество ядер
Устройство B
Устройство A
SM
SM
SM SM
SM SM
Сетка блоков
Блок 0 Блок 1
Блок 2 Блок 3
Блок 0 Блок 1 Блок 0 Блок 1 Блок 2 Блок 3
Блок 4 Блок 5
Блок 2 Блок 3
Блок 4 Блок 5 Блок 6 Блок 7
Блок 6 Блок 7
Блок 4 Блок 5
Блок 6 Блок 7
NVIDIA Confidential
13. Гетерогенная модель вычислений
Последовательная программа, с параллельными секциями
Последовательный код исполняется на CPU
Параллельный код исполняется блоками потоков на множестве вычислительных
модулей GPU
Последовательный код
Параллельное ядро A
…
KernelA<<< nBlk, nTid >>>(args);
Последовательный код
Параллельное ядро B …
KernelB<<< nBlk, nTid >>>(args);
NVIDIA Confidential
14. Расширения C для CUDA
Стандартный C код Код на CUDA C
__global__ void
void
saxpy_parallel(int n, float a, float *x, float *y)
saxpy_serial(int n, float a,
float *x, float *y) {
int i = blockIdx.x*blockDim.x +
{
threadIdx.x;
for (int i = 0; i < n; ++i)
if (i < n) y[i] = a*x[i] + y[i];
y[i] = a*x[i] + y[i];
}
}
// Вызов параллельного ядра SAXPY с размером
// блока в 256 потоков
// Вызов последовательного
int nblocks = (n + 255) / 256;
// ядра SAXPY
saxpy_parallel<<<nblocks, 256>>>(n, 2.0, x, y);
saxpy_serial(n, 2.0, x, y);
NVIDIA Confidential
1
15. Уровни параллелизма в CUDA
Параллелизм на уровне потоков
Каждый поток – независимая нить исполнения
Параллелизм на уровне данных
По потокам внутри блока
По блокам внутри ядра
Параллелизм на уровне задач
Блоки исполняются независимо друг от друга
NVIDIA Confidential
17. Ресурсы для разработчиков
Инструментарий разработчика CUDA
(CUDA toolkit)
Компилятор и библиотеки
Версии для Win32/64, MacOS, Linux
доступны для загрузки
Набор примеров и средств разработки
(CUDA SDK)
Готовые решения на CUDA
Примеры использования
Библиотеки и инструменты для отладки
и оптимизации
CUFFT, CUBLAS, CUDPP
NVIDIA Confidential
20. Мультипроцессор NVIDIA Tesla 10
SM
I-Cache
RISC-подобная скалярная система команд MT Issue
Многопоточное исполнение инструкций C-Cache
Поддержка до 1024 потоков
SP SP
TPC
Аппаратный менеджер потоков Geometry Controller
SMC
8 скалярных АЛУ
I-Cache I-Cache I-Cache
MT Issue MT Issue MT Issue
SP SP
C-Cache C-Cache C-Cache
SP SP SP SP SP SP
Операции с одинарной точностью IEEE-754 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
DP DP DP
16K 32-х битных регистров Shared Shared Shared
Memory Memory Memory
Texture Unit
SP SP
Tex L1
2 АЛУ для специальных операций
sin/cos/rcp/rsq
SFU SFU
1 АЛУ для операций с двойной точностью
Поддерживает FMA DP
16KB разделяемой памяти
Shared
Memory
NVIDIA Confidential
21. Мифы о вычислениях на GPU
Миф 1: GPU исполняет программы как графические
шейдеры
NVIDIA Confidential
22. Мифы о вычислениях на GPU
Миф 1: GPU исполняет программы как графические
шейдеры
Это не так – CUDA использует вычислительные ресурсы GPU
напрямую
NVIDIA Confidential
23. Мифы о вычислениях на GPU
Миф 2: Архитектурно, GPU представляют из себя
Очень широкие SIMD-машины (1000) ...
… с крайне неэффективной поддержкой ветвления ...
… которые ориентированые на обработку 4-х мерных векторов
NVIDIA Confidential
24. Мифы о вычислениях на GPU
Миф 2: Архитектурно, GPU представляют из себя
Очень широкие SIMD-машины (1000) ...
… с крайне неэффективной поддержкой ветвления ...
… которые ориентированые на обработку 4-х мерных векторов
Современные GPU используют SIMT исполнение, с размером
блока (warp) в 32 элемента и скалярными потоками
NVIDIA Confidential
25. Мифы о вычислениях на GPU
Миф 3: GPU неэффективны с точки зрения
энергопотребления
NVIDIA Confidential
26. Мифы о вычислениях на GPU
Миф 3: GPU неэффективны с точки зрения
энергопотребления
Показатель производительность/ватт для GPU от 4 до 20 раз
выше чем у CPU
NVIDIA Confidential
27. Мифы о вычислениях на GPU
Миф 4: GPU не используют “настоящую” арифметику с
плавающей точкой
NVIDIA Confidential
28. Мифы о вычислениях на GPU
Миф 4: GPU не используют “настоящую” арифметику с
плавающей точкой
GPU поддерживают стандарт IEEE-754
Сравнимы с другими вычислительными устройствами
Поддерживаются вычисления с двойной точностью
NVIDIA Confidential
29. Поддержка операций с двойной точностью
NVIDIA GPU SSE2 Cell SPE
Поддержка стандарта IEEE 754 IEEE 754 IEEE 754
Режимы округления для FADD и FMUL Все 4 режима IEEE: rtne, zero, inf, -inf Все 4 режима IEEE: rtne, zero, inf, -inf Только zero/truncate
Обработка денормализованных чисел С полной скоростью Поддерживается, 1000+ циклов Не поддерживается
Поддержка NaN Да Да Нет
Поддержка переполнений и
Да Да Бесконечности отсутствуют
бесконечностей
Флаги Нет Да Некоторые
Да Нет Да
FMA
Извлечение квадратного корня Эмуляция на основе FMA Аппаратная поддержка Программная эмуляция
Деление Эмуляция на основе FMA Аппаратная поддержка Программная эмуляция
Точность операции 1/x 12 бит 12 бит
24 bit
Точность операции 1/sqrt(x) 12 бит 12 бит
23 bit
Точность операций log2(x) и 2^x Нет Нет
23 bit
NVIDIA Confidential
2
33. FFT Performance: CPU vs GPU (8-Series)
NVIDIA Tesla C870 GPU (8-series GPU)
1D Fast Fourier Transform
Quad-Core Intel Xeon CPU 5400 Series 3.0GHz,
On CUDA In-place, complex, single precision
90
80
70
GFLOPS
60
CUFFT
50
2.x
CUFFT
40
1.1
• Intel FFT numbers
30
calculated by repeating
20
same FFT plan
• Real FFT performance is
10
~10 GFlops
0
Transform Size (Power of 2)
Source for Intel data : http://www.intel.com/cd/software/products/asmo-na/eng/266852.htm
NVIDIA Confidential
34. Single Precision BLAS: CPU vs GPU (10-series)
CUBLAS: CUDA 2.0b2, Tesla C1060 (10-series GPU)
BLAS (SGEMM) on CUDA ATLAS 3.81 on Dual 2.8GHz Opteron Dual-Core
350
CUDA
300
ATLAS 1
250
Thread
GFLOPS
200
150
100
50
0
Matrix Size
NVIDIA Confidential
35. 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
0
Matrix Size
NVIDIA Confidential
40. Linear Scaling with Multiple GPUs
Oil and Gas Computing: Reverse Time Migration
Hand Optimized SSE Versus CUDA C
200
160
GFLOPS
120
80
40
0
1 4 8 128 256 384
Number of Cores
X86 CPU NVIDIA GPU
NVIDIA Confidential