Архитектура Tesla. Программно-аппаратный стек CUDA. Лекторы: Боресков А.В. (ВМиК МГУ) Харламов А.А. (NVidia)

Содержание

Слайд 2

Примеры многоядерных систем На первой лекции мы рассмотрели Intel Core 2

Примеры многоядерных систем

На первой лекции мы рассмотрели
Intel Core 2 Duo
SMP
Cell
BlueGene/L
G80 /

Tesla
Слайд 3

Примеры многоядерных систем Мы хотели обратить ваше внимание на следующие особенности:

Примеры многоядерных систем

Мы хотели обратить ваше внимание на следующие особенности:
Как правило

вычислительный узел – достаточно маломощный процессор
Вычислительные узлы имеют свою оперативную память и свой кэш
Вычислительные узлы объединяются в более крупные блоки
Крупные блоки могут объединяться с целью наращивания вычислительной мощи
Слайд 4

Tesla vs GeForce У кого есть вопросы в чем разница?

Tesla vs GeForce

У кого есть вопросы в чем разница?

Слайд 5

План Архитектура Tesla Программная модель CUDA Синтаксические особенности CUDA

План

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

Программная модель CUDA
Синтаксические особенности CUDA

Слайд 6

Архитектура Tesla: Мультипроцессор Tesla 8

Архитектура Tesla: Мультипроцессор Tesla 8

Слайд 7

Архитектура Tesla Мультипроцессор Tesla 10

Архитектура Tesla Мультипроцессор Tesla 10

Слайд 8

Архитектура Tesla 10 Interconnection Network

Архитектура Tesla 10

Interconnection Network

Слайд 9

Архитектура Маштабируемость: [+][-] SM внутри TPC [+][-] TPC [+][-] DRAM партиции

Архитектура

Маштабируемость:
[+][-] SM внутри TPC
[+][-] TPC
[+][-] DRAM партиции
Схожие архитектуры:
Tesla 8: 8800 GTX
Tesla

10: GTX 280
Слайд 10

Технические детали RTM CUDA Programming Guide Run CUDAHelloWorld Печатает аппаратно зависимые

Технические детали

RTM CUDA Programming Guide
Run CUDAHelloWorld
Печатает аппаратно зависимые параметры
Размер shared памяти
Кол-во

SM
Размер warp’а
Кол-во регистров на SM
т.д.
Слайд 11

План Архитектура Tesla Синтаксические особенности CUDA Программная модель CUDA

План

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

Синтаксические особенности CUDA

Программная модель CUDA

Слайд 12

Программная модель CUDA GPU (device) это вычислительное устройство, которое: Является сопроцессором

Программная модель CUDA

GPU (device) это вычислительное устройство, которое:
Является сопроцессором к

CPU (host)
Имеет собственную память (DRAM)
Выполняет одновременно очень много нитей
Слайд 13

Программная модель CUDA Последовательные части кода выполняются на CPU Массивно-параллельные части

Программная модель CUDA

Последовательные части кода выполняются на CPU
Массивно-параллельные части кода выполняются

на GPU как ядра
Отличия нитей между CPU и GPU
Нити на GPU очень «легкие»
HW планировщик задач
Для полноценной загрузки GPU нужны тысячи нитей
Для покрытия латентностей операций чтения / записи
Для покрытия латентностей sfu инструкций
Слайд 14

Программная модель CUDA Параллельная часть кода выполняется как большое количество нитей

Программная модель CUDA

Параллельная часть кода выполняется как большое количество нитей
Нити группируются

в блоки фиксированного размера
Блоки объединяются в сеть блоков
Ядро выполняется на сетке из блоков
Каждая нить и блок имеют свой идентификатор
Слайд 15

