E N D
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 Шейдеры Видео- ускоритель Сопроцессор 1990 1995 2000 2005 2010
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 :КлассическийГрафический Конвейер CPU GPU Graphics State • Упрощенный графический конвейер • Отметим что конвейер варьируем • Кэши, Списки и многое другое не показано Экранные треугольники (2D) Итоговые пиксели (Цвет, Глубина) Фрагменты (pre-pixels) Освещенные вершины (2D) Приложение Трансформация& Свет Сборка примитивов Растериза- ция Тени вершины (3D) Память ВК (Текстуры) Рендеринг в текстуру
Программируемый вершинный процессор! Основы GPU : Современный Графический Конвейер CPU GPU Graphics State ВершинныеПроцессоры Освещенный вершины (2D) Фрагменты (pre-pixels) Итоговые пиксели (цвет, глубина) Экранные треугольники(2D) Приложение Transform Сборка Примитивов Растериза- ция Shade Вершины (3D) Память ВК (Текстуры) Рендеринг в текстуру • Программируемый фрагментный процессор!
GPU Конвейер: Преобразования • Вершинный процессор (несколько параллельных) • Преобразования из глобальной системы координат в систему координат изображения • Повершенное вычисление света
Программируемая сборка примитивов! Графический Конвейер последнего поколения CPU GPU Graphics State Геометрический процессор Xformed, Lit Vertices (2D) Screenspace triangles (2D) Фрагменты(pre-pixels) Итоговые пиксели (Цвет, глубина) Приложение Вершинный процессор AssemblePrimitives Растериза- ция Фрагментный Процессор Вершины (3D) Текстуры Рендеринг в текстуру • Более гибкая адресация памяти!
GPU Конвейер: Растеризация • Растеризатор • Перевод геометрического пр. (вершины) в плоское пр. (фрагменты) • Фрагмент = фрагмент изображения • Пиксель + связанные с ним данные: цвет, глубина, трафарет, etc. • Интерполирование повершенных данных через пиксели
Программируемая сборка примитивов! Графический Конвейер последнего поколения CPU GPU Graphics State Фрагментный процессор Xformed, Lit Vertices (2D) Screenspace triangles (2D) Фрагменты(pre-pixels) Итоговые пиксели (Цвет, глубина) Приложение Вершинный процессор AssemblePrimitives Растериза- ция Фрагментный Процессор Вершины (3D) Текстуры Рендеринг в текстуру • Более гибкая адресация памяти!
GPU Конвейер: Тени • Фрагментный процессор (несколько параллельных) • Вычисление цвета для каждого пикселя • Возможность чтения из текстур (изображений)
Программируемая сборка примитивов! Графический Конвейер последнего поколения CPU GPU Graphics State Xformed, Lit Vertices (2D) Screenspace triangles (2D) Фрагменты(pre-pixels) Итоговые пиксели (Цвет, глубина) Пиксельный процессор Приложение Вершинный процессор AssemblePrimitives Растериза- ция Фрагментный Процессор Вершины (3D) Текстуры Рендеринг в текстуру • Более гибкая адресация памяти!
Deep Pipelines • think assembly line conveyer belt Vertex Shader Triangle Setup Fragment Shader Fragment Blender Frame- Buffer(s) Deep Pipelines
Wide Pipelines (many conveyor belts) Vertex Shader Triangle Setup Fragment Shader Fragment Blender Frame- Buffer(s) Wide Pipelines Deep 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. • Don’t need expensive huge caches (unlike CPU’s) • Fill precious chip space with arithmetic logic units (ALU).
The Big Bandwidth Bugaboo • Moving Data is expensive http://graphics.tomshardware.com/graphic/20040310/index.html CPU L1 L2 GPU 6.4 GB/sec DMA AGP Mem Main Memory Video Memory
General Purpose Computing (GPGPU) • What’s the GPU good for? • Everything you can get it to do efficiently for you!!! • Physics • Collision Detection • AI • And yes, graphics too… Cullide: Naga Govindaraju et. al Skyworks, Mark Harris
0,1 1,1 0,0 1,0 General Purpose Computing • Texture Maps are arrays of data elements • Fragment Program is an “instruction” • Frame buffer holds the result of the SIMD operation m Fragment Program n m n m n Framebuffer Texture Maps (Multiple Data) ScreenFilling Quadrilateral Fragment Program (Single Instruction) Single Instruction Multiple Data/ Stream Processor
SIMT (Single Instruction, Multiple Threads) • Параллельно на каждом SM выполняется большое число отдельных нитей (threads) • Нити подряд разбиваются на warp’ы (по 32 нити) и SM управляет выполнением warp’ов • Нити в пределах одного warp’а выполняются физически параллельно • Большое число warp’ов покрывает латентность
Программная модель CUDA • GPU (device) это вычислительное устройство, которое: • Является сопроцессором к CPU (host) • Имеет собственную память (DRAM) • Выполняет одновременно очень много нитей
Типы памяти в CUDA Самая быстрая – shared (on-chip) Самая медленная – глобальная (DRAM) Для ряда случаев можно использовать кэшируемую константную и текстурную память Доступ к памяти в CUDA идет отдельно для каждой половины warp’а (half-warp)
Работа с памятью в CUDA Основа оптимизации – оптимизация работы с памятью Максимальное использование shared-памяти Использование специальных паттернов доступа к памяти, гарантирующих эффективный доступ Паттерны работают независимо в пределах каждого half-warp’а
Программная модель CUDA • Последовательные части кода выполняются на CPU • Массивно-параллельные части кода выполняются на GPU как ядра • Отличия нитей между CPU и GPU • Нити на GPU очень «легкие» • HW планировщик задач • Для полноценной загрузки GPU нужны тысячи нитей • Для покрытия латентностей операций чтения / записи • Для покрытия латентностей sfu инструкций
Программная модель CUDA Параллельная часть кода выполняется как большое количество нитей Нити группируются в блоки фиксированного размера Блоки объединяются в сеть блоков Ядро выполняется на сетке из блоков Каждая нить и блок имеют свой идентификатор
Программная модель CUDA • Потоки в CUDA объединяются в блоки: • Возможна 1D, 2D, 3D топология блока • Общее кол-во потоков в блоке ограничено • В текущем HW это 512 потоков
Программная модель CUDA • Блоки потоков объединяются в сетку (grid) потоков • Возможна 1D, 2D топология сетки блоков потоков
Программная модель потоков Grid Block B (0:0) B (1:0) B (2:0) B (3:0) B (4:0) T (0:0:0) T (1:0:0) T (2:0:0) B (0:1) B (1:1) B (2:1) B (3:1) B (4:1) T (0:1:0) T (1:1:0) T (2:1:0) B (0:2) B (1:2) B (2:2) B (3:2) B (4:2) T (0:2:0) T (1:2:0) T (2:2:0) B (0:3) B (1:3) B (2:3) B (3:3) B (4:3) Приведен пример сетки из 20 блоков (5x4), в каждом блоке 18 (3x3x2) потоков. Всего в сетке 360 потоков.