Hyper-Threading: "два-в-одному" від Intel, або Приховані можливості Xeon. Отже, які логічні ядра процесора (на відміну фізичних ядер процесора)

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

Даєш продуктивність

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

Постійне зростання швидкодії, безумовно, необхідне. Принаймні, це прибутковий бізнес, і завжди знайдеться гарний спосіб спонукати користувачів на черговий апгрейд вчорашнього "суперпродуктивного CPU" на завтрашній "ще супер...". Наприклад, синхронне розпізнавання мови та синхронний переклад на іншу мову - чи це не мрія всіх і кожного? Або надзвичайно реалістичні ігри майже "кіношної" якості (цілком поглинаючі увагу і часом призводять до серйозних змін у психіці) - чи це не прагнення безлічі геймерів від малого до великого?

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

Отже, якими ж способами домогтися збільшення їхньої швидкодії?

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

Нарощування ресурсів процесора- наприклад, нарощування обсягу кешу, додавання нових блоків (Execution Unit). Усе це тягне у себе зростання кількості транзисторів, ускладнення процесора, збільшення площі кристала, отже, вартості.

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

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

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

Chip Multiprocessing (CMP)- два процесорні ядра фізично розташовуються одному кристалі, використовуючи загальний чи роздільний кеш. Звичайно, розмір кристала виходить досить великим, і на ціні це не може не позначитися. Зауважимо, що кілька таких "здвоєних" CPU також можуть працювати у багатопроцесорній системі.

Time-Slice Multithreading. Процесор перемикається між програмними потоками через фіксовані часові відтинки. Накладні витрати часом виходять досить значними, особливо якщо будь-який процес перебуває в очікуванні.

Switch-on-Event Multithreading. Переключення завдань у разі тривалих пауз, наприклад " непопадань в кеш " (cache misses), велика кількість яких притаманно серверних додатків. У цьому випадку процес, що очікує завантаження даних із порівняно повільної пам'яті в кеш, зупиняється, вивільняючи ресурси CPU інших процесів. Однак Switch-on-Event Multithreading, як і Time-Slice Multithreading, не завжди дозволяє досягти оптимального використання ресурсів процесора, зокрема через помилки у передбаченні розгалужень, залежності інструкцій тощо.

Simultaneous Multithreading. У цьому випадку програмні потоки виконуються на одному процесорі "одночасно", тобто без перемикання між ними. Ресурси CPU розподіляються динамічно, за принципом "не використовуєш – віддай іншому". Саме такий підхід покладено в основу технології Intel Hyper-Threading, до розгляду якої ми переходимо.

Як працює Hyper-Threading

Як відомо, нинішня "парадигма комп'ютера" передбачає багатопоточні обчислення. Це стосується як серверів, де таке поняття існує спочатку, а й робочих станцій і настільних систем. Потоки (threads) можуть відноситися як до одного, так і до різних додатків, але майже завжди активних потоків більше, ніж один (щоб переконатися в цьому, достатньо в Windows 2000/XP відкрити Task Manager і включити відображення числа потоків). Разом з тим звичайний процесор може одночасно виконувати тільки один з потоків і змушений постійно перемикатися між ними.

Вперше технологія Hyper-Threading була реалізована в процесорі Intel Xeon MP (Foster MP), на якому йшла її "обкатка". Нагадаємо, що Xeon MP, офіційно представлений на IDF Spring 2002, використовує споріднене Pentium 4 Willamette ядро, що містить 256 KB L2-кешу та 512 KB/1 MB L3-кешу і підтримує роботу в 4-процесорних конфігураціях. Також підтримка Hyper-Threading є в процесорі для робочих станцій - Intel Xeon (ядро Prestonia, 512 KB L2-кеша), що вийшов на ринок дещо раніше, ніж Xeon MP. З двопроцесорними конфігураціями на Intel Xeon наші читачі вже знайомі, тому ми розглянемо можливості Hyper-Threading саме на прикладі цих CPU – як теоретично, так і практично. Як би там не було, а "простий" Xeon - річ більш приземлена і зручна, ніж Xeon MP у 4-процесорних системах.

Принцип дії Hyper-Threading полягає в тому, що у кожний час лише частина ресурсів процесора використовується під час виконання програмного коду. Невикористовувані ресурси також можна завантажити роботою - наприклад, задіяти для паралельного виконання ще однієї програми (чи іншого потоку цієї програми). В одному фізичному процесорі Intel Xeon формуються два логічні процесори (LP - Logical Processor), які поділяють між собою обчислювальні ресурси CPU. Операційна система та програми "бачать" саме два CPU і можуть розподіляти роботу між ними, як і у разі повноцінної двопроцесорної системи.

Одна з цілей реалізації Hyper-Threading - за наявності лише одного активного потоку дозволити йому виконуватися з тією самою швидкодією, як і звичайному CPU. Для цього у процесора передбачено два основні режими роботи: Single-Task (ST) та Multi-Task (MT). У режимі ST активним є лише один логічний процесор, який користується безроздільно доступними ресурсами (режими ST0 і ST1); інший LP зупинено командою HALT. При появі другого програмного потоку логічний процесор, що не діяв, активується (за допомогою переривання), і фізичний CPU переводиться в режим MT. Зупинка невикористовуваних LP командою HALT покладено на операційну систему, яка в результаті відповідає за таке ж швидке виконання одного потоку, як і у випадку без Hyper-Threading.

Для кожного з двох LP зберігається так званий Architecture State (AS), що включає стан регістрів різного типу - загального призначення, керуючих, APIC і службових. У кожного LP є свої APIC (контролер переривань) та набір регістрів, для коректної роботи з якими вводиться поняття Register Alias ​​Table (RAT), що відстежує відповідність між вісьма регістрами загального призначення IA-32 та 128 регістрів фізичного CPU (по одній RAT на кожен LP ).

Під час роботи двох потоків підтримуються два відповідні набори Next Instruction Pointers. Більшість інструкцій береться з Trace Cache (TC), де вони зберігаються в декодованому вигляді, і доступ до TC два активні LP отримують по черзі, через такт. У той самий час, коли активний лише одне LP, він отримує монопольний доступом до TC без чергування за тактами. Аналогічним чином відбувається і доступ до Microcode ROM. Блоки ITLB (Instruction Translation Look-aside Buffer), що задіяні за відсутності необхідних інструкцій у кеші команд, дублюються і доставляють команди кожен свого потоку. Блок декодування інструкцій IA-32 Instruction Decode розділяється і у разі, коли потрібно декодування інструкцій для обох потоків, обслуговує їх по черзі (знову-таки через такт). Блоки Uop Queue та Allocator поділяються надвоє, відводячи по половині елементів для кожного LP. Schedulers числом 5 штук обробляють черги декодованих команд (Uops) попри приналежність до LP0/LP1 і направляють команди виконання потрібним Execution Units - залежно від готовності до виконання перших та доступності других. Кеші всіх рівнів (L1/L2 для Xeon, а також L3 для Xeon MP) повністю розділяються між двома LP, однак для забезпечення цілісності даних запису в DTLB (Data Translation Look-aside Buffer) забезпечуються дескрипторами у вигляді ID логічних процесорів.

