Основы работы с технологией CUDA
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ДМК Пресс
Год издания: 2010
Кол-во страниц: 232
Дополнительно
Вид издания:
Практическое пособие
Уровень образования:
Аспирантура
ISBN: 978-5-94074-578-5
Артикул: 616068.01.99
К покупке доступен более свежий выпуск
Перейти
Данная книга посвящена программированию современных графических процессоров (GPU) на основе технологии CUDA от компании NVIDIA. В книге разбираются как сама технология CUDA, так и архитектура поддерживаемых GPU и вопросы оптимизации, включающие использование .PTX. Рассматривается реализация целого класса алгоритмов и последовательностей на CUDA. К книге прилагается CD, который содержит примеры решения на CUDA реальных задач с большим объемом вычислений из широкого класса областей, включая моделирование нейронных сетей, динамику движения элементарных частиц, геномные исследования и многое другое.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.02: Фундаментальная информатика и информационные технологии
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Боресков А. В., Харламов А. А. Основы работы с технологией CUDA Москва, 2010
УДК 32.973.26-018.2 ББК 004.4 Б82 Б82 Боресков А. В., Харламов А. А. Основы работы с технологией CUDA. – М.: ДМК Пресс, 2010. – 232 с.: ил. ISBN 978-5-94074-578-5 Данная книга посвящена программированию современных графических процессоров (GPU) на основе технологии CUDA от компании NVIDIA. В книге разбираются как сама технология CUDA, так и архитектура поддерживаемых GPU и вопросы оптимизации, включающие использование .PTX. Рассматривается реализация целого класса алгоритмов и последовательностей на CUDA. К книге прилагается CD, который содержит примеры решения на CUDA реальных задач с большим объемом вычислений из широкого класса областей, включая моделирование нейронных сетей, динамику движения элементарных частиц, геномные исследования и многое другое. УДК 32.973.26-018.2 ББК 004.4 Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Материал, изложенный в данной книге, многократно проверен. Но поскольку вероятность технических ошибок все равно существует, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможные ошибки, связанные с использованием книги. © Áîðåñêîâ À. Â., Õàðëàìîâ À. À., 2010 ISBN 978-5-94074-578-5 © Îôîðìëåíèå, èçäàíèå, ÄÌÊ Ïðåññ, 2010
Содержание Содержание Содержание Содержание Содержание Глава 1. Существующие многоядерные системы. Эволюция GPU. GPGPU .................................................................... 7 1.1. Многоядерные системы .................................................................. 8 1.1.1. Intel Core 2 Duo и Intel Core i7 .................................................... 8 1.1.2. Архитектура SMP ..................................................................... 9 1.1.3. BlueGene/L ............................................................................. 10 1.1.4. Архитектура GPU .................................................................... 11 1.2. Эволюция GPU ............................................................................... 11 Глава 2. Модель программирования в CUDA. Программноаппаратный стек CUDA ........................................ 17 2.1. Основные понятия ......................................................................... 17 2.2. Расширения языка C...................................................................... 22 2.2.1. Спецификаторы функций и переменных ................................ 22 2.2.2. Добавленные типы ................................................................. 23 2.2.3. Добавленные переменные ..................................................... 23 2.2.4. Директива вызова ядра .......................................................... 23 2.2.5. Добавленные функции ........................................................... 24 2.3. Основы CUDA host API ................................................................... 26 2.3.1. CUDA driver API ....................................................................... 27 2.3.2. CUDA runtime API .................................................................... 27 2.3.3. Основы работы с CUDA runtime API ........................................ 31 2.3.4. Получение информации об имеющихся GPU и их возможностях ........................................................................... 31 2.4. Установка CUDA на компьютер ...................................................... 34 2.5. Компиляция программ на CUDA .................................................... 35 2.6. Замеры времени на GPU, CUDA events .......................................... 41 2.7. Атомарные операции в CUDA ........................................................ 42 2.7.1. Атомарные арифметические операции .................................. 42 2.7.2. Атомарные побитовые операции ........................................... 44 2.7.3. Проверка статуса нитей warp’а .............................................. 44 Глава 3. Иерархия памяти в CUDA. Работа с глобальной памятью ..................................................... 45 3.1. Типы памяти в CUDA ...................................................................... 45 3.2. Работа с константной памятью ...................................................... 46 3.3. Работа с глобальной памятью........................................................ 47 3.3.1. Пример: построение таблицы значений функции с заданным шагом ........................................................................... 49 3.3.2. Пример: транспонирование матрицы..................................... 49 3.3.3. Пример: перемножение двух матриц ..................................... 50
Содержание Содержание Содержание Содержание Содержание 3.4. Оптимизация работы с глобальной памятью ................................. 51 3.4.1. Задача об Nтелах .................................................................. 55 Глава 4. Разделяемая память в CUDA и ее эффективное использование ............................................. 59 4.1. Работа с разделяемой памятью ..................................................... 59 4.1.1. Оптимизация задачи об N телах ............................................. 60 4.1.2. Пример: перемножение матриц ............................................. 62 4.2. Паттерны доступа к разделяемой памяти ...................................... 66 4.2.1. Пример: умножение матрицы на транспонированную ............ 69 Глава 5. Реализация на CUDA базовых операций над массивами – reduce, scan, построения гистограмм и сортировки ............................................................. 72 5.1. Параллельная редукция ................................................................. 72 5.2. Нахождение префиксной суммы (scan).......................................... 79 5.2.1. Реализация нахождения префиксной суммы на CUDA............ 80 5.2.2. Использование библиотеки CUDPP для нахождения префиксной суммы .......................................................................... 86 5.3. Построение гистограммы .............................................................. 88 5.4. Сортировка ................................................................................... 98 5.4.1. Битоническая сортировка ...................................................... 98 5.4.2. Поразрядная сортировка ..................................................... 101 5.4.3. Использование библиотеки CUDPP ...................................... 102 Глава 6. Архитектура GPU, основы PTX ................................. 106 6.1. Архитектура GPU Tesla 8 и Tesla 10 ............................................... 106 6.2. Введение в PTX ............................................................................ 108 6.2.1. Типы данных......................................................................... 111 6.2.2. Переменные......................................................................... 112 6.2.3. Основные команды .............................................................. 114 Глава 7. Иерархия памяти в CUDA. Работа с текстурной памятью ................................................... 121 7.1. Текстурная память в CUDA........................................................... 122 7.2. Обработка цифровых сигналов.................................................... 123 7.2.1. Простые преобразования цвета ........................................... 124 7.2.2. Фильтрация. Свертка ........................................................... 128 7.2.3. Обнаружение границ ............................................................ 134 7.2.4. Масштабирование изображений.......................................... 137 Глава 8. Взаимодействие с OpenGL ....................................... 142 8.1. Cоздание буферного объекта в OpenGL ...................................... 142 8.2. Использование классов ............................................................... 143
Содержание Содержание Содержание Содержание Содержание 8.3. Пример шума Перлина ................................................................ 147 8.3.1. Применение ......................................................................... 150 Глава 9. Оптимизации .................................................................. 152 9.1. PTXассемблер ............................................................................ 155 9.1.1. Занятость мультипроцессора .............................................. 156 9.1.2. Анализ PTXассемблера ....................................................... 157 9.2. Использование CUDAпрофайлера.............................................. 161 Приложение 1. Искусственные нейронные сети ............... 163 П1.1. Введение................................................................................... 163 П1.1.1. Задачи классификации (Classification) ............................... 163 П1.1.2. Задачи кластеризации (Clustering)..................................... 164 П1.1.3. Задачи регрессии и прогнозирования ............................... 164 П1.2. Модель нейрона ........................................................................ 165 П1.3. Архитектуры нейронных сетей................................................... 166 П1.4. Многослойный персептрон ....................................................... 166 П1.4.1. Работа с многослойным персептроном ............................. 167 П1.4.2. Алгоритм обратного распространения ошибки ................. 169 П1.4.3. Предобработка данных ...................................................... 171 П1.4.4. Адекватность данных ......................................................... 171 П1.4.5. Разбиение на наборы ......................................................... 171 П1.4.6. Порядок действий при работе с многослойным персептроном ............................................................................... 172 П1.5. Персептроны и CUDA ................................................................ 173 П1.5.1. Пример задачи реального мира ......................................... 174 П1.6. Литература................................................................................ 178 Приложение 2. Моделирование распространения волн цунами на GPU....................................................................... 179 П2.1. Введение................................................................................... 179 П2.2. Математическая постановка задачи .......................................... 181 П2.3. Программная модель ................................................................ 183 П2.4. Адаптация алгоритма под GPU .................................................. 186 П2.5. Заключение ............................................................................... 191 П2.6. Литература................................................................................ 191 Приложение 3. Применение технологии NVIDIA CUDA для решения задач гидродинамики ....................................... 193 П3.1. Введение................................................................................... 193 П3.2. Сеточные методы ...................................................................... 194 П3.2.1. Геометрический многосеточный метод ............................. 195 П3.2.2. Алгебраический многосеточный метод.............................. 197 П3.2.3. Метод редукции ................................................................. 198
Содержание Содержание Содержание Содержание Содержание П3.2.4. Оценка эффективности...................................................... 199 П3.3. Метод частиц ............................................................................ 200 П3.4. Статистическая обработка результатов .................................... 201 П3.5. Обсуждение .............................................................................. 202 П3.6. Литература................................................................................ 203 Приложение 4. Использование технологии CUDA при моделировании динамики пучков в ускорителях заряженных частиц .......................................... 205 П4.1. Введение................................................................................... 205 П4.2. Особенности задачи.................................................................. 205 П4.3. Использование многоядерных процессоров ............................. 208 П4.4. Реализация на графических процессорах ................................. 210 П4.5. Результаты ................................................................................ 214 П4.6. Литература................................................................................ 216 Приложение 5. Трассировка лучей ......................................... 218 П5.1. Обратная трассировка лучей ..................................................... 219 П5.1.1. Поиск пересечений ............................................................ 221 П5.1.2. Проблемы трассировки лучей на GPU ................................ 222 П5.1.3. Ускорение поиска пересечений ......................................... 223 П5.2. Оптимизация трассировки лучей для GPU ................................. 228 П5.2.1. Экономия регистров .......................................................... 228 П5.2.2. Удаление динамической индексации ................................. 229 П5.3. Литература................................................................................ 230
Глава 1 Глава 1 Глава 1 Глава 1 Глава 1 Существующие многоядерные системы. Существующие многоядерные системы. Существующие многоядерные системы. Существующие многоядерные системы. Существующие многоядерные системы. Эволюция GPU. GPGPU Эволюция GPU. GPGPU Эволюция GPU. GPGPU Эволюция GPU. GPGPU Эволюция GPU. GPGPU Одной из важнейших характеристик любого вычислительного устройства является его быстродействие. Для математических расчетов быстродействие обычно измеряется в количестве floatingpoint операций в секунду (Flops). При этом довольно часто рассматривается так называемое пиковое быстродействие, то есть максимально возможное число операций с вещественными (floatingpoint) величинами в секунду (когда вообще нет других операций, обращений к памяти и т. п.). Реальные цифры по загрузке (пиковая vs реальная ) по СPU и GPU На самом деле реальное быстродействие всегда оказывается заметно ниже пикового, поскольку необходимо выполнять другие операции, осуществлять доступ к памяти и т. п. Для персонального компьютера быстродействие обычно напрямую связано с тактовой частотой центрального процессора (CPU). Процессоры архитектуры x86 за время с момента своего появления в июне 1978 года увеличили свою тактовую частоту почти в 700 раз (с 4,77 МГц у Intel 8086 до 3,33 ГГц у Intel Core i7). Таблица 1.1. Динамика роста тактовых частот Год Тактовая частота Процессор 1978 4.77 MHz Intel 8086 2004 3.46 GHz Intel Pentium 4 2005 3.8 GHz Intel Pentium 4 2006 2.333 GHz Intel Core Duo T2700 2007 2.66 GHz Intel Core 2 Duo E6700 2007 3 GHz Intel Core 2 Duo E6800 2008 3.33 GHz Intel Core 2 Duo E8600 2009 3.06 GHz Intel Core i7 950 Однако если внимательно посмотреть на динамику роста частоты CPU, то становится заметно, что в последние годы рост частоты заметно замедлился, но зато появилась новая тенденция – создание многоядерных процессоров и систем и увеличение числа ядер в процессоре. Это связано как с ограничениями технологии производства микросхем, так и с тем фактом, что энергопотребление (а значит, и выделение тепла) пропорцио88888 Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU нально четвертой степени частоты. Таким образом, увеличивая тактовую частоту всего в 2 раза, мы сразу увеличиваем тепловыделение в 16 раз. До сих пор с этим удавалось справляться за счет уменьшения размеров отдельных элементов микросхем (так, сейчас корпорация Intel переходит на использование технологического процесса в 32 нанометра). Однако существуют серьезные ограничения на дальнейшую миниатюризацию, поэтому сейчас рост быстродействия идет в значительной степени на счет увеличения числа параллельно работающих ядер, то есть через параллелизм. Скорее всего, эта тенденция сохранится в ближайшее время, и появление 8и 12ядерных процессоров не заставит себя долго ждать. Максимальное ускорение, которое можно получить от распараллеливания программы на N процессоров (ядер), дается законом Амдала (Amdahl Law): . В этой формуле P – это часть времени выполнения программы, которая может быть распараллелена на N процессоров. Как легко видно, при увеличении числа процессоров N максимальный выигрыш стремится к . Таким образом, если вы можем распараллелить 3/4 всей программы, то максимальный выигрыш составит 4 раза. Именно поэтому крайне важно использование хорошо распараллеливаемых алгоритмов и методов. 1.1. Многоядерные системы Рассмотрим в качестве иллюстрации несколько существующих многоядерных систем и начнем наше рассмотрение с процессоров Intel Core 2 Duo и Intel Core i7. 1.1.1. Intel Core 2 Duo и Intel Core i7 Процессор Intel Core 2 Duo содержит два ядра (P0 и P1), каждое из которых фактически является процессором Pentium M, со своим L1кешем команд и L1кешем данных (по 32 Кбайта каждое). Также имеется общий L2кеш (размером 2 или 4 Мб), совместно используемый обоими ядрами (см. рис. 1.1). Процессор Core i7 содержит уже четыре ядра (P0, P1, P2 и P3). Каждое из этих ядер обладает своими L1кешем для данных и L1кешем для команд (по Рис. 1.1. Схема процессора Intel Core 2 Duo
32 Кбайта каждое) и L2кешем (256 Кбайт). Кроме того, имеется общий для всех ядер L3кеш размером 8 Мбайт. 1.1.2. Архитектура SMP Кроме этих процессоров, есть также и другие многопроцессорные архитектуры. Одной из таких систем является система на основе симметричной мультипроцессорной архитектуры (Simmetric MultiProcessor Architecture, SMP). Рис. 1.2. Схема процессора Intel Core i7 Рис. 1.3. Архитектура SMPсистем В таких системах каждое ядро содержит свои кеши L1 и L2, и все ядра подсоединены к общей шине. Блок Cache Control отслеживает изменения памяти другими процессорами и обновляет соответствующим образом содержимое кешей – ведь если один и тот же участок памяти содержится в кеше сразу нескольких ядер, то любое изменение этого участка памяти одним из ядер должно быть немедленно передано в кеши других ядер, работающих с данным участком памяти. Многоядерные системы Многоядерные системы Многоядерные системы Многоядерные системы Многоядерные системы
10 10 10 10 Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Это типичная проблема архитектур с набором процессоров, подключенных к общей шине, – принципиальным моментом для всех многоядерных систем является то, что каждый процессор должен «видеть» целый и корректный образ памяти, что неизбежно ведет к необходимости для каждого процессора отслеживать обращения к памяти всех остальных процессоров для поддержания актуальности своих кешей. Подобная задача имеет квадратичную сложность от числа процессоров. 1.1.3. BlueGene/L Еще одним примером многопроцессорной архитектуры является суперкомпьютер BlueGene/L. Он состоит из 65 536 двухъядерных узлов (nodes). Каждый узел содержит два 770 МГц процессора PowerPC. Каждый из них имеет свои кеши пер вого и второго уровней, специализированный процессор для floatingpoint вычислений (Double Hammer FPU). Оба процессора подключены к общему кешу третьего уровня (L3) размером 4 Мб и имеют собственный блок памяти размером 512 Мб (см. рис. 1.4). Рис. 1.4. Устройство одного узла в архитектуре BlueGene/L Отдельные узлы могут соединяться между собой различными способами при помощи набора портов. Таким образом, каждый узел может непосредственно обратиться всего к небольшому числу других узлов, но за счет соединения всех узлов в сеть сообщение может быть передано любому другому узлу за небольшое количество шагов. Для минимизации числа шагов, необходимых для передачи сообщения от одного узла другому, очень хорошо подходит топология тороидального куба. В ней все узлы образуют куб и у каждого узла есть ровно восемь соседей. При этом если узел лежит на одной из граней куба, то недостающих соседей он берет с противоположной грани (рис. 1.5).
11 11 11 11 В данной архитектуре именно за счет ограничения на соединения узлов между собой удалось объединить такое большое количество узлов в одном компьютере. 1.1.4. Архитектура GPU Графические процессоры (GPU) также являются параллельными архитектурами, и на рис. 1.6 изображена сильно упрощенная архитектура GPU серии G80 (архитектура GPU будет подробно рассмотрена в последующих главах). Как видно по рисунку, GPU обладает своей памятью (DRAM), объем которой уже достигает 1 Гбайта для некоторых моделей. Также GPU содержит ряд потоковых мультипроцессоров (SM, Streaming Multiprocessor), каждый из которых способен одновременно выполнять 768 (1024 – для более поздних моделей) нитей. При этом количество потоковых мультипроцессоров зависит от модели GPU. Так, GTX 280 содержит 30 потоковых мультипроцессоров. Каждый мультипроцессор работает независимо от остальных. Рис. 1.5. Двухмерный тороидальный куб 3×3 Рис. 1.6. Упрощенная архитектура G80 1.2. Эволюция GPU Сам термин GPU (Graphics Processing Unit) был впервые использован корпорацией Nvidia для обозначения того, что графический ускоритель, первоначально используемый только для ускорения трехмерной графики, стал мощным проSM SM SM SM SM SM DRAM Эволюция GPU Эволюция GPU Эволюция GPU Эволюция GPU Эволюция GPU
12 12 12 12 Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU граммируемым устройством (процессором), пригодным для решения широкого класса задач, никак не связанных с графикой. Сейчас современные GPU представляют из себя массивнопараллельные вычислительные устройства с очень высоким быстродействием (свыше одного терафлопа) и большим объемом собственной памяти (DRAM). Однако начиналось все более чем скромно – первые графические ускорители Voodoo компании 3DFx представляли из себя фактически просто растеризаторы (переводящие треугольники в массивы пикселов) с поддержкой буфера глубины, наложения текстур и альфаблендинга. При этом вся обработка вершин проводилась центральным процессором, и ускоритель получал на вход уже отображенные на экран (то есть спроектированные) вершины. Однако именно эту очень простую задачу Voodoo умел делать достаточно быстро, легко обгоняя универсальный центральный процессор, что, собственно, и привело к широкому распространению графических ускорителей 3Dграфики. Причина этого заключалась в значительной степени в том, что графический ускоритель мог одновременно обрабатывать сразу много отдельных пикселов, пусть и выполняя для них очень простые операции. Вообще, традиционные задачи рендеринга очень хорошо подходят для параллельной обработки – все вершины можно обрабатывать независимо друг от друга, точно так же отдельные фрагменты, получающиеся при растеризации треугольников, тоже могут быть обработаны совершенно независимо друг от друга. После своего появления ускорители трехмерной графики быстро эволюционировали, при этом, помимо увеличения быстродействия, также росла и их функциональность. Так, графические ускорители следующего поколения (например, Riva TNT) уже могли самостоятельно обрабатывать вершины, разгружая тем самым CPU (так называемый в то время T&L), и одновременно накладывать несколько текстур. Следующим шагом было увеличение гибкости при обработке отдельных фрагментов (пикселов) с целью реализации ряда эффектов, например попиксельного освещения. На том этапе развития сделать полноценно программируемый обработчик фрагментов было нереально, однако довольно большую функциональность можно было реализовать при помощи появившихся в GeForce256 register combiner’ов. Это были блоки, способные реализовывать довольно простые операции (например, вычисление скалярного произведения). При этом эти блоки можно быстро настраивать и соединять между собой их входы и выходы. Проведя необходимую конфигурацию register combiner’ов, можно было реализовывать основные операции попиксельного освещения. В настоящее графический ускоритель, используемый в iPhone и iPod Touch, также поддерживает register combiner’ы. Следующим шагом было появление вершинных программ (GeForce 2) – можно было вместо фиксированных шагов по обработке вершин задать программу, написанную на специальном ассемблере (см. листинг 1). Данная программа выполнялась параллельно для каждой вершины, и вся работа шла над числами типа float (размером 32 бита).
13 13 13 13 !!ARBvp1.0 ATTRIB pos = vertex.position; PARAM mat [4] = { state.matrix.mvp }; # transform by concatenation of modelview and projection matrices DP4 result.position.x, mat [0], pos; DP4 result.position.y, mat [1], pos; DP4 result.position.z, mat [2], pos; DP4 result.position.w, mat [3], pos; # copy primary color MOV result.color, vertex.color; END Следующим принципиальным шагом стало появление подобной функциональности уже на уровне отдельных фрагментов – возможности задания обработки отдельных фрагментов при помощи специальных программ. Подобная возможность появилась на ускорителях серии GeForce FX. Используемый для задания программ обработки отдельных фрагментов ассемблер был очень близок к ассемблеру для задания вершинных программ и также проводил все операции при помощи чисел типа float. При этом как вершинные, так и фрагментные программы выполнялись параллельно (графический ускоритель содержал отдельно вершинные процессоры и отдельно – фрагментные процессоры). Поскольку количество обрабатываемых в секунду пикселов было очень велико, то получаемое в результате быстродействие в Flop’ах также было очень большим. Фактически графические ускорители на тот момент стали представлять себой мощные SIMDпроцессоры. Термин SIMD (Single Instruction Multiple Data) обозначает параллельный процессор, способный одновременно выполнять одну и ту же операцию над многими данными. Фактически SIMDпроцессор получает на вход поток однородных данных и параллельно обрабатывает их, порождая тем самым выходной поток (рис. 1.7). Сам модуль, осуществляющий подобное преобразование входных потоков в выходные, принято называть ядром (kernel). Отдельные ядра могут соединяться между собой, приводя к довольно сложным схемам обработки входных потоков. Рис. 1.7. Работа SIMDархитектуры Рис. 1.8. Соединение нескольких ядер для задания сложной обработки данных Добавление поддержки текстур со значениями в форматах с плавающей точкой (16и 32битовые типы float вместо используемых ранее 8битовых беззнаковых целых чисел) позволило применять фрагментные процессоры для обработки Эволюция GPU Эволюция GPU Эволюция GPU Эволюция GPU Эволюция GPU
14 14 14 14 Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU Существующие многоядерные системы. Эволюция GPU. GP GPU больших массивов данных. При этом сами такие массивы передавались GPU как текстуры, со значениями компонент типа float, и результат обработки также сохранялся в текстурах такого же типа. Фактически мы получили мощный параллельный процессор, на вход которому можно передать большой массив данных и программу для их обработки и на выходе получить массив результатов. Появление высокоуровневых языков для написания программ для GPU, таких как Cg, GLSL и HLSL, заметно облегчило создание подобных программ обработки данных. Ниже приводится пример программы (шейдера) на языке GLSL. varying vec3 lt; varying vec3 ht; uniform sampler2D tangentMap; uniform sampler2D decalMap; uniform sampler2D anisoTable; void main (void) { const vec4 specColor = vec4 ( 0, 0, 1, 0 ); vec3 tang = normalize ( 2.0*texture2D ( tangentMap, gl_TexCoord [0].xy ).xyz – 1.0); float dot1 = dot ( normalize ( lt ), tang ); float dot2 = dot ( normalize ( ht ), tang ); vec2 arg = vec2 ( dot1, dot2 ); vec2 ds = texture2D ( anisoTable, arg*arg ).rg; vec4 color = texture2D ( decalMap, gl_TexCoord [0].xy ); gl_FragColor = color * ds.x + specColor * ds.y; gl_FragColor.a = 1.0; } В результате возникло такое направление, как GPGPU (GeneralPurpose computing on Graphics Processing Units) – использование графических процессоров для решения неграфических задач. За счет использования высокой степени параллелизма довольно быстро удалось получить очень высокую производительность – ускорение по сравнению с центральным процессором часто достигало 10 раз. Оказалось, что многие ресурсоемкие вычислительные задачи достаточно хорошо ложатся на архитектуру GPU, позволяя заметно ускорить их численное решение. Так, многие игры используют довольно сложные модели для расчета волн в воде, решая при этом дифференциальные уравнения на GPU в реальном времени. Всего за несколько лет за счет использования GPU удалось заметно ускорить решение ряда сложных вычислительных задач, достигая ускорения в 10 и более раз (рис. 1.9). Ряд процедур обработки изображения и видео с переносом на GPU стали работать в реальном времени (вместо нескольких секунд на один кадр). При этом разработчики использовали один из распространенных графических API (OpenGL и Direct3D) для доступа к графическому процессору. Используя такой API, подготавливались текстуры, содержащие необходимые входные данные, и через операцию рендеринга (обычно просто прямоугольника) на графическом процессоре запускалась программа для обработки этих данных. Результат
15 15 15 15 получался также в виде текстур, которые потом считывались в память центрального процессора. Фактически программа писалась сразу на двух языках – на традиционном языке программирования, например С++, и на языке для написания шейдеров. Часть программы (написанная на традиционном языке программирования) отвечала за подготовку и передачу данных, а также за запуск на GPU программ, написанных на шейдерных языках. Однако традиционный GPGPU обладает и рядом недостатков, затрудняющих его распространение. Все эти ограничения непосредственно связаны с тем, что использование возможностей GPU происходит через API, ориентированный на работу с графикой (OpenGL или Direct3D). И в результате все ограничения, изначально присущие данным API (и вполне естественные с точки зрения графики), влияют на реализацию расчетных задач (где подобные ограничения явно избыточны). Так, в графических API полностью отсутствует возможность какоголибо взаимодействия между параллельно обрабатываемыми пикселами, что в графике действительно не нужно, но для вычислительных задач оказывается довольно желательным. Рис. 1.9. Динамика роста производительности для CPU и GPU Эволюция GPU Эволюция GPU Эволюция GPU Эволюция GPU Эволюция GPU
К покупке доступен более свежий выпуск
Перейти