Параллельные вычисления в архитектуре 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 Кб (Скачать файл)

Содержание

 

Содержание 2

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.Введение

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

Благодаря развитию компьютерных технологий вычислительная математика получила возможность решать важные практические задачи за короткое время. К тому же появляются все новые и более быстрые способы обработки данных. Сегодня становится популярным использование современных графических процессоров для осуществления высокопроизводительных математических вычислений. Это позволяет значительно увеличить скорость вычислений по сравнению с теми, что обычно выполняются на центральном процессоре компьютера. 
Графическое процессорное устройство (англ. Graphics Processing Unit, GPU) – программируемое вычислительное устройство, изначально предназначенное для обработки графической информации. Оно занимается расчётами выводимого изображения, освобождая от этой обязанности центральный процессор (англ. Central Processing Unit, CPU), а также производит расчёты для обработки команд трёхмерной графики (геометрическая трансформация, моделирование освещения). В силу ряда особенностей архитектуры GPU стали использоваться как платформа для высокопроизводительных математических вычислений.

Они  достигают высокой пиковой производительности, которую не поддерживают  универсальные процессоры. Естественно, максимальная скорость достигается лишь в ряде удобных задач и имеет некоторые ограничения, но такие устройства уже начали довольно широко применять в сферах, для которых они изначально и не предназначались. Отличным примером такого параллельного процессора является процессор Cell, разработанный альянсом Sony-Toshiba-IBM и применяемый в игровой приставке Sony PlayStation 3.

Cell в данной работе рассматриваться не будет, несмотря на то, что появился он раньше и является универсальным процессором с дополнительными векторными возможностями. Для 3D видеоускорителей ещё несколько лет назад появились первые технологии неграфических расчётов общего назначения GPGPU (General-Purpose computation on GPUs). Ведь современные видеочипы содержат сотни математических исполнительных блоков, и эта мощь может использоваться для значительного ускорения множества вычислительно интенсивных приложений. И нынешние поколения GPU обладают достаточно гибкой архитектурой, что вместе с высокоуровневыми языками программирования и программно-аппаратными архитектурами, подобными рассматриваемой в данной курсовой работе, раскрывает эти возможности и делает их значительно более доступными.

Также актуальными примерами  графических процессоровявляются и все современные видеокарты от лидеров рынка — компаний NVIDIA и AMD, которые разработали и анонсировали соответствующие платформы под названием CUDA (Compute Unified Device Architecture) и CTM (Close To Metal или AMD Stream Computing), соответственно. В отличие от предыдущих моделей программирования GPU, эти были выполнены с учётом прямого доступа к аппаратным возможностям видеокарт. Платформы не совместимы между собой, CUDA — это расширение языка программирования C, а CTM — виртуальная машина, исполняющая ассемблерный код. В данной курсовой работе будет рассмотрена именно технология компании NVIDIA.

 

2. GPGPU на примере  использования технологии CUDA

 2.1. Особенности использования GPU

2.1.1. Разница между CPU и GPU в параллельных расчётах

  Рост частот универсальных процессоров останавливает физическое ограничение и высокое энергопотребление. Увеличение их производительности всё чаще происходит за счёт размещения нескольких ядер в одном чипе. Продаваемые сейчас процессоры содержат до 8 ядер (дальнейший рост не будет быстрым) и они предназначены для обычных приложений, используют MIMD (множественный поток команд и данных). Каждое ядро работает отдельно от остальных, исполняя разные инструкции для разных процессов.

Специализированные векторные  возможности (SSE2 и SSE3) для четырехкомпонентных (одинарная точность вычислений с  плавающей точкой) и двухкомпонентных (двойная точность) векторов появились  в универсальных процессорах, в первую очередь, из-за возросших требований графических приложений. Именно поэтому для определённых задач применение GPU выгоднее.

Например, в видеочипах NVIDIA основной блок — это мультипроцессор  с восемью-десятью ядрами и сотнями ALU в целом, несколькими тысячами регистров и небольшим количеством  разделяемой общей памяти. Кроме  того, видеокарта содержит быструю  глобальную память с доступом к ней  всех мультипроцессоров, локальную  память в каждом мультипроцессоре, а также специальную память для  констант.

