Можно ли использовать ускорение GPU при компиляции нескольких программ в gcc-компиляторе?
Есть ли способ или инструмент для применения ускорения GPU при компиляции программ с компилятором GCC? Прямо сейчас я создал программу для компиляции данного списка программ итеративно. Это займет несколько минут. Я знаю несколько программ, таких как Pyrit, которые помогают применять ускорение GPU для предварительной компиляции хэшей.
Если таких инструментов нет, проконсультируйтесь о том, следует ли использовать OpenCL или что-то еще для перепрограммирования моего кода.
Ответы
Ответ 1
A. В обязательном языке программирования операторы выполняются последовательно, и каждый оператор может изменить состояние программы. Поэтому анализ единиц перевода по своей сути является последовательным.
Пример: проверьте, как может работать постоянное распространение -
a = 5;
b = a + 7;
c = a + b + 9;
Вам нужно пройти эти инструкции последовательно, прежде чем вы обнаружите, что значения, назначенные b
и c
, являются константами во время компиляции.
(Однако отдельные базовые блоки могут быть скомпилированы и оптимизированы параллельно друг другу.)
B. Кроме того, разные проходы должны выполняться последовательно, а также влиять друг на друга.
Пример. Основываясь на расписании инструкций, вы выделяете регистры, затем обнаруживаете, что вам нужно пролистывать регистр в память, поэтому вам нужно создать новые инструкции. Это снова изменит расписание.
Таким образом, вы не можете выполнять "проходы" как "распределение регистров" и "планирование" параллельно (фактически, я думаю, что есть статьи, в которых компьютерные ученые/математики пытались решить эти две проблемы вместе, но не уходят в это).
(Опять же, с помощью конвейерных проходов можно достичь некоторого parallelism.)
Кроме того, графические процессоры особенно не подходят, потому что:
-
Графические процессоры хороши в математике с плавающей запятой. Кое-что компиляторы не нужны или не используют много (за исключением оптимизации арифметики с плавающей запятой в программе)
-
Графические процессоры хороши в SIMD. т.е. выполнять одну и ту же операцию на нескольких входах. Это опять же не то, что нужно компилятору. Может быть полезно, если компилятор должен, скажем, оптимизировать несколько сотен операций с плавающей запятой (дикий пример: программист определил несколько больших массивов FP, назначил им константы и затем написал код для работы над ними. очень плохо написанная программа.)
Таким образом, помимо параллельной компиляции базовых блоков и сквозных проходов, на уровне "внутри компиляции файла C" не так много parallelism. Но parallelism возможно, легко реализуется и постоянно используется на более высоком уровне. GNU Make
, например, имеет аргумент -j=N
. В основном это означает: если он находит N
независимые задания (обычно, компиляция кучки файлов - это то, что GNU Make
используется в любом случае), оно порождает N
процессы (или N
экземпляры gcc
компиляции разные файлы параллельно).
Ответ 2
ЕСЛИ что вы спрашиваете: "Можете ли вы автоматически записать код с ускорением GPU для использования с GCC и LLVM?" ответ - да. NVIDIA и Google создают проекты компилятора с открытым исходным кодом на основе LLVM:
NVIDIA CUDA LLVM:
GOOGLE GPUCC:
Если у вас есть вопрос: "Могу ли я использовать графический процессор для ускорения компиляции не кодов CUDA?" ответ в настоящее время нет. Графический процессор хорош в некоторых вещах, таких как параллельные задачи, в других - как в ветвях, компиляторах которых есть все. Хорошей новостью является то, что вы можете использовать сеть ПК с процессорами, чтобы получить ускорение компиляции 2-10x, в зависимости от того, насколько оптимизирован ваш код, и вы можете получить самый быстрый многоядерный процессор и высокоскоростной SSD для вашего рабочего стола чтобы получить прибыль за меньшую сумму, прежде чем прибегать к сетевым сборкам.
Существуют инструменты для распространения задач компилятора C/С++/ObjC в сети компьютеров, таких как Distcc. Он был включен в более ранние версии XCode, но был удален, и нет поддержки для его использования с Swift.
Существует коммерческий инструмент, похожий на Distcc под названием Incredibuild, который поддерживает среды разработки Visual Studio C/С++ и Linux:
Есть несколько хороших статей о реальном использовании Incredibuild vs Distcc и компромиссов по сравнению с поддержкой инкрементной сборки в собственном компиляторе для создания небольших изменений, таких как одна строка в одном файле, без перекомпиляции всего остального. Вопросы для рассмотрения:
- Вы можете значительно ускорить базу кода, предварительно скомпилировав заголовки, используя несколько DLL и используя инкрементные сборки на одной машине.
- Incredibuild - это более полное решение для автоматического распределения работы и обеспечения того же результата, что и серийный компилятор, по сравнению с бесплатным с distcc, где вам нужно сделать гораздо больше работы для тех же результатов и совместимости с чем-либо, кроме gcc.
- Подробный обзор см. в http://gamesfromwithin.com/how-incredible-is-incredibuild