Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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