Технологія hyper-threading від intel

У минулому ми розповідали про технології одночасної багатопоточності (Simultaneous Multi-Threading - SMT), яка застосовується в процесорах Intel. І хоча спочатку вона створювалася під кодовим ім'ям "технологія Джексона" (Jackson Technology) як можливий, ймовірний варіант, Intel офіційно анонсувала свою технологію на форумі IDF минулої осені. Кодове ім'я Jackson було замінено більш відповідним Hyper-Threading. Отже, для того щоб розібратися, як працює нова технологія, нам потрібні деякі початкові знання. А саме, нам потрібно знати, що таке потік, як виконуються ці потоки. Чому працює додаток? Як процесор дізнається, які операції і над якими даними він повинен здійснювати? Вся ця інформація міститься в відкомпілювався коді виконуваного застосування. І як тільки додаток отримує від користувача будь-яку команду, будь-які дані, - процесору відразу ж відправляються потоки, в результаті чого він і виконує те, що повинен виконати у відповідь на запит користувача. З точки зору процесора, потік - це набір інструкцій, які необхідно виконати. Коли в вас потрапляє снаряд в Quake III Arena, або коли ви відкриваєте документ Microsoft Word, процесору посилається певний набір інструкцій, які він повинен виконати.

Існує загальновідомий спосіб вирішення даної проблеми. Полягає він у використанні двох процесорів - якщо один процесор в кожен момент часу може виконувати один потік, то два процесора за ту ж одиницю часу можуть виконувати вже два потоки. Відзначимо, що цей спосіб не ідеальний. При ньому виникає безліч інших проблем. З деякими, ви вже, мабуть, знайомі. По-перше, кілька процесорів завжди дорожче, ніж один. По-друге, управляти двома процесорами теж не так-то просто. Крім того, не варто забувати про поділ ресурсів між процесорами. Наприклад, до появи чіпсета AMD 760MP, все x86 платформи з підтримкою многопроцессорности поділяли всю пропускну здатність системної шини між усіма наявними процесорами. Але основний недолік в іншому - для такої роботи і додатки, і сама операційна система повинні підтримувати многопроцессорность. Здатність розподілити виконання декількох потоків по ресурсів комп'ютера часто називають багатопоточність. При цьому і операційна система повинна підтримувати багатопоточність. Додатки також повинні підтримувати багатопоточність, щоб максимально ефективно використовувати ресурси комп'ютера. Не забувайте про це, коли ми будемо розглядати ще один підхід вирішення проблеми многопоточности, нову технологію Hyper-Threading від Intel.

Продуктивності завжди мало

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

