Чому один потік поширюється через процесор?


24

Мені просто цікаво, чому планувальник постійно переміщує додаток між процесорами, а не тримає його на одному. Дещо дурним виглядає 4 ядра на 25%, а не одне на 100%.

Це має відношення до тепла, чи це якось ефективніше? Інші ОС роблять це по-іншому?

Інформація або посилання на поглиблені речі були б непоганими. (Я не міг знайти себе багато.)

Оновлення:

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


3
Навіть коли "більше нічого не виконується", завжди є системні потоки, що змагаються за процесор. Наприклад, в O / S є потік для нульового відновлення сторінок пам'яті, тому коли потрібна пам'ять, деякі сторінки будуть готові до роботи. Коли ваш потік знову буде виконаний, процесор, на якому ви були, може використовувати один з цих потоків. Що повинен робити ос? Зачекайте цього або перенесіть вас на новий процесор? Що б там не було, у деяких випадках ви стикаєтесь із небажаною поведінкою.
Тоні Лі

Це гумба. SMB, а не LBP. :)
Макке

У своїй "відповіді" я показав, що одна програма з потоком поводиться саме так, як ви описуєте, тобто "переміщується з однієї в іншу кілька разів в секунду, роблячи ефект, який він виглядає розкинутим".
Evan Rosica

Відповіді:


8

Я думаю wierob, що досить добре описав цю точку.
Ось старіша стаття, де обговорюються processor affinityналаштування з чотирьохядерним QX6800 .
(посилання вказує на другу сторінку цієї статті).

Якщо ви не примушуєте спорідненість процесу до основних, ви втрачаєте продуктивність ?

  • Хоча планувальнику Windows потрібно вирішити таку спорідненість, щоб уникнути обмацування кеш-пам'ять,
    сам дизайн процесора також враховує такі речі.
  • Чотириядерний процесор Intel QX6800 (оскільки я згадую про це раніше у цій відповіді)
    має кеш-пам'ять 8 Мб, L3поділену на 4 його ядра .

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


Вперед, архітектура Nehalem та NUMA ,
процесори в декількох сокетах також зможуть краще вирішити доступ до треш-доступу.
Ось короткий малюнок зі сторінки ArsTechnica в NUMA .

введіть тут опис зображення

Якщо Негалем i7вас зацікавив, у мене є ще кілька посилань на цю відповідь .


Що змушує вас думати, що "Вперед, завдяки архітектурі Nehalem та NUMA, процесори в декількох сокетах також зможуть краще вирішити доступ до треш-доступу". ? Як я бачу, NUMA робить пам'ять ще більш локальною і пов'язаною з конкретними процесорами, тому погіршує наслідки кошика.
Roland Pihlakas

@RolandPihlakas, деякий час з моменту цієї відповіді, але, дивлячись на статтю про arstechnica і ці моменти, я думаю, що я враховував можливість нових платформ мати кращу підключення пам’яті та програмне забезпечення, щоб скористатися цим (над тим, щоб не мати цього варіанта з на той час кілька конфігурацій розеток, тобто перед Негалемом.
nik

6

Планувальник просто виконує наступний потік, готовий до виконання на "вільному" ядрі / ЦП.

Ви можете призначити процес певному процесору через менеджер завдань Windows.

Наявність 4 ядер на 25% означає, що 4 нитки виконуються одночасно. Тоді як одне ядро ​​на х% означає, що виконується лише одна нитка. Тож перший у деяких випадках більш ефективний.

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

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


3
afaik планувальник Windows робить досить непогану роботу по збереженню тем на одному процесорі / ядрі протягом його тривалості, щоб уникнути цієї проблеми.
Paxxi

@ Pär: Моя нитка, схоже, виконується на кожному ядрі.
Макке

Так, це, мабуть, програми ОС, які натикаються на мою нитку. Як прийняти дві відповіді? :)
Макке

@ PärBjörklund з мого досвіду принаймні Windows XP не має. Я думаю, що проблема «підстрибування кешу» була виправлена ​​у Vista чи пізніших версіях
Waxhead

1
"Наявність 4 ядер на 25% означає, що 4 нитки виконуються одночасно." Ні, це означає, що одна нитка виконується, трохи на одній серцевині, потім про іншу тощо. Як диспетчер завдань показує середнє використання, він показуватиме 25% (у 4-ядерній системі, у двох ядрах - 50%) для кожного ядра. Це означає, що ядро ​​було повністю використано протягом однієї чверті часу і простоювало час роботи.
Девід Балажич

0

