Графический процессор скрывает время доступа к памяти

#cuda #opencl #gpu

#cuda #opencl #графический процессор

Вопрос:

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

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

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

Ответ №1:

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

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

Ответ №2:

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

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

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

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

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

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

 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 warp требуется 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, -, -,  -,  -,  -,  -,  -,  -
  

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

 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 , тогда все запросы будут обслуживаться за одну объединенную операцию с памятью. Если аппаратное обеспечение обнаруживает адреса, которые ему не нравятся (согласно спецификациям), это приведет к ограничению доступа к памяти для нескольких операций с памятью.

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

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