- •Нижегородский государственный университет им. Н.И. Лобачевского
 - •Содержание
 - •Архитектура 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  | 
