CUDA_full / L03_Threads_Memory
.pdfПример выполнения варпов
Н. Новгород, 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 |
|
|