Какие зависимости выполнения графического процессора имеют фиксированную задержку (вызывая остановку ожидания)?

В последних микроархитектурах NVIDIA появилась новая (?) Таксономия причин остановки деформации / состояний планировщика деформации. Одним из них является :

Подождите : Warp остановился в ожидании зависимости выполнения с фиксированной задержкой.

Как объясняет @GregSmith , инструкции с фиксированной задержкой : «Математическое, побитовое [и] перемещение регистров». Но что такое «зависимости выполнения» с фиксированной задержкой? Это просто «ожидание завершения чьей-то инструкции с фиксированной задержкой, прежде чем мы сможем ее выпустить сами»?

1 ответ

Зависимости выполнения - это зависимости, которые необходимо разрешить до того, как будет выдана следующая инструкция. К ним относятся регистровые операнды и предикаты. Причина ожидания WAIT будет выдана между инструкциями с фиксированной задержкой. Компилятор может выбрать добавление дополнительных ожиданий между инструкциями одного и того же конвейера, если частота выдачи конвейера не равна 1 деформации за цикл (например, конвейер FMA и ALU может выдавать каждый второй цикл на GV100 - GA100).

ПРИМЕР 1 - Нет зависимостей - компилятор добавил ожидания

      IADD  R0, R1, R2;  # R0 = R1 + R2
// stall = wait for 1 additional cycle
IADD  R4, R5, R6;  # R4 = R5 + R6
// stall = wait for 1 additional cycle
IADD  R8, R9, R10; # R8 = R9 + R10

Если компилятор не добавил циклов ожидания, причиной остановки будет math_throttle. Это также может появиться, если деформация готова выдать инструкцию (все зависимости разрешены), а другая деформация выдает инструкцию целевому конвейеру.

ПРИМЕР 2 - Ожидание остановок из-за зависимости чтения после записи

      IADD  R0, R1, R2;  # R0 = R1 + R2
// stall - wait for fixed number of cycles to clear read after write
IADD  R0, R0, R3;  # R0 += R3
// stall - wait for fixed number of cycles to clear read after write
IADD  R0, R0, R4;  # R0 += R4
Другие вопросы по тегам