скільки ядер я повинен використовувати для розрахунків? #cores або #cores -1?


12

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


8
Використання всіх ядер - це гарний початок, і деяке забобонство щодо ОС, яке поводиться краще з «-1 ядрами», мабуть, просто - забобони, але насправді ви повинні профайлювати це, як він поводиться для вашого розрахунку, обладнання, операційну систему.
Док Браун

У багатьох випадках використання # ядер + 1 має багато сенсу. Якщо ви просто використовуєте #cores, то будь-яке несподіване блокування (наприклад, помилка сторінки) непотрібно змушує ядро ​​простоювати.
Девід Шварц

Відповіді:


28

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

Вибір кількості ядер більше залежить від вашого наміру зробити щось інше під час розрахунку.

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

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


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

Примітка. Навіть на серверах, якщо ви хочете мати можливість ssh і отримати швидку відповідь, залишати core 0 в спокої може бути корисним.
Матьє М.

11

Це залежить.

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

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

Якщо машина не призначена для обчислень, то 100% на обчислення може бути не ідеальним. Наприклад, якщо ви використовуєте веб-браузер під час обчислення. Оскільки навантаження на вашу машину час від часу буде досягати 100%, вона буде відчуватися млявою. Завдання, орієнтовані на пропускну здатність, такі як обчислення, насправді не будуть сповільнені, але завдання, залежні від затримки, такі як графічний інтерфейс, не реагуватимуть так швидко. Тоді розумно лише запускати потоки / процеси NPROC-1 для обчислення. Крім того, явне використання нижчого пріоритету для обчислень, ніж для звичайних завдань, може вирішити цю проблему, і в цьому випадку для обчислень слід використовувати процеси NPROC, щоб не витрачати будь-які ресурси.


3
"якщо ви використовуєте веб-браузер під час обчислення [...], він буде відчувати себе мляво. Завдання, орієнтовані на пропускну спроможність, такі як обчислення, насправді не будуть сповільнені, але завдання, залежні від затримок, такі як GUI, не реагуватимуть так швидко. [ ...] явне використання нижчого пріоритету для обчислення, ніж для звичайних завдань, може вирішити цю проблему "- І саме тому значення пріоритету процесу в Unix називається" niceness "і налаштовується за допомогою утиліти з ім'ям nice.
Йорг W Міттаг

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

2
На додаток до приміток @Davidmh на стороні процесора L1 $ і L2 $ певною мірою поділяються між потоками, а L3 $ поділяється по всій сокетці, тому використання більшої кількості потоків може призвести до збільшення пропусків $ уповільнення процесів. Особливо, якщо процес пов'язаний з пам'яттю, а не з процесором.
Maciej Piechotka

Якщо встановити рівні пріоритетності потоку / процесу належним чином, ви можете пом'якшити вплив фонової роботи на інтерактивні процеси. Я працював поширюваними обчислювальними програмами на своїй персональній машині вже більше десяти років; і з завданнями обчислення процесора, які працюють з низьким пріоритетом, моя здатність користуватися браузерами та іншими звичайними програмами для настільних ПК не порушена. Обмін ресурсами в графічному процесорі не настільки передовий, і у мене виникали випадкові проблеми з прискореним графічним графічним процесором HTML5 (без уваги ігор) під час роботи графічних процесор у фоновому режимі. Ігри з багатьма потоками можуть бути проблематичними навіть при легкій GFX; win
starves thread

1

Я дещо обережно погоджуюся з @motoDrizzt, внизу, через його негативні голоси :), але це справді мій фактичний досвід - більше краще, навіть понад фактичну кількість ядер (але не тисячі). Наприклад, подивіться на http://www.forkosh.com/images/avoronoi.gif, де кожна 2D-площина цієї 3D-voronoi_diagram може генеруватися незалежно. І програма приймає атрибут nfork = n query_string, щоб вимкнути обчислення для n площин "одночасно".

За допомогою чотирьохядерного процесора час (користувач) на завершення діаграми скорочується значно лінійно за допомогою nfork, аж до приблизно nfork = 8 (чотири ядра гіперточеними). Але за межами 8 час все ж зменшується, хоча й повільніше. І приблизно за 16, або близько того, не буде помітного поліпшення. Я взагалі не аналізував цю поведінку, але наївно відношу її до процесів осфальтування (в даному випадку Linux slackware 14.2x64), щоб ще більше зменшити загальний час простою.


0

Найкращий вибір залежить від системи. Отже, що ви хочете зробити, це запустити обидві версії в реальній системі, а потім перевірити, як система реагує. Чи можете ви ще використовувати браузер, текстовий редактор та інші речі у вашій системі? А ефективність краща при використанні n ниток, а не n-1? Що станеться, якщо ви запускаєте додаток разом з іншим додатком, який намагається використовувати всі процесори?

І тоді вам потрібно подумати про гіпертонус. З чотирма ядрами плюс гіпертретування, ви можете використовувати 8 ядер, або 7 ядер. Знову ж таки, спробуйте систему чуйності та час, щоб закінчити.

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

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


-4

Я не знаю, як це написати так, що не звучить «погано», тому просто сприймайте це як дружнє зауваження, гаразд?

Зважаючи на те, що середній ПК вже має тисячу і більше потоків, що змушує вас думати, що використання 8 проти 7 призведе до будь-якої зміни? :-)

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


3
Але більшість цих тисяч потоків не використовують 100% процесора, чи не так?
Андреас Рейбранд

1
Використання вдвічі більшої кількості ядер, як правило, не покращує час обчислення. Насправді використання більшої кількості фізичних ядер не є загалом вигідним, навіть якщо у вас є більше логічних ядер (через HyperThreading тощо; хоча це може залежати від конкретного завдання, яке ви виконуєте). Джерело: досвід минулого, використовуючи паралельну обробку MATLAB.
Санчіз

1
@Sanchises Це тому, що гіпертредінг використовує квазіпаралельне переплетення інструкцій - це ефективно для важкого коду для гілок та пам'яті. Матричні обчислення дуже інтенсивні в FPU, і є лише один FPU на фізичне ядро, тож гіперточення не може вам допомогти.
J ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.