Рекомендуемый способ распространения сгенерированных Halide функций?

В настоящее время я экспериментирую с Halide, первые тесты показывают многообещающие улучшения производительности.

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

Одним из вариантов может быть использование compile_to_c, добавление сгенерированного кода C в репозиторий и распространение скриптов компиляции для такого кода C. scikit-learn использует аналогичную стратегию для сгенерированного кода Cython. Для Halide это кажется бесполезным, так как сгенерированный код C теряет все оптимизации, нарушая цель Halide.

Моей текущей идеей было бы использовать compile_to_bitcode, распространять сгенерированный битовый код вместе со сценариями компиляции, которые вызывают llc для создания желаемого машинного кода. Единственным требованием для пользователя будет наличие установленного llc (т.е. llvm).

Есть ли у кого-нибудь опыт в этом вопросе?
Каковы плюсы и минусы моей идеи распространения биткода?
Что бы вы порекомендовали?


person rodrigob    schedule 25.07.2014    source источник


Ответы (2)


Некоторые подробности о типе распространения программного обеспечения не помешали бы. Вопрос подразумевает распространение исходного кода, но существует большая разница между библиотекой, в которой программистам может потребоваться взаимодействовать с кодом, созданным Halide, на мелкозернистом уровне, и приложением, в котором использование Halide в значительной степени невидимо для конечного пользователя и цель состоит в том, чтобы просто заставить его построить.

Распространение биткода выполнимо, но проблематично. Чтобы быть переносимым, вы должны использовать что-то вроде бэкенда PNaCl. (PNaCl довольно близок к общему представлению битового кода LLVM.) Если вы ориентируетесь на конкретную архитектуру, нет гарантии, что битовый код скомпилируется или запустится на любой другой. (Например, Halide может снизиться до встроенных функций, специфичных для архитектуры.) Сообщество LLVM не одобряет использование битового кода в качестве формата распространения, хотя, если он находится в исходной форме (.ll, а не .bc), он, вероятно, довольно стабилен и кажется не намного хуже, чем доставка файлы сборки с точки зрения долгосрочной стабильности.

Halide включает в сгенерированный вывод среду выполнения для конкретной ОС, поэтому даже с битовым кодом результат включает ряд зависимостей, специфичных для цели.

Часто в итоге получается проект, который во время выполнения выбирает один из нескольких выходов Halide в зависимости от фактического типа используемого процессора. Например. использование Halide для компиляции одного и того же алгоритма с двумя разными расписаниями для процессоров SSE2 и AVX2. В этой модели в любом случае будет много объектных файлов, и можно просто выбрать во время сборки, какие из них включить для данной архитектуры и ОС. Распространение объектов в виде файлов .ll, а не файлов .o, скорее всего, сработает, но я не уверен, что это принесет много пользы.

Я бы стремился сделать доступным полный исходный код, требуя Halide, если кто-то выполняет компиляцию с нуля, и искал бы способы обеспечить различные уровни двоичного распространения. Конечно, для программного обеспечения для конечного пользователя акцент должен быть сделан на том, как передать полностью готовый пакет в руки пользователей. Для библиотек Halide может использоваться для представления модели программирования более высокого уровня пользователям библиотеки, и в этом случае компилятор Halide должен будет присутствовать в любом случае.

Мы стремимся сделать Halide достаточно простым для внедрения в систему и очень стабильным, но пока еще не достигли абсолютного успеха. Я, вероятно, попытаюсь обеспечить некоторый уровень отката, и использование бэкэнда C для создания общего кода C может быть достойным способом сделать это, не переписывая все на C напрямую. (При сборке из исходного кода у вас есть выбор между установкой Halide или использованием предварительно созданного кода C.) Это один из лучших вариантов использования бэкэнда C. (Генерация кода C из Halide, как правило, довольно маргинальная идея, несмотря на то, что поначалу она кажется хорошей.)

person Zalman Stern    schedule 25.07.2014
comment
Итак, биткод — плохая идея. Я также предоставлю путь компиляции без Halide, и для самой быстрой версии, таким образом, Halide будет обязательным требованием. Да, я имел в виду выпуск приложения с открытым исходным кодом. - person rodrigob; 25.07.2014

compile_to_c() определенно не рекомендуется, так как генерируемый им код не очень оптимизирован; это полезно в основном как инструмент отладки/разработки.

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

(Возможно, было бы полезно иметь автоматическую установку для Halide.)

person Steven Johnson    schedule 25.07.2014