introduction in cuda (1-3)

37
Часть I: Введение в CUDA Александр Межов Ассистент кафедры Информатики [email protected] 30 сентября 2011 Кафедра Информатики

Upload: alexander-mezhov

Post on 04-Jul-2015

5.251 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Introduction in CUDA (1-3)

Часть I: Введение в CUDAАлександр Межов

Ассистент кафедры Информатики[email protected]

30 сентября 2011Кафедра Информатики

Page 2: Introduction in CUDA (1-3)

АППАРАТНЫЕ ОСОБЕННОСТИ GPUКраткий обзор архитектурных особенностей GPU

Page 3: Introduction in CUDA (1-3)

Основные тенденции

• Переход к многопроцессорным системам

• Развития технологий параллельного программирования

– OpenMP, MPI, TPL etc.

– Простота в использовании

Page 4: Introduction in CUDA (1-3)

Классификация архитектур

• Виды параллелизма

– На уровне данных (Data)

– На уровне задач (Instruction)

Single Instruction (SI) Multiple Instruction (MI)

Single Data (SD) SISD MISD

Multiple Data (MD) SIMD MIMD

*GPU: SIMT – Single Instruction Multiple Thread

Page 5: Introduction in CUDA (1-3)

Архитектура многоядерных CPU

• Кэш первого уровня– для инструкций (L1-I)

– для данных (L1-D)

• Кэш второго уровня– на одном кристалле

– используется раздельно

• Проблема синхронизации кэш-памяти

Processor 1 Processor 2

L1-I

L2

L1-D L1-I L1-D

Page 6: Introduction in CUDA (1-3)

Архитектура GPU: Device

L2

. . .

Texture Processing Cluster

Texture

SM

SM

. . .

Texture Processing Cluster

Texture

SM

SM

. . .

Device RAM

Page 7: Introduction in CUDA (1-3)

Архитектура GPU: TPC

• Кластер текстурных блоков (TPC)

– Память для текстур

– Потоковый мультипроцессор

Texture Processing Cluster (TPC)

Text

ure

mem

ory Streaming

Multiprocessor

. . .

Streaming Multiprocessor

Page 8: Introduction in CUDA (1-3)

Архитектура GPU: SM

• Память констант

• Память инструкций

• Регистровая память

• Разделяемая память

• 8 скалярных процессоров

• 2 суперфункциональных блока

Streaming Multiprocessor

Instructions Constants

Shared Memory

SP

SP

SP

SP

SP

SP

SP

SP

SFU SFU

Registers

Page 9: Introduction in CUDA (1-3)

Основные отличия GPU от CPU

• Высокая степень параллелизма (SIMT)

• Минимальные затраты на кэш-память

• Ограничения функциональности

Page 10: Introduction in CUDA (1-3)

РАЗВИТИЕ ВЫЧИСЛЕНИЙ НА GPUРазвитие технологии неграфических вычислений

Page 11: Introduction in CUDA (1-3)

Эволюция GPU

Voodoo

T&L

Shader

Floating-point

GPGPU

Page 12: Introduction in CUDA (1-3)

GPGPU

• General-Purpose Computation on GPU– Вычисления на GPU общего (неграфического)

назначения

– AMD FireStream

– NVIDIA CUDA

– DirectCompute (DirectX 10)

– OpenCL

Page 13: Introduction in CUDA (1-3)

ПРОГРАММНАЯ МОДЕЛЬ CUDAОсновные понятия и определения CUDA

Page 14: Introduction in CUDA (1-3)

CUDA – Compute Unified Device Architecture

• Host – CPU (Central Processing Unit)

• Device – GPU (Graphics Processing Unit)

Page 15: Introduction in CUDA (1-3)

Организация работы CUDA GPU

Исходные данные

Блок

Потоки

Блок

Потоки

Блок

Потоки

Ядро (Kernel)

Page 16: Introduction in CUDA (1-3)

Warp и латентность

• Warp

– Порция потоков для выполнения на потоковом мультипроцессоре (SM)

• Латентность

– Общая задержка всех потоков warp’а при выполнении инструкции

Page 17: Introduction in CUDA (1-3)

Топология блоков (block)

• Возможна 1, 2 и 3-мерная топология

• Количество потоков в блоке ограничено (512)

1D

2D3D

Page 18: Introduction in CUDA (1-3)

Топология сетки блоков (grid)

• Возможна 1 и 2-мерная топология• Количество блоков в каждом измерении