Самое главное — эти  несколько ядер мультипроцессора в GPU являются SIMD (одиночный поток команд, множество потоков данных) ядрами. И эти ядра исполняют одни и  те же инструкции одновременно, такой  стиль программирования является обычным  для графических алгоритмов и  многих научных задач, но требует  специфического программирования. Зато такой подход позволяет увеличить  количество исполнительных блоков за счёт их упрощения.

Итак, основные различия между  архитектурами CPU и GPU заключаются в следующем. Ядра CPU созданы для исполнения одного потока последовательных инструкций с максимальной производительностью, а GPU проектируются для быстрого исполнения большого числа параллельно выполняемых потоков инструкций. Универсальные процессоры оптимизированы для достижения высокой производительности единственного потока команд, обрабатывающего и целые числа и числа с плавающей точкой. При этом доступ к памяти случайный.

Разработчики CPU стараются  добиться выполнения как можно большего числа инструкций параллельно, для  увеличения производительности. Для  этого, начиная с процессоров  Intel Pentium, появилось суперскалярное выполнение, обеспечивающее выполнение двух инструкций за такт, а Pentium Pro отличился внеочередным выполнением инструкций. Но у параллельного выполнения последовательного потока инструкций есть определённые базовые ограничения и увеличением количества исполнительных блоков кратного увеличения скорости не добиться.

У видеочипов работа простая  и распараллеленная изначально. Видеочип принимает на входе группу полигонов, проводит все необходимые операции, и на выходе выдаёт пиксели. Обработка  полигонов и пикселей независима, их можно обрабатывать параллельно, отдельно друг от друга. Поэтому, из-за изначально параллельной организации  работы в GPU используется большое количество исполнительных блоков, которые легко  загрузить, в отличие от последовательного  потока инструкций для CPU. Кроме того, современные GPU также могут исполнять  больше одной инструкции за такт (dual issue).

GPU отличается от CPU ещё  и по принципам доступа к  памяти. В GPU он связанный и  легко предсказуемый — если  из памяти читается тексель текстуры, то через некоторое время придёт время и для соседних текселей. Да и при записи то же — пиксель записывается во фреймбуфер, и через несколько тактов будет записываться расположенный рядом с ним. Поэтому организация памяти отличается от той, что используется в CPU. И видеочипу, в отличие от универсальных процессоров, просто не нужна кэш-память большого размера, а для текстур требуются лишь несколько (до 128-256 в нынешних GPU) килобайт.

И сама по себе работа с памятью у GPU и CPU несколько отличается. Так, не все центральные процессоры имеют встроенные контроллеры памяти, а у всех GPU обычно есть по несколько контроллеров, вплоть до восьми 64-битных каналов в чипе NVIDIA GT200. Кроме того, на видеокартах применяется более быстрая память, и в результате видеочипам доступна в разы большая пропускная способность памяти, что также весьма важно для параллельных расчётов, оперирующих с огромными потоками данных.

В универсальных процессорах  большие количества транзисторов и  площадь чипа идут на буферы команд, аппаратное предсказание ветвления  и огромные объёмы «начиповой» кэш-памяти. Все эти аппаратные блоки нужны для ускорения исполнения немногочисленных потоков команд. Видеочипы тратят транзисторы на массивы исполнительных блоков, управляющие потоками блоки, разделяемую память небольшого объёма и контроллеры памяти на несколько каналов. Вышеперечисленное не ускоряет выполнение отдельных потоков, оно позволяет чипу обрабатывать нескольких тысяч потоков, одновременно исполняющихся чипом и требующих высокой пропускной способности памяти.

Необходимо рассмотреть  и  отличия в кэшировании. Универсальные центральные процессоры используют кэш-память для увеличения производительности за счёт снижения задержек доступа к памяти, а GPU используют кэш или общую память для увеличения полосы пропускания. CPU снижают задержки доступа к памяти при помощи кэш-памяти большого размера, а также предсказания ветвлений кода. Эти аппаратные части занимают большую часть площади чипа и потребляют много энергии. Видеочипы обходят проблему задержек доступа к памяти при помощи одновременного исполнения тысяч потоков — в то время, когда один из потоков ожидает данных из памяти, видеочип может выполнять вычисления другого потока без ожидания и задержек.

