Какие компиляторы x86 С++ являются многопоточными?

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

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

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

Может ли это быть: GCC, компилятор Intel С++, компилятор Borland С++, Open64, LLVM/GCC, LLVM/Clang, компилятор Sun, MSVC, OpenWatcom, Pathscale, PGI, TenDRA, Digital Mars?

Есть ли более высокий предел номера потока для компиляторов, которые многопоточны?

Спасибо!

Ответ 1

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

Ответ 2

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

Ответ 3

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

Страница MSDN

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

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