
- •Оглавление
- •Глава 1 Устройство графических процессоров 4
- •Глава 2 gpgpu – «gpu общего назначения» 12
- •Глава 3 Примеры внедрения nvidia cuda 21
- •Введение
- •Глава 1 Устройство графических процессоров
- •1.1 Принцип работают графического процессора
- •1.2 Устройство графического конвейера
- •1.2.1 Преобразование вершин
- •1.2.2 Построение примитивов и растеризация
- •1.2.3 Текстурирование и окрашивание
- •1.3 Совершенствование графических конвейеров
- •Глава 2 gpgpu – «gpu общего назначения»
- •2.1 Общий обзор
- •2.2 Разница между cpu и gpu в параллельных расчётах
- •2.3 Первые попытки применения расчётов на gpu
- •2.4 Возможности nvidia cuda
- •2.5 Преимущества и ограничения cuda
- •Глава 3 Примеры внедрения nvidia cuda
- •3.1 Мини-суперкомпьютер для томографии
- •3.2 Distributed Password Recovery — высокоскоростное восстановление паролей
- •3.3 Nvidia PhysX — физические расчёты в играх и dcc приложениях
- •3.4 Ускоренная версия пакета утилит текстурного сжатия nvidia Texture Tools 2
- •Заключение
- •Библиографический список
Глава 2 gpgpu – «gpu общего назначения»
2.1 Общий обзор
Высокий уровень параллельной нагрузки, характерный для трехмерной компьютерной графики, воспроизводимой в режиме реального времени, предъявляет крайне высокие требования к пропускной способности арифметического блока и потоковой памяти. Благодаря добавлению программируемых шейдерных блоков и более высокой арифметической точности растровых конвейеров, разработчики ПО смогли использовать потоковые процессоры для неграфических данных. Исследователи, взявшие на вооружение подход GPGPU (General-purpose graphics processing units — «GPU общего назначения»), используют графический процессор в качестве вычислительного сопроцессора, а не устройства синтеза изображений. Специализированная архитектура графических процессоров хорошо подходит для реализации не любого алгоритма. Многие приложения ориентированы на последовательную обработку, для них характерны непредсказуемые всплески обращений к памяти. Вместе с тем многие важные задачи требуют значительных вычислительных ресурсов и хорошо укладываются в характерную для графического процессора схему интенсивной многоядерной арифметической обработки. Другим нужна высокая пропускная способность при обработке больших объемов данных, и тут уже в полном блеске может продемонстрировать себя подсистема потоковой памяти графического процессора. Перенос правильно подобранного алгоритма на платформу графического процессора зачастую помогает в 5-20 раз увеличить производительность по сравнению с выполнением на современном процессоре общего назначения хорошо написанного, оптимизированного кода. А некоторые алгоритмы, особенно удачно ложащиеся на архитектуру графического процессора, позволяют добиться стократного роста производительности [2].
Последние достижения в этой области поражают. Архитектура CUDA, последняя на текущий момент разработка NVIDIA, с кодовым названием «Fermi» — это самая продвинутая архитектура в истории вычислений на GPU. Более трех миллиардов транзисторов и 512 ядер CUDA позволяют новейшей архитектуре Fermi обеспечивать супервычисления и невероятную производительность с затратами, составляющими 1/10 средств и 1/20 потребляемого электричества по сравнению с традиционными GPU-серверами. Архитектура Fermi обеспечивает более широкое применение гетерогенным вычислениям на GPU и CPU, поддерживая полный спектр вычислительных приложений. Встроенные возможности работы с C++ и совместимость со средой разработки Visual Studio делают параллельное программирование с Fermi еще проще и позволяют достигать невероятно высокой скорости работы в небывалом числе приложений, включая значительное ускорение трассировки луча, обработки физики, анализа конечных элементов, высокоточных научных вычислений, работы с разреженными матрицами в линейной алгебре, сортировки и поисковых алгоритмов [3].
2.2 Разница между cpu и gpu в параллельных расчётах
Рост частот универсальных процессоров упёрся в физические ограничения и высокое энергопотребление, и увеличение их производительности всё чаще происходит за счёт размещения нескольких ядер в одном чипе. Продаваемые сейчас процессоры содержат лишь до восьми ядер (дальнейший рост не будет быстрым) и они предназначены для обычных приложений, используют MIMD — множественный поток команд и данных. Каждое ядро работает отдельно от остальных, исполняя разные инструкции для разных процессов.
В отличие от CPU, ядра мультипроцессора в GPU являются SIMD (одиночный поток команд, множество потоков данных) ядрами. И эти ядра исполняют одни и те же инструкции одновременно, такой стиль программирования является обычным для графических алгоритмов и многих научных задач, но требует специфического программирования. Зато такой подход позволяет увеличить количество исполнительных блоков за счёт их упрощения.
Ниже приведены основные различия между архитектурами CPU и GPU. Ядра CPU созданы для исполнения одного потока последовательных инструкций с максимальной производительностью, а GPU проектируются для быстрого исполнения большого числа параллельно выполняемых потоков инструкций. Универсальные процессоры оптимизированы для достижения высокой производительности единственного потока команд, обрабатывающего и целые числа и числа с плавающей точкой. При этом доступ к памяти случайный [5].
У видеочипов работа простая и распараллеленная изначально. Видеочип принимает на входе группу полигонов, проводит все необходимые операции, и на выходе выдаёт пиксели. Обработка полигонов и пикселей независима, их можно обрабатывать параллельно, отдельно друг от друга. Поэтому, из-за изначально параллельной организации работы в GPU используется большое количество исполнительных блоков, которые легко загрузить, в отличие от последовательного потока инструкций для CPU.
GPU отличается от CPU ещё и по принципам доступа к памяти. В GPU он связанный и легко предсказуемый — если из памяти читается тексель текстуры, то через некоторое время придёт время и для соседних текселей. Да и при записи то же — пиксель записывается во фреймбуфер, и через несколько тактов будет записываться расположенный рядом с ним. Поэтому организация памяти отличается от той, что используется в CPU. И видеочипу, в отличие от универсальных процессоров, просто не нужна кэш-память большого размера, а для текстур требуются лишь несколько (до 128-256 в нынешних GPU) килобайт.
Про отличия в кэшировании. Универсальные центральные процессоры используют кэш-память для увеличения производительности за счёт снижения задержек доступа к памяти, а GPU используют кэш или общую память для увеличения полосы пропускания. CPU снижают задержки доступа к памяти при помощи кэш-памяти большого размера, а также предсказания ветвлений кода. Эти аппаратные части занимают большую часть площади чипа и потребляют много энергии. Видеочипы обходят проблему задержек доступа к памяти при помощи одновременного исполнения тысяч потоков — в то время, когда один из потоков ожидает данных из памяти, видеочип может выполнять вычисления другого потока без ожидания и задержек.
Есть множество различий и в поддержке многопоточности. CPU исполняет 1-2 потока вычислений на одно процессорное ядро, а видеочипы могут поддерживать до 1024 потоков на каждый мультипроцессор, которых в чипе несколько штук. И если переключение с одного потока на другой для CPU стоит сотни тактов, то GPU переключает несколько потоков за один такт.
Вкратце можно сказать, что в отличие от современных универсальных CPU, видеочипы предназначены для параллельных вычислений с большим количеством арифметических операций. И значительно большее число транзисторов GPU работает по прямому назначению — обработке массивов данных, а не управляет исполнением (flow control) немногочисленных последовательных вычислительных потоков.
В итоге, основой для эффективного использования мощи GPU в научных и иных неграфических расчётах является распараллеливание алгоритмов на сотни исполнительных блоков, имеющихся в видеочипах. К примеру, множество приложений по молекулярному моделированию отлично приспособлено для расчётов на видеочипах, они требуют больших вычислительных мощностей и поэтому удобны для параллельных вычислений. А использование нескольких GPU даёт ещё больше вычислительных мощностей для решения подобных задач.
Выполнение расчётов на GPU показывает отличные результаты в алгоритмах, использующих параллельную обработку данных. То есть, когда одну и ту же последовательность математических операций применяют к большому объёму данных. При этом лучшие результаты достигаются, если отношение числа арифметических инструкций к числу обращений к памяти достаточно велико. Это предъявляет меньшие требования к управлению исполнением (flow control), а высокая плотность математики и большой объём данных отменяет необходимость в больших кэшах, как на CPU.
В результате всех описанных выше отличий, теоретическая производительность видеочипов значительно превосходит производительность CPU.