Компиляция заключается не только в скорости процессора и количестве доступных ядер: пропускная способность диска и пропускная способность памяти также имеют большое значение.
В вашем случае, я полагаю, что каждый брат HT с процессором получает примерно 4 процесса для выполнения. При запуске он блокирует дисковый ввод-вывод и переходит к следующему процессу. Второй пытается открыть второй файл, блокирует дисковый ввод-вывод, и брат переходит к следующему процессу. Запуск четырех компиляторов до того, как IO первого диска будет готов, меня не удивит.
Поэтому, когда первый из них, наконец, будет прочитан в исходном коде программы, компилятор должен начать поиск по каталогам, чтобы найти включенные файлы. Каждому из них требуются некоторые вызовы open (), за которыми следуют вызовы read (), все из которых могут блокироваться, и все из них освободят одноуровневого элемента для запуска других процессов.
Теперь умножьте это на восемь братьев и сестер - каждое ядро HT будет работать до тех пор, пока оно не заблокирует доступ к памяти, после чего оно переключится на другого брата и будет работать некоторое время. После того, как память первого брата извлечена в кэш, вероятно, пришло время второму брату остановиться в ожидании памяти.
Существует верхний предел того, насколько быстрее вы можете запускать свои компиляции с помощью make -j
, но удвоение числа процессоров было хорошей отправной точкой для меня в прошлом.