Як спорідненість процесора Windows працює з гіпертокованими процесорами?


27

Як спорідненість процесора Windows працює з гіпертокованими процесорами? Скористаємося прикладом (на фото) системи з чотирма ядрами, кожне з гіперпотоковим віртуальним ядром.

  1. Які ядра відповідають кожному "CPU" нижче?
  2. Чи (скажімо) CPU 6 та CPU 7 нижче представляють одне ядро; HT і справжнє ядро?
  3. Якщо, наприклад, CPU 6 являє собою справжнє ядро, а CPU 7 - ядро ​​HT, чи потік, призначений просто лише CPU7, отримає лише залишені ресурси реального ядра? (якщо ядро ​​виконує інші завдання)
  4. Чи впорядкована гіперреалізація повністю в процесорі така, що потоки переміщуються всередині? Якщо так, то чи є це в області процесора чи в основній області застосування? Приклад: Якщо CPU 6 і 7 являють собою одне ядро, чи не має значення, якому процесу призначено, оскільки процесор призначить ресурси відповідно до запущеної нитки?
  5. Я зауважую, що тривалі процеси з однопотоковими процесами трохи стрибають навколо ядер, принаймні на думку менеджера завдань. Чи означає це, що присвоєння процесу одному ядру трохи покращить продуктивність (уникаючи контекстних комутаторів та недійсних кеш-пам'яті тощо)? Якщо так, то чи можу я знати, що я не призначаю "просто віртуальне ядро"?

Це все дуже розпливчасто і заплутано для мене. HT є чудовим, але, здається, він зменшує прозорість розподілу ресурсів.

Меню спорідненості з процесором


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

Також останній коментар для вас. "HT чудовий, але, здається, він зменшує прозорість розподілу ресурсів." Це на 100% правда, але ви можете з цим зробити мало, а також для вас нічого не робити. Усі сучасні операційні системи знають, що таке гіпертокування, більшість мають розширені планові процесори, щоб компенсувати це, і окрім кількох конкретних випадків (а я маю на увазі мало), майже завжди є користь від продуктивності.
Прорив

Відповіді:


18

Які ядра відповідають кожному "CPU" нижче?

Якщо припустити, що у нас Core 1, 2, 3 і 4, CPU4 і CPU5 являють собою ядро ​​3.

Чи (скажімо) CPU 6 та CPU 7 нижче представляють одне ядро; HT і справжнє ядро?

Ніякої різниці немає - обидва вони мають фізичні апаратні інтерфейси до центрального процесора, логічний інтерфейс реалізований апаратно (детальніше див. Технічну таблицю процесорів Intel Core, том 1 ). В основному кожне ядро ​​має два відокремлених підрозділи виконання, але воно ділиться деякими загальними ресурсами між ними. Ось чому в певних випадках гіперреалізація може фактично знизити продуктивність.

Якщо, наприклад, CPU 6 являє собою справжнє ядро, а CPU 7 - ядро ​​HT, чи потік, призначений просто лише CPU7, отримає лише залишені ресурси реального ядра? (якщо ядро ​​виконує інші завдання)

Дивись вище. Потік, призначений ТОЛЬКО CPU6 або ТІЛЬКИ CPU7, буде виконуватись з точно однаковою швидкістю (якщо припустимо, що потік працює однаково, а інші ядра в процесорі простоюють). Windows знає про процесори з підтримкою HT, і планувальник процесів враховує ці речі.

Чи керується гіперпотоком повністю всередині процесора таким чином, що потоки переміщуються всередині? Якщо так, то чи є це в області процесора чи в основній області застосування? Приклад: Якщо CPU 6 і 7 являють собою одне ядро, чи не має значення, якому процесу призначено, оскільки процесор призначить ресурси відповідно до запущеної нитки?

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

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

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

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


5

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

Наприклад, скажімо, що у вас є чотири ядра з гіперпотоком, які називаються A, B, C і D. Якщо ви припускаєте, що A і B поділяють кеш L2, а C і D ділять кеш L2, порядок повинен бути таким:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

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

Знову ж таки, так і має бути.

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


1
  1. Як вони відповідають, залежить від того, як ваш процесор і материнська плата перераховують та ідентифікують ядра. Що має статися, це те, що фізичні сокети спочатку перераховуються, наступні логічні ядра, а віртуальні ядра - останні. У вашому випадку ядра 0-3 повинні бути фізичними ядрами, а 4-7 - віртуальними ядрами HT. Основна причина цього полягає в тому, що у випадку, якщо ви запускаєте ОС, яка не в змозі обробити всі наявні одиниці виконання, найімовірніше, спочатку отримаєте найнезалежніші блоки перед спільними. Було б непогано, якби гіпотетична лише 2-ЦП ОС знайшла в вашій системі пару HT замість 2 різних ядер. (Це було справжньою проблемою для деяких ранніх систем HT, перш ніж планувальники ядер могли бути оновлені для нових процесорів.)
  2. №. Див. 1.
  3. Ні. HT є складнішим за це. Пам’ятайте, що два віртуальних ядра часто діляться деякими ресурсами, тоді як інші біти розділені, але одночасно можуть виконуватись лише те чи інше.
  4. Типу. Ваш приклад (зважаючи на припущення), як правило, правильний. Однак, якщо програма може знати, яке навантаження працює, вона може допомогти належним чином планувати потоки ОС.
  5. Є дуже вагомий привід для стрибків в основному: Поширення теплового навантаження навколо. Зважаючи на те, що в багатьох випадках кеші вищого рівня (L2, L3) в будь-якому випадку поділяються між усіма ядрами, стрибок ядра не матиме значного впливу на продуктивність, але тепловий вплив буде значним, оскільки у вас не буде "гарячої точки" на одне ядро, яке постійно працює, а інші сидять без роботи. Тепер, схрещування розеток в системі з декількома розетками (особливо в системі NUMA) може мати значний вплив на продуктивність. Більшість планувальників знають про це і враховують це.

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

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


4
"ядра 0-3 повинні бути фізичними ядрами, а 4-7 - віртуальними ядрами HT". Власне, ядро ​​0 і ядро ​​1 відповідають одному і тому ж (одному) фізичному ядру. Кожне "гіпертокове ядро" має два фізичних з'єднання з процесором, тому Windows буквально бачить 8 фізичних ядер. Просто відомо, що у процесора є гіперточення. Детальнішу інформацію про це див. У таблиці даних Intel Core, якщо вам це цікаво.
Прорив

@Breakthrough Це не була б хорошою топологією, тому що це означало б, що наївна ОС, яка підтримує лише 4 ядра, завершиться лише за допомогою половини фізичних ядер. Одне віртуальне ядро ​​з кожного фізичного ядра повинно з’являтися у списку віртуальних ядер до того, як буде перелічено друге віртуальне ядро ​​з будь-якого фізичного ядра.
Девід Шварц

@DavidSchwartz Хороша топологія чи ні, саме так перераховують логічні процесори. Тому широко рекомендується вимкнути гіпертодування на ранніх ОС (наприклад, Windows 2000 і новіших версій), які не перераховують належним чином LP та ядра проти фізичних пакетів процесора.
Джеймі Ханрахан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.