Сколько сделать темы для использования?

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), цепочки компиляторов (предварительно скомпилированные заголовки и т. Д.?) И структуры сборки (связывает ли она только одну важную вещь в конец или несколько мелких вещей между ними)
Иоганнес
1
Если вы серьезно ищете производительность, я бы посоветовал вам настроить RAM-диск или какой-то другой способ облегчить ваш ввод-вывод. Я не думаю, что загрузка процессора - ваша горячая точка.
TMN
@ TMN: Как поможет RAM-диск? Linux довольно хорошо кэширование вещи (вы делаете означает , файлы заголовков, верно?), Не говоря уже о кэш диска. Я должен был бы сначала загрузить все в shm, либо вручную, либо изменив скрипт сборки (что было бы полным перебором).
битовая

Ответы:

15

Я провел серию тестов, собирая llvm (в режиме отладки + подтверждения) на машине с двумя ядрами и 8 ГБ оперативной памяти:

время компиляции в зависимости от количества заданий

Как ни странно, кажется, что он поднимается до 10, а затем внезапно падает ниже времени, которое требуется для построения с двумя заданиями (одно задание занимает примерно двойное время, не включенное в график).

Минимум вроде бы 7*$coresв этом случае.

битовая
источник
1
+1 за реальное тестирование и не спекулировать.
Мартин Уикман
3

Я использую Gentoo Linux (дистрибутив на основе исходного кода), и по своему опыту я могу сказать, что (с более или менее новым оборудованием) n*2 + x- лучшее значение. Позвольте мне объяснить это:

  • n*2: Даже у более медленных процессоров достаточно мощности для выполнения 2 задач одновременно. большинство задач компиляции выполняются очень быстро.
  • +xэто число зависит от вашей системы (в основном, от памяти и диска). Если у вас достаточно оперативной памяти и быстрого диска, установите x=n. Однако это зависит от исходного кода (Open Office, я смотрю на вас!) И используемого языка (компиляция C / C ++ требует очень много памяти).

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

ercpe
источник
Сейчас я в основном занимаюсь C ++, и, наверное, мои диски не самые быстрые.
битовая
Затем начните с n * 1,5 и увеличивайте его до тех пор, пока время компиляции не перестанет уменьшаться (убедитесь, что вы каждый раз очищаете кэш диска / кэш компиляции). Также подумайте об использовании ccache ( ccache.samba.org ) для ускорения компиляции.
ercpe