Що робить процесор під час очікування вибору основної пам'яті


26

Якщо припустити, що запити кешу l1 та l2 призводять до пропуску, чи процесор зупиняється до отримання основної пам'яті?

Я чув про ідею переходу на іншу нитку, якщо так, що використовується для пробудження застряглої нитки?


4
Які дослідження ви провели? Це, безумовно, доступна інформація. Я залишу відповідь експертам, але не думаю, що перемикач потоків - це корисна річ. Як правило, перемикання контексту на процесорі спричинить багато доступу до пам'яті (а значить, ймовірно, кеш буде пропущений). Існують деякі заходи, такі як переупорядкування операцій (використання трубопроводу), але, здається, не існує альтернативи.
Рафаель

@Raphael Я в основному читав книги з комп'ютерної архітектури, ARM System-on-Chip Architecture Стіва Фербера, був, мабуть, найбільш вичерпним, що я читав повністю. Однак я почав читати архітектуру комп’ютера: кількісний підхід. Він визначає методи, щоб уникнути затримок, таких як перемикання потоків, OOE та операцій з пам'яттю поза порядком, хоча це ніколи насправді не дає багато про тонкощі сучасних конструкцій, як, як і більшість підручників, які охоплюють або старіші архітектури, або дають розпливчасті пропозиції щодо того, як ці речі впроваджуються та працюють разом.
102948239408

Розширюючись на моє запитання, схоже, що кеші мають невеликі затримки і детермінізують свою відповідь, але у випадку наявності найгіршого сценарію сторінки сторінки пройдуть для отримання фізичної адреси, тисячі інструкцій можуть виконати, деякі з того ж потоку, витягнутого ILP. Які апаратні взаємодії відбуваються на процесорі, щоб вирішити, що він може запланувати інший потік і яке спілкування використовується для пробудження цього потоку, якщо це станеться. Далі все-таки, якщо OoOE існує техніка роботи з повною чергою результатів при перемиканні потоків?
102948239408

1
З вашого запитання незрозуміло, що вас цікавлять деталі сучасних процесорів. Мало того, що це, напевно, офтопік, це також може бути власна інформація. З допомогою понять ми можемо вам допомогти; вони, ймовірно, змінювалися менше протягом десятиліть, ніж впровадження. Щодо вашого питання, будь ласка, включіть те, що ви знаєте, і сформулюйте конкретне, концептуальне (або довідкове запитання) питання.
Рафаель

1
Я відповів про загальні поняття, але судячи з ваших коментарів, ви можете бути після більш вдосконалених міркувань. Однак якщо ви хочете більш досконалих відповідей, вам потрібно буде зробити своє питання більш конкретним для конкретних архітектур та типів методик.
Жил "ТАК - перестань бути злим"

Відповіді:


28

Затримка пам’яті є однією з основних проблем, що вивчаються в дослідженнях комп'ютерної архітектури.

Спекулятивне виконання

Спекулятивне виконання з випуском інструкцій поза замовленням часто може знайти корисну роботу для заповнення затримки під час звернення до кешу L1, але зазвичай закінчується корисна робота через 10 або 20 циклів або близько того. Було кілька спроб збільшити обсяг роботи, яку можна виконати під час тривалої пропуски. Одна з ідей полягала в тому, щоб спробувати зробити прогнозування цінності (Ліпасті, Вілкерсон і Шен, (ASPLOS-VII): 138-147, 1996). Ця ідея була дуже модною в дослідницьких колах академічної архітектури, але, здається, не спрацьовує на практиці. Остання спроба врятувати прогноз цінності на смітнику історії була стратою(Mutlu, Stark, Wilkerson, and Patt (HPCA-9): 129, 2003). Під час виконання runahead ви визнаєте, що ваші прогнози цінності будуть помилковими, але все-таки спекулятивно виконати, а потім викинете всю роботу, грунтуючись на передбаченні, на теорії, що ви принаймні розпочнете кілька попередніх налаштувань для того, що інакше буде кеш L2 промахує. Виявляється, рунахед витрачає стільки енергії, що цього просто не варто.

