Что такое «Инструкции за цикл»?

23

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

Например, у меня сложилось впечатление, что четырехъядерный процессор может выполнять четыре инструкции за цикл, поэтому четырехъядерный процессор, работающий на частоте 2 ГГц, будет выполнять 8 миллиардов операций в секунду. Это тот случай?

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

Мэтт Симмонс
источник
Нет, это не так. Современные процессоры x86 могут поддерживать три инструкции на ядро ​​за цикл в идеальных условиях, в то время как некоторые инструкции могут требовать десятков циклов.
Дэвид Шварц

Ответы:

22

Ключевые слова, которые вы, вероятно, должны искать: CISC , RISC и суперскалярная архитектура .

CISC

В архитектуре CISC (x86, 68000, VAX) одна инструкция является мощной, но для ее обработки требуется несколько циклов . В более старых архитектурах число циклов было фиксированным, в настоящее время количество циклов на инструкцию обычно зависит от различных факторов (попадание в кэш, прогноз ветвления и т. Д.). Есть таблицы для поиска таких вещей. Часто есть также возможность реально измерить, сколько циклов занимает определенная инструкция при определенных обстоятельствах (см. Счетчики производительности ).

Если вас интересуют подробности об Intel, очень полезно прочитать Справочное руководство по оптимизации для Intel 64 и IA-32 .

RISC

Архитектура RISC (ARM, PowerPC, SPARC) означает, что обычно одна очень простая инструкция занимает всего несколько (часто только один) цикл.

Superscalar

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

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

Людвиг Вайнцерль
источник
9
Для меня аналогия с «сборочной линией» предполагает простую конвейеризацию, а не суперскалярную архитектуру. Суперскаляр включает в себя репликацию частей аппаратного обеспечения процессора (например, этап конвейера, который является узким местом) для повышения пропускной способности.
sblair
2
Я добавляю для краткости: RISC = сокращенный набор инструкций; CISC = сложный набор команд. Хорошее объяснение: Людвиг указал на соотношение попаданий и промахов в кэш и (в конечном итоге) на TLB. Объяснить архитектуру микропроцессора нелегко, особенно втиснуть все в один (довольно компактный) пост! :)
osij2is
1
Из того, что я слышал, процессоры в эти дни проводят много времени в ожидании работы, чтобы появиться из основной памяти. По крайней мере, это был ответ, который я получил, когда спросил, почему в процессоре больше нет исполнительных ядер.
Surfasb
32

Мне нравится думать об этом с помощью аналогии со стиркой. Инструкции ЦП похожи на кучу белья. Вы должны использовать как стиральную машину, так и сушилку для каждой загрузки. Допустим, что каждый занимает 30 минут, чтобы бежать. Это цикл часов. Старые процессоры запускали стиральную машину, затем запускали сушилку, каждый раз занимая 60 минут (2 цикла), чтобы завершить каждую загрузку белья.

Конвейерная обработка: конвейер - это когда вы используете оба одновременно - вы моете загрузку, затем, пока она сушится, вы стираете следующую загрузку. Первая загрузка занимает 2 цикла, но вторая загрузка завершается после еще 1 цикла. Таким образом, большинству нагрузок требуется только 1 цикл, кроме первой загрузки.

Суперскаляр: отнесите все белье в прачечную. Получить 2 шайбы и загрузить их обе. Когда они закончат, найдите 2 сушилки и используйте их оба. Теперь вы можете вымыть и высушить 2 загрузки за 60 минут. Это 2 нагрузки за 2 цикла. Каждая загрузка по-прежнему занимает 2 цикла, но вы можете сделать больше из них сейчас. Среднее время теперь составляет 1 нагрузку за цикл.

Суперскаляр с конвейером: промойте первые 2 загрузки, затем, пока они высыхают, загрузите шайбы следующими 2 загрузками. Теперь первые 2 загрузки по-прежнему занимают 2 цикла, а затем следующие 2 завершаются после еще 1 цикла. Таким образом, большую часть времени вы заканчиваете 2 загрузки в каждом цикле.

Несколько ядер: отдайте половину белья своей матери, у которой также есть 2 стиральные машины и 2 сушилки. Работая вместе, вы можете сделать вдвое больше. Это похоже на суперскаляр, но немного отличается. Вместо того, чтобы вам приходилось переносить все белье на каждую машину самостоятельно, она может сделать это одновременно с вами.

Это замечательно, мы можем стирать в восемь раз больше, чем раньше, за то же время без необходимости создавать более быстрые машины. (Удвойте тактовую частоту: стиральные машины, для работы которых требуется всего 15 минут.)

Теперь давайте поговорим о том, как все идет не так:

Пузырь в трубопроводе: у вас есть пятно, которое не появилось при стирке, поэтому вы решаете вымыть его снова. Теперь сушилка просто сидит там, ожидая что-нибудь сделать.

Cache Miss: Грузовик, который доставляет грязное белье, застрял в пробке. Теперь у вас есть 2 стиральные машины и 2 сушилки, но вы не выполняете работу, потому что вам приходится ждать.

В зависимости от того, как часто что-то идет не так, мы не всегда сможем выполнить 4 загрузки за цикл, поэтому фактический объем выполненной работы может варьироваться.

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

Кевин Панко
источник
Хорошая аналогия. Я собираюсь украсть это.
dmckee
6
А гиперпоточность подобна тому, как несколько человек стирают в одном и том же прачечном.
Рональд Поттол
1
Предсказание филиала: вы начинаете стирать одежду, которая, по вашему мнению, понадобится на следующей неделе
Акаш,
2
Гиперпоточность: вы начинаете принимать белье других людей и рекламируете количество стиральных машин, которые у вас есть (1). Вскоре вы понимаете, что в вашей стиральной машине есть место не только для пары штанов, которые вы стираете, но не для другой пары штанов, а для чего-то меньшего. Так что ты тоже носишь носки. Теперь вы рекламируете 2 стиральные машины и надеетесь, что люди будут выкладывать белье достаточно разнообразным, чтобы вы всегда «заполняли дыры» мелкими предметами. Как раз когда этот парень, который когда-либо приходит с 10 грязными джинсами и 1 парой носков, роняет свои вещи, это происходит медленно, как никогда.
Флоренц Клей
@Akash Вы стираете одежду, на которой еще нет пятен, на всякий случай?
Кевин Панко
3

Не совсем. Цикл, на который вы ссылаетесь - это тактовый цикл, и поскольку большинство современных процессоров конвейерно, для выполнения одной инструкции требуется несколько тактовых циклов. (Это хорошо, потому что он позволяет другим инструкциям начинать выполнение даже до завершения 1-й инструкции.) При самых идеальных обстоятельствах это, вероятно, будет около 8 миллиардов IPC, но происходят все виды вещей, такие как зависимости, пузыри в конвейере. , ветви и т. д., так что не всегда получается.

Извините, это слишком сложно для прямого ответа. Джон Стоукс хорошо объясняет эту статью .

hyperslug
источник
2

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

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

dmckee
источник
1

Людвиг объяснил разницу между CISC и RISC, но забыл упомянуть, что, хотя инструкции RISC просты и быстры, они выполняют мало по отдельности, и поэтому вы должны соединить несколько вместе, чтобы сделать то же самое, что и одна инструкция в процессоре CISC. В результате некоторые инструкции RISC будут выполняться быстрее, другие - нет.

Synetech
источник
0

Cycles - это скорее концепция ядра. Каждое ядро ​​делает там свои циклы параллельно.

Йоаким Элофссон
источник