ограничено 65536=216

1D

2D

Page 19: Introduction in CUDA (1-3)

Адресация элементов данных

• CUDA предоставляет встроенные переменные, которые идентифицируют блоки и потоки

– blockIdx

– blockDim

– threadIdx

1D Grid & 2D Block:

int dataIdnex = blockIdx.x * blockDim.x + threadIdx.x

Page 20: Introduction in CUDA (1-3)

Барьерная синхронизация

• Синхронизация потоков блока осуществляется встроенным оператором __synchronize

Блок

Потоки

Page 21: Introduction in CUDA (1-3)

CUDA: РАСШИРЕНИЕ C++Особенности написания программ для GPU CUDA

Page 22: Introduction in CUDA (1-3)

Расширение языка С++

• Новые типы данных

• Спецификаторы для функций

• Спецификаторы для переменных

• Встроенные переменные (для ядра)

• Директива для запуска ядра

Page 23: Introduction in CUDA (1-3)

Процесс компиляции

Файлы CUDA (GPU)*.cu

Файлы CPU*.cpp, *.h

Исполняемый модуль*.dll, *.exe

nvcc VC90

Page 24: Introduction in CUDA (1-3)

Типы данных CUDA

• 1, 2, 3 и 4-мерные вектора базовых типов

– Целые: (u)char, (u)int, (u)short, (u)long, longlong

– Дробные: float, double

– Пример: float(1), float2, float3, float4

• dim3 ~ uint3

– Пример: dim3(n) = uint(n,1,1)

Page 25: Introduction in CUDA (1-3)

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

Спецификатор Выполняется Вызывается

__device__ device device

__global__ device host

__host__ host host

Page 26: Introduction in CUDA (1-3)

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

• Ядро помечается __global__

• Ядро не может возвращать значение

• Возможно совместное использование __host__ и __device__

• Спецификаторы __global__ и __host__ не могут использоваться совместно

Page 27: Introduction in CUDA (1-3)

Ограничения функций GPU

• Не поддерживается рекурсия

• Не поддерживаются static-переменные

• Нельзя брать адрес функции __device__

• Не поддерживается переменное число аргументов

Page 28: Introduction in CUDA (1-3)

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

Спецификатор Находится Доступна Вид доступа

__device__ device device R

__constant__ device device / host R / R/W

__shared__ device block R/W

Page 29: Introduction in CUDA (1-3)

Ограничения переменных GPU

• Переменные __shared__ не могут инициализироваться при объявлении

• Запись в __constant__ может производить только host через CUDA API

• Спецификаторы нельзя применять к полям структур и union

Page 30: Introduction in CUDA (1-3)

Переменные ядра

• dim3 gridDim

• unit3 blockIdx

• dim3 blockDim

• uint3 threadIdx

• int warpSize

Page 31: Introduction in CUDA (1-3)

Директива запуска ядра

• Kernel<<<blocks, threads>>>(data)

– blocks – число блоков в сетке

– threads – число потоков в блоке

Page 32: Introduction in CUDA (1-3)

Общая структура программы CUDA

__global__ void Kernel(float* data){

. . .}

void main(){

. . .

Kernel<<<blocks, threads>>>(data);

. . .}

Page 33: Introduction in CUDA (1-3)

Предустановки

• Видеокарта NVIDIA с поддержкой CUDA• Драйвера устройства с поддержкой CUDA

• NVIDIA CUDA Toolkit• NVIDIA CUDA SDK• NVIDIA Nsight

• Visual Studio 2008 / 2010• Компилятор Visual C++ 9.0

Page 34: Introduction in CUDA (1-3)

Пример программы CUDA

Page 35: Introduction in CUDA (1-3)

Литература

• NVIDIA Developer Zone– http://developer.nvidia.com/cuda

• NVIDAI CUDA – Неграфические вычисления на графических процессорах– http://www.ixbt.com/video3/cuda-1.shtml

• Создание простого приложения CUDA в Visual Studio 2010– http://mezhov.blogspot.com/2011/09/cuda-visual-

studio-2010.html

Page 36: Introduction in CUDA (1-3)

Спасибо за внимание

Александр Межов[email protected]

30 сентября 2011Кафедра Информатики

Page 37: Introduction in CUDA (1-3)

Часть II: Обзор CUDA APIАлександр Межов

Ассистент кафедры Информатики[email protected]

Кафедра Информатики