Параллельные вычисления в архитектуре CUDA

Автор работы: Пользователь скрыл имя, 24 Декабря 2012 в 19:12, курсовая работа

Описание работы

Устройства для преобразования персональных компьютеров в маленькие суперкомпьютеры известны довольно давно. Ещё в 80-х годах прошлого века на рынке предлагались так называемые транспьютеры, которые вставлялись в распространенные тогда слоты расширения ISA. Первое время их производительность в соответствующих задачах впечатляла, но затем рост быстродействия универсальных процессоров ускорился, они усилили свои позиции в параллельных вычислениях, и смысла в транспьютерах не осталось. Хотя подобные устройства существуют и сейчас — это разнообразные специализированные ускорители. Но зачастую сфера их применения узка и особого распространения такие ускорители не получили.

Содержание работы

1.Введение 3
2. GPGPU на примере использования технологии CUDA 5
2.1. Особенности использования GPU 5
2.1.1. Разница между CPU и GPU в параллельных расчётах 5
2.1.2. Первые попытки применения расчётов на GPU 10
2.1.3. Области применения параллельных расчётов на GPU 11
2.2. Архитектура CUDA 13
2.2.1. Возможности NVIDIA CUDA 13
2.2.2. История развития CUDA 14
2.2.3. Преимущества и ограничения CUDA 16
2.2.4. Решения с поддержкой NVIDIA CUDA 19
2.2.5. Состав NVIDIA CUDA 20
2.3. Основы создания программ на CUDA 22
2.3.1. Модель программирования CUDA 24
2.3.2. Модель памяти CUDA 26
2.3.3. Среда программирования 29
2.3.4. Стадии компиляции CUDA-приложения 30
2.3.5. Оптимизация программ на CUDA 30
3.Выводы 32
4. Список литературы 34

Файлы: 1 файл

курсовая.Параллельные вычисления в архитектуре CUDA.docx

— 289.56 Кб (Скачать файл)

Естественно, у Brook было множество недостатков. Но даже просто его появление вызвало интерес NVIDIA и ATI к инициативе вычислений на GPU, так как развитие этих возможностей серьёзно изменило рынок в дальнейшем, открыв целый новый его сектор — параллельные вычислители на основе видеочипов.

В дальнейшем, некоторые  исследователи из проекта Brook вступились в команду разработчиков NVIDIA, чтобы представить программно-аппаратную стратегию параллельных вычислений, открыв новую долю рынка. И главным преимуществом этой инициативы NVIDIA стало то, что разработчики отлично знают все возможности своих GPU до мелочей, и в использовании графического API нет необходимости, а работать с аппаратным обеспечением можно напрямую при помощи драйвера. Результатом усилий этой команды стала NVIDIA CUDA (Compute Unified Device Architecture) — новая программно-аппаратная архитектура для параллельных вычислений на NVIDIA GPU, которой посвящена эта статья.

2.1.3. Области применения параллельных расчётов на GPU

  Чтобы понять, какие преимущества приносит перенос расчётов на видеочипы, предоставлены усреднённые цифры, полученные исследователями по всему миру. В среднем, при переносе вычислений на GPU, во многих задачах достигается ускорение в 5-30 раз, по сравнению с быстрыми универсальными процессорами. Самые большие цифры (порядка 100-кратного ускорения и даже более) достигаются на коде, который не очень хорошо подходит для расчётов при помощи блоков SSE, но вполне удобен для GPU.

Основные приложения, в которых сейчас применяются вычисления на GPU: анализ и обработка изображений и сигналов, симуляция физики, вычислительная математика, вычислительная биология, финансовые расчёты, базы данных, динамика газов и жидкостей, криптография, адаптивная лучевая терапия, астрономия, обработка звука, биоинформатика, биологические симуляции, компьютерное зрение, анализ данных (data mining), цифровое кино и телевидение, электромагнитные симуляции, геоинформационные системы, военные применения, горное планирование, молекулярная динамика, магнитно-резонансная томография (MRI), нейросети, океанографические исследования, физика частиц, симуляция свёртывания молекул белка, квантовая химия, трассировка лучей, визуализация, радары, гидродинамическое моделирование (reservoir simulation), искусственный интеллект, анализ спутниковых данных, сейсмическая разведка, хирургия, ультразвук, видеоконференции.