Остаточний підхід у цій галузі, який може отримати деяку тягу в промисловості, передбачає створення надзвичайно довгих буферів для зміни порядку. Інструкції виконуються спекулятивно на основі прогнозування галузей, але прогнозування значення не робиться. Натомість усі інструкції, що залежать від тривалості затримки, пропускають сидіти та чекати в буфері повторного замовлення. Але оскільки буфер для впорядкування настільки великий, ви можете дотримуватися інструкцій щодо отримання, якщо передбачувач гілок виконує гідну роботу, іноді ви зможете знайти корисну роботу набагато пізніше в потоці інструкцій. Вагомою дослідницькою роботою в цій галузі були трубопроводи безперервного потоку(Шрінівасан, Раджвар, Аккарі, Ганді та Аптон (ASPLOS-XI): 107-119, 2004). (Незважаючи на те, що всі автори від Intel, я вважаю, що ідея отримала більше тяги в AMD.)

Багатопотоковість

Використання декількох ниток для затримки затримки має набагато довшу історію та значно більший успіх у промисловості. Усі успішні версії використовують апаратну підтримку для багатопотокової роботи. Найпростіший (і найуспішніший) варіант цього - це те, що часто називають FGMT ( тонкозерниста багатопоточна різьба ) або переплетеною багатопотоковою нарізкою . Кожне апаратне ядро ​​підтримує декілька контекстів потоків ( контекст по суті є станом регістра, включаючи регістри, як вказівник інструкції та будь-які неявні регістри прапорів). У дрібнозернистому багатопотоковому процесорі кожна нитка обробляється в-порядок. Процесор відслідковує, які потоки зупиняються на пропуску довгострокового завантаження та які готові до наступної інструкції, і він використовує просту стратегію планування FIFO на кожному циклі, щоб вибрати, який готовий потік виконати цей цикл. Ранним прикладом цього були широкомасштабні HEP-процесори Бертона Сміта (Бертон Сміт продовжував архітектор суперкомп'ютера Tera, який був також дрібнозернистим багатопотоковим процесором). Але ідея йде набагато далі, у 60-ті роки, я думаю.

FGMT особливо ефективний при потоковому навантаженні. Усі сучасні графічні процесори (одиниці графічної обробки) є багатоядерними, де кожним ядром є FGMT, а концепція також широко використовується в інших обчислювальних областях. T1 Sun також був багатоядерним FMGT, і так це Xeon Phi від Intel (процесор, який часто ще називають "MIC" і раніше називався "Larabee").

Ідея одночасного багатопотокового перетворення (Tullsen, Eggers і Levy, (ISCA-22): 392-403, 1995) поєднує апаратну багатопотоковість із спекулятивним виконанням. Процесор має декілька контекстів потоку, але кожен потік виконується спекулятивно і поза порядком. Більш складний планувальник може потім використовувати різні евристики, щоб дістати з теми, яка, швидше за все, матиме корисну роботу ( Malik, Agarwal, Dhar, and Frank, (HPCA-14: 50-61), 2008 ). Деяка велика напівпровідникова компанія почала використовувати термін Hyperthreading для одночасного багатопотокового прочитання, і ця назва, схоже, є найбільш широко використовуваною в наші дні.

Мікроархітектурні проблеми низького рівня

Після перечитування ваших коментарів я зрозумів, що вас також цікавить сигналізація, що триває між процесором і пам'яттю. Сучасні кеші, як правило, дозволяють одночасно вирішувати кілька помилок. Це називається кешем без блокування (Kroft, (ISCA-8): 81-87, 1981). (Але цей документ важко знайти в Інтернеті, і його важко читати. Коротка відповідь: велика кількість бухгалтерій є, але ви просто з цим справляєтесь. Структура бухгалтерського обліку апаратури називається MSHR (пропустіть інформацію / реєстрація статусу про статус ), яке ім'я Крофт дав у своїй праці 1981 року.)


Дякую справді вичерпну відповідь, я спробую заглянути в кеш-пам'ять без вільного блокування. Моє погано сформульоване запитання справді шукало підтвердження того, що процесори продовжували завантажувати та зберігати під час доступу до основної пам'яті та які мікроархітектурні методи використовували для цього.
102948239408

