Introduction in CUDA (1-3)
-
Upload
alexander-mezhov -
Category
Technology
-
view
5.247 -
download
0
Transcript of Introduction in CUDA (1-3)
![Page 1: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/1.jpg)
Часть I: Введение в CUDAАлександр Межов
Ассистент кафедры Информатики[email protected]
30 сентября 2011Кафедра Информатики
![Page 2: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/2.jpg)
АППАРАТНЫЕ ОСОБЕННОСТИ GPUКраткий обзор архитектурных особенностей GPU
![Page 3: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/3.jpg)
Основные тенденции
• Переход к многопроцессорным системам
• Развития технологий параллельного программирования
– OpenMP, MPI, TPL etc.
– Простота в использовании
![Page 4: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/4.jpg)
Классификация архитектур
• Виды параллелизма
– На уровне данных (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)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/5.jpg)
Архитектура многоядерных 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)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/6.jpg)
Архитектура GPU: Device
L2
. . .
Texture Processing Cluster
Texture
SM
SM
. . .
Texture Processing Cluster
Texture
SM
SM
. . .
Device RAM
![Page 7: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/7.jpg)
Архитектура GPU: TPC
• Кластер текстурных блоков (TPC)
– Память для текстур
– Потоковый мультипроцессор
Texture Processing Cluster (TPC)
Text
ure
mem
ory Streaming
Multiprocessor
. . .
Streaming Multiprocessor
![Page 8: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/8.jpg)
Архитектура 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)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/9.jpg)
Основные отличия GPU от CPU
• Высокая степень параллелизма (SIMT)
• Минимальные затраты на кэш-память
• Ограничения функциональности
![Page 10: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/10.jpg)
РАЗВИТИЕ ВЫЧИСЛЕНИЙ НА GPUРазвитие технологии неграфических вычислений
![Page 11: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/11.jpg)
Эволюция GPU
Voodoo
T&L
Shader
Floating-point
GPGPU
![Page 12: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/12.jpg)
GPGPU
• General-Purpose Computation on GPU– Вычисления на GPU общего (неграфического)
назначения
– AMD FireStream
– NVIDIA CUDA
– DirectCompute (DirectX 10)
– OpenCL
![Page 13: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/13.jpg)
ПРОГРАММНАЯ МОДЕЛЬ CUDAОсновные понятия и определения CUDA
![Page 14: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/14.jpg)
CUDA – Compute Unified Device Architecture
• Host – CPU (Central Processing Unit)
• Device – GPU (Graphics Processing Unit)
![Page 15: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/15.jpg)
Организация работы CUDA GPU
Исходные данные
Блок
Потоки
Блок
Потоки
Блок
Потоки
Ядро (Kernel)
![Page 16: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/16.jpg)
Warp и латентность
• Warp
– Порция потоков для выполнения на потоковом мультипроцессоре (SM)
• Латентность
– Общая задержка всех потоков warp’а при выполнении инструкции
![Page 17: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/17.jpg)
Топология блоков (block)
• Возможна 1, 2 и 3-мерная топология
• Количество потоков в блоке ограничено (512)
1D
2D3D
![Page 18: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/18.jpg)
Топология сетки блоков (grid)
• Возможна 1 и 2-мерная топология• Количество блоков в каждом измерении
ограничено 65536=216
1D
2D
![Page 19: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/19.jpg)
Адресация элементов данных
• CUDA предоставляет встроенные переменные, которые идентифицируют блоки и потоки
– blockIdx
– blockDim
– threadIdx
1D Grid & 2D Block:
int dataIdnex = blockIdx.x * blockDim.x + threadIdx.x
![Page 20: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/20.jpg)
Барьерная синхронизация
• Синхронизация потоков блока осуществляется встроенным оператором __synchronize
Блок
Потоки
![Page 21: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/21.jpg)
CUDA: РАСШИРЕНИЕ C++Особенности написания программ для GPU CUDA
![Page 22: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/22.jpg)
Расширение языка С++
• Новые типы данных
• Спецификаторы для функций
• Спецификаторы для переменных
• Встроенные переменные (для ядра)
• Директива для запуска ядра
![Page 23: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/23.jpg)
Процесс компиляции
Файлы CUDA (GPU)*.cu
Файлы CPU*.cpp, *.h
Исполняемый модуль*.dll, *.exe
nvcc VC90
![Page 24: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/24.jpg)
Типы данных 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)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/25.jpg)
Спецификаторы функций
Спецификатор Выполняется Вызывается
__device__ device device
__global__ device host
__host__ host host
![Page 26: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/26.jpg)
Спецификаторы функций
• Ядро помечается __global__
• Ядро не может возвращать значение
• Возможно совместное использование __host__ и __device__
• Спецификаторы __global__ и __host__ не могут использоваться совместно
![Page 27: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/27.jpg)
Ограничения функций GPU
• Не поддерживается рекурсия
• Не поддерживаются static-переменные
• Нельзя брать адрес функции __device__
• Не поддерживается переменное число аргументов
![Page 28: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/28.jpg)
Спецификаторы переменных
Спецификатор Находится Доступна Вид доступа
__device__ device device R
__constant__ device device / host R / R/W
__shared__ device block R/W
![Page 29: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/29.jpg)
Ограничения переменных GPU
• Переменные __shared__ не могут инициализироваться при объявлении
• Запись в __constant__ может производить только host через CUDA API
• Спецификаторы нельзя применять к полям структур и union
![Page 30: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/30.jpg)
Переменные ядра
• dim3 gridDim
• unit3 blockIdx
• dim3 blockDim
• uint3 threadIdx
• int warpSize
![Page 31: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/31.jpg)
Директива запуска ядра
• Kernel<<<blocks, threads>>>(data)
– blocks – число блоков в сетке
– threads – число потоков в блоке
![Page 32: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/32.jpg)
Общая структура программы CUDA
__global__ void Kernel(float* data){
. . .}
void main(){
. . .
Kernel<<<blocks, threads>>>(data);
. . .}
![Page 33: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/33.jpg)
Предустановки
• Видеокарта 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)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/34.jpg)
Пример программы CUDA
![Page 35: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/35.jpg)
Литература
• 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 37: Introduction in CUDA (1-3)](https://reader033.fdocuments.us/reader033/viewer/2022060123/559751c01a28ab005c8b457e/html5/thumbnails/37.jpg)
Часть II: Обзор CUDA APIАлександр Межов
Ассистент кафедры Информатики[email protected]
Кафедра Информатики