Можно ли использовать ускорение GPU при компиляции нескольких программ на компиляторе gcc? - PullRequest
46 голосов
/ 07 декабря 2011

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

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

Ответы [ 2 ]

30 голосов
/ 04 мая 2012

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

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

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

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

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

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

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

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

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

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

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

  2. GPU хороши в SIMD. т. е. выполнение одной и той же операции на нескольких входах. Это опять же, не то, что компилятору нужно делать. может быть полезным, если компилятор должен, скажем, оптимизировать несколько сотен операций с плавающей запятой (дикий пример: программист определил несколько больших массивов FP, назначил им константы, а затем написал код работать над этим. Очень плохо написанная программа действительно.)

Таким образом, кроме распараллеливания компиляции базовых блоков и конвейерного прохода, не так много параллелизма, чтобы имел на уровне «внутри компиляции файла C». Но параллелизм возможен, прост в реализации и постоянно используется на более высоком уровне. Например, GNU Make имеет аргумент -j=N. Что в основном означает: пока он находит N независимых заданий (обычно компиляция группы файлов - это то, для чего GNU Make используется в любом случае), он порождает N процессов (или N экземпляров gcc компиляции). разные файлы параллельно).

12 голосов
/ 01 сентября 2016

ЕСЛИ вы спрашиваете: «Можете ли вы автоматически писать код с ускорением на 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
...