Почему увеличение глубины трубопровода не всегда означает увеличение пропускной способности? - PullRequest
7 голосов
/ 08 апреля 2010

Возможно, это больше вопрос для обсуждения, но я подумал, что именно stackoverflow может быть подходящим местом, чтобы задать его.Я изучаю концепцию конвейеризации инструкций.Меня учили, что пропускная способность команд конвейера увеличивается после увеличения числа стадий конвейера, но в некоторых случаях пропускная способность может не изменяться.При каких условиях это происходит?Я думаю, что остановка и ветвление могут быть ответом на этот вопрос, но мне интересно, упускаю ли я что-то важное.

Ответы [ 5 ]

4 голосов
/ 15 апреля 2010

Все может быть остановлено другими инструкциями при ожидании результата или при пропадании кэша. Конвейерная обработка сама по себе не гарантирует, что операции полностью независимы. Вот отличная презентация о тонкостях архитектуры x86 Intel / AMD: http://www.infoq.com/presentations/click-crash-course-modern-hardware

В нем подробно объясняется подобное и рассматриваются некоторые решения о том, как еще больше повысить пропускную способность и скрыть задержку. JustJeff упомянул о неправильном выполнении для одного, и у вас есть теневые регистры, не представленные моделью программиста (более 8 регистров в x86), и у вас также есть прогноз ветвления.

2 голосов
/ 08 апреля 2010

Согласовано.Самыми большими проблемами являются задержки (ожидание результатов из предыдущих инструкций) и неправильный прогноз ветвления.Если ваш конвейер имеет глубину 20 этапов и вы ожидаете результатов условия или операции, вы будете ждать дольше, чем если бы ваш конвейер был только 5 этапами.Если вы прогнозируете неправильную ветвь, вы должны сбросить 20 инструкций из конвейера, а не 5.

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

1 голос
/ 15 апреля 2010

Параллелизм на уровне инструкций имеет убывающую отдачу. В частности, зависимости данных между инструкциями определяют возможный параллелизм.

Рассмотрим случай чтения после записи (в учебниках это называется RAW).

В синтаксисе, где первый операнд получает результат, рассмотрим этот пример.

10: add r1, r2, r3
20: add r1, r1, r1

Результат строки 10 должен быть известен ко времени начала вычисления строки 10. Пересылка данных смягчает эту проблему, но ... только до того момента, когда данные становятся известны.

0 голосов
/ 08 апреля 2010

Определенно, лапы / пузыри в длинных трубопроводах приводят к огромным потерям пропускной способности. И, конечно, чем длиннее конвейер, тем больше тактов тратится впустую.

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

0 голосов
/ 08 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...