Суперскалярність - Вікіпедія

Суперскалярний процесор(англ. superscalar processor ) — процесор, що підтримує так званий паралелізм на рівні інструкцій (тобто процесор, здатний виконувати кілька інструкцій одночасно) за рахунок включення до складу його обчислювального ядра декількох однакових функціональних вузлів (таких як АЛУ, FPU, помножувач (integer multiplier), зсувний пристрій (integer shifter) та інші пристрої). Планування виконання потоку інструкцій здійснюється динамічно обчислювальним ядром (не статично компілятором).
Способи збільшення продуктивності, які можуть використовуватись спільно:
- Використання конвеєра (англ. pipelining)
- збільшення кількості функціональних вузлів процесора (суперскалярність)
- збільшення кількості ядер (багатоядерність)
- збільшення кількості процесорів (багатопроцесорність)
При використанні конвеєра кількість вузлів залишається незмінною; збільшення продуктивності досягається рахунок одночасної роботи вузлів, відповідальних різні стадії обробки інструкцій одного потоку. При використанні суперскалярності збільшення продуктивності досягається за рахунок одночасної роботи більшої кількості однакових вузлів, що незалежно обробляють інструкції одного потоку (у тому числі, і більшої кількості конвеєрів). При використанні декількох ядер кожне ядро виконує інструкції окремого потоку, причому кожне може бути суперскалярним і/або конвеєрним. При використанні кількох процесорів кожен процесор може бути багатоядерним.