Щоб проілюструвати ситуацію, давайте уявимо собі процесор з трьома виконавчими пристроями: арифметико-логічним (цілочисельним - ALU), пристроєм для роботи з плаваючою точкою (FPU), і пристроєм завантаження / зберігання (для запису і читання даних з пам'яті). Крім того, припустимо, що наш процесор може виконувати будь-яку операцію за один такт і може розподіляти операції по всім трьох пристроїв одночасно. Давайте уявимо, що до цього процесору на виконання відправляється потік з наступних інструкцій:

1 + 1
10 + 1
Зберегти попередній результат

Малюнок нижче ілюструє рівень завантаженості виконавчих пристроїв (сірим кольором позначається незадіяний пристрій, синім - працюючий пристрій):

Отже, ви бачите, що в кожен такт використовується тільки 33% всіх виконавчих пристроїв. Цього разу FPU залишається взагалі незадіяним. Відповідно до даних Intel, більшість програм для IA-32 x86 використовують не більше 35% виконавчих пристроїв процесора Pentium 4.

Уявімо собі ще один потік, відправимо його на виконання процесору. На цей раз він буде складатися з операцій завантаження даних, складання і збереження даних. Вони будуть виконуватися в наступному порядку:

І знову завантаженість виконавчих пристроїв становить лише на 33%.

Хорошим виходом з даної ситуації буде паралелізм на рівні інструкцій (Instruction Level Parallelism - ILP). У цьому випадку одночасно виконуються відразу декількох інструкцій, оскільки процесор здатний заповнювати відразу кілька паралельних виконавчих пристроїв. На жаль, більшість x86 програм не пристосовані до ILP в належній мірі. Тому доводиться знаходити інші способи збільшення продуктивності. Так, наприклад, якщо б в системі використовувалося відразу два процесори, то можна було б одночасно виконувати відразу два потоки. Таке рішення називається паралелізмом на рівні потоків (thread-level parallelism, TLP). До слова сказати, таке рішення досить дороге.

Які ж ще існують способи збільшення виконавчої мощі сучасних процесорів архітектури x86?

Hyper-Threading

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

В даний час більшість виробників покращують швидкість роботи процесорів шляхом збільшення тактової частоти і розмірів кешу. Звичайно, таким способом можна збільшити продуктивність, але все ж потенціал процесора не буде повністю задіяний. Якби ми могли одночасно виконувати кілька потоків, то ми змогли б використовувати процесор куди більш ефективно. Саме в цьому і полягає суть технології Hyper-Threading.

Hyper-Threading - це назва технології, що існувала і раніше поза x86 світу, технології одночасної багатопоточності (Simultaneous Multi-Threading, SMT). Ідея цієї технології проста. Один фізичний процесор представляється операційній системі як два логічних процесора, і операційна система не бачить різниці між одним SMT процесором або двома звичайними процесорами. В обох випадках операційна система направляє потоки як на двухпроцессорную систему. Далі всі питання вирішуються на апаратному рівні.

У процесорі з Hyper-Threading кожен логічний процесор має свій власний набір регістрів (включаючи і окремий лічильник команд), а щоб не ускладнювати технологію, в ній не реалізується одночасне виконання інструкцій вибірки / декодування в двох потоках. Тобто такі інструкції виконуються по черзі. Паралельно ж виконуються лише звичайні команди.

Технологія поки ще не випущена, однак ті з вас, хто придбав 0,13 мкм Xeon, і встановив цей процесор на плати з оновленим BIOS, напевно були здивовані, побачивши в BIOS опцію включення / відключення Hyper-Threading.

А поки Intel буде залишати опцію Hyper-Threading відключеною за замовчуванням. Втім, для її включення досить просто оновити BIOS. Все це стосується робочих станцій і серверів, що ж до ринку персональних комп'ютерів, в найближчому майбутньому у компанії планів щодо цієї технології немає. Хоча можливо, виробники материнських плат нададуть можливість включити Hyper-Threading за допомогою спеціального BIOS.

Залишається дуже цікаве питання, чому Intel хоче залишити цю опцію виключеною?

Заглиблюємося в технологію

Пам'ятаєте ті два потоки з попередніх прикладів? Давайте на цей раз припустимо, що наш процесор оснащений Hyper-Threading. Подивимося, що вийде, якщо ми спробуємо одночасно виконати ці два потоки:

Як і раніше, сині прямокутники вказують на виконання інструкції першого потоку, а зелені - на виконання інструкції другого потоку. Сірі прямокутники показують незадіяні виконавчі пристрої, а червоні - конфлікт, коли на один пристрій прийшло відразу дві різні інструкції з різних потоків.

Отже, що ж ми бачимо? Паралелізм на рівні потоків дав збій - виконавчі пристрої стали використовуватися ще менш ефективно. Замість паралельного виконання потоків, процесор виконує їх повільніше, ніж якби він виконував їх без Hyper-Threading. Причина досить проста. Ми намагалися одночасно виконати відразу два дуже схожих потоку. Адже обидва вони складаються з операцій із завантаження / збереження і операцій додавання. Якби ми паралельно запускали "целочисленное" додаток і додаток, що працює з плаваючою точкою, ми б опинилися куди в кращій ситуації. Як бачимо, ефективність Hyper-Threading сильно залежить від виду навантаження на ПК.

На даний момент, більшість користувачів ПК використовують свій комп'ютер приблизно так, як описано в нашому прикладі. Процесор виконує безліч дуже схожих операцій. На жаль, коли справа доходить до однотипних операцій, виникають додаткові труднощі з управлінням. Трапляються ситуації, коли виконавчих пристроїв потрібного типу вже не залишилося, а інструкцій, як на зло, вдвічі більше, ніж звичайно. У більшості випадків, якщо б процесори домашніх комп'ютерів використовували технологію Hyper-Threading, то продуктивність б від цього не збільшилася, а може бути, навіть знизилася на 0-10%.

На робочих ж станціях можливостей для збільшення продуктивності у Hyper-Threading більше. Але з іншого боку, все залежить від конкретного використання комп'ютера. Робоча станція може означати як high-end комп'ютер для обробки 3D графіки, так і просто сильно навантажений комп'ютер.

Найбільший же приріст в продуктивності від використання Hyper-Threading спостерігається в серверних додатках. Головним чином це пояснюється широким розмаїттям посилаються процесору операцій. Сервер баз даних, що використовують транзакції, може працювати на 20-30% швидше при включеній опції Hyper-Threading. Трохи менший приріст продуктивності спостерігається на веб-серверах і в інших сферах.

Максимум ефективності від Hyper-Threading

Ви думаєте, Intel розробила Hyper-Threading тільки для своєї лінійки серверних процесорів? Звичайно ж ні. Якби це було так, вони б не стали даремно витрачати місце на кристалі інших своїх процесорів. По суті, архітектура NetBurst, що використовується в Pentium 4 і Xeon, як не можна краще підходить для ядра з підтримкою одночасної багатопоточності. Давайте ще раз уявімо собі процесор. На цей раз в ньому буде ще один виконавчий пристрій - друга целочисленное пристрій. Подивимося, що станеться, якщо потоки будуть виконуватися обома пристроями:

З використанням другого цілочисельного пристрою, єдиний конфлікт трапився тільки на останній операції. Наш теоретичний процесор в чомусь схожий на Pentium 4. У ньому є цілих три цілочисельних пристрої (два ALU і одне повільне целочисленное пристрій для циклічних зрушень). А що ще більш важливо, обидва цілочисельних пристрої Pentium 4 здатні працювати з подвійною швидкістю - виконувати по дві мікрооперації за такт. А це, в свою чергу, означає, що будь-яка з цих двох цілочисельних пристроїв Pentium 4 / Xeon могло виконати ті дві операції складання з різних потоків за один такт.

Але це не вирішує нашої проблеми. Було б мало сенсу просто додавати в процесор додаткові виконавчі пристрої з метою збільшення продуктивності від використання Hyper-Threading. З точки зору займаного на кремнії простору це було б вкрай дорого. Замість цього, Intel запропонувала розробникам оптимізувати програми під Hyper-Threading.

Використовуючи інструкцію HALT, можна призупинити роботу одного з логічних процесорів, і тим самим збільшити продуктивність додатків, що не виграють від Hyper-Threading. Отже, програма не стане працювати повільніше, натомість один з логічних процесорів буде зупинений, і система буде працювати на одному логічному процесорі - продуктивність буде такою ж, що і на однопроцесорних комп'ютерах. Потім, коли додаток вважатиме, що від Hyper-Threading воно виграє в продуктивності, другий логічний процесор просто відновить свою роботу.

На веб-сайті Intel є презентація. описує, як саме необхідно програмувати, щоб витягти з Hyper-Threading максимум вигоди.

Хоча ми всі були вкрай зраділи, коли до нас дійшли чутки про використання Hyper-Threading в ядрах всіх сучасних Pentium 4 / Xeon, все ж це не буде безкоштовною продуктивністю на всі випадки життя. Причини зрозумілі, і технології належить подолати ще багато, перш ніж ми побачимо Hyper-Threading, що працює на всіх платформах, включаючи домашні комп'ютери. А за підтримки розробників, технологія безумовно може виявитися хорошим союзником Pentium 4, Xeon, і процесорам майбутнього покоління від Intel.

За наявних обмежень і при наявній технології упаковки, Hyper-Threading здається більш розумним вибором для споживчого ринку, ніж, наприклад, підхід AMD в SledgeHammer - в цих процесорах використовується цілих два ядра. І до тих пір, поки не стануть досконалими технології упаковки, такі як Bumpless Build-Up Layer. вартість розробки багатоядерних процесорів може виявитися занадто високою.

Цікаво зауважити, наскільки різними стали AMD і Intel за останні кілька років. Адже колись AMD практично копіювала процесори Intel. Тепер же компанії виробили принципово інші підходи до майбутніх процесорам для серверів і робочих станцій. AMD насправді виконала дуже довгий шлях. І якщо в процесорах Sledge Hammer дійсно будуть використовуватися два ядра, то по продуктивності таке рішення буде ефективніше, ніж Hyper-Threading. Адже в цьому випадку крім подвоєння кількості всіх виконавчих пристроїв знімаються проблеми, які ми описали вище.

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

Згода на обробку персональних даних