Какие зависимости выполнения графического процессора имеют фиксированную задержку (вызывая остановку ожидания)?
В последних микроархитектурах 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