Почему последняя функция в серии начинается с halide_copy_to_host и как ее удалить

У меня есть программа, которая создает градиентное изображение. Если я скомпилирую это для своего графического процессора и посмотрю на вывод compile_to_lowered_stmnt, я увижу, что он начинается (после оператора product) с halide_copy_to_host, а затем запускает внешний цикл. Если я вкладываю функции, halide_copy_to_host находится в той же позиции, но тогда для самой внешней функции. Примечание. Я ничего не делаю с планированием. Я хотел бы понять, почему он находится в этом месте. Я ожидаю, что это будет в конце программы, чтобы скопировать результат обратно на хост, а не только до завершения вычислений. И если я хочу, чтобы результат остался на GPU (например, вывод на экран), алгоритм должен работать быстрее без копирования. Есть ли способ «удалить» halide_copy_to_host?


person pietervanderstar    schedule 25.10.2016    source источник


Ответы (1)


Copy_to_host, вероятно, существует на случай, если буфер вывода загрязнен на графическом процессоре. Если это так, и мы не копировали на хост, то у вас будет грязный буфер на ЦП и ГП, что невозможно согласовать, не отслеживая, какие части буфера загрязнены на каждом ГП по сравнению с ЦП.

Однако copy_to_host не работает, если для флага dev_dirty установлено значение false, поэтому в вашем случае он ничего не должен делать. Я думаю, вполне вероятно, что никаких копий не происходит. Если вы включите целевой флаг -debug, вы можете проверить это сами.

Halide не выполняет copy_to_host после вычисления GPU, если вы хотите, чтобы результат оставался на GPU, по указанным вами причинам.

person Andrew Adams    schedule 25.10.2016
comment
хорошо я понял. Позже в коде я вижу вызов set_dev_dirty. Как мне узнать, какая часть моего кода генерирует этот оператор и/или как мне предотвратить это? - person pietervanderstar; 26.10.2016
comment
Я видел, как кто-то предлагал установить указатель хоста на NULL, значит ли это, что это работает только для скомпилированного AOT Halide? - person pietervanderstar; 27.10.2016
comment
Получил это работает. Вам нужно использовать буфер и передать этот буфер функции реализации. Затем вы можете передать его на хост, используя copy_to_host, если хотите. Глядя на пониженный код, по-прежнему видно, что set_dev_dirty и copy_to_device также присутствуют в коде, но кажется, что он больше не вызывается. - person pietervanderstar; 27.10.2016