GPU скрывает время доступа к памяти

Я знаю, что графические процессоры обычно имеют высокое время доступа к памяти. Тем не менее, производительность не сильно ограничена, так как время доступа "скрыто", выполняя другие инструкции в ожидании доступа к памяти.

Мне просто интересно, если у вас есть волновой фронт с 64 рабочими элементами и 16 процессорными ядрами, каждое процессорное ядро ​​будет иметь 64/16 = 4 рабочие предметы. Кроме того, все ядра должны выполнять все рабочие элементы параллельно.

Так что, если рабочему элементу требуется доступ к памяти, что произойдет? Конечно, поскольку все инструкции одинаковы, у вас будет 16 обращений к памяти для вычисления (или только 1?). Тогда это случай, когда другой из 4 рабочих элементов на каждом ядре затем подставляется, чтобы начать выполнение? Означает ли это, что все 16 процессорных ядер теперь выполняют один и тот же новый рабочий элемент?

2 ответа

Ваш вопрос скорее ориентирован на AMD, и это та архитектура, в которой я менее бегло говорю, но архитектура NVIDIA использует конструкцию контроллера памяти, которая может объединять запросы доступа DRAM в одну транзакцию ("объединение памяти" в NVIDIA).

Основная идея заключается в том, что контроллер памяти объединит запросы, которые находятся в пределах небольшого диапазона адресов I, с одной загрузкой или сохранит их для обслуживания каждого потока в группе SIMD, выполняющей загрузку. Самое последнее оборудование поддерживает 32,64,128 и 256-байтовые размеры транзакций, и контроллер памяти также достаточно умен, чтобы добавить дополнительный ответ размером в одно слово в большую транзакцию в тех случаях, когда доступ к области памяти не выравнивается по границе размера транзакции.

На ваш вопрос довольно сложно ответить, потому что вы смешиваете вещи. Существуют теоретические (абстрактные) объекты, такие как рабочие элементы и волновые фронты (насколько я знаю, "Wavefront" = "Warp" в терминологии NVIDIA) и физические, такие как процессоры и мультипроцессоры (nvidia).

Теоретические абстракции придуманы, чтобы сделать ваши программы независимыми от базовой аппаратной конфигурации. Чтобы не беспокоить вычислительные индексы процессора, который будет выполнять работу для 16-процессорного графического процессора, а затем выполнять новые вычисления для 32-процессорных графических процессоров, вы просто будете думать с точки зрения волновых фронтов (перекосов), которые имеют постоянные размеры.

Давайте вернемся к вашему вопросу:

"Я знаю, что графические процессоры обычно имеют высокое время доступа к памяти. Однако производительность не сильно снижается, поскольку время доступа" скрыто ", выполняя другие инструкции в ожидании доступа к памяти".

Пример (это не технически правильно, но служит иллюстрацией):

Предположим, мы выполняем 100 арифметических инструкций и затем сталкиваемся с запросом памяти. На физическом уровне выполнение инструкций, выполняемых варпом / волновым фронтом, выполняется в несколько аппаратных циклов. Вот как выполняется операция с памятью:

Requested address   : a, b, c, d, -, -, -, -, -, -,  -,  -,  -,  -,  -,  -
Abstract WorkItems  : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
SIMD Hardware cores : 0, 1, 2, 3, -, -, -, -, -, -,  -,  -,  -,  -,  -,  -

Деформация NVIDIA занимает 4 цикла для вычисления:

Requested address   : a, b, c, d, e, f, g, h, -, -,  -,  -,  -,  -,  -,  -
Abstract WorkItems  : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
SIMD Hardware cores : *, *, *, *, 0, 1, 2, 3, -, -,  -,  -,  -,  -,  -,  -

Давайте пропустим 3-й цикл.

Requested address   : a, b, c, d, e, f, g, h, i, j,  k,  l,  m,  n,  o,  p
Abstract WorkItems  : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
SIMD Hardware cores : *, *, *, *, *, *, *, *, *, *,  *,  *,  0,  1,  2,  3

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

В зависимости от того, какие адреса запрашиваются и насколько интеллектуальным является оборудование, эти запросы обрабатываются в соответствии со спецификацией оборудования. предполагать a..p упорядочены последовательно в пределах диапазона 0xFFF0..0xFFFF тогда все запросы будут обслуживаться в одной операции объединения памяти. Если оборудование встречает адреса, которые ему не нравятся (в соответствии со спецификациями), оно ограничит доступ к памяти несколькими операциями с памятью.

Поскольку текущая деформация требует операции с памятью, она приостанавливает работу и аппаратное переключение физического процессора на следующую деформацию Новая деформация начинается с выполнения 100 инструкций так же, как это было сделано с помощью предыдущей деформации / волнового фронта. После обнаружения и выдачи операции памяти второй варп / волновой фронт также приостанавливается. На этом этапе, в зависимости от размера рабочей группы и других параметров, аппаратное обеспечение может возобновить предыдущую деформацию или перейти к следующей.

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

Другие вопросы по тегам