Автор работы: Пользователь скрыл имя, 11 Июня 2013 в 18:24, курсовая работа
Мета дослідження – розглянути принципи мультитредової архітектури та описати функціонування сучасних мультитредових мікропроцесорів.
Для досягнення мети дослідження було визначено наступні завдання:
розглянути поняття тред та багатопотоковість;
дослідити мультитредову архітектуру;
вказати на особливості виявлення тредів;
вказати на перспективи мультитредовості.
ВСТУП…………………………………………… 5
РОЗДІЛ І АНАЛІТИЧНИЙ ОГЛЯД ПРЕДМЕТНОЇ ОБЛАСТІ..….... 7
1.1 Основи мультитредової архітектури ……..………………………....... 7
1.2 Переваги мультитредової архітектури 11
1.3 Виявлення тредів 13
1.3 Специфіка мультитредових моделей розпаралелювання 14
РОЗДІЛ ІІ ТЕОРЕТИЧНА ЧАСТИНА 17
2.1 Мультитредові процесори з тредами, що виявляються шляхом аналізу
потоків управління програми 17
2.2 Мультитредові процесори з тредами, що виявляються шляхом аналізу
потоків даних програми 25
РОЗДІЛ ІІІ ПРАКТИЧНА ЧАСТИНА 29
3.1 Опис технології Hyper-Threading 29
3.2 Особливості реалізації Hyper-Threading у процесорі Pentium 4 на
прикладі виконання коду різного типу 32
ВИСНОВКИ 39
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ 42
Для спрощення збереження послідовної семантики виконання програми мультитредовий процесор видаляє сегменти з циклічної черги в тому ж порядку, в якому їх поміщав у чергу. У процесі спекулятивного виконання сегмент виробляє значення, які можуть бути як правильними, так і неправильними. Тільки, безумовно, правильні результати сегменту можуть бути безпечно використані іншими сегментами. Тим не менш, в мультитредовому процесорі значення оптимістично надсилаються для спекулятивного використання в ході виконання інших сегментів. Оскільки сегмент посилає значення заздалегідь іншим сегментам, як тільки їх виробляє, більша частина, якщо не всі значення, будуть надіслані до моменту, коли сегмент стає головним в черзі. Таким чином, скасування сегмента для звільнення процесора і призначення нового сегмента може бути виконане просто шляхом модифікування покажчика початку черги.
Щоб ілюструвати потужність мультитредової моделі, розглянемо приклад, наведений у лістингу (див. дод. 3). У ході виконання цієї програми з буфера неодноразово вибирається символ і перевіряється на збіг з елементами пов'язаного списку. Якщо збіг стався, викликається функція обробки символу. Якщо збігу не відбулося, символ включається до списку. По мірі виконання програми додавання елементів до списку стануть нечастими, оскільки більшість символів буде збігатися з елементами, які вже містяться в списку.
При виконанні програми на мультитредовому процесорі сегмент, призначений на процесор, виконує один повний пошук по списку для відповідного символу. Процесори виконують пошук по пов'язаному списку паралельно, кожен для свого символу, в результаті чого виконується безліч команд за такт.
Мультитредові програми
Програма, призначена для виконання на мультитредовому процесорі, повинна забезпечувати можливість швидкого обходу її ГУЗ, в результаті якого відбувається розподіл безлічі сегментів по безлічі процесорів.
Специфікація коду для кожного сегмента однакова. Сегмент визначається як фрагмент програми для послідовної машини. Хоча система команд, в якій подається код, впливає на конструкцію кожного індивідуального процесора, це не впливає на решту частин конструкції мультитредового процесора.
Для прискорення обходу ГУЗ планувальником мультитредового процесора потрібна інформація про структуру потоку управління програми. Зокрема, потрібно знати, які сегменти є можливими наступниками будь-якого сегменту в ГУЗ. Планувальник мультитредового процесора використовує цю інформацію для передбачення одного з можливих сегментів-наступників і продовження обходу ГУЗ, починаючи з поточної позначки. Така інформація може бути визначена статично і поміщена в описувач сегмента. Описувачі сегментів можуть бути розташовані всередині тексту програми (наприклад, перед кодом сегмента) або поміщені окремо, поряд з текстом програми (наприклад в кінці).
Для узгодженого виконання різних сегментів необхідно характеризувати кожний сегмент у відповідності з набором використовуваних і вироблюваних сегментом значень.
Процедура обробки регістрових значень проста. У результаті статичного аналізу ГУЗ компілятором формується маска створення. Використовуючи значення, сегмент чекає їх тільки в тому випадку, якщо вони ще не були вироблені сегментом-попередником. Інакше вона знаходить необхідні значення всередині локальної пам'яті, передані по кільцю сегментом-попередником.
Природним є розташування маски створення всередині описувача сегмента. Так як сегмент може містити безліч базисних блоків, виконання яких залежить від даних, не представляється можливим визначити статично, які регістрові значення будуть створені в динаміці обчислень через можливі умовні переходи. Маска створення повинна бути консервативною і, внаслідок цього, включати всі можливі регістрові значення, які можуть бути вироблені.
По мірі виконання процесором команд сегмента вироблені значення регістрів пересилаються наступним сегментам. Так як ПЕ не може визначати апріорно, які команди містить призначений йому сегмент, він не може знати, які з команд виконують модифікацію регістрів, чиє значення має бути надіслане іншим сегментах. Згідно з послідовною семантикою іншим сегментам повинен бути посланий тільки результат останньої модифікації регістру в сегменті. Стратегія, пов'язана з очікуванням виконання всіх команд в сегменті (коли ніякі подальші модифікації регістрів не можливі), недоцільна, тому що це часто призводить до очікування іншими сегментами значення, яке вже є доступним.
Не всі створені сегментом значення повинні бути передані сегментам-наступникам. Достатньо передавати лише ті значення, які будуть використані поза сегментом, який їх створив.
Компілятор має можливість визначення останньої команди в сегменті, яка модифікує відповідний регістр. Він може відзначити цю команду як спеціальну (виконати і переслати) команду, яка на додаток до виконання певної операції направляє результат наступним ПЕ. Крім того, оскільки ПЕ виконує команди сегмента, він може ідентифікувати ті регістри, для яких значення не будуть вироблені.
З тих же самих причин процесор не може визначити, які команди, насправді виконує призначений йому сегмент, так само, як не може визначити апріорно, на якій команді сегмент завершиться, тобто в якій точці управління передається поза сегментом. Під час розбиття компілятором ГУЗ на сегменти визначаються межі сегменту і вузли передачі управління. Команда в одному з цих вузлів передачі управління може бути відзначена спеціальними умовами зупинки так, щоб відповідні умови могли бути оцінені до моменту вибірки такої команди процесором. Якщо пов'язані з командою умови зупинки виконані, то сегмент завершений.
Специфікація пересилання та вимикання може бути задана за допомогою додавання тегової бітової позначки (бітів пересилання і стопових бітів) до кожної команди сегмента. Можливо також інше введення бітових відміток. Наприклад, з кожною статичною командою може бути асоційована таблиця тегових бітів. Апаратні засоби вибирають команди з тексту програми та відповідні бітові позначки з таблиці об'єднують цю пару в нову команду і поміщають в кеш-пам'ять команд. Звільнення регістру може бути задано додаванням спеціальної команди звільнення базовій системі команд.
Мультитредова програма може бути згенеровано з існуючої двійковим шляхом додавання описувачів сегментів і бітових відміток. Ця інформація може бути розміщена усередині коду програми, а також до або після коду.
Поділ виконавчого коду і описувачів дозволяє спростити процедуру перенесення програми на інші апаратні засоби.
Апаратні засоби, необхідні для мультитредової архітектури
На апаратні засоби покладаються функції обходу ГУЗ, призначення сегментів на процесори і виконання цих сегментів при збереженні послідовної семантики програми. Робота з визначення порядку призначення сегментів на виконання покладається на програму-планувальник. За адресою описувача сегментів програма-планувальник вибирає описувач сегмента і призначає сегмент на процесор, видає адресу першої команди, встановлює маски створення та накопичення для сегменту. Планувальник, використовуючи статичну або динамічну схему передбачення на основі інформації з описувача сегмента, прогнозує сегмент-наступник. Кожен процесор незалежно вибирає і виконує команди сегмента до тих пір, поки не стикається з командою зупину, що ідентифікує завершення сегмента.
Основною метою розподілу сегментів по процесорах мультитредового процесора є створення можливості виконання кількох команд в одному такті. Втрати продуктивності мультитредового процесора можливі через наявність у процесорів тактів непотрібних обчислень, тактів очікування і вільних тактів.
Безкорисні такти обчислення представляють роботу, яка в подальшому буде скасована через використання неправильних значень даних або неправильного передбачення. Такти очікування пов'язані з очікуванням отримання значення, створеного командою в сегменті-попереднику, або значення, створеного командою в тому ж самому сегменті (наприклад, у випадку операції з великим часом виконання або зважаючи на невдале звернення в кеш), а також з очікуванням при виконанні дій з перепланування сегментів. Неактивні такти становлять час, протягом якого процесор не має призначеного сегмента. Основною причиною їх виникнення є незбалансованість завантаження процесорів.
Для зменшення втрат, пов'язаних з безкорисними тактами, слід знижувати вірогідність скасування результатів попередніх обчислень, забезпечуючи синхронізацію процесорів за даними, а також встановлювати факт необхідності скасування якомога раніше.
2.2 Мультитредові процесори з тредами, що виявляються шляхом аналізу потоків даних програми
Прикладом реалізації мультитредового процесора з тредами, що виявляються шляхом аналізу потоків даних програми, служить мікропроцесор Kin. Цей мікропроцесор будується як сукупність функціональних блоків, зв'язки між якими виконуються через FIFO-черги. Кожен функціональний блок може бути всередині як синхронним (що цілком можливо в силу обмеженого розміру блоку), так і асинхронним. Останнє досить актуальне, тому що мікропроцесори на кристалах з мільярдом транзисторів і тактовими частотами на рівні гігагерц не можуть бути синхронними. На великих кристалах час поширення від одного краю кристала до протилежного краю будь-яких сигналів, включаючи тактові, становить близько 3 нс, що при тактовій частоті 2 ГГц займає 5-7 тактів. Традиційне рішення, засноване на введенні мережі розподілу тактового сигналу, потребує багато ресурсів і енергії. Наприклад, в мікропроцесорі Alpha 40% потужності витрачається на розподіл тактового сигналу без скосу (skew) фронтів і нерівномірностей (jitter) періодів.
Для розуміння функціонування мікропроцесора Kin важливо те, що блок вибирає з вхідної черги елементи в міру їх надходження, виробляє задані дії і поміщає результат у вихідну чергу. При такій організації потік команд поширюється між блоками як потік пакетів, що містять у собі теги та іншу необхідну інформацію для управління функціональними блоками. Використовувана в Kin модель ILP організації обчислень служить розвитком па сучасному етапі ідей потокових обчислень (data flow).
Основним архітектурним поняттям мікропроцесора Kin є базисний блок: послідовність команд перетворення даних в регістрах і пам'яті, що завершується командою переходу.
Пристрій вибірки команд витягує і декодує команди чергового базисного блоку і розміщує цей блок як рядок кеш-пам'яті декодованих команд. Кожна команда отримує при цьому унікальний динамічний тег.
Далі в блоках перейменування регістрів усуваються зайві WAR-і WAW-залежності між командами, і команди надходять в блок організації позачергового виконання.
З блоку позачергового виконання команди передаються в резервуючі станції, в яких вони очікують готовності операндів для початку свого виконання.
Команди з готовими операндами надсилаються резервуючим станціями для виконання в функціональні блоки: інтерпретації команд переходу, інтерпретації арифметичних, логічних команд і команд зсуву, виконання команд звернення до пам'яті. Результати роботи функціональних блоків передаються в резервуючі станції, до блоку позачергового виконання команд і, у разі команд переходу, до блоку передвибірки команд.
Описана організація функціонування мікропроцесора Kin звичайна для процесорів з позачерговим виконанням команд. Особливість Kin полягає в застосуванні механізму жадібної (avid) вибірки команд базисних блоків і механізму видалення команд, які були обрані при помилковому передбаченні ходу обчислень.
Блок передвибірки команд, який реалізує передбачення переходів і жадібну предвибірку команд, витягує команди з кеш-пам'яті декодованих команд і приписує їм динамічний тег, що містить, серед іншого, трасу, якій належить команда. При цьому одні й ті ж команди можуть вилучатись багаторазово. Наприклад, у разі циклу, організованого командою умовного переходу, команди тіла циклу багаторазово витягуються. При цьому вони розглядаються як незалежні один від одного. Одночасно можуть вилучатись команди різних кеш-рядків пам'яті декодованих команд. Це і становить суть жадібної передвибірки команд.
При жадібній предвибірці команд вибираються команди як у напрямку переходу, так і по напрямку відсутності переходу. Тому при визначенні значення предиката команди переходу необхідно усунути результати невірно предвибранних команд і самі ці команди. Для цього використовуються динамічний тег, який формується при виконанні команд переходу. Якщо команда переходу мала в тезі трасу m, то передвибрані команди одного напрямку отримують трасу m0, а іншого напрямку - трасу m1. Тим самим, з'являється можливість при кожному визначенні напрямку переходу встановити всі ті команди, які були помилково обрані. Блок видалення помилково вибраних команд розсилає повідомлення іншим блокам про траси команд, що підлягають видаленню.
3.1 Опис технології Hyper-Threading
Hyper-threading (англ. Hyper-threading - гіперпоточність, офіційна назва Hyper-Threading Technology (HTT)) - це торгова марка компанії Intel для реалізації технології «одночасної мультипоточності» (англ. Simultaneous multithreading) на мікроархітектурі Pentium 4. Розширена форма суперпоточності (англ. Super-threading), що вперше з'явилася в процесорах Intel Xeon і пізніше додана в процесори Pentium 4. Процесори Pentium 4 з включеним Hyper-threading операційна система визначає як два різних процесора замість одного. У процесорах Core 2 Duo підтримка технології Hyper-threading не була реалізована. У процесорах Core i7 знову використовується Hyper-threading, при цьому кожна фізична ядро процесора визначається операційною системою як два логічних. Так само ця технологія присутня в мобільних процесорах Core i3 і Core i5.
Основна проблема збільшення продуктивності процесорів полягає в тому, що кількість виконуваних за такт інструкцій зростає не пропорційно числу виконуваних модулів в процесорі, а набагато повільніше. Зокрема, хоча Pentium 4 і містить чотири паралельних блоки для операцій з цілими числами, два блоки для роботи з дійсними числами і два блоки для роботи з пам'яттю, одночасно всі ці ресурси практично ніколи не використовуються. У переважній більшості випадків істотна частина процесора простоює або в очікуванні даних, або через її непотрібність при виконанні чергової операції. Якщо з простоями при відсутності даних ще можна якось боротися, нарощуючи обсяг кеш-пам'яті, то завантажити весь процесор цілком при існуючій концепції послідовних обчислень ніяк не вийде. Наприклад, якщо вже програма виконує додавання цілих чисел, блоки операцій з дійсними числами задіяні не будуть. У підсумку, отримуємо досить сумну картину: більшість x86 програм використовує одночасно не більше 35% виконавчих