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

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

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

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

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

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

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, как правило, довольно маргинальная идея, несмотря на то, что на первый взгляд она кажется хорошей).

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

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

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

Другие вопросы по тегам