Подробности о многих применениях  можно найти на сайте компании NVIDIA в разделе по технологии CUDA.

 

 

2.2. Архитектура CUDA

2.2.1. Возможности NVIDIA CUDA

 Технология CUDA — это  программно-аппаратная вычислительная  архитектура NVIDIA, основанная на  расширении языка Си, которая  даёт возможность организации  доступа к набору инструкций  графического ускорителя и управления  его памятью при организации  параллельных вычислений. CUDA помогает  реализовывать алгоритмы, выполнимые  на графических процессорах видеоускорителей GeForce восьмого поколения и старше, а также Quadro и Tesla.

Хотя трудоёмкость программирования GPU при помощи CUDA довольно велика, она  ниже, чем с ранними GPGPU решениями. Такие программы требуют разбиения  приложения между несколькими мультипроцессорами подобно MPI программированию, но без  разделения данных, которые хранятся в общей видеопамяти. И так  как CUDA программирование для каждого  мультипроцессора подобно OpenMP программированию, оно требует хорошего понимания организации памяти. Но сложность разработки и переноса на CUDA сильно зависит от приложения.

В основе API лежит расширенный  язык Си, а для трансляции кода с  этого языка в состав CUDA SDK входит компилятор командной строки nvcc, созданный на основе открытого компилятора Open64.

Основные характеристики CUDA:

•унифицированное программно-аппаратное решение для параллельных вычислений на видеочипах NVIDIA;

 •большой набор поддерживаемых  решений, от мобильных до мультичиповых

 •стандартный язык  программирования Си;

 •стандартные библиотеки  численного анализа FFT (быстрое  преобразование Фурье) и BLAS (линейная  алгебра);

 •оптимизированный обмен  данными между CPU и GPU;

 •взаимодействие с  графическими API OpenGL и DirectX;

 •поддержка 32- и 64-битных  операционных систем: Windows XP, Windows Vista, Linux и MacOS X;

 •возможность разработки  на низком уровне.

Среда разработки CUDA (CUDA Toolkit) включает:

•компилятор nvcc;

 •библиотеки FFT и BLAS;

 •профилировщик;

 •отладчик gdb для GPU;

 •CUDA runtime драйвер в комплекте стандартных драйверов NVIDIA

 •руководство по программированию;

 •CUDA Developer SDK (исходный код, утилиты и документация).

2.2.2. История развития CUDA

  Разработка CUDA была анонсирована вместе с чипом G80 в ноябре 2006, а релиз публичной бета-версии CUDA SDK состоялся в феврале 2007 года. Версия 1.0 вышла в июне 2007 года под запуск в продажу решений Tesla, основанных на чипе G80, и предназначенных для рынка высокопроизводительных вычислений. Затем, в конце года вышла бета-версия CUDA 1.1, которая, несмотря на малозначительное увеличение номера версии, ввела довольно много нового.

Из обновлений в CUDA 1.1 можно  отметить включение CUDA-функциональности в обычные видеодрайверы NVIDIA. Это  означало, что в требованиях к  любой CUDA программе достаточно было указать видеокарту серии GeForce 8 и выше, а также минимальную версию драйверов 169.xx. Это очень важно для разработчиков, при соблюдении этих условий CUDA программы будут работать у любого пользователя. Также было добавлено асинхронное выполнение вместе с копированием данных (только для чипов G84, G86, G92 и выше), асинхронная пересылка данных в видеопамять, атомарные операции доступа к памяти, поддержка 64-битных версий Windows и возможность мультичиповой работы CUDA в режиме SLI.

