Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

CUDA_full / L03_Threads_Memory

.pdf
Скачиваний:
23
Добавлен:
27.03.2015
Размер:
1.11 Mб
Скачать

Пример выполнения варпов

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

21

 

 

Выполнение ветвлений

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

При возникновении таких ветвлений последовательно исполняются все их ветки.

В зависимости от выполнения условия входа в очередную ветку потоки делятся на активные и неактивные.

С точки зрения планировщика все потоки работают как SIMD, операции доступа к памяти для неактивных потоков не выполняются.

Таким образом, логически выполнение ветвлений происходит корректно, время выполнения примерно равно

суммарному времени выполнения всех ветвей.

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

22

 

 

Оптимизация загрузки устройства

Число потоков на мультипроцессор обычно гораздо больше числа CUDA-ядер.

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

Степень загрузки устройства (occupancy) – отношение количества варпов, работающих на мультипроцессоре, к максимально возможному количеству варпов.

Ограничивающим для числа потоков фактором является количество разделяемой памяти и регистров.

При наличии достаточного количества ресурсов несколько блоков могут одновременно исполняться на одном мультипроцессоре.

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

23

 

 

Иерархия памяти CUDA

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

24

 

 

Типы памяти и скорость доступа

Тип памяти

Доступ

Уровень

Скорость работы

 

 

выделения

 

 

 

 

 

Регистры

R/W

Per-thread

Высокая (on-chip)

 

 

 

 

Локальная

R/W

Per-thread

Низкая (DRAM)

 

 

 

 

Разделяемая

R/W

Per-block

Высокая (on-chip)

 

 

 

 

Глобальная*

R/W

Per-grid

Низкая (DRAM)

 

 

 

 

Константная

R/O

Per-grid

Высокая при попадании в кэш

 

 

 

 

Текстурная

R/O

Per-grid

Высокая при попадании в кэш

 

 

 

 

*+ L1/L2 кэш на Fermi

[А.В. Боресков, А.А. Харламов «Архитектура и программирование массивнопараллельных вычислительных систем»]

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

25

 

 

Использование локальной памяти

Локальная память логически эксклюзивна для потока.

Физически она расположена в области памяти устройства и имеет ту же латентность, что и глобальная память.

Явное использование локальной памяти – объявление в ядре переменных с квалификатором __local__.

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

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

26

 

 

Использование константной памяти

Константная память служит для хранения данных, не меняющихся во время исполнения ядер.

Расположена в памяти устройства (как и глобальная память), кэшируется на всех устройствах.

Малый размер (десятки килобайт).

Способы использования:

Глобальные переменные, объявленные с квалификатором __constant__ (нужна инициализация при определении)

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

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

27

 

 

Использование константной памяти

Пример использования: хранение матрицы коэффициентов косинус-преобразования для блоков малого размера в алгоритмах кодирования изображений, хранение матриц фильтров.

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

28

 

 

Использование текстурной памяти

Текстуры широко применяются в компьютерной графике, многие операции над ними поддерживаются аппаратно (например, интерполяция).

Текстурная память расположена в области памяти устройства и кэшируется на всех устройствах.

Оптимизирована для двумерной локальности доступа.

С появлением архитектуры Fermi и кэша для глобальной памяти стала использоваться гораздо реже.

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

29

 

 

Использование глобальной памяти

Способы использования:

Основной способ – через указатели, выделение/освобождение памяти и копирование данных со стороны хоста при помощи функций API.

Глобальные статические переменные с квалификатором

__device__.

Возможность динамического выделения памяти из ядер (поддерживается только на относительно новых GPU).

Н. Новгород, 2012 г.

Исполнение потоков. Иерархия памяти

30

 

 

Соседние файлы в папке CUDA_full