Якщо припустити, що запити кешу l1 та l2 призводять до пропуску, чи процесор зупиняється до отримання основної пам'яті?
Я чув про ідею переходу на іншу нитку, якщо так, що використовується для пробудження застряглої нитки?
Якщо припустити, що запити кешу l1 та l2 призводять до пропуску, чи процесор зупиняється до отримання основної пам'яті?
Я чув про ідею переходу на іншу нитку, якщо так, що використовується для пробудження застряглої нитки?
Відповіді:
Затримка пам’яті є однією з основних проблем, що вивчаються в дослідженнях комп'ютерної архітектури.
Спекулятивне виконання з випуском інструкцій поза замовленням часто може знайти корисну роботу для заповнення затримки під час звернення до кешу 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 року.)
Коротка відповідь: нічого, процесор зупиняється.
Не так багато можливостей. Перехід до іншого завдання насправді не є можливим з двох причин. Це дорога операція, і оскільки поточне завдання та інша задача змагаються за місце в кеші, перехід на інше завдання сам по собі може потребувати доступу до основної пам’яті, а отже, може повернутися до початкового завдання. Крім того, це повинно залучати операційну систему, тому процесор повинен був би викликати певну форму переривання або пастки - адже процесор переходив би на якийсь код ядра.
Поки процесор зупиняється, таймер продовжує працювати, тому може статися перерва таймера або перерва з інших периферійних пристроїв. Таким чином, контекстна комутація швидше за все відбуватиметься під час доступу до основної пам'яті, ніж під час доступу до кешу, але лише тому, що це займає більше часу.
Тим не менш, сучасні комп'ютери включають в себе різноманітні методики, щоб спробувати зменшити витрачений час на процесор, який чекає основної пам'яті. Затримка буває, але лише тоді, коли її не вдалося уникнути.
Однією з методів є спекулятивний вибір : процесор намагається відгадати, до якого місця в пам'яті буде доступний, і витягує його до кешування раніше часу. Наприклад, петлі над блоком пам’яті є загальними, тому, якщо кешовані рядки були завантажені для адрес пам’яті 0x12340000, 0x12340010 та 0x12340020, може бути хорошою ідеєю завантажити рядок на 0x12340030. Компілятор може допомогти, створивши інструкції попереднього вибору , подібні до завантажень, за винятком того, що вони передають дані лише з основної пам'яті в кеш, а не в регістр процесора.
Ще одна техніка - спекулятивне виконання . Процесор починає виконувати наступну інструкцію до того, як буде виконано завантаження. Це відбувається природним чином у будь-якому випадку через конвеєрну інструкцію. Таким чином можна виконати лише інструкції, які не залежать від завантаженого значення: процесор повинен виконати аналіз залежності. Для умовних інструкцій (наприклад, навантаження r1; гілка, якщо r1 ≠ 0) процесори використовують евристику прогнозування гілок, щоб здогадатися, яке значення буде. Спекулятивне виконання після навантаження може потребувати перемотування, якщо навантаження викликає переривання.
Деякі архітектури, такі як Itanium, полегшують виконання інструкцій у зручному порядку, дозволяючи переупорядкувати інструкції за замовчуванням: замість того, щоб складатися з послідовності елементарних інструкцій, які семантично виконуються одна за одною, програми складаються з дуже довгих слів інструкцій : одна інструкція включає багато операцій, які мають виконуватися паралельно різними компонентами процесора.
Перехід на інший потік відбувається в гіпертоковці , виявленій на процесорах високого класу x86. Це техніка апаратного проектування: кожне ядро процесора містить два окремі банки реєстру (кожен відповідає контексту завдання), але один екземпляр інших елементів, щоб він міг підтримувати два незалежні потоки виконання, але лише ефективно виконувати інструкції з одного в Час. Поки одна нитка затримується, інша нитка продовжується. З точки зору програмного забезпечення, існує два незалежних процесора; просто буває, що ці процесори діляться багатьма компонентами під кришкою.
Swap - це ще один рівень в ієрархії кешу пам'яті: основна пам'ять може розглядатися як кеш простору для обміну. При заміні механізми та коефіцієнти продуктивності різні. Якщо завдання потребує завантаження даних із swap, інструкція з завантаження запускає пастку, яка виконує код ядра для виділення сторінки в оперативній пам'яті та завантаження її вмісту з диска. Поки це відбувається, ядро цілком може вирішити перейти на інше завдання.
Відповідь на це питання залежить від архітектури, про яку йдеться. Хоча багато процесорів будуть зупинятися (ARM, x86 без гіперточення тощо), оскільки для перемикання потоків їм потрібно занадто багато часу, це не такий підхід, який застосовує кожна архітектура. У деяких архітектурах кожен потік, запланований на процесорі, має власний незалежний файл реєстру, тому процесор може просто виконати роботу з потоку, який не чекає доступу до пам'яті. Наскільки я розумію, що це, в обмеженій мірі, те, що робить x86 hyperthreading (використовуючи лише 2 теми), але це набагато частіше в GPGPUархітектури. У конкретному випадку CUDA, щонайменше десятки, якщо не сотні, ниток основи ниток зазвичай завантажуються на даний мультипроцесор у будь-який момент часу, при цьому кожен потік (сотні чи тисячі) має власні регістри. Це дозволяє архітектурі виконувати інструкцію з іншого потоку на наступному циклі, коли даний потік надає доступ до пам'яті. Отже, доки завантажено достатньо багато потоків, ядра процесора ніколи не працюють в режимі доступу до пам'яті. Див Продуктивність Guidelines і пам'яті ієрархії для отримання додаткової інформації.