На данный момент одной  из актуальных является версия для  решений на основе GT200 — CUDA 2.0, вышедшая вместе с линейкой GeForce GTX 200. Бета-версия была выпущена ещё весной 2008 года. Во второй версии появились: поддержка вычислений двойной точности (аппаратная поддержка только у GT200), поддерживается Windows Vista (32 и 64-битные версии) и Mac OS X, добавлены средства отладки и профилирования, поддерживаются 3D текстуры, оптимизированная пересылка данных.

Что касается вычислений с  двойной точностью, то их скорость на текущем аппаратном поколении ниже одинарной точности в несколько  раз. Реализация в GT200 этой поддержки  заключается в том, блоки FP32 не используются для получения результата в четыре раза меньшем темпе, для поддержки FP64 вычислений в NVIDIA решили сделать  выделенные вычислительные блоки. И  в GT200 их в десять раз меньше, чем  блоков FP32 (по одному блоку двойной  точности на каждый мультипроцессор).

Реально производительность может быть даже ещё меньше, так  как архитектура оптимизирована для 32-битного чтения из памяти и  регистров, кроме того, двойная точность не нужна в графических приложениях, она сделана скорее, чтобы  просто была. Да и современные четырехъядерные процессоры показывают не намного меньшую реальную производительность. Но будучи даже в 10 раз медленнее, чем одинарная точность, такая поддержка полезна для схем со смешанной точностью. Одна из распространенных техник — получить изначально приближенные результаты в одинарной точности, и затем их уточнить в двойной. Теперь это можно сделать прямо на видеокарте, без пересылки промежуточных данных к CPU.

Ещё одна полезная особенность CUDA 2.0 не имеет отношения к GPU, как  ни странно. Просто теперь можно компилировать  код CUDA в высокоэффективный многопоточный SSE код для быстрого исполнения на центральном процессоре. То есть, теперь эта возможность годится не только для отладки, но и реального использования на системах без видеокарты NVIDIA. Ведь использование CUDA в обычном коде сдерживается тем, что видеокарты NVIDIA хоть и самые популярные среди выделенных видеорешений, но имеются не во всех системах. И до версии 2.0 в таких случаях пришлось бы делать два разных кода: для CUDA и отдельно для CPU. А теперь можно выполнять любую CUDA программу на CPU с высокой эффективностью, пусть и с меньшей скоростью, чем на видеочипах.

2.2.3. Преимущества и ограничения CUDA

  С точки зрения программиста, графический конвейер является набором стадий обработки. Блок геометрии генерирует треугольники, а блок растеризации — пиксели, отображаемые на мониторе. Традиционная модель программирования GPGPU выглядит следующим образом:

Рисунок 2.3

Чтобы перенести вычисления на GPU в рамках такой модели, нужен  специальный подход. Даже поэлементное сложение двух векторов потребует отрисовки фигуры на экране или во внеэкранный буфер. Фигура растеризуется, цвет каждого пикселя вычисляется по заданной программе (пиксельному шейдеру). Программа считывает входные данные из текстур для каждого пикселя, складывает их и записывает в выходной буфер. И все эти многочисленные операции нужны для того, что в обычном языке программирования записывается одним оператором!

Поэтому, применение GPGPU для  вычислений общего назначения имеет  ограничение в виде слишком большой  сложности обучения разработчиков. Да и других ограничений достаточно, ведь пиксельный шейдер — это лишь формула зависимости итогового  цвета пикселя от его координаты, а язык пиксельных шейдеров — язык записи этих формул с «Си-подобным» синтаксисом. В ранних методах GPGPU данные представлены изображениями (текстурами), а алгоритм — процессом растеризации. Нужно особо отметить и весьма специфичную модель памяти и исполнения.