Таким чином, інструкції обох логічних CPU можуть виконуватися одночасно на ресурсах одного фізичного процесора, які поділяються на чотири класи:

  • дубльовані (Duplicated);
  • повністю розділяються (Fully Shared);
  • із дескрипторами елементів (Entry Tagged);
  • динамічно поділяються (Partitioned) залежно від режиму роботи ST0/ST1 або MT.

При цьому більшість програм, що отримують прискорення в багатопроцесорних системах, можуть також прискорюватися і на CPU з включеним Hyper-Threading без модифікацій. Але існують і проблеми: наприклад, якщо один процес перебуває в циклі очікування, він може зайняти всі ресурси фізичного CPU, запобігаючи роботі другого LP. Таким чином, продуктивність при використанні Hyper-Threading може іноді падати (до 20%). Для запобігання цьому Intel рекомендує замість порожніх циклів очікування використовувати інструкцію PAUSE (з'явилася в IA-32 з Pentium 4). Також ведеться досить серйозна робота з автоматичної та напівавтоматичної оптимізації коду при компіляції - наприклад, щодо цього відчутно просунулися компілятори серії Intel OpenMP C++/Fortran Compilers ().

Ще однією метою першої реалізації Hyper-Threading, за словами Intel, було зведення до мінімуму зростання кількості транзисторів, площі кристала та енергоспоживання при помітному прирості швидкодії. Перша частина цього зобов'язання вже виконана: додавання до Xeon/Xeon MP підтримки Hyper-Threading збільшило площу кристалу та енергоспоживання менш ніж на 5%. Що ж вийшло з другою частиною (продуктивністю), нам ще доведеться перевірити.

Практична частина

З цілком зрозумілих причин ми не проводили тестів 4-процесорних серверних систем на Xeon MP із включеним Hyper-Threading. По-перше, це досить трудомістко. А по-друге, зважись ми на такий подвиг - все одно зараз, менш ніж через місяць після офіційного оголошення, абсолютно нереально отримати це дороге обладнання. Тому вирішено було обмежитися тією ж системою із двома Intel Xeon 2.2 GHz, на якій проводилося перше тестування цих процесорів (див. посилання на початку статті). Система ґрунтувалася на материнській платі Supermicro P4DC6+ (чіпсет Intel i860), містила 512 MB RDRAM-пам'яті, відеокарту на чіпі GeForce3 (64 MB DDR, драйвери Detonator 21.85), жорсткий диск Western Digital WD300BB та 6X DVD-ROM; як ОС використовувалася Windows 2000 Professional SP2.

Спочатку кілька загальних вражень. При встановленні одного Xeon із ядром Prestonia на старті системи BIOS виводить повідомлення про наявність двох CPU; якщо ж встановлені два процесори, користувач бачить повідомлення про чотири CPU. Операційна система нормально розпізнає "обидва процесори", але тільки якщо виконані дві умови.

По-перше, у CMOS Setup в останніх версій BIOS плат Supermicro P4DCxx з'явився пункт Enable Hyper-Threading, без дозволу якого ОС розпізнає лише фізичний процесор(-и). По-друге, повідомлення ОС про наявність додаткових логічних процесорів використовуються можливості ACPI. Тому для залучення Hyper-Threading в CMOS Setup має бути включена опція ACPI, і для самої ОС також має бути встановлений HAL (Hardware Abstraction Layer) з підтримкою ACPI. Благо, у Windows 2000 зміна HAL зі Standard PC (або MPS Uni-/Multiprocessor PC) на ACPI Uni-/Multiprocessor PC робиться легко – заміною "драйвера комп'ютера" у менеджері пристроїв. У той же час для Windows XP єдиним законним способом переходу на ACPI HAL є переустановка системи поверх існуючої інсталяції.

Але всі приготування зроблені, і наша Windows 2000 Pro вже свято вірить у те, що працює на двопроцесорній системі (хоча насправді процесор встановлений тільки один). Тепер за традицією настав час визначитися з цілями тестування. Отже, ми хочемо:

  • Оцінити вплив Hyper-Threading на продуктивність програм різного класу.
  • Порівняти цей ефект із ефектом від установки другого процесора.
  • Перевірити, наскільки "чесно" ресурси віддаються активному логічному процесору, коли другий LP не діє.

Для оцінки продуктивності ми взяли вже знайомий читачам набір додатків, який використовувався у тестуваннях workstation-систем. Почнемо, мабуть, з кінця та перевіримо "рівноправність" логічних CPU. Все дуже просто: спочатку ми проводимо тести на одному процесорі з відключеним Hyper-Threading, а потім повторюємо процес, включивши Hyper-Threading і використовуючи лише один із двох логічних CPU (за допомогою Task Manager). Оскільки в даному випадку нас цікавлять лише відносні значення, результати всіх тестів наведені до виду "більше - краще" та нормалізовані (за одиницю взято показники однопроцесорної системи без Hyper-Threading).

Що ж, як можна бачити, обіцянки Intel тут виконані: за наявності лише одного активного потоку продуктивність кожного з двох LP точно дорівнює швидкодії фізичного CPU без Hyper-Threading. Недіючий LP (причому як LP0, так і LP1) дійсно припиняється, а ресурси, що розділяються, наскільки про це можна судити за отриманими результатами, повністю передаються в користування активному LP.

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

Рендеринг. Результати чотирьох тестів у пакетах 3D-моделювання 3D Studio MAX 4.26, Lightwave 7b та A|W Maya 4.0.1 об'єднані в одну діаграму через їхню схожість.

У всіх чотирьох випадках (для Lightwave - дві різні сцени) завантаження CPU за наявності одного процесора з вимкненим Hyper-Threading майже завжди тримається на рівні 100%. Проте при включенні Hyper-Threading розрахунок сцен прискорюється (в результаті чого у нас навіть народився жарт про завантаження CPU більше 100%). У трьох тестах видно приріст продуктивності від Hyper-Threading 14-18% - з одного боку, негусто в порівнянні з другим CPU, але з іншого - досить непогано, враховуючи "безкоштовність" цього ефекту. В одному з двох тестів з Lightwave приріст швидкодії практично нульовий (мабуть, позначається специфіка цього повного дива додатку). Але негативного результату немає ніде, а помітний приріст у інших трьох випадках обнадіює. І це при тому, що паралельні процеси рендерингу роблять подібну роботу і, напевно, не найкращим чином можуть одночасно задіяти ресурси фізичного CPU.

Photoshop та MP3-кодування. Кодек GOGO-no-coda 2.39c один з небагатьох підтримує SMP, і на ньому помітний 34% приріст швидкодії від двопроцесорності. Разом з тим ефект від Hyper-Threading у даному випадку нульовий (різницю в 3% ми суттєвою не рахуємо). А ось у тесті з Photoshop 6.0.1 (скрипт, що складається з великого набору команд та фільтрів) видно уповільнення при включенні Hyper-Threading, хоча другий фізичний CPU додає у цьому випадку 12% продуктивності. Ось, власне, перший випадок, коли Hyper-Threading викликає падіння швидкодії.

Професійний OpenGL. Те, що SPEC ViewPerf та багато інших OpenGL-додатків часто уповільнюються в SMP-системах, відомо давно.

OpenGL і двопроцесорність: чому вони не дружать

Багато разів у статтях ми звертали увагу читачів на те, що двопроцесорні платформи при виконанні професійних OpenGL-тестів дуже рідко показують хоч трохи істотну перевагу порівняно з однопроцесорними. І мало того, часті випадки, коли установка другого процесора навпаки, погіршує швидкодію системи при малюванні динамічних тривимірних сцен.

Звісно, ​​помічали цю дивність як ми. Деякі тестери просто мовчки оминали цей факт - наприклад, наводячи результати порівняння за тестами SPEC ViewPerf тільки для двопроцесорних конфігурацій, уникаючи таким чином пояснень "чому двопроцесорна система повільніша?". Інші ж будували всі можливі фантастичні припущення про когерентність кешів, необхідність її підтримувати накладні витрати, що виникають через це і т.п. І чомусь нікого не дивувало, що, наприклад, стежити за когерентністю процесорам чомусь закортіло саме при віконному OpenGL-рендерингу (за своєю "обчислювальною" суттю мало чим відрізняється від будь-якого іншого розрахункового завдання).

Насправді пояснення, на наш погляд, набагато простіше. Як відомо, програма може виконуватися на двох процесорах швидше, ніж на одному, якщо:

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

Тепер спрощено розглянемо як виглядає OpenGL-рендеринг, що виконується двома потоками. Якщо програма, "бачачи" два процесори, створює два потоки OpenGL-рендерінгу, то для кожного з них, згідно з правилами OpenGL, створюється свій gl-контекст. Відповідно, кожен потік виконує рендеринг у свій gl-контекст. Але проблема в тому, що для вікна, в яке відбувається виведення зображення, лише один gl-контекст може бути поточним у кожний момент. Відповідно потоки у разі просто " по черзі " виводять згенероване зображення у вікно, роблячи поперемінно свій контекст поточним. Чи потрібно говорити, що таке "чергування контекстів" може дуже дорого обходитись у сенсі накладних витрат?

Також для прикладу наведемо графіки використання двох CPU у кількох додатках, що відображають OpenGL-сцени. Усі виміри проведені на платформі наступної конфігурації:

  • один або два Intel Xeon 2.2 GHz (Hyper-Threading вимкнено);
  • 512 MB RDRAM-пам'яті;
  • материнська плата Supermicro P4DC6+;
  • відеокарта ASUS V8200 Deluxe (NVidia GeForce3, 64 МБ DDR SDRAM, драйвери Detonator 21.85);
  • Windows 2000 Professional SP2;
  • відеорежим 1280x1024x32 bpp, 85 Hz, Vsync вимкнено.

Синім та червоним зображені графіки завантаженості CPU 0 та CPU 1 відповідно. Лінія посередині – підсумковий графік CPU Usage. Три графіки відповідають двом сценам із 3D Studio MAX 4.26 та частині тесту SPEC ViewPerf (AWadvs-04).


CPU Usage: анімація 3D Studio MAX 4.26 - Anibal (with manipulators).max


CPU Usage: анімація 3D Studio MAX 4.26 - Rabbit.max


CPU Usage: SPEC ViewPerf 6.1.2 - AWadvs-04

Така ж картина повторюється ще в масі інших додатків OpenGL. Два процесори зовсім не турбуються роботою, і загальний CPU Usage виявляється на рівні 50-60%. У той же час для однопроцесорної системи у всіх цих випадках CPU Usage впевнено тримається на рівні 100%.

Тому не дивно те, що багато OpenGL-додатків не надто прискорюються в дуальних системах. Ну а те, що вони часом навіть уповільнюються, має, на наш погляд, цілком логічне пояснення.

Ми можемо констатувати, що при двох логічних CPU падіння швидкодії ще більш значно, що цілком зрозуміло: два логічні процесори заважають один одному точно так само, як і два фізичні. Але їхня загальна продуктивність, природно, виявляється при цьому нижче, тому при включенні Hyper-Threading вона знижується ще більше, ніж просто при роботі двох фізичних CPU. Результат передбачуваний і простий: Hyper-Threading, як і "справжній" SMP, для OpenGL буває протипоказаний.

CAD-додатки. Попередній висновок підтверджується і результатами двох CAD-тестів – SPECapc for SolidEdge V10 та SPECapc for SolidWorks. Показники графічних складових цих тестів для Hyper-Threading схожі (хоча у випадку SMP-системи для SolidEdge V10 результат трохи вищий). А ось результати навантажувальних процесор тестів CPU_Score змушують задуматися: 5-10%-ний приріст від SMP і 14-19%-ве уповільнення від Hyper-Threading.

Але врешті-решт Intel чесно визнає в деяких випадках можливість падіння продуктивності при Hyper-Threading - наприклад, при використанні порожніх циклів очікування. Ми можемо лише припустити, що це і є причиною (детальне дослідження коду SolidEdge та SolidWorks виходить за межі статті). Адже всім відомий консерватизм розробників CAD-додатків, які віддають перевагу перевіреній надійності і не особливо поспішають переписувати код з урахуванням нових віянь у програмуванні.

Підбиття підсумків, або "Увага, правильне питання"

Hyper-Threading працює, у цьому жодних сумнівів не лишається. Безумовно, технологія не універсальна: є програми, яким "поганіє" від Hyper-Threading, і у разі поширення цієї технології їх бажано модифікувати. Але хіба не те саме сталося свого часу з MMX і SSE і продовжує відбуватися з SSE2?

Однак тут постає питання про застосування цієї технології до наших реалій. Варіант однопроцесорної системи на Xeon з Hyper-Threading ми відкинемо відразу (або допустимо тільки як тимчасовий, в очікуванні покупки другого процесора): навіть 30%-ний приріст продуктивності ніяк не виправдовує ціну - тоді краще придбати звичайний Pentium 4. Залишається число CPU від двох та вище.

А тепер уявимо, що ми купуємо двопроцесорну систему на Xeon (скажімо, з Windows 2000/XP Professional). Два CPU встановлені, Hyper-Threading включений, BIOS знаходить цілих чотири логічні процесори, зараз ух як злетимо… Стоп. А ось скільки процесорів побачить наша операційна система? Правильно, дві. Усього два, оскільки на більшу кількість вона просто не розрахована. Це будуть два фізичні процесори, тобто працювати все буде так само, як і при відключеному Hyper-Threading, - не повільніше (два "додаткових" логічних CPU просто зупиняться), але і не швидше (перевірено додатковими тестами, результати не наводимо через їхню повну очевидність). М-так, приємного мало.

Що ж лишається? Ну не ставити ж Advanced Server або .NET Server на нашу workstation насправді? Ні, система встановиться, пізнає всі чотири логічні процесори і функціонуватиме. Ось тільки серверна ОС виглядає на робочій станції, м'яко кажучи, трохи дивно (не кажучи вже про фінансові аспекти). Єдиний розумний випадок - це коли наша двопроцесорна Xeon-система і буде виконувати роль сервера (принаймні деякі збирачі анітрохи не сумнівалися вже налагодили випуск серверів на workstation-процесорах Xeon). Але ось для дуальних workstation з відповідними ОС застосування Hyper-Threading залишається під питанням. Intel зараз активно виступає за ліцензування ОС за кількістю не логічних, а фізичних CPU. Дискусії поки що йдуть, і загалом багато залежить від того, чи побачимо ми ОС для робочих станцій з підтримкою чотирьох процесорів.

Ну а із серверами все виходить досить просто. Наприклад, Windows 2000 Advanced Server, встановлений на двопроцесорну Xeon-систему з включеним Hyper-Threading, "побачить" чотири логічні процесори і буде спокійно на ній працювати. Для оцінки того, що дає Hyper-Threading у серверних системах, ми наводимо результати Intel Microprocessor Software Labs для двопроцесорних систем на Xeon MP та кількох серверних програмах Microsoft.

Прибавка продуктивності 20-30% для двопроцесорного сервера "задарма" - річ більш ніж приваблива (особливо в порівнянні з покупкою "справжньої" 4-процесорної системи).

Ось і виходить, що на даний момент практична застосування Hyper-Threading можлива тільки в серверах. Питання ж із робочими станціями залежить від рішення з ліцензуванням ОС. Хоча ще одне застосування Hyper-Threading цілком реальне - якщо і настільні процесори отримають підтримку цієї технології. Наприклад (пофантазуємо), чим погана система з Pentium 4 з підтримкою Hyper-Threading, на яку встановлена ​​Windows 2000/XP Professional з підтримкою SMP?.. Втім, нічого неймовірного в цьому немає: повні ентузіазму розробники Intel обіцяють повсюдне впровадження Hyper-Thread - від серверів до настільних та мобільних систем.

  • Tutorial

У цій статті я спробую описати термінологію, яка використовується для опису систем, здатних виконувати кілька програм паралельно, тобто багатоядерних, багатопроцесорних, багатопотокових. Різні види паралелізму в ЦПУ IA-32 з'являлися в різні часи і в дещо непослідовному порядку. У всьому цьому досить легко заплутатися, особливо з огляду на те, що операційні системи дбайливо ховають деталі від не дуже досвідчених прикладних програм.

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

Попередження про знаки ®, ™, у статті

Мій коментар пояснює, чому співробітники компаній мають у публічних комунікаціях використовувати знаки авторського права. У цій статті їх довелося використати досить часто.

Процесор

Звичайно ж, найдавніший, найчастіше використовуваний і неоднозначний термін – це процесор.

У сучасному світі процесор - це те (package), що ми купуємо в красивій коробці Retail або не дуже красивому OEM-пакетиці. Неподільна сутність, що вставляється у роз'єм (socket) на материнській платі. Навіть якщо ніякого роз'єму немає і зняти його не можна, тобто якщо він припаяний намертво, це один чіп.

Мобільні системи (телефони, планшети, ноутбуки) та більшість десктопів мають один процесор. Робочі станції та сервери іноді можуть похвалитися двома або більше процесорами на одній материнській платі.

Підтримка кількох центральних процесорів в одній системі потребує численних змін її дизайну. Як мінімум, необхідно забезпечити їхнє фізичне підключення (передбачити кілька сокетів на материнській платі), вирішити питання ідентифікації процесорів (див. далі в цій статті, а також мою попередню нотатку), погодження доступів до пам'яті та доставки переривань (контролер переривань повинен уміти маршрутизувати переривання на кілька процесорів) і, звичайно, підтримки з боку операційної системи. Я, на жаль, не зміг знайти документальної згадки моменту створення першої багатопроцесорної системи на процесорах Intel, проте Вікіпедія стверджує, що Sequent Computer Systems постачала їх вже в 1987 році, використовуючи процесори Intel 80386. Широко поширеною підтримка кількох чіпів в одній системі стає доступною , починаючи з Intel Pentium.

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


До зльоту готовий! Intel® Desktop Board D5400XS

Ядро

Історично багатоядерність в Intel IA-32 з'явилася пізніше за Intel® HyperThreading, проте в логічній ієрархії вона йде наступною.

Здавалося б, якщо в системі більше процесорів, то вища її продуктивність (на задачах, здатних задіяти всі ресурси). Однак, якщо вартість комунікацій між ними занадто велика, весь виграш від паралелізму вбивається тривалими затримками на передачу загальних даних. Саме це спостерігається у багатопроцесорних системах – як фізично, так і логічно вони знаходяться дуже далеко один від одного. Для ефективної комунікації в таких умовах доводиться вигадувати спеціалізовані шини, такі як Intel QuickPath Interconnect. Енергоспоживання, розміри та ціна кінцевого рішення, звичайно, від цього не знижуються. На допомогу повинна прийти висока інтеграція компонентів - схеми, що виконують частини паралельної програми, треба підтягнути ближче один до одного, бажано на один кристал. Іншими словами, в одному процесорі слід організувати декілька ядер, у всьому ідентичних один одному, але працюючих незалежно.

Перші багатоядерні процесори IA-32 від Intel були представлені у 2005 році. З того часу середня кількість ядер у серверних, десктопних, а нині й мобільних платформах неухильно зростає.

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


Мікрознімок чотириядерного процесора Intel з кодовим ім'ям Nehalem. Виділено окремі ядра, загальний кеш третього рівня, а також лінки QPI до інших процесорів та загальний контролер пам'яті.

Гіперпотік

До приблизно 2002 єдиний спосіб отримати систему IA-32, здатну паралельно виконувати дві або більше програми, полягав у використанні саме багатопроцесорних систем. У Intel Pentium 4, а також лінійці Xeon з кодовим ім'ям Foster (Netburst) була представлена ​​нова технологія - гіпертреди або гіперпотоки, - Intel HyperThreading (далі HT).

Ніщо не нове під місяцем. HT - це окремий випадок того, що в літературі називається одночасною багатопоточністю (simultaneous multithreading, SMT). На відміну від «справжніх» ядер, що є повними та незалежними копіями, у разі HT в одному процесорі дублюється лише частина внутрішніх вузлів, що в першу чергу відповідають за зберігання архітектурного стану – регістри. Виконавчі ж вузли, відповідальні за організацію та обробку даних, залишаються в однині, і в будь-який момент часу використовуються максимум одним із потоків. Як і ядра, гіперпотоки ділять між собою кеші, однак, починаючи з якого рівня - це залежить від конкретної системи.

Я не намагатимуся пояснити всі плюси та мінуси дизайнів з SMT взагалі і з HT зокрема. Читач, що цікавиться, може знайти досить докладне обговорення технології в багатьох джерелах, і, звичайно ж, у Вікіпедії. Однак зазначу наступний важливий момент, який пояснює поточні обмеження на кількість гіперпотоків у реальній продукції.

Обмеження потоків
У яких випадках наявність "нечесної" багатоядерності у вигляді HT виправдана? Якщо один потік програми неспроможна завантажити всі виконуючі вузли всередині ядра, їх можна «позичити» іншому потоку. Це типово для додатків, що мають «вузьке місце» не в обчисленнях, а при доступі до даних, тобто часто генерують промахи кешу і змушені чекати на доставку даних з пам'яті. У цей час ядро ​​без HT буде змушене простоювати. Наявність же HT дозволяє швидко переключити вільні виконуючі вузли до іншого архітектурного стану (т.к. воно дублюється) і виконувати його інструкції. Це - окремий випадок прийому під назвою latency hiding, коли одна тривала операція, протягом якої корисні ресурси простоюють, маскується паралельним виконанням інших завдань. Якщо програма вже має високий рівень утилізації ресурсів ядра, наявність гіперпотоків не дозволить отримати прискорення - тут потрібні «чесні» ядра.

Типові сценарії роботи десктопних та серверних додатків, розрахованих на машинні архітектури загального призначення, мають потенціал до паралелізму, що реалізується за допомогою HT. Однак цей потенціал швидко «витрачається». Можливо, з цієї причини майже на всіх процесорах IA-32 кількість апаратних гіперпотоків не перевищує двох. На типових сценаріях виграш від використання трьох і більше гіперпотоків був невеликий, а ось програш у розмірі кристала, його енергоспоживання та вартості значний.

Інша ситуація спостерігається на типових завданнях, які виконуються на відеоприскорювачах. Тому для цих архітектур характерне використання техніки SMT з більшим числом потоків. Так як співпроцесори Intel Xeon Phi (представлені в 2010 році) ідеологічно і генеалогічно досить близькі до відеокарт, на них може бути чотиригіперпотоку на кожному ядрі – унікальна для IA-32 конфігурація.

Логічний процесор

Із трьох описаних «рівнів» паралелізму (процесори, ядра, гіперпотоки) у конкретній системі можуть бути деякі або навіть усі. На це впливають налаштування BIOS (багатоядерність і багатопоточність відключаються незалежно), особливості мікроархітектури (наприклад, HT був відсутній в Intel Core Duo, але був повернутий з випуском Nehalem) і події при роботі системи (багатопроцесорні сервери можуть вимикати процесори, що відмовили, у разі виявлення несправностей і продовжувати «летіти» на тих, хто залишився). Як цей багаторівневий зоопарк паралелізму видно операційній системі і, зрештою, прикладним додаткам?

Далі для зручності позначимо кількості процесорів, ядер та потоків у деякій системі трійкою ( x, y, z), де x- Це число процесорів, y- число ядер у кожному процесорі, а z- Число гіперпотоків у кожному ядрі. Далі я називатиму цю трійку топологією- усталений термін, що мало що має з розділом математики. твір p = xyzвизначає число сутностей, які називаються логічними процесорамисистеми. Воно визначає повну кількість незалежних контекстів прикладних процесів у системі із загальною пам'яттю, що виконуються паралельно, які операційна система змушена враховувати. Я говорю «змушена», тому що вона не може керувати порядком виконання двох процесів, що знаходяться на різних логічних процесорах. Це стосується навіть гіперпотоків: хоча вони і працюють «послідовно» на одному ядрі, конкретний порядок диктується апаратурою і недоступний для спостереження або управління програмами.

Найчастіше операційна система ховає від кінцевих додатків особливості фізичної топології системи, де вона запущена. Наприклад, три наступні топології: (2, 1, 1), (1, 2, 1) і (1, 1, 2) - ОС представлятиме у вигляді двох логічних процесорів, хоча перша з них має два процесори, друга - два ядра, а третя - лише два потоки.


Windows Task Manager показує 8 логічних процесорів; але скільки це в процесорах, ядрах та гіперпотоках?


Linux top показує 4 логічні процесори.

Це досить зручно для творців прикладних додатків - їм не доводиться мати справу з найчастіше несуттєвими для них особливостями апаратури.

Програмне визначення топології

Звичайно, абстрагування топології в однину логічних процесорів у ряді випадків створює достатньо підстав для плутанини та непорозумінь (у спекотних Інтернет-спорах). Обчислювальні програми, які бажають вичавити із заліза максимум продуктивності, вимагають детального контролю над тим, де будуть розміщені їхні потоки: ближче один до одного на сусідніх гіперпотоках або навпаки, подалі на різних процесорах. Швидкість комунікацій між логічними процесорами у складі одного ядра чи процесора значно вища, ніж швидкість передачі між процесорами. Можливість неоднорідності у створенні оперативної пам'яті також ускладнює картину.

Інформація про топологію системи в цілому, а також положення кожного логічного процесора в IA-32 доступна за допомогою інструкції CPUID. З появи перших багатопроцесорних систем схема ідентифікації логічних процесорів кілька разів розширювалася. На даний момент її частини містяться в аркушах 1, 4 та 11 CPUID. Який із аркушів слід дивитися, можна визначити з наступної блок-схеми, взятої зі статті:

Я не втомлюватиму всіма подробицями окремих частин цього алгоритму. Якщо виникне інтерес, цьому можна присвятити наступну частину цієї статті. Відішлю читача, що цікавиться, в якій це питання розбирається максимально докладно. Тут я спочатку коротко опишу, що таке APIC і як він пов'язаний із топологією. Потім розглянемо роботу з листом 0xB (одинадцять у десятковому численні), який зараз є останнім словом в «апікобудуванні».

APIC ID
Local APIC (advanced programmable interrupt controller) - це пристрій (який нині входить до складу процесора), що відповідає за роботу з перериваннями, що приходять до конкретного логічного процесора. Свій власний APIC має кожен логічний процесор. І кожен із них у системі повинен мати унікальне значення APIC ID. Це число використовується контролерами переривань для адресації при доставці повідомлень, а рештою (наприклад, операційною системою) - для ідентифікації логічних процесорів. Специфікація на цей контролер переривань еволюціонувала, пройшовши від мікросхеми Intel 8259 PIC через Dual PIC, APIC та xAPIC до x2APIC.

На даний момент ширина числа, що зберігається в APIC ID, досягла повних 32 біт, хоча в минулому воно було обмежене 16, а ще раніше - лише 8 бітами. Нині залишки старих днів розкидані по всьому CPUID, проте в CPUID.0xB.EDX повертаються всі 32 біти APIC ID. На кожному логічному процесорі, незалежно виконує інструкцію CPUID, буде повертатися своє значення.

З'ясування родинних зв'язків
Значення APIC ID саме собою нічого не говорить про топологію. Щоб дізнатися, які два логічні процесори знаходяться всередині одного фізичного (тобто є «братами» гіпертредами), які два - всередині одного процесора, а які виявилися зовсім у різних процесорах, треба порівняти їх значення APIC ID. Залежно від ступеня кревності деякі їх біти збігатимуться. Ця інформація міститься в підливах CPUID.0xB, які кодуються за допомогою операнда в ECX. Кожен з них описує положення бітового поля одного з рівнів топології в EAX (точніше, число біт, які потрібно зрушити в APIC ID вправо, щоб усунути нижні рівні топології), а також тип цього рівня - гіперпотік, ядро ​​або процесор, - в ECX.

У логічних процесорів, що знаходяться всередині одного ядра, збігатимуться всі біти APIC ID, крім тих, що належать полю SMT. Для логічних процесорів, що у одному процесорі, - всі біти, крім полів Core і SMT. Оскільки кількість підлистів у CPUID.0xB може зростати, дана схема дозволить підтримати опис топологій і з більшим числом рівнів, якщо в майбутньому виникне потреба. Більше того, можна буде запровадити проміжні рівні між існуючими.

Важливе наслідок організації цієї схеми у тому, що у наборі всіх APIC ID всіх логічних процесорів системи може бути «дірки», тобто. вони не йдуть послідовно. Наприклад, у багатоядерному процесорі з вимкненим HT всі APIC ID можуть виявитися парними, оскільки молодший біт, відповідальний за кодування номера гіперпотоку, завжди буде нульовим.

Зазначу, що CPUID.0xB - не єдине джерело інформації про логічні процесори, доступне операційній системі. Список всіх процесорів, доступний їй, разом із їх значеннями APIC ID, кодується у таблиці MADT ACPI .

Операційні системи та топологія

Операційні системи надають інформацію про топологію логічних процесорів додатків за допомогою своїх власних інтерфейсів.

У Linux інформація про топологію міститься в псевдофайлі /proc/cpuinfo, а також виведенні команди dmidecode. У прикладі нижче я фільтрую вміст cpuinfo на деякій чотириядерній системі без HT, залишаючи тільки записи, що стосуються топології:

Прихований текст

ggg@shadowbox:~$ cat /proc/cpuinfo |grep "processor\|physical\ id\|siblings\|core\|cores\|apicid" processor: 0 physical id: 0 siblings: 4 core id: 0 cpu cores: 2 apicid: 0 initial apicid: 0 processor: 1 physical id: 0 siblings: 4 core id: 0 cpu cores: 2 apicid: 1 initial apicid: 1 processor: 2 physical id: 0 siblings: 4 core id: 1 2 apicid: 2 initial apicid: 2 processor: 3 physical id: 0 siblings: 4 core id: 1 cpu cores: 2 apicid: 3 initial apicid: 3

У FreeBSD топологія повідомляється через механізм sysctl у змінній kern.sched.topology_spec у вигляді XML:

Прихований текст

user@host:~$ sysctl kern.sched.topology_spec kern.sched.topology_spec: 0, 1, 2, 3, 4, 5, 6, 7 0, 1, 2, 3, 4, 5, 6, 7 0, 1 THREAD groupSMT group 2, 3 THREAD groupSMT group 4, 5 THREAD groupSMT group 6, 7 THREAD groupSMT group

У MS Windows 8 інформацію про топології можна побачити у диспетчері завдань Task Manager.

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

Відео-формат статті «Вся правда про багатоядерні процесори»

Просте пояснення питання "що таке процесор"

Мікропроцесор - один з основних пристроїв у комп'ютері. Цю суху офіційну назву частіше скорочують просто до «процесор») . Процесор - мікросхема, за площею порівнянна з сірниковою коробкою. Якщо завгодно, процесор це як мотор в автомобілі. Найважливіша частина, але зовсім не єдина. Є у машини ще й колеса, і кузов, і програвач із фарами. Але саме процесор (як і двигун автомобіля) визначає потужність «машини».

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

Функція процесора - обчислення. Не так важливо, які саме. Справа в тому, що вся робота комп'ютера пов'язана виключно на арифметичних обчисленнях. Додавання, множення, віднімання та інша алгебра — цим усім займається мікросхема під назвою «процесор». А результати таких обчислень виводяться на екран у вигляді гри, ордівського файлу або просто робочого столу.

Головна частина комп'ютера, яка займається обчисленнями - ось, що таке процесор.

Що таке процесорне ядро ​​та багатоядерність

Споконвіку процесорних «століття» ці мікросхеми були одноядерними. Ядро - це, власне, сам процесор. Його основна та головна частина. Є у процесорів та інші частини — скажімо, «ніжки»-контакти, мікроскопічна «електропроводка» — але саме той блок, який відповідає за обчислення, називається ядром процесора. Коли процесори стали зовсім невеликими, то інженери вирішили поєднати всередині одного процесорного корпусу відразу кілька ядер.

Якщо уявити процесор у вигляді квартири, то ядро ​​це велика кімната в такій квартирі. Однокімнатна квартира - це одне процесорне ядро ​​(велика кімната-зал), кухня, санвузол, коридор ... Двокімнатна квартира - це вже як два процесорні ядра разом з іншими кімнатами. Бувають і три-, і чотири, і навіть 12-кімнатні квартири. Також і у випадку з процесорами: всередині одного кристала-квартири може бути кілька ядер-кімнат.

Багатоядерність- Це поділ одного процесора на кілька однакових функціональних блоків. Кількість блоків – це число ядер усередині одного процесора.

Різновиди багатоядерних процесорів

Існує помилка: «що більше ядер у процесора — то краще». Саме так намагаються уявити справу маркетологи, яким платять за створення таких помилок. Їхнє завдання — продавати дешеві процесори, до того ж — дорожче і у величезних кількостях. Але насправді кількість ядер далеко не головна характеристика процесорів.

Повернемося до аналогії процесорів та квартир. Двокімнатна квартира дорожча, зручніша і престижніша за однокімнатну. Але якщо ці квартири знаходяться в одному районі, обладнані однаково, та й ремонт у них схожий. Існують слабенькі чотириядерні (а то й 6-ядерні) процесори, які значно слабші за двоядерні. Але повірити в це складно: ще б пак, магія великих чисел 4 або 6 проти «якийсь» двійки. Однак саме так і буває дуже часто. Начебто та ж чотирикімнатна квартира, але в убитому стані, без ремонту, у зовсім віддаленому районі — та ще й за ціною шикарної «двушки» в самому центрі.

Скільки буває ядер усередині процесора?

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

Був експеримент компанії AMD створювати і 3-ядерні процесори, але це вже у минулому. Вийшло дуже непогано, проте їхній час минув.

До речі, компанія AMD також виробляє багатоядерні процесори, але, як правило, вони відчутно слабші від конкурентів від Intel. Щоправда, і ціна у них значно нижча. Просто слід знати, що 4 ядра від AMD майже завжди виявляться помітно слабшими, ніж ті ж 4 ядра виробництва Intel.

Тепер ви знаєте, що у процесорів буває 1, 2, 3, 4, 6 та 12 ядер. Одноядерні та 12-ядерні процесори – велика рідкість. Триядерні процесори – справа минулого. Шестиядерні процесори або дуже дорогі (Intel), або не такі сильні (AMD), щоб переплачувати за число. 2 і 4 ядра - найпоширеніші та практичні пристрої, від найслабших до дуже потужних.

Частота багатоядерних процесорів

Одна з характеристик комп'ютерних процесорів – їхня частота. Ті самі мегагерці (а частіше – гігагерці). Частота - важлива характеристика, але далеко не єдина. Так, мабуть, ще й не найголовніша. Наприклад, двоядерний процесор з частотою 2 гігагерці — потужніша пропозиція, ніж його одноядерний побратим із частотою 3 гігагерці.

Зовсім не так вважати, що частота процесора дорівнює частоті його ядер, помноженої на кількість ядер. Якщо простіше, то у 2-ядерного процесора з частотою ядра 2 ГГц загальна частота в жодному разі не дорівнює 4 гігагерцям! Навіть поняття «загальна частота» немає. В даному випадку, частота процесорадорівнює саме 2 ГГц. Жодних множень, додавань чи інших операцій.

І знову «перетворимо» процесори на квартири. Якщо висота стель у кожній кімнаті — 3 метри, то загальна висота квартири залишиться такою ж — ті самі три метри, і ні сантиметром вище. Скільки кімнат не було б у такій квартирі, висота цих кімнат не змінюється. Також і тактова частота процесорних ядер. Вона не складається та не множиться.

Віртуальна багатоядерність, або Hyper-Threading

Існують ще й віртуальні процесорні ядра. Технологія Hyper-Threading у процесорах виробництва Intel змушує комп'ютер «думати», що всередині двоядерного процесора насправді 4 ядра. Дуже схоже на те, як один-єдиний жорсткий диск ділиться на кілька логічних— локальні диски C, D, E тощо.

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

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

Зазначимо, що найдорожчі та продуктивні процесори класуCorei7 обов'язково оснащеніHyper-Threading. У них 4 фізичні ядра та 8 віртуальних. Виходить, що одночасно на одному процесорі працюють 8 обчислювальних потоків. Менш дорогі, але також потужні процесори Intel класу Corei5складаються із чотирьох ядер, але Hyper Threading там не працює. Виходить, що Core i5 працюють із 4 потоками обчислень.

Процесори Corei3- Типові «середнячки», як за ціною, так і за продуктивністю. Вони мають два ядра і ніякого натяку на Hyper-Threading. Разом виходить, що у Corei3всього два обчислювальні потоки. Це ж стосується і відверто бюджетних кристалів. Pentium таCeleron. Два ядра, «гіпе-тредінг» відсутній = два потоки.

Чи потрібне комп'ютеру багато ядер? Скільки ядер потрібно у процесорі?

Усі сучасні процесори досить продуктивні для звичайних завдань. Перегляд інтернету, листування в соцмережах та електронною поштою, офісні завдання Word-PowerPoint-Excel: для цієї роботи підійдуть і слабенькі Atom, бюджетні Celeron і Pentium, не кажучи вже про більш потужні Core i3. Двох ядер для нормальної роботи більш ніж достатньо. Процесор із великою кількістю ядер не принесе значного приросту у швидкості.

Для ігор слід звернути увагу на процесориCorei3 абоi5. Швидше, продуктивність у іграх залежатиме не від процесора, а від відеокарти. Рідко в якій грі буде потрібна вся міць Core i7. Тому вважається, що ігри вимагають не більше чотирьох процесорних ядер, а найчастіше підійдуть і два ядра.

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

Чи є користь багатоядерних процесорів?

Безперечно, так. Одночасно комп'ютер займається кількома завданнями — хоча робота Windows (до речі, це сотні різних завдань) і, в той же час, програвання фільму. Програвання музики та перегляду інтернету. Робота текстового редактора та включена музика. Два процесорні ядра — а це, по суті, два процесори, впораються з різними завданнями швидше за один. Два ядра зроблять це трохи швидше. Чотири ще швидше, ніж два.

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

Тому міф, що укорінився, про те, що, нібито, програми не можуть використовувати кілька ядер — застаріла інформація. Колись справді було так, сьогодні ситуація покращала кардинально. Переваги від кількох ядер є незаперечними, це факт.

Коли менше ядер у процесора – краще

Не слід купувати процесор за невірною формулою «що більше ядер — то краще». Це не так. По-перше, 4, 6 і 8-ядерні процесори відчутно дорожчі за своїх двоядерних побратимів. Значна надбавка в ціні далеко не завжди виправдана з точки зору продуктивності. Наприклад, якщо 8-ядерник виявиться лише на 10% швидше за CPU з меншою кількістю ядер, але буде вдвічі дорожчим, то таку покупку складно виправдати.

По-друге, чим більше ядер у процесора, тим він «ненажерливіший» з погляду енергоспоживання. Немає жодного сенсу купувати набагато дорожчий ноутбук з 4-ядерним (8-потоковим) Core i7, якщо на цьому ноутбуці будуть оброблятися лише текстові файли, переглядатиметься інтернет і так далі. Жодної різниці з двоядерником (4 потоки) Core i5 не буде, та й класичний Core i3 лише з двома обчислювальними потоками не поступиться більш іменитому «колегі». А від батарейки такий потужний ноутбук пропрацює набагато менше, ніж економічний та невибагливий Core i3.

Багатоядерні процесори в мобільних телефонах та планшетах

Мода на кілька обчислювальних ядер усередині одного процесора стосується й мобільних апаратів. Смартфони разом із планшетами з великою кількістю ядер майже ніколи не використовують усі можливості своїх мікропроцесорів. Двоядерні мобільні комп'ютери іноді дійсно працюють трохи швидше, але 4, а тим більше 8 ядер — найвідвертіший перебір. Акумулятор витрачається абсолютно безбожно, а потужні обчислювальні пристрої просто простоюють без діла. Висновок - багатоядерні процесори в телефонах, смартфонах та планшетах - лише данина маркетингу, а не нагальна потреба. Комп'ютери — вимогливіші пристрої, ніж телефони. Два процесорні ядра їм справді потрібні. Чотири – не завадять. 6 і 8 - надмірність у звичайних завданнях і навіть в іграх.

Як вибрати багатоядерний процесор і не помилитись?

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

Зауважимо, що таблиця ґрунтується на процесорах зразка 2012-2014 років. Старіші зразки мають інші характеристики. Також ми не стали згадувати рідкісні варіанти CPU, наприклад одноядерний Celeron (бувають і такі навіть сьогодні, але це нетиповий варіант, який майже не представлений на ринку). Не слід вибирати процесори виключно за кількістю ядер усередині них — є й інші важливіші характеристики. Таблиця лише полегшить вибір багатоядерного процесора, але конкретну модель (а їх десятки у кожному класі) слід купувати тільки після ретельного ознайомлення з їх параметрами: частотою, тепловиділенням, поколінням, розміром кешу та іншими характеристиками.

Процесор кількість ядер Обчислювальні потоки Типова сфера застосування
Atom 1-2 1-4 Малопотужні комп'ютери та нетбуки. Завдання процесорів Atom – мінімальне енергоспоживання. Продуктивність у них мінімальна.
Celeron 2 2 Найдешевші процесори для настільних ПК та ноутбуків. Продуктивності достатньо для офісних завдань, але це зовсім не ігрові CPU.
Pentium 2 2 Такі ж недорогі та малопродуктивні процесори Intel, як і Celeron. Чудовий вибір для офісних комп'ютерів. Pentium оснащуються трохи більш ємним кешем, і, іноді, трохи підвищеними характеристиками в порівнянні з Celeron
Core i3 2 4 Два досить потужні ядра, кожне з яких поділено на два віртуальні «процесори» (Hyper-Threading). Це вже досить потужні CPU за не дуже високих цін. Хороший вибір для домашнього чи потужного офісного комп'ютера без особливої ​​вимогливості до продуктивності.
Core i5 4 4 Повноцінні 4-ядерники Core i5 досить дорогі процесори. Їхньої продуктивності не вистачає лише в найвибагливіших завданнях.
Core i7 4-6 8-12 Найпотужніші, але особливо дорогі процесори Intel. Як правило, рідко виявляються швидше за Core i5, і лише в деяких програмах. Альтернатив їм просто нема.

Короткий підсумок статті «Вся правда про багатоядерні процесори». Замість конспекту

  • Ядро процесора- Його складова частина. Фактично, самостійний процесор усередині корпусу. Двоядерний процесор - два процесори всередині одного.
  • Багатоядерністьможна порівняти з кількістю кімнат усередині квартири. Двокімнатні краще однокімнатних, але лише за інших рівних характеристик (розташування квартири, стан, площа, висота стель).
  • Твердження про те, що чим більше ядер у процесора, тим краще- Маркетинговий прийом, зовсім неправильне правило. Адже Квартиру вибирають далеко не тільки за кількістю кімнат, але і за її розташуванням, ремонтом та іншими параметрами. Це ж стосується і кількох ядер усередині процесора.
  • Існує «віртуальна» багатоядерність- Технологія Hyper-Threading. Завдяки цій технології, кожне «фізичне» ядро ​​поділяється на два «віртуальні». Виходить, що у 2-ядерного процесора з Hyper-Threading лише два справжні ядра, але ці процесори одночасно обробляють 4 обчислювальні потоки. Це справді корисна «фішка», але 4-потоковий процесор не можна вважати чотириядерним.
  • Для настільних процесорів Intel: Celeron - 2 ядра та 2 потоки. Pentium - 2 ядра, 2 потоки. Core i3 - 2 ядра, 4 потоки. Core i5 - 4 ядра, 4 потоки. Core i7 - 4 ядра, 8 потоків. Ноутбучні (мобільні) CPU Intel мають іншу кількість ядер/потоків.
  • Для мобільних комп'ютерів часто важливіше економічність в енергоспоживання (на практиці час роботи від батареї), ніж кількість ядер.

Багатоядерні процесори є центральними процесорами, в яких міститься більше двох обчислювальних ядер. Такі ядра можуть бути як в одному корпусі, так і на одному процесорному кристалі.

Що таке багатоядерний процесор?

Найчастіше під багатоядерними процесорами розуміють центральні процесори, у яких кілька обчислювальних ядер інтегровані в одну мікросхему (тобто вони розташовані на одному кристалі кремнію).

Зазвичай тактова частота багатоядерних процесорах навмисно занижується. Це роблять для того, щоб скоротити енергоспоживання, зберігши при цьому необхідну продуктивність процесора. Кожне ядро ​​при цьому є повноцінним мікропроцесором, для якого характерні риси всіх сучасних процесорів – він використовує багаторівневий кеш, підтримує позачергове виконання коду та векторні команди.

Hyper-threading

Ядра багатоядерних процесорах можуть підтримувати технологію SMT, що дозволяє виконувати кілька потоків обчислень і створювати на основі кожного ядра кілька логічних процесорів. На процесорах, які випускає компанія Intel, така технологія називається Hyper-threading. Завдяки їй можна подвоювати число логічних процесорів проти числом фізичних чіпів. У мікропроцесорах, які підтримують цю технологію, кожен фізичний процесор здатний зберігати стан двох потоків одночасно. Для операційної системи це буде виглядати як наявність двох логічних процесорів. Якщо в роботі одного з них виникає пауза (наприклад, він чекає на отримання даних з пам'яті), інший логічний процесор приступає до виконання власного потоку.

Види багатоядерних процесорів

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

Принцип роботи

Більшість сучасних багатоядерних процесорів працює за такою схемою. Якщо запущена програма підтримує багатопоточність, вона може змушувати процесор виконувати кілька завдань одночасно. Наприклад, якщо в комп'ютері використовується 4-ядерний процесор із тактовою частотою 1.8 ГГц, програма може «завантажити» роботою відразу всі чотири ядра, при цьому сумарна частота процесора становитиме 7.2 ГГц. Якщо запущено відразу кілька програм, кожна з них може використовувати частину ядер процесора, що також призводить до зростання продуктивності комп'ютера.

Багато операційних систем підтримують багатопоточність, тому використання багатоядерних процесорів дозволяє прискорити роботу комп'ютера навіть у разі додатків, які багатопоточність не підтримують. Якщо розглядати роботу лише одного додатка, то використання багатоядерних процесорів буде виправданим лише в тому випадку, якщо ця програма оптимізована під багатопоточність. В іншому випадку, швидкість роботи багатоядерного процесора не відрізнятиметься від швидкості роботи звичайного процесора, а іноді він працюватиме навіть повільніше.

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

4 Solutions collect form web for “Отже, які логічні ядра процесора (на відміну фізичних ядер процесора)?”

Фізичні ядра – це фізичні ядра у процесорі. Логічні ядра – це здібності одного ядра, щоб одночасно виконувати дві чи більше речі. Це виросло з ранніх процесорів Pentium 4, здатних робити те, що називалося Hyper Threading (HTT).

Це була гра, де грали, коли допоміжні компоненти ядра не використовувалися для певних типів інструкцій, тоді як інша довга робота могла виконуватися. Таким чином, центральний процесор міг би працювати одночасно над двома речами.

Нові ядра – це повнофункціональні процесори, тому працюють над кількома речами одночасно, але вони є істинними процесорами як фізичних ядер. Ви можете більше дізнатися про обмеження функції hyperthreading і фізичні можливості ядра тут в hardware в цій статті під назвою: Intel Core i5 і Core i7: Intel Mainstream Magnum Opus .

Ви можете побачити розбивку свого вікна за допомогою lscpu:

$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit CPU(s): 4 Thread(s) per core: 2 Core(s) per socket: 2 CPU socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 37 Stepping: 5 CPU MHz: 2667.000 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 307 ): 0-3

У наведеному вище моїй ноутбуці Intel i5 є 4 "процесори" в цілому

Процесор(и): 4

з яких є 2 фізичні ядра

Ядро на сокет: 2

з яких кожен може працювати до 2 потоків

Тема на ядро: 2

в той же час. Ці потоки є логічними можливостями ядра.

Фізичні ядра – це кількість фізичних ядер, реальних апаратних компонентів.

Логічні ядра – це кількість фізичних ядер, помножена кількість потоків, які можуть виконуватися кожному ядрі з допомогою гіперпотоку.

наприклад, мій 4-ядерний процесор працює по двох потоках на ядро, тому я маю 8 логічних процесорів.

$ sudo dmidecode |егреп "Socket Designation: Proc|((Thread|Core) Count)" Socket Designation: Proc 1 Core Count: 14 Thread Count: 28 Socket Designation: Proc 2 Core Count: 14 Thread Count: 28

Два гнізда. Кожен роз'єм має 14 фізичних ядер. Кожне ядро ​​має два потоки (28/14). Загальна кількість логічних блоків cpus або логічної обробки - 56 (це те, що верх, а деякі інші команди показують вам як число cpus).

Технологія Hyperthreading дозволяє одному фізичному ядру процесора вести себе як два логічні процесори.

Таким чином, одне процесорне ядро ​​може одночасно виконувати два незалежні потоки.

Intel відноситься до фізичного процесора як до сокету.

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

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

Резюме

Фізичний процесор – це те, що ми можемо бачити та падати.

Логічний процесор схожий на: Phsical Core, що діє як два фізичні ядра