2010-04-08 5 views
7

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

+0

Спасибо за ответы. Как раз для вашей информации, еще одна вещь, которая приходит мне на ум, даже если мы увеличим стадии трубопровода, надеясь разбить исходную логику конвейера на более мелкие подсети, инструкция может не распространяться через эти более мелкие сети, поскольку ее простейшая форма иерархии конвейера может быть объясняется с точки зрения исходной логики этапа, поэтому это не повлияет на пропускную способность. – user246392

ответ

4

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

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

0

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

0

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

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

2

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

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

+1

Это не 20 инструкций, а инструкции по 20 циклов. На сильно суперскалярном CPU это может быть намного больше. – slacker

1

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

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

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

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

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