Программно-аппаратная архитектура  для вычислений на GPU компании NVIDIA отличается от предыдущих моделей GPGPU тем, что позволяет  писать программы для GPU на настоящем  языке Си со стандартным синтаксисом, указателями и необходимостью в  минимуме расширений для доступа  к вычислительным ресурсам видеочипов. CUDA не зависит от графических API, и обладает некоторыми особенностями, предназначенными специально для вычислений общего назначения.

Преимущества CUDA перед традиционным подходом к GPGPU вычислениям:

•интерфейс программирования приложений CUDA основан на стандартном  языке программирования Си с расширениями, что упрощает процесс изучения и  внедрения архитектуры CUDA;

 •CUDA обеспечивает доступ  к разделяемой между потоками  памяти размером в 16 Кб на  мультипроцессор, которая может быть использована для организации кэша с широкой полосой пропускания, по сравнению с текстурными выборками;

 •более эффективная  передача данных между системной  и видеопамятью

 •отсутствие необходимости  в графических API с избыточностью и накладными расходами;

 •линейная адресация  памяти, и gather и scatter, возможность записи по произвольным адресам;

 •аппаратная поддержка  целочисленных и битовых операций.

Основные ограничения CUDA:

•отсутствие поддержки рекурсии для выполняемых функций;

 •минимальная ширина  блока в 32 потока;

 •закрытая архитектура  CUDA, принадлежащая NVIDIA.

Слабыми местами программирования при помощи предыдущих методов GPGPU является то, что эти методы не используют блоки исполнения вершинных шейдеров в предыдущих неунифицированных  архитектурах, данные хранятся в текстурах, а выводятся во внеэкранный буфер, в свою очередь многопроходные алгоритмы используют пиксельные шейдерные блоки. В ограничения GPGPU можно включить: недостаточно эффективное использование аппаратных возможностей, ограничения полосой пропускания памяти, отсутствие операции scatter (только gather), обязательное использование графического API.

Основные преимущества CUDA по сравнению с предыдущими методами GPGPU вытекают из того, что эта архитектура  спроектирована для эффективного использования  неграфических вычислений на GPU и  использует язык программирования C, не требуя переноса алгоритмов в удобный  для концепции графического конвейера  вид. CUDA предлагает новый путь вычислений на GPU, не использующий графические API, предлагающий произвольный доступ к памяти (scatter или gather). Такая архитектура лишена недостатков GPGPU и использует все исполнительные блоки, а также расширяет возможности за счёт целочисленной математики и операций битового сдвига.

Кроме того, CUDA открывает  некоторые аппаратные возможности, недоступные из графических API, такие как разделяемая память. Это память небольшого объёма (16 килобайт на мультипроцессор), к которой имеют доступ блоки потоков. Она позволяет кэшировать наиболее часто используемые данные и может обеспечить более высокую скорость, по сравнению с использованием текстурных выборок для этой задачи. Что, в свою очередь, снижает чувствительность к пропускной способности параллельных алгоритмов во многих приложениях. Например, это полезно для линейной алгебры, быстрого преобразования Фурье и фильтров обработки изображений.

Удобнее в CUDA и доступ к  памяти. Программный код в графических API выводит данные в виде 32-х значений с плавающей точкой одинарной точности (RGBA значения одновременно в восемь render target) в заранее предопределённые области, а CUDA поддерживает scatter запись — неограниченное число записей по любому адресу. Такие преимущества делают возможным выполнение на GPU некоторых алгоритмов, которые невозможно эффективно реализовать при помощи методов GPGPU, основанных на графических API.

Также, графические API в обязательном порядке хранят данные в текстурах, что требует предварительной  упаковки больших массивов в текстуры, что усложняет алгоритм и заставляет использовать специальную адресацию. А CUDA позволяет читать данные по любому адресу. Ещё одним преимуществом CUDA является оптимизированный обмен  данными между CPU и GPU. А для разработчиков, желающих получить доступ к низкому  уровню (например, при написании  другого языка программирования), у данной архитектуры есть возможность низкоуровневого программирования на языке Assembler.

Информация о работе Параллельные вычисления в архитектуре CUDA