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