Программная модель CUDA Десятки тысяч потоков for (int ix = 0;

Программная модель CUDA

Десятки тысяч потоков

for (int ix = 0; ix <

nx; ix++)
{
pData[ix] = f(ix); }

for (int ix = 0; ix < nx; ix++)
for (int iy = 0; iy < ny; iy++)
{
pData[ix + iy * nx] = f(ix) * g(iy); }

for (int ix = 0; ix < nx; ix++)
for (int iy = 0; iy < ny; iy++)
for (int iz = 0; iz < nz; iz++)
{
pData[ix + (iy + iz * ny) * nx] = f(ix) * g(iy) * h(iz); }

Слайд 16

Программная модель CUDA Потоки в CUDA объединяются в блоки: Возможна 1D,

Программная модель CUDA

Потоки в CUDA объединяются в блоки:
Возможна 1D, 2D, 3D

топология блока
Общее кол-во потоков в блоке ограничено
В текущем HW это 512 потоков
Слайд 17

Программная модель CUDA Потоки в блоке могут разделять ресурсы со своими

Программная модель CUDA

Потоки в блоке могут разделять ресурсы со своими соседями

float

g_Data[gN];
for (int ix = 0; ix < nx; ix++)
{
pData[ix] = f(ix, g_Data[ix / n]); }
Слайд 18

Программная модель CUDA Блоки могут использовать shared память Т.к. блок целиком

Программная модель CUDA

Блоки могут использовать shared память
Т.к. блок целиком выполняется

на одном SM
Объем shared памяти ограничен и зависит от HW
Внутри Блока потоки могут синхронизоваться
Т.к. блок целиком выполняется на одном SM
Слайд 19

Программная модель CUDA Блоки потоков объединяются в сетку (grid) потоков Возможна

Программная модель CUDA

Блоки потоков объединяются в сетку (grid) потоков
Возможна 1D, 2D

топология сетки блоков потоков
Слайд 20

План Архитектура Tesla Синтаксические особенности CUDA Программная модель CUDA

План

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

Синтаксические особенности CUDA

Программная модель CUDA

Слайд 21

Синтаксис CUDA CUDA – это расширение языка C [+] спецификаторы для

Синтаксис CUDA

CUDA – это расширение языка C
[+] спецификаторы для

функций и переменных
[+] новые встроенные типы
[+] встроенные переменные (внутри ядра)
[+] директива для запуска ядра из C кода
Как скомпилировать CUDA код
[+] nvcc компилятор
[+] .cu расширение файла
Слайд 22

Синтаксис CUDA Спецификаторы Спецификатор функций Спецификатор переменных

Синтаксис CUDA Спецификаторы

Спецификатор функций

Спецификатор переменных

Слайд 23

Синтаксис CUDA Встроенные переменные Сравним CPU код vs CUDA kernel: __global__

Синтаксис CUDA Встроенные переменные

Сравним CPU код vs CUDA kernel:

__global__ void incKernel

( float * pData )
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
pData [idx] = pData [idx] + 1.0f;
}

float * pData;
for (int ix = 0; ix < nx; ix++)
{
pData[ix] = pData[ix] + 1.0f; }

Пусть nx = 2048
Пусть в блоке 256 потоков
? кол-во блоков = 2048 / 256 = 8

[ 0 .. 7 ]

[ == 256]

[ 0 .. 255 ]

Слайд 24

Синтаксис CUDA Встроенные переменные В любом CUDA kernel’e доступны: dim3 gridDim;

Синтаксис CUDA Встроенные переменные

В любом CUDA kernel’e доступны:
dim3 gridDim;
uint3 blockIdx;
dim3 blockDim;
uint3 threadIdx;
int

warpSize;

dim3 – встроенный тип, который используется для задания размеров kernel’а
По сути – это uint3.

Слайд 25

Синтаксис CUDA Директивы запуска ядра Как запустить ядро с общим кол-во

Синтаксис CUDA Директивы запуска ядра

Как запустить ядро с общим кол-во тредов

равным nx?

incKernel<<>> ( pData );

dim3 threads(256, 1, 1);
dim3 blocks(nx / 256, 1);

float * pData;

<<< , >>> угловые скобки, внутри которых задаются параметры запуска ядра:
Кол-во блоке в сетке
Кол-во потоков в блоке

Неявно предпологаем, что nx кратно 256

Слайд 26

Как скомпилировать CUDA код NVCC – компилятор для CUDA Основными опциями

Как скомпилировать CUDA код

NVCC – компилятор для CUDA
Основными опциями команды nvcc являются:
-deviceemu - компиляция

в режиме эмуляции, весь код будет выполняться в многонитевом режиме на CPU и можно использовать обычный отладчик (хотя не все ошибки могут проявится в таком режиме)
--use_fast_math - заменить все вызовы стандартных математических функций на их быстрые (но менее точные) аналоги
-o  - задать имя выходного файла
CUDA файлы обычно носят расширение .cu
Слайд 27

Ресуры нашего курса CUDA.CS.MSU.SU Место для вопросов и дискуссий Место для

Ресуры нашего курса

CUDA.CS.MSU.SU
Место для вопросов и дискуссий
Место для материалов нашего курса
Место

для ваших статей!
Если вы нашли какой-то интересный подход!
Или исследовали производительность разных подходов и знаете, какой из них самый быстрый!
Или знаете способы сделать работу с CUDA проще!
Steps3d
www.nvidia.ru