+1, 1. Це дійсно обробка бочки, якщо не використовується круглий робочий графік? Вікіпедія робить це синонімом FGMT. (Я можу прийняти застосовувати "бочковий процесор" до круглої робіни із пропуском, хоча це порушує аналогію, оскільки відсутня стулка (див. Не готовий потік) не скорочує окружність стовбура. (Я думаю, що "справжні" процесори бочки були рідкісний - можливо периферійний процесор для CDC 6600? - тому що вони витрачають цикл, але це спрощує апаратне забезпечення.) 2. Згадка про SoEMT, наприклад, Hyper-Threading Itanium та IBM Northstar та ін., здається особливо доречним, враховуючи питання.
Пол А. Клейтон

@ 102948239408, інша річ, яку ви можете зробити в Google, - це такі терміни, як "потрапити під промах" і "пропустити міс" (інший варіант - "стійло під промах", але я просто спробував це, і, здається, нічого корисного не повернути.) терміни, які в даний час використовуються (деякими) архітекторами для різних варіантів того, що може дозволити кеш.
Мандрівна логіка

@ PaulA.Clayton, термінологія, безумовно, не є моїм сильним позовом. Я погоджуюсь з вами, що обробка бочки повинна означати кругообіг. Але я не можу придумати жоден інший термін, який означає: переплетення циклу за циклом купи потоків в порядку (що і роблять GPU, Xeon Phi і Sun T1). Це FGMT? Я завжди думав про FGMT як про SMT (тобто не вказує, що потоки повинні виконуватися в порядку), але, можливо, FGMT кращий, ніж "бочковий процесор" для цього випадку?
Мандрівна логіка

Стаття про процесор Barrel у Вікіпедії зазначає: "також відомий як" переплетений "або" дрібнозернистий "тимчасовий багатопотоковий простір", тому IMT та FGMT є принаймні визнаними термінами. Я думаю, що я читав "дрібнозернисту" більше, ніж "переплетену", але переплетення - це не рідкість. Я звичайно використовував FG (для мене "зернисте" передбачає більше поділу, ніж передбачає SMT); FG має ту перевагу, що перемежоване може застосувати до SoEMT. Я підозрюю, що це лише зміна у використанні "бочковий процесор", який мені доведеться посміхнутись (вибити зуби).
Пол А. Клейтон

16

Коротка відповідь: нічого, процесор зупиняється.

Не так багато можливостей. Перехід до іншого завдання насправді не є можливим з двох причин. Це дорога операція, і оскільки поточне завдання та інша задача змагаються за місце в кеші, перехід на інше завдання сам по собі може потребувати доступу до основної пам’яті, а отже, може повернутися до початкового завдання. Крім того, це повинно залучати операційну систему, тому процесор повинен був би викликати певну форму переривання або пастки - адже процесор переходив би на якийсь код ядра.

Поки процесор зупиняється, таймер продовжує працювати, тому може статися перерва таймера або перерва з інших периферійних пристроїв. Таким чином, контекстна комутація швидше за все відбуватиметься під час доступу до основної пам'яті, ніж під час доступу до кешу, але лише тому, що це займає більше часу.

Тим не менш, сучасні комп'ютери включають в себе різноманітні методики, щоб спробувати зменшити витрачений час на процесор, який чекає основної пам'яті. Затримка буває, але лише тоді, коли її не вдалося уникнути.

Однією з методів є спекулятивний вибір : процесор намагається відгадати, до якого місця в пам'яті буде доступний, і витягує його до кешування раніше часу. Наприклад, петлі над блоком пам’яті є загальними, тому, якщо кешовані рядки були завантажені для адрес пам’яті 0x12340000, 0x12340010 та 0x12340020, може бути хорошою ідеєю завантажити рядок на 0x12340030. Компілятор може допомогти, створивши інструкції попереднього вибору , подібні до завантажень, за винятком того, що вони передають дані лише з основної пам'яті в кеш, а не в регістр процесора.

Ще одна техніка - спекулятивне виконання . Процесор починає виконувати наступну інструкцію до того, як буде виконано завантаження. Це відбувається природним чином у будь-якому випадку через конвеєрну інструкцію. Таким чином можна виконати лише інструкції, які не залежать від завантаженого значення: процесор повинен виконати аналіз залежності. Для умовних інструкцій (наприклад, навантаження r1; гілка, якщо r1 ≠ 0) процесори використовують евристику прогнозування гілок, щоб здогадатися, яке значення буде. Спекулятивне виконання після навантаження може потребувати перемотування, якщо навантаження викликає переривання.

Деякі архітектури, такі як Itanium, полегшують виконання інструкцій у зручному порядку, дозволяючи переупорядкувати інструкції за замовчуванням: замість того, щоб складатися з послідовності елементарних інструкцій, які семантично виконуються одна за одною, програми складаються з дуже довгих слів інструкцій : одна інструкція включає багато операцій, які мають виконуватися паралельно різними компонентами процесора.

Перехід на інший потік відбувається в гіпертоковці , виявленій на процесорах високого класу x86. Це техніка апаратного проектування: кожне ядро ​​процесора містить два окремі банки реєстру (кожен відповідає контексту завдання), але один екземпляр інших елементів, щоб він міг підтримувати два незалежні потоки виконання, але лише ефективно виконувати інструкції з одного в Час. Поки одна нитка затримується, інша нитка продовжується. З точки зору програмного забезпечення, існує два незалежних процесора; просто буває, що ці процесори діляться багатьма компонентами під кришкою.

Swap - це ще один рівень в ієрархії кешу пам'яті: основна пам'ять може розглядатися як кеш простору для обміну. При заміні механізми та коефіцієнти продуктивності різні. Якщо завдання потребує завантаження даних із swap, інструкція з завантаження запускає пастку, яка виконує код ядра для виділення сторінки в оперативній пам'яті та завантаження її вмісту з диска. Поки це відбувається, ядро ​​цілком може вирішити перейти на інше завдання.


На противагу першому та другому в останньому абзацу, "хитрість" полягає в тому, що з гіперточенням не повинно відбуватися реального переключення контексту, правда? Процесор повністю підтримує два контексти одночасно.
Рафаель

1
@Raphael Right: що стосується програмного забезпечення, для всього, крім продуктивності, є два процесори.
Жил "ТАК - перестань бути злим"

У процесорі з гіперпотоком є ​​багато напівнезалежних одиниць виконання (цілочисельні та плаваючі точки, множники тощо), і я думаю, що обидва контексти можуть одночасно використовувати окремі одиниці виконання - хоча не на 100% впевнені в цьому.
Рассел Борогов

@RussellBorogove Так, я не згадував про це , тому що навіть не-hyperthreaded процесори можуть мати кілька ALU / FPU / ... і , навпаки , окремі ядра іноді поділяють FPU і т.д.
Жиля SO- перестати бути злим »

5

Відповідь на це питання залежить від архітектури, про яку йдеться. Хоча багато процесорів будуть зупинятися (ARM, x86 без гіперточення тощо), оскільки для перемикання потоків їм потрібно занадто багато часу, це не такий підхід, який застосовує кожна архітектура. У деяких архітектурах кожен потік, запланований на процесорі, має власний незалежний файл реєстру, тому процесор може просто виконати роботу з потоку, який не чекає доступу до пам'яті. Наскільки я розумію, що це, в обмеженій мірі, те, що робить x86 hyperthreading (використовуючи лише 2 теми), але це набагато частіше в GPGPUархітектури. У конкретному випадку CUDA, щонайменше десятки, якщо не сотні, ниток основи ниток зазвичай завантажуються на даний мультипроцесор у будь-який момент часу, при цьому кожен потік (сотні чи тисячі) має власні регістри. Це дозволяє архітектурі виконувати інструкцію з іншого потоку на наступному циклі, коли даний потік надає доступ до пам'яті. Отже, доки завантажено достатньо багато потоків, ядра процесора ніколи не працюють в режимі доступу до пам'яті. Див Продуктивність Guidelines і пам'яті ієрархії для отримання додаткової інформації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.