Какие компиляторы x86 C ++ являются многопоточными? - PullRequest
9 голосов
/ 13 декабря 2010

Теперь почти каждый пользователь имеет 2 или 4 ядра на рабочем столе (и на большом количестве ноутбуков).Опытные пользователи имеют 6-12 ядер с amd или i7.

Какие компиляторы x86 / x86_64 C / C ++ могут использовать несколько потоков для компиляции?

Уже есть 'make -j N' -подобные решения, но иногда (для -fwhole-program или -ipo) есть последний большой и медленный шаг, который начинался последовательно.

из них могут: GCC, компилятор Intel C ++, компилятор Borland C ++, Open64, LLVM / GCC, LLVM / Clang, компилятор Sun, MSVC, OpenWatcom, Pathscale, PGI, TenDRA, Digital Mars?

Существует ли более высокий предел количества потоков для многопоточных компиляторов?

Спасибо!

Ответы [ 7 ]

5 голосов
/ 13 декабря 2010

Некоторые системы сборки могут компилировать независимые модули параллельно, но сами компиляторы все еще являются однопоточными.Я не уверен, что от компилятора многопоточности можно что-то выиграть.Наиболее трудоемким этапом компиляции является обработка всех зависимостей #include, и они имеют для последовательной обработки из-за потенциальных зависимостей между различными заголовками.Другие фазы компиляции сильно зависят от результатов предыдущих фаз, поэтому от параллелизма здесь мало что можно получить.

4 голосов
/ 28 апреля 2017

Gcc имеет -flto=n или -flto=jobserver, чтобы сделать шаг связывания (который с LTO выполняет оптимизацию и генерацию кода) параллельным. Согласно документации, они были доступны начиная с версии 4.6, хотя я не уверен, насколько хороши они были в этих ранних версиях.

1 голос
/ 28 апреля 2017

Многопоточная компиляция не очень полезна, так как системы сборки (Make, Ninja) запускают несколько модулей компиляции одновременно.И, как заявил Ферруччо, параллельную компиляцию действительно сложно реализовать.

Многопотоковое связывание может быть полезным (одновременное чтение .o / .a и разрешение символов), поскольку это, скорее всего, будет последним этапом сборки.1003 *

Gnu Gold linker может быть многопоточным, с реализацией LLVM ThinLTO: https://clang.llvm.org/docs/ThinLTO.html

1 голос
/ 13 декабря 2010

На самом деле невозможно мультипроцессировать стадию соединения.Возможно, в какой-то степени возможна многопоточность, но вряд ли она даст значительный прирост производительности.Таким образом, многие системы сборки просто запускают отдельный процесс для отдельных файлов.Как только вы все скомпилируете, он, как вы заметили, выполнит длинную однопоточную ссылку.Увы, как я уже сказал, вы мало что можете с этим поделать: (

1 голос
/ 13 декабря 2010

Более новые версии Visual Studio могут компилировать отдельные блоки перевода параллельно. Помогает, если ваш проект использует много файлов реализации (таких как .c, .cc, .cpp).

Страница MSDN

0 голосов
/ 28 октября 2017

Go 1.9 утверждает, что компилятор имеет:

Параллельная компиляция

Компилятор Go теперь поддерживает параллельную компиляцию функций пакета, используя преимущества нескольких ядер,Это в дополнение к существующей поддержке команды go для параллельной компиляции отдельных пакетов.

но, конечно, он компилирует Go, а не C ++

Я не могу назвать аналогичным образом ни один компилятор C ++, даже в октябре 2017 года. Но я предполагаю, что многопоточный Goкомпилятор показывает, что многопоточные компиляторы C или C ++ (в принципе) возможны.Но их мало, и создание новых - это огромная работа , и вам практически придется начинать такие усилия с нуля.

0 голосов
/ 13 декабря 2010

Для Visual C ++ я не знаю, выполняет ли он какую-либо параллельную компиляцию (я так не думаю). Для версий более поздних, чем Visual Studio 2005 (т. Е. Visual C ++ 8), проекты в решении строятся параллельно, насколько это позволяет граф зависимости решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...