ожливість негайного перемикання з команд, які потенційно здатні викликати простий (наприклад, завантаження, збереження і переходи), без з'ясування, чи дійсно намічається простий. Ця стратегія дозволяє перемикатися раніше звичайного (відразу після декодування команди) і виключає нескінченні цикли. Іншими словами, виконання триває до того моменту, поки не виявиться можливість виникнення проблеми, після чого слід перемикання. Такі часті перемикання ріднять крупномодульних багатопоточність з мілкомодульних. p> Незалежно від використовуваного варіанту багатопоточності, необхідно якось відслідковувати приналежність кожної операції до того чи іншого програмного потоку. У рамках мілкомодульних багатопоточності кожної операції присвоюється ідентифікатор потоку, тому при переміщеннях по конвеєру її приналежність не викликає сумнівів. Крупномодульних багатопоточність передбачає можливість очищення конвеєра перед запуском кожного наступного потоку. У такому випадку чітко визначається ідентичність потоку, виконуваного в даний момент. Природно, дана методика ефективна тільки в тому випадку, якщо паузи між перемиканнями значно більше часу, необхідного для очищення конвеєра. p> Усе належить до процесорам, здатним викликати не більше однієї команди за тактовий цикл. Однак ми знаємо, що для сучасних процесорів це обмеження не актуально. Стосовно до зображення на малюнку 6.3 ми допускаємо, що процесор може викликати по 2 команди за цикл, однак твердження про неможливість запуску наступних команд у разі простою попередньої залишається в силі. Малюнок 6.3, а ілюструє механізм мілкомодульних багатопоточності в здвоєному суперскалярное процесорі. Як бачимо, в потоці А перші дві команди запускаються під час першого циклу, однак в потоці У в другому циклі запускається тільки одна команда. p> У суперскалярних процесорах є ще один спосіб організації багатопоточності - так звана синхронна багатопоточність (simultaneous multithreading), яку ілюструє малюнок 6.3, в. Ця методика являє собою вдосконалений варіант крупномодульних багатопоточності, де кожен програмний потік може запускати по дві команди за такт, проте в разі простою з метою забезпечення повного завантаження процесора запускаються команди наступного потоку. При синхронної багатопоточності повністю завантажуються всі функціональні блоки. У разі неможливості запуску команди через зайнятість функціонального блоку вибирається команда з іншого потоку. На малюнку передбачається, що в циклі 11 простоює команда B8, тому в циклі 12 запускається команда С7. <В
6.4 Нить в Pentium 4
Розібравшись з теорією багатопоточності, розглянемо практичний приклад - Pentium 4. Вже на етапі розробки цього процесора інженери Intel продовжували роботу над підвищенням його швидкодії без внесення змін в програмний інтерфейс. Розглядалося п'ять найпростіших способів:
- підвищення тактової частоти;
- розміщення на одній мікросхемі двох процесорів;
- введення нових функціональних блоків;
- подовження конвеєра;
- використання багатопоточності. p> Самий очевидний спосіб підвищення швидкодії полягає в тому, щоб підвищити тактову частоту, що не змінюючи інші параметри. Як правило, кожна наступна модель процесора має дещо вищу тактову частоту, ніж попередня. На жаль, при прямолінійній підвищенні тактової частоти розробники стикаються з двома проблемами: збільшенням енергоспоживання (що актуально для портативних комп'ютерів та інших обчислювальних пристроїв, що працюють на акумуляторах) і перегрівом (що вимагає створення більш ефективних теплоотводов). p> Другий спосіб - розміщення на мікросхемі двох процесорів - порівняно простий, але він пов'язане з подвоєнням площі, займаної мікросхемою. Якщо кожен процесор забезпечується власної кеш-пам'яттю, кількість мікросхем на пластині зменшується вдвічі, але це також означає подвоєння витрат на виробництво. Якщо для обох процесорів передбачається загальна кеш-пам'ять, значного збільшення займаної площі вдається уникнути, проте в цьому випадку виникає інша проблема - обсяг кеш-пам'яті в перерахунку на кожен процесор зменшується удвічі, а це неминуче позначається на продуктивності. Крім того, якщо професійні серверні додатки здатні повністю задіяти ресурси декількох процесорів, то в звичайних настільних програмах внутрішній паралелізм розвинений в значно меншому ступені. p> Введення нових функціональних блоків також не представляє складності, але тут важливо дотримати баланс. Який сенс у десятці блоків АЛУ, якщо мікросхема не може видавати команди на конвеєр із швидкістю, яка дозволяє завантажити всі ці блоки? p> Конвеєр із збільшеним числом ступенів, здатний розділяти завдання на більш дрібні сегменти і обробляти їх за короткі періоди часу, з одного боку, підвищує продуктивність, з інший, посилює негативні наслідки невірного прогнозування переходів, кеш-промахів, переривань та інших подій, що порушують нормальний хід обробки команд в процесорі. Крі...