По- перше, в якості коментаря Кіла в і відповідь Turbo Джея відзначаєте, вимір було 113,093 Dhrystone MIPS НЕ рідної MIPS.
Мікроархітектура Ivy Bridge i7 3630QM може здійснювати лише 4 злиті мкОп за цикл, хоча може розпочати виконання 6 мкОс за цикл. (Кількість зрощених мкОп в сліді коду приблизно дорівнює кількості інструкцій; деякі складні інструкції декодуються в кілька мкОп, які не злиті, а деякі пари інструкцій можуть бути злиті в один µop, наприклад, порівняння негайно з подальшим умовним стрибком.)
Дві ваші міркування щодо того, як можна виконати кілька інструкцій за один цикл, цілком справедливі і використовуються в фактичних процесорах. Ваші перші міркування про те, що використовується швидший внутрішній годинник, використовувались в оригінальних ALU-колах Pentium 4. Ці АЛУ були тактовані з подвійною частотою решти ядра, яка була вже відносно високою.
(Це було досягнуто за допомогою поетапної АЛУ, в якій нижня половина додавання виконувалася за один цикл, що дозволяє залежній операції використовувати нижню половину результату в наступному циклі. Для таких операцій, як додавання, xor або зсув вліво яким потрібна лише нижня половина операндів, щоб отримати повну нижню половину результату, таке враження - також відоме як ширина конвеєра - дозволяє затримати результат одно циклу, а також пропускну здатність одного циклу.)
HyperSPARC використовував кілька споріднену техніку, каскадні АЛУ. HyperSPARC передав результати з двох АЛУ в третій АЛУ. Це дозволило виконати дві незалежні та третю залежну операцію в одному циклі.
Ваша міркування про те, що "є декілька паралельних трубопроводів на одне ядро" - це інша методика, яка застосовується. Цей тип конструкції називається суперскалярним і на сьогоднішній день є найпоширенішим засобом збільшення кількості операцій, виконаних за один цикл.
Існує також кілька інших шансів та закінчень виконання інструкцій, які, можливо, варто відзначити. Деякі операції можна ефективніше виконувати поза звичайними підрозділами виконання. Методика усунення переміщення використовує перейменування реєстру в процесорах, що не є в порядку, для виконання операцій переміщення під час перейменування реєстру; переміщення просто копіює фізичний номер реєстру з однієї позиції в таблиці перейменування (називається таблицею псевдоніму реєстру) в іншу. Це не тільки збільшує ширину виконання, але й усуває залежність. Ця методика застосовувалася на початку x87 на базі стека, але зараз широко використовується у високопродуктивних процесорах x86 x86. (Використання руйнівних інструкцій з двома операндами в x86 робить усунення переміщення більш корисним, ніж було б у типовому RISC.)
Метод, схожий на усунення переміщення, - це керування інструкціями щодо обнулення регістру під час перейменування. Надаючи ім’я регістру, що забезпечує нульове значення, інструкція очищення регістру (наприклад, xor або віднімання, коли обидва операнди є одним і тим же регістром) може просто вставити це ім'я в таблицю перейменування (RAT).
Інша методика, яка використовується деякими процесорами x86, знижує витрати на операції push і pop. Зазвичай інструкція, що використовує покажчик стека, повинна буде дочекатися повного циклу попереднього натискання або спливаючого вікна, щоб оновити значення для покажчика стека. Визнаючи, що push і pop лише додають або віднімають невелике значення до покажчика стека, можна паралельно обчислити результати декількох додавань / підрозділів. Основна затримка додавання - це розповсюдження перенесення, але при малих значеннях більш значущі біти базового значення - у цьому випадку покажчик стека - матимуть не більше одного переносу. Це дозволяє оптимізацію, подібну оптимізації переносу-вибору, застосовувати до декількох додань малих значень. Крім того, оскільки покажчик стека зазвичай оновлюється лише константами,
Також можливо об'єднати інструкції в одну, більш складну операцію. Хоча зворотний процес розбиття інструкцій на декілька, простіших операцій є давньою методикою, інструкції по об'єднанню (які Intel називають макроопераційним злиттям) можуть дозволити виконанню підтримувати операції більш складні, ніж ті, які викриті в наборі інструкцій.
З теоретичної сторони були запропоновані інші методи. Невеликі постійні, окрім нуля, можуть підтримуватися в RAT, і з деякими простими операціями, які використовують або надійно виробляють такі невеликі значення, можна обробити рано. ("Фізичний вклад до фізичного реєстру", Мікко Х. Ліпасті та ін., 2004 р.) Запропонував використовувати RAT як засіб зменшення кількості регістрів, але ідея може бути розширена для підтримки завантаження невеликих безпосередніх та простих операцій на невеликі числа.)
Для кешів слідів (які зберігають послідовності інструкцій під певними припущеннями контрольного потоку), можуть бути можливості об'єднати операції, розділені гілками, та видалити операції, які дають невикористані результати в трасі. Кешування оптимізацій у кеш-пам'яті слідів може також сприяти виконанню оптимізацій, таких як об'єднання інструкцій, що, можливо, не варто, якщо їх потрібно робити щоразу, коли потік інструкцій надходить.
Передбачення значення може бути використане для збільшення кількості операцій, які можна виконати паралельно шляхом усунення залежностей. Індикатор значення на основі кроку схожий на оптимізацію pop / push оптимізованого двигуна стека, згаданого раніше. Він може обчислювати кілька доповнень, переважно паралельно, знімаючи серіалізацію. Загальна ідея прогнозування вартості полягає в тому, що з передбачуваним значенням залежні операції можуть тривати без зволікань. (Передбачення напряму та цільове передбачення є фактично лише дуже обмеженою формою прогнозування значення, що дозволяє отримувати наступні інструкції, які залежать від "значення" гілки - взятої чи ні - і наступної адреси інструкції, іншого значення.)