Скільки роблять ниток для використання?


11

Коли я (заново) будую великі системи на настільному / портативному комп'ютері, я кажу makeвикористовувати декілька потоків для прискорення швидкості компіляції, наприклад:

$ make -j$[ $K * $C ]

Де $Cповинен вказати число ядер (які ми можемо припустити , щоб бути числом з однією цифрою) машина має, а $Kто , що я змінюватися від 2до 4, в залежності від настрою.

Так, наприклад, я можу сказати, make -j12якщо у мене є 4 ядра, що вказує makeна використання до 12 потоків.


Моє обгрунтування полягає в тому, що якщо я використовую лише $Cпотоки, ядра будуть простоювати, поки процеси зайняті вилученням даних з накопичувачів. Але якщо я не обмежую кількість потоків (тобто make -j), я ризикую втратити час на перемикання контекстів, втрату пам’яті чи гірше . Припустимо, машина має $Mконцерти пам’яті (де $Mв порядку 10).

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


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

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

4
багато людей також пропонують $ cores + 1, тому 1 процес компіляції читається з диска, тоді як 4 компілюються. Загальна пропозиція є складною, також залежить від кодової бази (надмірне використання шаблонів C ++ порівняно з невеликими одиницями компіляції з кількома функціями C), ланцюжка компілятора (попередньо складені заголовки тощо?) Та структури збірки (чи пов'язує вона лише одну велику річ у кінець або кілька дрібних речей між ними)
johannes

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

@TMN: Як допомагає диск RAM? Linux досить добре кешування речі (ви робите означає , файли заголовків, вірно?), Не кажучи вже про кеш диска. Мені довелося б спочатку завантажити все в shm, або вручну, або змінивши сценарій збірки (що було б надмірним вбивством).
бітмаска

Відповіді:


15

Я провів ряд тестів, будуючи llvm (у режимі Debug + Asserts) на машині з двома ядрами та 8 ГБ оперативної пам’яті:

складання часу llvm залежно від кількості завдань

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

Здається, що мінімум 7*$coresу цьому випадку.


1
+1 для фактичного тестування та не спекуляції.
Мартін Вікман

3

Я використовую Gentoo Linux (дистрибутив на основі джерел), і зі свого досвіду я можу сказати, що (з більш-менш останнім обладнанням) n*2 + xнайкраще значення. Поясню це:

  • n*2: Навіть повільніші процесори мають достатню потужність для виконання двох завдань одночасно. більшість завдань з компіляції виконуються дуже швидко.
  • +xце число залежить від вашої системи (в основному пам'яті та диска). Якщо у вас достатньо оперативної пам’яті та швидкого диска, встановіть x=n. Однак це залежить від вихідного коду (Open Office, я дивлюся на тебе!) Та використовуваної мови (компіляція C / C ++ дуже інтенсивна в пам'яті).

Однак вам доведеться запустити кілька тестів з деякими -jзначеннями, щоб отримати найкраще число. Також спробуйте паралелізувати інші кроки процесу збирання: розпакування, запуск configureтощо.


На даний момент я найбільше переймаюся C ++, і мої диски не найшвидші.
бітмаска

Потім почніть з n * 1.5 і збільшуйте його, поки час компіляції не перестане скорочуватися (обов'язково кожен раз очищайте кеш-диск / компілюючи кеш). Крім того, подумайте про використання ccache ( ccache.samba.org ) для прискорення компіляції.
ercpe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.