ОК, поэтому: я успешно интегрировал первый рабочий Halide generator в cmake build system для моего маленького image-processing project.Запуск генераторов Halide от cmake с самыми оптимальными флагами и конфигурациями компилятора
Генератор реализует алгоритм изменения размера и -изменения, основанный на примере кода из кодовой базы Halide - Halide/apps/resize/resize.cpp
- Я адаптировал образец, чтобы использовать параметры генератора, и связал компиляцию и вызов генераторов с моим cmake скрипт, используя функции, определенные в HalideGenerator.cmake
, так же, как проект Halide делает в своем собственном скрипте сборки.
Все это отлично работает, но до сих пор мой опыт в области знаний отсутствует в сфере нюансов генерации кода. Например, я настроил метод планирования, чтобы получить наилучшую наблюдаемую эмпирическую скорость на моем ноутбуке, но, несмотря на много длинные сеансы мастеринга и считывание кода, погружается в глубины большого числа связанных с генератором генераторов tools и scripts, у меня есть только самые поверхностные понимание процесса генерации кода.
В частности, я не знаю, как подойти к этому. Лучше ли использовать настройки по умолчанию или пытаться включить определенные параметры для моей целевой платформы, и если последнее, мне нужно иметь условный код где-нибудь или может включить резервные копии двоичных файлов?
Вот о чем я говорю: в источнике урока по учебнику Halide № 15 есть сложный сценарий, который вызывает генератор с различными параметрами. Вот отрывок из комментариев коды в скрипте:
# If you're compiling and linking multiple Halide pipelines, then the
# multiple copies of the runtime should combine into a single copy
# (via weak linkage). If you're compiling and linking for multiple
# different targets (e.g. avx and non-avx), then the runtimes might be
# different, and you can't control which copy of the runtime the
# linker selects.
# You can control this behavior explicitly by compiling your pipelines
# with the no_runtime target flag. Let's generate and link several
# different versions of the first pipeline for different x86 variants: [snip]
... от этого трудно отделить то, что должны быть сделано, от чего должны быть сделаны, или что может быть сделаны, дискреционно. Сравнительно, не нужно решать эти проблемы при настройке проектов на C++ или Objective-C (даже более византийские примеры), поскольку компилятор и компоновщик принимают большинство этих решений для вас, и в лучшем случае нуждаются в знаке или двух.
Мой вопрос: как я могу интегрировать вывода библиотеки двоичные файлы Галогенид генератора в мой существующий проект - таким образом, что выходная мощность генератора является как можно быстрее (например, использует GPU, SSE2/3, AVX2 и т.д.) без дальнейшего ограничения переносимость (например, это не будет таинственно segfault на немного другой машине)?
В частности, каким должен быть мой процесс - как в, должен ли я сначала ориентироваться на наименьший общий знаменатель, а затем постепенно увеличивать возможности экзотических процессоров?
EDIT: Как я уже говорил в комментариях ниже, это то, что мой GenGen двоичные выходы на stdout
при вызове без параметров:
Эй, спасибо за то, что вернулись ко мне с этим - это «целевые строки», которые вы упомянули о тех же строках, что и @StevenJohnson, упомянутые выше, если я могу спросить? – fish2000
Да. Если вы используете модель GenGen, не вызывайте 'get_jit_target_from_environment()' или 'get_host_target()'. Внутри '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'необходимо просто вызвать' get_target() ', который является функцией-членом' Halide :: Generator'. Ваш 'build()' будет вызываться несколько раз с другой целью каждый раз. –