Можно ли использовать ускорение GPU при компиляции нескольких программ на компиляторе gcc?

Есть ли способ или инструмент для применения ускорения GPU при компиляции программ с помощью компилятора GCC? Прямо сейчас я создал программу для итеративного составления заданного списка программ. Это займет несколько минут. Я знаю несколько программ, таких как Pyrit, которые помогают применять ускорение графического процессора для предварительных вычислений хэшей.

Если таких инструментов нет, пожалуйста, дайте совет, использовать ли OpenCL или что-то еще для перепрограммирования моего кода.

2 ответа

О. В императивном языке программирования операторы выполняются последовательно, и каждый оператор может изменять состояние программы. Таким образом, анализ единиц перевода по своей сути является последовательным.

Пример: посмотрите, как может работать постоянное распространение -

a = 5;
b = a + 7;
c = a + b + 9;

Вам необходимо последовательно пройти через эти утверждения, прежде чем вы поймете, что значения, присвоенные b а также c являются константами во время компиляции.

(Однако отдельные базовые блоки могут быть скомпилированы и оптимизированы параллельно друг с другом.)

B. Кроме того, разные проходы должны выполняться последовательно и влиять друг на друга.

Пример: на основе расписания инструкций вы распределяете регистры, а затем обнаруживаете, что вам нужно вылить регистр в память, поэтому вам нужно сгенерировать новые инструкции. Это снова меняет расписание.

Таким образом, вы также не можете выполнять "проходы", такие как "распределение регистров" и "планирование", параллельно (на самом деле, я думаю, что есть статьи, в которых ученые-математики пытались решить эти две проблемы вместе, но не будем вдаваться в подробности),

(Опять же, можно добиться некоторого параллелизма путем конвейерной передачи.)

Более того, графические процессоры особенно не подходят, потому что:

  1. GPU хороши в математике с плавающей запятой. Что-то компиляторы не нуждаются или не используют много (кроме случаев оптимизации арифметики с плавающей точкой в ​​программе)

  2. 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
Другие вопросы по тегам