
- •Нижегородский государственный университет им. Н.И. Лобачевского
- •Содержание
- •Архитектура GPU NVIDIA
- •Архитектура CPU и GPU
- •Архитектура CPU и GPU
- •Архитектура GPU: общие сведения
- •Архитектура Tesla 8/10
- •Мультипроцессор Tesla 8
- •Мультипроцессор Tesla 10
- •Иерархия памяти Tesla 10
- •Мультипроцессор Fermi
- •Архитектура Fermi
- •Вычислительные возможности
- •Вычислительные возможности
- •Исполнение потоков
- •Основные понятия
- •Взаимодействие потоков
- •Выполнение блоков
- •«Автоматическая масштабируемость»
- •SIMT
- •Пример выполнения варпов
- •Выполнение ветвлений
- •Оптимизация загрузки устройства
- •Иерархия памяти CUDA
- •Типы памяти и скорость доступа
- •Использование локальной памяти
- •Использование константной памяти
- •Использование константной памяти
- •Использование текстурной памяти
- •Использование глобальной памяти
- •Использование глобальной памяти
- •Пример: выделение памяти и копирование вектора
- •Эффективная работа с глобальной памятью
- •Эффективная работа с глобальной памятью
- •Эффективная работа с глобальной памятью
- •Пример доступа к глобальной памяти
- •Пример доступа к глобальной памяти
- •Пример доступа к глобальной памяти
- •Рекомендации по эффективной работе с глобальной памятью
- •Пример
- •Работа с разделяемой памятью
- •Работа с разделяемой памятью
- •Пример
- •Динамически выделяемая разделяемая память
- •Пример
- •Эффективная работа с разделяемой памятью
- •Эффективная работа с разделяемой памятью
- •Доступ к разделяемой памяти без конфликтов банков
- •Доступ к разделяемой памяти с конфликтами банков
- •Пример: параллельная редукция
- •Постановка задачи
- •Иерархическое суммирование
- •Вариант 1
- •Вариант 1
- •Вариант 2
- •Вариант 2
- •Вариант 3
- •Вариант 3
- •Вариант 4
- •Вариант 4
- •Вариант 5
- •Результаты
- •Материалы

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