Есть множество различий и в поддержке многопоточности. CPU исполняет 1-2 потока вычислений на одно процессорное ядро, а видеочипы могут поддерживать до 1024 потоков на каждый мультипроцессор, которых в чипе несколько штук. И если переключение с одного потока на другой для CPU можно оценить в сотни тактов, то GPU переключает несколько потоков за один такт.

Кроме того, центральные  процессоры используют SIMD (одна инструкция выполняется над многочисленными  данными) блоки для векторных  вычислений, а видеочипы применяют SIMT (одна инструкция и несколько  потоков) для скалярной обработки  потоков. SIMT не требует, чтобы разработчик  преобразовывал данные в векторы, и  допускает произвольные ветвления  в потоках.

Итак, в отличие от современных универсальных CPU, видеочипы предназначены для параллельных вычислений с большим количеством арифметических операций. И значительно большее число транзисторов GPU работает по прямому назначению — обработке массивов данных, а не управляет исполнением (flow control) немногочисленных последовательных вычислительных потоков. На рисунке 2.1 схема того, сколько места в CPU и GPU занимает разнообразная логика:

 

Рисунок 2.1

В итоге, основой для эффективного использования мощи GPU в научных  и иных неграфических расчётах является распараллеливание алгоритмов на сотни  исполнительных блоков, имеющихся в  видеочипах. Так и в области криптографии есть приложения, отлично приспособленные для расчётов на видеочипах, они требуют больших вычислительных мощностей и поэтому удобны для параллельных вычислений. А использование нескольких GPU даёт ещё больше вычислительных мощностей для решения подобных задач.

Выполнение расчётов на GPU показывает отличные результаты в алгоритмах, использующих параллельную обработку  данных. То есть, когда одну и ту же последовательность математических операций применяют к большому объёму данных. При этом лучшие результаты достигаются, если отношение числа арифметических инструкций к числу обращений  к памяти достаточно велико. Это  предъявляет меньшие требования к управлению исполнением (flow control), а высокая плотность математики и большой объём данных отменяет необходимость в больших кэшах, как на CPU.

В результате всех описанных  выше отличий, теоретическая производительность видеочипов значительно превосходит  производительность CPU. Компания NVIDIA приводит следующий график роста производительности CPU и GPU за последние несколько лет:

Рисунок 2.2

Естественно, что данные не точны. Ведь на CPU гораздо проще на практике достичь теоретических цифр, да и цифры приведены для одинарной точности в случае GPU, и для двойной — в случае CPU. Но для части параллельных задач одинарной точности хватает, а разница в скорости между универсальными и графическими процессорами весьма велика.

 

2.1.2. Первые попытки применения расчётов на GPU

Видеочипы в параллельных математических расчётах пытались использовать довольно давно. Самые первые попытки  такого применения были крайне примитивными и ограничивались использованием некоторых  аппаратных функций, таких, как растеризация и Z-буферизация. Но в нынешнем веке, с появлением шейдеров, начали ускорять вычисления матриц. В 2003 году на ежегодной конференции по вопросам компьютерной графики SIGGRAPH (Special Interest Group on Graphics and Interactive Techniques) отдельная секция была выделена под вычисления на GPU, и она получила название GPGPU (General-Purpose computation on GPU) — универсальные вычисления на GPU.

Наиболее известен BrookGPU — компилятор потокового языка программирования Brook, созданный для выполнения неграфических вычислений на GPU. До его появления разработчики, использующие возможности видеочипов для вычислений, выбирали один из двух распространённых API: Direct3D или OpenGL. Это серьёзно ограничивало применение GPU, ведь в 3D графике используются шейдеры и текстуры, о которых специалисты по параллельному программированию знать не обязаны, они используют потоки и ядра. Brook смог помочь в облегчении их задачи. Эти потоковые расширения к языку C, разработанные в Стэндфордском университете, скрывали от программистов трёхмерный API, и представляли видеочип в виде параллельного сопроцессора. Компилятор обрабатывал файл с кодом C++ и расширениями .br, производя код, привязанный к библиотеке с поддержкой DirectX, OpenGL или x86.

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