Visual Studio 2010, Максимальные параллельные компиляции C ++ для многопоточных процессоров - PullRequest
4 голосов
/ 16 июня 2011

Я пытаюсь оптимизировать время компиляции большого проекта 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% мощности процессора при компиляции?

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

Спасибоочень заранее,

Николай

Ответы [ 3 ]

5 голосов
/ 16 июня 2011

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

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

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


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

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

0 голосов
/ 25 января 2012

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

0 голосов
/ 16 июня 2011

Возможно, вы ограничены диском, а не процессором.

...