Це не. Один потік може працювати лише на одному процесорі. Однак деякі процеси мають кілька потоків, які можна поширити.

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


1
Дивіться моє додаткове пояснення. Це одна нитка, яка працює на повному дроселі, яку швидко переміщують, так що з часом кожне ядро ​​(поза передньою мірою) зайняте на 25%. (Усі інші процеси / теми є незначними)
Macke

0

ОС переміщує потік через ядра процесора (швидко, кілька разів на секунду). Ефективніше весь час запускати його на одному і тому ж ядрі. Це можна виконати за допомогою пункту контекстного меню "Встановити спорідненість" у Диспетчері завдань.

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

"4 ядра кожен при 25% використання" означає, як диспетчер завдань показує середнє використання, що кожне ядро ​​було повністю використане одну чверть часу і звільнило решту часу.

Опис призначений для Windows, але він схожий і на інших операційних системах.


-1

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

  1. Поширення однієї нитки по всіх ядрах дозволяє знизити енергоспоживання. Більшість процесорів знижують свою частоту і, що ще важливіше, напруга відповідно до навантаження, тому Core 2 Quad, наприклад, споживає набагато менше енергії та виробляє менше тепла, розносячи одну нитку на всі 4 ядра, а не використовуючи одне ядро ​​(що б привести до підвищення напруги на ВСІХ ядрах, оскільки є лише один регулятор напруги * - це досить неефективно).
  2. Це забезпечує те, що нитка завжди працює на максимальній / постійній швидкості. Якщо потік раптом вимагає більшої потужності процесора, одне ядро ​​може перевантажитися і відбудеться затримка виконання. Поширюючи його по ядрах, будь-який раптовий шип буде оброблятися плавно, без запізнень і затримок.

Також, через два вищезазначені спостереження, я прийшов до думки, що Turbo Boost і IDA неефективні. Вони можуть бути корисні в старих операційних системах, але Linux і Windows 7 досить ефективно поширюють все по всіх ядрах. Отже, Core 2 Quad q9100 @ 2,26 ГГц буде майже (завжди є винятки :-) завжди буде швидше, ніж Core 2 Duo X9100 @ 3,06 ГГц, і я рідко бачив, як він використовував IDA (в основному попередник Turbo boost, збільшує частоту на одному або двох ядрах лише для однопотокових програм).

  • У Core 2 Quad є два тактових домену завдяки тому, що є два фізичні штампи, тому два ядра можуть працювати на повній частоті, а два - на найнижчій частоті. Не знаю, чи є два регулятори напруги - я помітив, що напруга рівномірна на всіх 4 ядрах, тому для всього пакету повинен бути лише один регулятор.

3
Це звучить сумнівно з кількох причин. Будь ласка, надайте посилання на ваші "факти". По-перше, чому обчислювальні матеріали на рівні 25% на чотирьох ядрах споживають менше енергії, ніж 100% на одному? (Я можу погодитися, що тепло рівномірно розподіляється, але ...) Крім того, нитка в моєму запитанні працює з повним нахилом (100%), тому він не "вимагатиме більшої потужності процесора", тому що це вже працює так багато, як тільки можливо.
Макке

Ну, це лише з моїх власних спостережень - мене заінтригували IDA та TurboBoost, вирішили зробити кілька тестів. Це було досить давно, але я дійшов до вищезазначених висновків. Процесор споживає менше енергії, оскільки всі ядра працюють при меншій напрузі - зниження напруги на 0,1 В заощаджує близько 6-10 Вт енергоспоживання (якщо одне ядро ​​завантажено на 100%, усі ядра працюють на більш високій напрузі, чи не працюють чи ні). Особливо це стосується Core2Duo з режимом SLFM. Ви маєте рацію щодо того, що нитка працює з повним нахилом, не вимагаючи більше тактових процесорів, але є програми, які дійсно роблять це.
JakL

Немає такого поняття, як "розтікання нитки" (ні, навіть 5 років потому). Є одна нитка, виконана на одному ядрі. А потім пізніше іншого. І так далі. Кожного моменту одне ядро ​​працює на 100%, а інші простоюють. Тож економії немає. Тим більше, що ви згадуєте, коли всі ядра на повній напрузі весь час (як ви сказали, вони ділять напругу). Крім того, як уже зверталося, що знаходиться на одному ядрі, гарантує, що нитка отримує всю наявну потужність обробки. Оскільки це ядро ​​вже на 100% використовується, ОС буде планувати інші потоки до інших, менш використаних ядер.
Девід Балажич
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.