Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Основы работы с технологией CUDA

Покупка
Артикул: 616068.01.99
К покупке доступен более свежий выпуск Перейти
Данная книга посвящена программированию современных графических процессоров (GPU) на основе технологии CUDA от компании NVIDIA. В книге разбираются как сама технология CUDA, так и архитектура поддерживаемых GPU и вопросы оптимизации, включающие использование .PTX. Рассматривается реализация целого класса алгоритмов и последовательностей на CUDA. К книге прилагается CD, который содержит примеры решения на CUDA реальных задач с большим объемом вычислений из широкого класса областей, включая моделирование нейронных сетей, динамику движения элементарных частиц, геномные исследования и многое другое.
Боресков, А. В. Основы работы с технологией CUDA [Электронный ресурс] / А. В. Боресков, А. А. Харламов. - Москва : ДМК Пресс, 2010. - 232 с.: ил. - ISBN 978-5-94074-578-5. - Текст : электронный. - URL: https://znanium.com/catalog/product/408395 (дата обращения: 26.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Боресков А. В., Харламов А. А.

Основы работы
с технологией 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

К покупке доступен более свежий выпуск Перейти