Это было то, что я не могу обернуть голову вокруг. Почти каждый современный процессор способен выполнять больше команд в секунду, чем его частота.
Я могу понять, почему процессоры более низкого класса могут выполнять меньше IPS, чем его частота. Например, ATmega328 выполняет около 16 MIPS на 16 МГц (или, по крайней мере, это то, что мне сказали), а Z80 выполняет 0,5 MIPS на 4 МГц. Но тогда Pentium 4 Extreme может выполнять более 9 GIPS только на 3,2 ГГц. Это примерно три инструкции за такт!
Как это сделать, и почему это не реализовано в меньших процессорах, таких как микроконтроллеры AVR ?
Я нашел всю свою информацию, кроме ATmega328, отсюда .
Ответы:
Это связано с сочетанием особенностей современных процессоров.
Первое, что способствует высокой IPS, - это тот факт, что современные процессоры имеют несколько исполнительных блоков, которые могут работать независимо. На изображении ниже (заимствовано из Википедии: Intel Core Microarchitecture ) внизу видно, что есть восемь исполнительных блоков (показаны желтым цветом), которые могут выполнять инструкции одновременно. Не все из этих блоков могут обеспечивать одинаковые типы команд, но по крайней мере 5 из них могут выполнять операцию ALU, и есть три блока с поддержкой SSE.
Объедините это с длинным конвейером команд, который может эффективно составлять инструкции, готовые к тому, чтобы эти блоки выполняли инструкции ( не в порядке , если необходимо), означает, что современный процессор может иметь большое количество команд на лету в любой момент времени.
Для выполнения каждой инструкции может потребоваться несколько тактов, но если вы сможете эффективно распараллелить их выполнение, вы сможете значительно повысить IPS за счет сложности процессора и тепловой мощности.
Для того, чтобы эти большие конвейеры были полны инструкций, также необходим большой кэш, который можно предварительно заполнить инструкциями и данными. Это влияет на размер матрицы и количество тепла, которое производит процессор.
Причина, по которой это не делается на меньших процессорах, заключается в том, что это существенно увеличивает количество логики управления, требуемой вокруг процессорных ядер, а также количество требуемого пространства и также выделяемого тепла. Если вам нужен маленький процессор с низким энергопотреблением и высокой чувствительностью, вам нужен короткий конвейер без слишком большого количества «лишних» вещей, окружающих реальные функциональные ядра. Поэтому, как правило, они минимизируют кэш, ограничивают его только одним модулем каждого типа, необходимого для обработки инструкций, и уменьшают сложность каждой части.
Они могут сделать небольшой процессор таким же сложным, как и более крупный процессор, и достичь аналогичной производительности, но тогда потребляемая мощность и требования к охлаждению будут экспоненциально увеличены.
источник
Это не сложно представить. Один цикл - это все, что нужно для переключения многих тысяч транзисторов. Пока инструкции выстраиваются в параллель, одного цикла может быть достаточно для их выполнения.
Лучше, чем пытаться объяснить это самому, вот хорошая отправная точка .
источник
Чтобы получить немного более фундаментальный, чем ответ Мокубая:
Суперскалярные процессоры анализируют поток команд на предмет данных (и других) зависимостей между инструкциями. Инструкции, которые не зависят друг от друга, могут выполняться параллельно.
Типичные настольные процессоры x86 извлекают 16 или 32B команд за такт. Intel разрабатывает, так как Core2 может выдавать до 4 инструкций за цикл. (Или 5, если есть сравнение и ответвление, которое может слиться с макрокомандой).
См. Хороший ответ Mobukai, где приведены ссылки и подробности о том, как на практике процессоры выполняют задачу извлечения как можно большего параллелизма на уровне команд из кода, который они запускают.
Также см. Http://www.realworldtech.com/sandy-bridge/ и аналогичные статьи для других архитектур ЦП для подробного объяснения того, что находится под капотом.
источник
Предыдущие ответы показывают, как можно получить больше инструкций, выполняемых процессором по определению «инструкция», и представить себе, что на самом деле это намерение спрашивающего.
Но другой источник этого может заключаться в том, что каждая «инструкция» на самом деле представляет собой определенный объем данных, обрабатываемых как инструкция, вводимая процессором. Если его источник считает только то, что процессор считает инструкциями, следующее ничего не добавляет. Но если его источник считает все то, что человек назвал бы «инструкцией», тогда: добавьте, что не каждая инструкция физически длинна, как любая другая инструкция (одна может быть 12 байтов, другая может быть 56 байтов и т. Д.). Таким образом, если он загружает 64 байта материала в каждом цикле как «инструкцию» (или столько полных инструкций, сколько может, прежде чем набрать 64 байта), и у каждого есть шесть инструкций в этих 64 байтах, то шесть инструкций (как вы и я могли бы их считать ) будет закончен в этом цикле.
Поскольку многие очень простые инструкции (наше «разумное» определение) являются остатками с ранних дней с длиной инструкций по 8 байт, и очень простые инструкции, по определению, возможно, используются непропорционально, просто это будет иметь большое значение для выполнения большего количества «инструкций» Частота, казалось бы, позволяет.
источник
add al, bl
и 80386add eax, ebx
.