- •Оглавление
- •Глава 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.3 Первые попытки применения расчётов на gpu
Видеочипы в параллельных математических расчётах пытались использовать довольно давно. Самые первые попытки такого применения были крайне примитивными и ограничивались использованием некоторых аппаратных функций, таких, как растеризация и Z-буферизация. Этот процесс можно описать следующим образом: входные данные задачи преобразовывались в графический фрагмент, алгоритм обработки этих данных закладывался в процесс растеризации, затем выходные данные в виде отрисованных пикселов возвращались вызывающей программе. В нынешнем веке, с появлением шейдеров, начали ускорять вычисления матриц. В 2003 году на SIGGRAPH отдельная секция была выделена под вычисления на GPU, и она получила название GPGPU (General-Purpose computation on GPU) — универсальные вычисления на GPU).
Наиболее известен BrookGPU — компилятор потокового языка программирования Brook, созданный для выполнения неграфических вычислений на GPU. До его появления разработчики, использующие возможности видеочипов для вычислений, выбирали один из двух распространённых API: Direct3D или OpenGL. Это серьёзно ограничивало применение GPU, ведь в 3D графике используются шейдеры и текстуры, о которых специалисты по параллельному программированию знать не обязаны, они используют потоки и ядра. Brook смог помочь в облегчении их задачи. Эти потоковые расширения к языку C, разработанные в Стэндфордском университете, скрывали от программистов трёхмерный API, и представляли видеочип в виде параллельного сопроцессора. Компилятор обрабатывал файл .br с кодом C++ и расширениями, производя код, привязанный к библиотеке с поддержкой DirectX, OpenGL или x86.
Естественно, у Brook было множество недостатков. Но даже просто его появление вызвало значительный прилив внимания тех же NVIDIA и ATI к инициативе вычислений на GPU, так как развитие этих возможностей серьёзно изменило рынок в дальнейшем, открыв целый новый его сектор — параллельные вычислители на основе видеочипов.
В дальнейшем, некоторые исследователи из проекта Brook влились в команду разработчиков NVIDIA, чтобы представить программно-аппаратную стратегию параллельных вычислений, открыв новую долю рынка. И главным преимуществом этой инициативы NVIDIA стало то, что разработчики отлично знают все возможности своих GPU до мелочей, и в использовании графического API нет необходимости, а работать с аппаратным обеспечением можно напрямую при помощи драйвера. Результатом усилий этой команды стала NVIDIA CUDA (Compute Unified Device Architecture) — новая программно-аппаратная архитектура для параллельных вычислений на NVIDIA GPU [5].
2.4 Возможности nvidia cuda
Технология CUDA — это программно-аппаратная вычислительная архитектура NVIDIA, основанная на расширении языка Си, которая даёт возможность организации доступа к набору инструкций графического ускорителя и управления его памятью при организации параллельных вычислений. CUDA помогает реализовывать алгоритмы, выполнимые на графических процессорах видеоускорителей GeForce восьмого поколения и старше (серии GeForce 8, GeForce 9, GeForce 200), а также Quadro и Tesla.
Хотя трудоёмкость программирования GPU при помощи CUDA довольно велика, она ниже, чем с ранними GPGPU решениями. Такие программы требуют разбиения приложения между несколькими мультипроцессорами, но без разделения данных, которые хранятся в общей видеопамяти. CUDA программирование для каждого мультипроцессора требует хорошего понимания организации памяти. Но, конечно же, сложность разработки и переноса на CUDA сильно зависит от приложения.
Набор для разработчиков содержит множество примеров кода и хорошо документирован. Процесс обучения потребует около двух-четырёх недель для тех, кто уже знаком с OpenMP и MPI. В основе API лежит расширенный язык Си, а для трансляции кода с этого языка в состав CUDA SDK входит компилятор командной строки nvcc, созданный на основе открытого компилятора Open64.
Перечислим основные характеристики CUDA:
унифицированное программно-аппаратное решение для параллельных вычислений на видеочипах NVIDIA;
большой набор поддерживаемых решений, от мобильных до мультичиповых
стандартный язык программирования Си;
стандартные библиотеки численного анализа FFT (быстрое преобразование Фурье) и BLAS (линейная алгебра);
оптимизированный обмен данными между CPU и GPU;
взаимодействие с графическими API OpenGL и DirectX;
поддержка 32- и 64-битных операционных систем: Windows XP, Windows Vista, Linux и MacOS X;
возможность разработки на низком уровне.
Касательно поддержки операционных систем нужно добавить, что официально поддерживаются все основные дистрибутивы Linux (Red Hat Enterprise Linux 3.x/4.x/5.x, SUSE Linux 10.x), но, судя по данным энтузиастов, CUDA прекрасно работает и на других сборках: Fedora Core, Ubuntu, Gentoo и др.
Среда разработки CUDA (CUDA Toolkit) включает:
компилятор nvcc;
библиотеки FFT и BLAS;
профилировщик;
отладчик gdb для GPU;
CUDA runtime драйвер в комплекте стандартных драйверов NVIDIA
руководство по программированию;
CUDA Developer SDK (исходный код, утилиты и документация).
В примерах исходного кода: параллельная битонная сортировка (bitonic sort), транспонирование матриц, параллельное префиксное суммирование больших массивов, свёртка изображений, дискретное вейвлет-преобразование, пример взаимодействия с OpenGL и Direct3D, использование библиотек CUBLAS и CUFFT, вычисление цены опциона (формула Блэка-Шоулза, биномиальная модель, метод Монте-Карло), параллельный генератор случайных чисел Mersenne Twister, вычисление гистограммы большого массива, шумоподавление, фильтр Собеля (нахождение границ) [5].
