CUDA, весна 2009, 02 лекция (от 03 марта)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

На гуглгруппе будет ссылка на спредшит, где можно будет записать себя, чтобы организаторы могли подать списки охране

У последней версии CUDA SDK есть несколько нью.ансов, в чатсности, под никсами она использует старую версию gcc. На сайте АВ рассказывается, как настраивается CUDA под ubuntu. В следуюшей версии оно будет вероятно исправлено, но пока оно есть.

Что мы рассмотрели: несколько базоавых арзитектур и слегка коснулись g80.

В пятницу был tesla day, где было несколько интересных лекций.

Посмотрим некоторые жл-0ты, которыеп моджно выделить у устройств, являюш. массивно-параллельными.

Что мы видим, как правило: есть набор узлов, и каждый узел довольно маломощный. Если брать расширяемую MPP-систему, то там узлы довольно слабые. Как правило, каждый узел имеет свои ОЗУ и кэш. Обычно они расп. on-chip и имеют быстрый доступ. Также есть память вне чиа, к которой можно быстро оже обр. Процессоры объед. в топологию, наиболее интересным например явл. BG, где можно строить дерево и трёхмерный тор. При этом кол-во блоков может увел., оно легко скейлится, получаем быстродействие. Кроме того, можно объед более крупные блоки. Это будет более чётко видно на tesla.

План:

  • Поговорим об арх. tes;a
  • Прогр, модели
  • Особенности CUDA

Tesla --- спец. аверсия графпроцессора, ориент. не на графику, а а обыкн. выч. Всё, что отн. к tesla, актульно и джля geforce 8.

Высокоуровн. юнитом, из коиторого строится сситема, явл. TPC. Их кол. легко масштабируется. Из чего стоит TPC: у него есть текстурный модуль, обесп. доступ к текст. памяти, и к нему прилаг. два потоковых мультипроц., SM. Каждый из SM есть SIMD процессор RISC-архзитектуры. Неск. потоковых мультипроц. имеют общий TM. Что такое SM (streaming multiprocessor):

  • Есть два небольш. кэша, instr. cache и const cache
  • Есть multithreaded instr. fetch. Он отвечает за выборку и декодир.
  • 8 скалярных процессоров. Это и делает его SIMD-арх, етсь 8 один. процессоров, идущих в ногу. Управление идёт от MIF, и 8 скла ядер, к-рые их вып.
  • Есть ещё 2 специальных юнита. Они служат для выч. трансценд. функций: sin, cos, 1/x, 1/sqrt(x)... Следствие из этого: злоуб. трансценд. функциями сажает быстродействие
  • Память, расп. непоср. на чипе, непоср. в SM. оНА РАЗДЕЛЕНА НА ДВЕ КУЧИ: РЕГИСТРы. Все регистры объед в регистровый файл (для tesla 8 есть 8192 выд. регистра, при этом они расп. на тапе компил. программы, компилятор сам расп. регистры между нитями). Второе --- shared память, доступная всем устр в SM. Её вы распр. явно в коде. Наличие shred памяти накл. огр. на то, сколько одновр. можно запустить нитей на мультипроцессоре, накл. опр. огр. на то, как выполняется программа.

Tesla 10.

  • В TPC уже входит три потоковых мультипроцессора
  • В SM появилось дополн. АЛУ, отвечающее за выч. double precision
  • Edtkbxtyj rjk/ ырфкув gfvnzb? вроде вдвое


Сама Tesla/GF предст. собой массив текстурных процессоров, разница лишь в их количестве.

Что ещё: есть память, уст. на плате. Хотя память соед. дост. быстрой шиной, всё равно эта скорость оказывается ощутимо меньше скорости доступа памяти на чипе.

За счёт чего получ. масштабируемость:

  • Увелич. мультипроцессоров в TPC
  • Увлеич. количество TPC
  • Увелич. объёма DRAM

Техничесике детали:

  • Есть в CUDA PRogr. guide, единст. офиц. источник инф. по CUDA. Лучше держать under your pillow
  • Запустить HelloWorld

[править] Прогр. модель CUDA

Есть GPU. Это отд. устр., которое рассм. как сопроц., имеющ. собст. памяти и умеющ. выполнять большое количество нитей.

Особенности нитей на GPU:

  • Нити лёгкие
  • Планировщик аппаратный

Цена создания нити факт. нолевая, цена планирования тоже нулевая. ЗА счёт этого можно исп. очень большое число нитей. Что ещё вхоит в прогр. модель CUDA: есть единый код, и компилятор сам опр., какие части явл. последовательными. Части прогр., которые должны вып. как паралл., будут вып. на GPU как ядра. Что такое ядро: ядро --- некая опер., вып. над каждым вхоным элекментом.

За счёт чего обесп. высокое быст. GPU: в CPU львиная доля кэшеё, призв. замаск. латентность памтяи. На GPU-же большую часть занимают АЛУ.

Пример: много нитей, каждой нужно прочесть слово из памяти. Первая пришла, сказала, нужно прочитать, форм. запрос. После чего она ждёт. После этого выполн. слежд нить, которая тоже идёт в память. И так далее. Вопрос в том, через какое время, сколько нужно постр. так нитей, чтобы данные на перввую нить пришли до того, как исчерп. список нитей. Если произошло до того, то латентнось и не заметили. Допустим, нужен один такт на посылку запроса, память условно требует 100 тактов на ответ, соотв. нужно 100 нитей, и тогда на первую через 100 тактов придут данные, сразу после того, как вып. 100-я, после чего перваая может уже работать дальше.

