Войти
ПрограммированиеФорумОбщее

CUDA (комментарии)

#0
1:12, 13 июня 2009

CUDA (комментарии)

Это сообщение сгенерировано автоматически.

#1
1:12, 13 июня 2009

>Для написания программ используется расширение языка C/C++, позволяющее манипулировать с данными, находящимися как в оперативной памяти компьютера, так и в памяти видеокарты.

Причем обработка данный в оперативной памяти компьютера производится CPU, а данных в памяти видеокарты  соответственно GPU.

>Теоретически CUDA даёт достаточный контроль над действиями видеочипа, чтобы утилизировать всю его громадную вычислительную мощность, которая, опять же, теоретически, может в сотни раз превосходить пиковую вычислительную мощность CPU. Но на практике максимально эффективно использовать всю эту вычислительную мощность удаётся далеко не всегда по ряду причин:

Использовать теоретическую мощность CPU тоже совсем не просто.

> * В силу архитектурных особенностей чипсета видеокарты, её ядра, количество которых доходит до нескольких сотен, максимально эффективно работают в так называемом SIMD (Single Instruction, Multiple Data) режиме, когда все они в один такт выполняют одну и ту же операцию с разными ячейками памяти. В противном случае производительность резко снижается, различные ядра будут работать на различные такты, появляется необходимость в особо дорогостоящих механизмах их синхронизации.

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

> * Доступ к памяти максимально эффективен при когерентном режиме чтения, когда i-ое ядро читает j-й блок памяти, i+1-ое читает j+1 и так далее, в противном случае, опять же, будет наблюдаться существенное уменьшение производительности.

Это из глобал памяти. Здесь выбор из памяти оптимизирован на чтение строк (из матрицы например), в случае текствой памяти не менее эффективен из-за кеширования также отбор из столбцов.
Но это все относится только для отбора в пределах одного блока (варпа), варпы же могут отбирать память практически произвольно (т.е. номер блока blockIdx значения не имеет).

Стоит наверное упамянуть несколько цифр. Для карты GF8800GT при правильной работе с данными можно получить скорость обмена данных между глобал и шеред памятью >40gb/s, если же отбор данных будет произвольным, то эта скорость упадет до 1.5gb/s - что равно скорости передачи по PCI-e.

> * Shared Memory(общая память ядер видеокарты), сильно ограниченна, приходится гонять данные по шине из оперативной памяти, что, разумеется, ставит крест на производительности.

Нужно кернель делать небольшими так чтоб полностью уложиться в имеющуюся Shared память и память регистров (исчерпание последней катастрофично: при ее недостатке используется память драма).

Вообще основная идея CUDA стоит того, что ее упомянуть.

Если для ускорения работы с памятью обычного CPU используется кеширование, предсказание и т.п., то в CUDA проблема медленной памяти решается принципиально иначе:
Создаются, если так можно выразится, виртульные мультипроцессоры (полуварп ~  виртульный мультипроцессор), которые "ползают" по глобальной памяти GPU. Когда полуварп достигает нужной ему области памяти, он перестает быть виртуальным и становится реальным - его задачу начинает выполнять первый же свободный мультипроцессор.
Этим достигается то, что мультипроцессорам не приходится (в идеальном случае конечно) дожидаться необходимых данных.
Но это же требует достаточно аккуратного программирования: нужно исключать конфликты памяти и по возможности работать с памятью локально. И разумеется, нужно очень экономно расходовать шейдерную и регистровую память, так, чтоб этой памяти хватило не для одного, а для 2-3 варпов. Тогда у планировщика задач появится свобода для маневра и он действительно сможет реализовать эти "виртульные мультипроцессоры".

#2
1:20, 13 июня 2009

>Вообще стоит упамянуть несколько цифр. Для карты GF8800GT при правильной работе с данными можно получить скорость обмена данных между глобал и шеред памятью >40gb/s, если же отбор данных будет произвольным, то эта скорость упадет до 1.5gb/s - что равно скорости передачи по PCI-e.

Ну тут вообще-то стоит говорить не о throughput, а о latency. Просто по чтению из глобал мемори имеется большая latency, которую по идее можно скрыть за счет большего количества микротредов.

#3
1:25, 13 июня 2009

Wraith
Разумеется.

ПрограммированиеФорумОбщее

Тема в архиве.