gpgpu: Почему мы не нуждаемся в предсказании ветвления в многопоточности мелкого зерна?
Когда волновой фронт выполняется, он обеспечивает тонкозернистую многопоточность. Одним из последствий этого является отсутствие требования прогнозирования ветвления, как показано на следующем слайде:
Но я не могу этого понять. Может кто-нибудь объяснить это по-простому?
3 ответа
Ветви вносят значительную задержку в выполнение потока инструкций. Если процессор не поддерживает спекулятивное выполнение, то никакие инструкции не могут выполняться до тех пор, пока не будет выполнено условное ветвление. Если ветвь берется, то процессор должен выбрать новую строку команд, вводящую дополнительную задержку. Если ответвление не занято, выполнение может быть продолжено. На глубоких трубопроводах оценка условного может вводить 10-20 циклов. Предсказание ветвлений и умозрительное выполнение позволяют процессору продолжать выполнять дополнительные инструкции или начинать раннее извлечение инструкции, если ветвление принято. Если прогноз ветвления неверен, то все инструкции, следующие за ветвлением, должны быть отброшены (откатаны).
Аппаратное предсказание ветвления обычно дорого с точки зрения области, но даже базовое предсказание ветвления (скорее всего взято против вероятного не принято) может значительно улучшить IPC.
Графические процессоры не склонны реализовывать предсказание ветвлений по крайней мере по 3 причинам:
Цель прогнозирования ветвлений - улучшить IPC путем умозрительного выполнения инструкций вместо ожидания как условного результата, так и, возможно, дополнительной выборки команд. Графические процессоры предназначены для того, чтобы скрыть задержки, переключаясь между несколькими потоками исполнения бесплатно. Пока деформация / волновой фронт ожидают определения условного результата ветвления, могут быть созданы другие деформации / волновые фронты, чтобы скрыть задержку.
Таблицы истории ветвей дороги с точки зрения площади.
Спекулятивное исполнение дорого с точки зрения площади.
На слайде говорится, что в данный момент в процессе находится только одна инструкция. Цель прогнозирования ветвления состоит в том, чтобы предотвратить заполнение конвейера команд неправильной ветвью (загрузите часть if только для того, чтобы понять, что она должна была загрузить инструкции else в конвейер). Это не нужно, если в конвейере находится только одна инструкция, потому что у вас нет затрат на заполнение ваших x этапов конвейера (быстрый поиск в Google: до 30 для процессора), прежде чем вы поймете, что это неправильная ветвь, нужно промойте трубопровод и начните все сначала.
Некоторые детали зависят от фактической архитектуры графического процессора. Но упрощенный пример, в дополнение к ответу, который Трюдберт уже дал (+1):
Для такой ветки
if (data[threadIndex] > 0.5) {
data[threadIndex] = 1.0;
}
может быть набор потоков, для которых true
и другой набор потоков, для которых это утверждение false
, Можно представить, как будто темы, для которых это утверждение false
просто подождите, пока остальные не закончат свою работу.
Аналогично для такой ветки
if (data[threadIndex] > 0.5) {
data[threadIndex] = 1.0;
} else {
data[threadIndex] = 0.0;
}
это можно представить как все потоки, выполняющие оба пути ветви, и следящие за тем, чтобы результаты от "неправильного" пути игнорировались. Это называется "предикатным исполнением".
(Более подробную информацию об этом можно найти в GPU Gems 2, глава 34)
Таким образом, поскольку нет никакого преимущества в прогнозировании "правильной" ветви (потому что каждый поток в любом случае должен принимать все ветви), нет никаких причин вводить прогнозирование ветви.