What is a GPU? A Graphics Processing Unit or GPU (also occasionally called Visual Processing Unit or VPU) is a dedicated graphics rendering device for a personal computer or game console. Modern GPUs are very efficient at manipulating and displaying computer graphics, and their highly-parallel structure makes them more effective than typical CPUs for a range of complex algorithms. - Definition from wikipedia.org Radeon 9800 Pro
History of GPUs The pre-GPU era VGAs in the 80s 4 (or even 5) generations of GPUs in the last decade Fixed functions vs. programmability API support OpenGL, Direct3D (v6.0 to v9.0) Shader models (v1.0 – v3.0)
Предыстория к GPGPU Сопроцессор Видео- ускоритель Шейдеры GPU
Why shifting from CPU to GPU? Why not just keep increasing the CPU speed and leave the GPU to handle what is its best? CPU speed is reaching a bottle neck (how many transistors can be integrated on a chip) Solution, in the future, nano technology, short term, dual core machines (double CPUs), clustered CPUs, …, even grid computing and supercomputing GPU facing the same problem, but still have space to press on due to its task specific designs and parallelism paradigm
Существующие многоядерные системы Посмотрим на частоты CPU: 2004 г. - Pentium 4, 3.46 GHz 2005 г. - Pentium 4, 3.8 GHz 2006 г. - Core Duo T2700, 2333 MHz 2007 г. - Core 2 Duo E6700, 2.66 GHz 2007 г. - Core 2 Duo E6800, 3 GHz 2008 г. - Core 2 Duo E8600, 3.33 Ghz 2009 г. - Core i7 950, 3.06 GHz
Мотивация: Вычислительная Мощность Courtesy Ian Buck, John Owens
An Aside: Вычислительная мощность Почему GPU становятся мощнее так быстро? Арифметика : особенности архитектуры GPUs позволяют относительно просто использовать дополнительные транзисторы для вычислений, а не для кэша Экономика : Многомиллиардная индустрия компьютерных игр вкладывает деньги в разработку все более совершенных GPU
Мотивация: Гибкость и Точность Современные GPUs хорошо программируемы Программируемые пиксельные, вершинные, видео процессоры Установившаяся поддержка высокоуровневых языков программирования Современные GPUs обеспечивают высокую точность вычислений Аппаратная поддержка чисел с плавающей точкой одинарной точности (32 бита). Что достаточно много для многих(не всех) приложений
Мотивация: Потенциал GPGPU Кратко: Гибкость и мощность GPUs делает их привлекательными для вычислений общего назначения Сфера применения GPGPU очень широка – от алгоритмов компьютерной графики, таких как задача глобального освещения, до задач численных методов и ММС. Цель: сделать доступными разработчикам недорогую вычислительную мощность GPU как вычислительного сопроцессора
Проблемы: Сложность использования GPUs разработаны для & направляемы компьютерными играми Необычная модель программирования Идиомы программирования связаны с компьютерной графикой Среда программирования сильно ограничена Архитектура: Высоко параллельная Быстрое развитие Нельзя просто перенести CPU код на GPU!
Основы GPU :Классический Графический Конвейер Упрощенный графический конвейер Отметим что конвейер варьируем Кэши, Списки и многое другое не показано GPUCPU Приложение Трансформация & Свет Растериза- ция Растериза- ция Тени Память ВК (Текстуры) Память ВК (Текстуры) Освещенные вершины (2D) Graphics State Рендеринг в текстуру Сборка примитивов Сборка примитивов вершины (3D) Экранные треугольники (2D) Фрагменты (pre-pixels) Итоговые пиксели ( Цвет, Глубина )
GPU Transform CPU Приложение Растериза- ция Растериза- ция Shade Память ВК (Текстуры) Память ВК (Текстуры) Освещенный вершины (2D) Graphics State Рендеринг в текстуру Сборка Примитивов Сборка Примитивов Вершины (3D) Экранные треугольники (2D) Фрагменты (pre-pixels) Итоговые пиксели ( цвет, глубина ) Программируемый вершинный процессор! Программируемый фрагментный процессор! Основы GPU : Современный Графический Конвейер Вершинные Процессоры
GPU Конвейер: Преобразования Вершинный процессор (несколько параллельных) Преобразования из глобальной системы координат в систему координат изображения Повершенное вычисление света
GPUCPU Приложение Вершинный процессор Вершинный процессор Растериза- ция Растериза- ция Фрагментный Процессор Фрагментный Процессор Текстуры Xformed, Lit Vertices (2D) Graphics State Рендеринг в текстуру Вершины (3D) Screenspace triangles (2D) Фрагменты (pre-pixels) Итоговые пиксели ( Цвет, глубина) Программируемая сборка примитивов! Более гибкая адресация памяти! Графический Конвейер последнего поколения Assemble Primitives Геометрический процессор Геометрический процессор
GPU Конвейер: Растеризация Растеризатор Перевод геометрического пр. (вершины) в плоское пр. (фрагменты) Фрагмент = фрагмент изображения Пиксель + связанные с ним данные: цвет, глубина, трафарет, etc. Интерполирование повершенных данных через пиксели
GPUCPU Приложение Вершинный процессор Вершинный процессор Растериза- ция Растериза- ция Фрагментный Процессор Фрагментный Процессор Текстуры Xformed, Lit Vertices (2D) Graphics State Рендеринг в текстуру Вершины (3D) Screenspace triangles (2D) Фрагменты (pre-pixels) Итоговые пиксели ( Цвет, глубина) Программируемая сборка примитивов! Более гибкая адресация памяти! Графический Конвейер последнего поколения Assemble Primitives Фрагментный процессор Фрагментный процессор
GPU Конвейер: Тени Фрагментный процессор (несколько параллельных) Вычисление цвета для каждого пикселя Возможность чтения из текстур (изображений)
GPUCPU Приложение Вершинный процессор Вершинный процессор Растериза- ция Растериза- ция Фрагментный Процессор Фрагментный Процессор Текстуры Xformed, Lit Vertices (2D) Graphics State Рендеринг в текстуру Вершины (3D) Screenspace triangles (2D) Фрагменты (pre-pixels) Итоговые пиксели ( Цвет, глубина) Программируемая сборка примитивов! Более гибкая адресация памяти! Графический Конвейер последнего поколения Assemble Primitives Пиксельный процессор Пиксельный процессор
Deep Pipelines Vertex Shader Triangle Setup Fragment Shader Fragment Blender Frame- Buffer(s) Deep Pipelines think assembly line conveyer belt
Wide Pipelines (many conveyor belts) Vertex Shader Triangle Setup Fragment Shader Fragment Blender Frame- Buffer(s) Deep Pipelines Wide Pipelines
Parallelism, Parallelism, Parallelism Deep/Wide pipelines allow memory latency to be hidden. If one fragment(or vertex) is waiting on a memory fetch, go work on another element for a while. Dont need expensive huge caches (unlike CPUs) Fill precious chip space with arithmetic logic units (ALU).
The Big Bandwidth Bugaboo L1 L2 Video Memory 6.4 GB/sec Main Memory AGP Mem CPUCPU GPUGPU Moving Data is expensive DMA
General Purpose Computing (GPGPU) Whats the GPU good for? Everything you can get it to do efficiently for you!!! Physics Collision Detection AI And yes, graphics too… Skyworks, Mark Harris Cullide: Naga Govindaraju et. al
General Purpose Computing Texture Maps are arrays of data elements Fragment Program is an instruction Frame buffer holds the result of the SIMD operation Single Instruction Multiple Data/ Stream Processor n m m n n m Fragment Program 0,0 0,11,1 1,0 Screen Filling Quadrilateral Texture Maps (Multiple Data) Fragment Program (Single Instruction) Framebuffer
Архитектура Tesla: Мультипроцессор Tesla 8 TEX SM Texture Processing Cluster Streaming Multiprocessor Instruction $Constant $ Instruction Fetch Shared Memory SFU SP SFU SP Register File
TEX SM Texture Processing Cluster SM Архитектура Tesla Мультипроцессор Tesla 10 Streaming Multiprocessor Instruction $Constant $ Instruction Fetch Shared Memory SFU SP SFU SP Double Precision Register File
Архитектура Tesla 10 TPC Interconnection Network ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 ROP L2 DRAM Work Distribution CPUBridgeHost Memory
Архитектура Маштабируемость: [+][-] SM внутри TPC [+][-] TPC [+][-] DRAM партиции Схожие архитектуры: Tesla 8: 8800 GTX Tesla 10: GTX 280
SIMT (Single Instruction, Multiple Threads) zПараллельно на каждом SM выполняется большое число отдельных нитей (threads) zНити подряд разбиваются на warpы (по 32 нити) и SM управляет выполнением warpов zНити в пределах одного warpа выполняются физически параллельно zБольшое число warpов покрывает латентность
Программная модель CUDA GPU (device) это вычислительное устройство, которое: Является сопроцессором к CPU (host) Имеет собственную память (DRAM) Выполняет одновременно очень много нитей
Типы памяти в CUDA Самая быстрая – shared (on-chip) Самая медленная – глобальная (DRAM) Для ряда случаев можно использовать кэшируемую константную и текстурную память Доступ к памяти в CUDA идет отдельно для каждой половины warpа (half-warp)
Работа с памятью в CUDA Основа оптимизации – оптимизация работы с памятью Максимальное использование shared- памяти Использование специальных паттернов доступа к памяти, гарантирующих эффективный доступ Паттерны работают независимо в пределах каждого half-warpа
Программная модель памяти ТипДоступРасположение Латентность Регистры Поток GPU (R\W)SM 2-4 такта ЛокальнаяПоток GPU (R\W)DRAM ~500 тактов РазделяемаяБлок потоков GPU (R\W)SM 2-4 такта ГлобальнаяCPU(R\W), GPU(R\W)DRAM ~500 тактов Константная CPU(R\W), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM 2-4 к кешу Текстурная CPU(R\W), GPU(Read-only) DRAM + КЕШ SM ~500 к DRAM 2-4 к кешу
Программная модель CUDA Последовательные части кода выполняются на CPU Массивно-параллельные части кода выполняются на GPU как ядра Отличия нитей между CPU и GPU Нити на GPU очень «легкие» HW планировщик задач Для полноценной загрузки GPU нужны тысячи нитей Для покрытия латентностей операций чтения / записи Для покрытия латентностей sfu инструкций
Программная модель CUDA Параллельная часть кода выполняется как большое количество нитей Нити группируются в блоки фиксированного размера Блоки объединяются в сеть блоков Ядро выполняется на сетке из блоков Каждая нить и блок имеют свой идентификатор
Программная модель CUDA Потоки в CUDA объединяются в блоки: Возможна 1D, 2D, 3D топология блока Общее кол-во потоков в блоке ограничено В текущем HW это 512 потоков
Программная модель CUDA Блоки потоков объединяются в сетку (grid) потоков Возможна 1D, 2D топология сетки блоков потоков
Программная модель потоков B (0:0) B (0:1) B (0:2) B (0:3) B (1:0) B (1:1) B (1:2) B (1:3) B (2:0) B (2:1) B (2:2) B (2:3) B (3:0) B (3:1) B (3:2) B (3:3) B (4:0) B (4:1) B (4:2) B (4:3) Grid Block T (0:0:0) T (0:1:0) T (0:2:0) T (1:0:0) T (1:1:0) T (1:2:0) T (2:0:0) T (2:1:0) T (2:2:0) Приведен пример сетки из 20 блоков (5x4), в каждом блоке 18 (3x3x2) потоков. Всего в сетке 360 потоков.