Понятно, что с GPU неск. сложнее, паралл. вып. много нитей, но если вы см. обесп, что если пока одни нити ждут данные, другие работауют, то вы см. латентность компенсировать.

Нити разб. на варпы, явл. единицой параллельности, и эти ити на SM вып. параллельно (одновременно). В случае ветвления проходятся они все, для части нитей это прохождение окажется пустым.

АХ: в CUDA реализован SIMT, simultaneous multithreading, поэтому вып. ветвл. будет что-то стоить, если оно попадает на warp. Если ветвл. происх. между варпом, то оно стоить ничего не будет.

Компилятор вып. деление на варпы?

Компилятору предост. ядро. Лучше думать так: идёт цикл, внутри которого идут бранчи и так жалее, ядро еть тело этого цикла.

Как вып. scheduling: шедулер смотрит, какой варп готов (все данные для него готовы) и вып. одну команду для него.

Счёдчик команд для всех варпов один?

Нет. Сперва вып. одна команда для всех варпов, потом след. и так далее.

Если есть много нитей, то хочется, чтобы нити могли взаимод. между собой. Одна из проблем прогр. на гпу ранее: можно было зап. вып. множества нитей, но взаимод. меджу собой они не могли. При этом, реализ. взаимод. нитей довольно дорого аппаратно. Поэтому, когда собир. запустить ядро, уакз., как нити разб. на блоки. При этом запуск. грид, предлст. из себя набор блоков, блок --- нвабор нитей. И нити могу взаимод. только в рамках блока. попадлание в дин блок гарантирует попадание в один мультипроцессор. Что из этого следует: внутри мультипроц. они вып. варпами, у их есть доступ к шаред памяти, за счёт этого осуш. взаимод., и таким обр. можно осущ. барьерную синхронизацию.

Типичный пример: при чтении данных из памяти, чтобы дальше можно было с ними работать.

Синхр. лёгкая и обесп. за счёт того, что все нити живут внутри одного блока.

Это разделение делаете вы сами. Ядро запускается на гриде, и необх. задать топологию грида.

Нити из разных блоков взаимод. не могут.

Какая довольно част. встреч. пар. операция: один. цикл., двоёной цикл, троёной цикл. Что можно сделать: можно попытапться разбить это как нить. Может быть одномер. массив, кжадая нить считает свой элемент. В случае матрицы логично орг. их как двумерный массив, and so on. По каждому измерению — максимум 65536 нитей в блоке.

При том поотки в блоке могут разд. ресурсы со своими соседями.

При этом надо понимать, что ваша ответственность как программиста не ставить синхр. внутри бранча, потому что иначе оно встанет. По крайней мере, в нутри бранча внутри варпа.

Блоки объед. в grid, при этом возм. либо одномер., либо двумер. топология. Количество блоков в гриде не больше 65535 по каждому измерению.

[править] Синтаксис CUDA

  • CUDA строится как расшир. С. Плюсовые части могут отн. только к посл. вып. коду.

В результате получ два бинарника?

В простейшем случае один, код для gpu лежит в бинарнике как data и загр. драйвером. Можно получить два бинарника.

  • При этом доб. некоторые вещи:
    • Спецификаторы. Для необх. пометить, где что выполняется. Аналогично переменные. На GPU неск. типов памяти, в част. shred и dram, и можно указ., чтло есть что
    • Добавл. встр. типы: 2-3-4-вектора из базовых типов.
    • Опред. набор готовых переменных. Нить имеет полный доступ об инф. о всей структуре нити: в каком блоке она вып, какой у неё индекс, сколько нитей в блоке и так далее
    • Добавлена констр, котораяы позв. зап. спец. обозн. функциб как ядро.

Какие есть специф.:

  • ф-ция хар. тем, где она вып. и откужда она может вызываться.
  • Перем. хар. местом нах., доступностью исп. и видом доступа.

Сравним код на CPU и CUDA: вместо цикла пишем соотв. ядро. Ядро всегда void, и это понятно. Не может быть функций с перем. кол. перем, не может быть

В отличие от шейдерного языка, вектора есть просто структуры и тут нет спец. операций для арифметики над векторами.

Как скомпилировать cuda-код:

  • nvcc --- компилятор для cuda
  • У него есть много опций, одна из самых важных -- -o
  • --use_fast_mask --- есть станд. мат. функции С, которые доступны, и которые мождно исп. и ля cuda, есть ньюанс следующий: честно посчитать sin медленно, и можно восп. апп. возм, которые считаются быстрее, но с меньш. точностью. для этого либо заменить все вызовы (sin на sinf and so on), или использовать эту опцию
  • --deviceemu --- компиляция в режиме эмуляции


Архитектура и программирование массивно-параллельных вычислительных систем на основе технологии CUDA


01 02 03 04 05 06 07 08 09 10 11


Календарь

вт вт вт вт вт
Февраль
      24
Март
03 10 17 24 31
Апрель
07 14 21 28
Май
  12


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы