Visual Studio 2010, Максимальное количество параллельных компиляций C ++ для гиперпоточных процессоров

StackOverflow https://stackoverflow.com/questions/6373121

Вопрос

Я пытаюсь оптимизировать время компиляции большого проекта VC ++. Мой процессор - Core i7 950 (4 ядра, 8 потоков, поскольку он поддерживает технологию Intel Hyper-Threading).

В Microsoft Visual Studio 2010, если вы перейдете на Инструменты> Параметры> Проекты и решения> Настройки проекта VC ++> Максимальное количество одновременных компиляций C ++

вы можете выбрать максимальное количество ядер ЦП, которое будет использоваться для параллельной компиляции C ++. Я выбираю там 0 (чтобы использовались все мои ядра), что дает точно такие же результаты, как и при использовании 4 или 8.

Теперь, если я открою диспетчер задач во время компиляции проекта, я вижу, что запущены 4 параллельных потока компиляции (в процессах они имеют описание: Драйвер компилятора Microsoft C / C ++), и что общее использование ЦП составляет все время немного меньше 50%.

Итак, мой вопрос:

Возможно ли иметь 8 параллельных потоков компиляции в четырехъядерном гиперпоточном процессоре? Если это невозможно, то можно ли каким-то образом использовать почти 100% мощности процессора во время компиляции?

Это сэкономит мне много времени.

Заранее большое спасибо,

Николай

Это было полезно?

Решение

<цитата>

Это сэкономит мне много времени.

Нет, не будет. Гиперпоточность полезна, когда у вас есть разные виды задач для выполнения, которые используют дополнительные ресурсы внутри ЦП. Например, один поток использует много чисел с плавающей запятой, а другой - нет. В то время как первый выполняет вычисления с плавающей запятой, остальная часть ЦП доступна другому потоку.

По очевидным причинам группе потоков компиляции требуются одни и те же внутренние ресурсы ЦП. Все, что вам нужно, - это иметь вдвое больше потоков, борющихся за кэш и ресурсы ЦП. Увеличение числа конфликтов в кеше сделало бы жизнь медленнее, а не быстрее.


Вышеупомянутое объясняет, почему вы не получите БОЛЬШОЙ выгоды от Hyperthreading и однородного кода. Традиционная мудрость для параллельной make состоит в том, чтобы установить количество заданий на единицу больше, чем количество ядер, при этом предполагается, что процессы 1 / N, вероятно, выполняют дисковый ввод-вывод. Конечно, это для программы make для Unix, где в дополнение к фактической компиляции задание выполняет много обработки make-файла.

Если вы повернули ручку до 8 и не увидели никаких изменений (обратите внимание, это могло быть отрицательное изменение пропускной способности по причинам, описанным выше), в диспетчере задач сообщалось об использовании ЦП, вероятно, это связано с тем, что взаимозависимости в вашем решении вынуждают определенные задачи компиляции выполняются последовательно. Если одна задача зависит от вывода другой (это часто вызывают предварительно скомпилированные заголовки), то это ограничивает количество одновременных задач - даже если у вас есть 16-ядерная система, вы все равно не получите большего параллелизма, чем позволяет структура проекта.

Другие советы

Возможно, вы ограничены только диском, а не ЦП.

Я думаю, что это проблема Visual Studio.Попробуйте запустить ваши make-файлы с помощью "jom" параллельного клона nmake.Вы должны увидеть увеличение на 35% при использовании его вместо msvc, вызываемого для компиляции с 4 ядрами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top