У суперскалярному процесорі інструкція витягується з потоку інструкцій (що у пам'яті), визначається наявність чи відсутність залежності інструкції за данимивід інших інструкцій, а потім інструкція виконується. Одночасно протягом одного такту може виконуватися кілька незалежних інструкцій.
За класифікацією Флінна одноядерні суперскалярні процесори відносять до групи процесорів SISD (англ.singleinstruction stream,singledata stream — один потік інструкції, один потік даних). Подібні процесори, що підтримують інструкції для роботи з короткими векторами, можуть бути віднесені до групи SIMD (англ.singleinstruction stream,multipledata streams – один потік інструкцій, кілька потоків даних). Багатоядерні суперскалярні процесори відносять до групи MIMD. декілька потоків даних).
Зміст
Існує суперечка щодо того, яку ЕОМ можна вважати першою суперскалярною. В іноземній літературі найчастіше вказується CDC 6600 (1964), розроблена Сеймуром Креєм [1] . У СРСР першої суперскалярної ЕОМ вважався комп'ютер «Ельбрус», розробка якого велася в 1973-1979 роках в ІТМіВТ. Основною структурною відмінністю Ельбруса від CDC 6600 (крім зовсім іншої видимої програміста системи команд - стекового типу) було те, що всі вузли в ньому були конвеєризовані, як у сучасних суперскалярних мікропроцесорах. На підставі цього факту Б. А. Бабаян заявляв про пріоритет радянських ЕОМ у питанні побудови суперскалярних обчислювальних машин, проте вже наступна за CDC 6600 машина фірми Control Data, CDC 7600 (англ.) 1969 мала конвеєризацію виконавчих пристроїв. Крім того, трохи раніше (1967 року) фірмою IBM була випущена машина IBM 360/91, що використовує позачергове виконання, перейменування регістрівта конвеєризацію виконавчих пристроїв [2] .
Першими промисловими суперскалярними однокристальними (англ. single-chip) мікропроцесорами стали мікропроцесор MC88100 1988 фірми Motorola, мікропроцесор Intel i960CA 1989 і мікропроцесор 29050 серії AMD 29000 1990 року. Першим комерційно широкодоступним суперскалярним мікропроцесором став i960, що вийшов 1988 року. У 90-ті роки основним виробником суперскалярних мікропроцесорів стала фірма Intel.
Всі процесори загального призначення, розроблені приблизно з 1998 року, крім процесорів, що використовуються у пристроях з низьким енергоспоживанням, у системах, що вбудовуються, і в пристроях, що живляться від батарейок, є суперскалярними.
Процесори Pentium з мікроархітектурою P5 стали першими суперскалярними процесорами архітектури x86. Мікропроцесори Nx586, P6 Pentium Pro та AMD K5 стали першими суперскалярними процесорами, що перетворюють інструкції x86 у внутрішній код, який потім виконували.
Якщо в процесі роботи процесора кілька інструкцій, що обробляються конвеєром, незалежні, то ядро може виконати їх одночасно. У суперскалярних системах рішення про запуск інструкції на виконання приймає саме ядро процесора, що потребує багато ресурсів. У пізніших системах, таких, як Ельбрус-3 та Itanium, використовується статпланування, тобто рішення про те, які інструкції виконувати одночасно приймає компілятор; компілятор знаходить незалежні інструкції та поєднує їх в одну довгу інструкцію (архітектура VLIW).
Вузол суперскалярного процесора, званий диспетчером інструкцій (англ. instruction dispatcher, ID), відповідальний:
- за читання інструкцій із пам'яті;
- за ухвалення рішень про те, які інструкції можуть бутивиконані одночасно;
- розподіл інструкцій між кількома функціональними вузлами процесора.
Вузол ID повинен розподіляти інструкції між вузлами так, щоб вузли працювали без простоїв. Перші суперскалярні процесори мали по два АЛУ та по одному FPU. Сучасні процесори містять більше вузлів. Наприклад, процесор PowerPC 970 містить чотири АЛУ, два FPU та два вузли SIMD. Якщо вузол ID не впорається зі своєю роботою (не навантажить роботою всі вузли), продуктивність суперскалярного процесора буде не кращою за продуктивність скалярного процесора.
Суперскалярний процесор, як правило, здатний виконувати більше однієї інструкції за такт (англ.). При цьому тільки здатність обробляти кілька інструкцій одночасно не робить архітектуру суперскалярної, оскільки одночасності можна досягти й іншими методами: застосуванням конвеєра, застосуванням декількох ядер і/або застосуванням декількох процесорів.
Реалізації
| CDC 6600 | CDC 6600 | 1964 | Control Data Corporation | Конвеєр виконання команд, кілька виконавчих пристроїв (але не конвеєризованих). |
| CDC 7600 [джерело не вказано 3226 днів] | CDC 7600 | 1969 | Control Data Corporation | Повна конвеєризація і виконання команд, і самих виконавчих пристроїв. |
| IBM 360/91 [джерело не вказано 3226 днів] | IBM 360/91 | 1967 | IBM | Повна конвеєризація з динамічним перейменуванням регістрів, виконання команд не в черговості їх надходження тапередбаченням переходів |
| Ельбрус | Ельбрус-1 | 1979 | ІТМіВТ | |
| i960 | i960 | 1988 | Intel | |
| Am29000 | Am29050 | 1990 | AMD | |
| SPARC | SuperSPARC | 1992 | Sun Microsystems | Fujitsu, МЦСТ |
| m88k, m68k | MC88110,MC68060 | 1992 | Motorola | |
| x86 | Pentium | 1993 | Intel | AMD, VIA |
| MIPS | R8000 | 1994 | MIPS Technologies | Toshiba |
| ARM | Cortex A8 | ARM |
Прискорення обчислень
У суперскалярних обчислювальних машинах використовується ряд методів для прискорення обчислень, характерних насамперед для них, проте такі методики можуть використовуватись і в інших типах архітектур:
Також використовуються загальні методики збільшення продуктивності, які застосовуються і в інших типах обчислювальних машин:
- провісник переходів;
- кеш;
- конвеєр (використовується у всіх сучасних суперскалярах);
- Одночасна багатопоточність (SMT) — одночасне виконання інструкцій кількох незалежних потоків у кожному такті на конвеєрах суперскалярного процесора, що одночасно працюють.
Скалярні та суперскалярні процесори
Під час виконання однієї інструкції скалярним процесором обробляється одне чи два числа (скаляра). Під час виконання однієї інструкції векторним процесором обробляється кілька чисел (вектор). При одночасному виконанні кількох інструкцій суперскалярним процесором одночасно обробляється кілька чисел(кілька скалярів).
Обмеження
Збільшення продуктивності суперскалярних процесорів обмежується такими факторами:
- ступенем внутрішнього паралелізму інструкцій;
- складністю пошуку залежностей між інструкціями та витратами часу на цей пошук; складністю схеми перейменування регістрів та витратами часу на перейменування;
- обробкою інструкцій розгалуження.
Можливість одночасного виконання інструкцій залежить від рівня внутрішнього паралелізму інструкцій — від того, наскільки одні інструкції залежать від інших. Одна інструкція залежить від іншої інструкції, якщо використовує ресурси, які також використовуються іншою інструкцією, або використовує результат роботи іншої інструкції. Одночасне виконання можливе у випадках, коли інструкції програми не залежать одна від одної. Наприклад, інструкція a = b + c і інструкція d = e + f можуть бути виконані одночасно, так як результат обчислення жодної з них не залежить від результату обчислення інший. Інструкція a = b + c і інструкція b = e + f взаємозалежні і не можуть виконуватися одночасно, так як результат їх виконання залежить від того, яка з них виконається першою.
При збільшенні кількості інструкцій, що одночасно виконуються, швидко збільшуються витрати часу на перевірку їх взаємозалежностей, і ці витрати не повинні перевищити один такт. Час витрачається працювати логічних вентилів, реалізують схему перевірки, і передачі даних між вентилями. Зменшити затримки не вдається зміною технологічного процесу. Розсіювання електроенергії, складність схем та затримки сигналу на вентилях не дозволяють підвищити кількість одночасно розбитих інструкцій вище восьми.