Галогенная проверка, возможно ли расщепление

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

Чтение за пределами обрабатывается с помощью Halide::BoundaryConditions. Конечно, я могу вручную проверить коэффициент разделения с помощью оператора if, но есть ли у Halide что-то похожее на BoundaryConditions для оптимизации?


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


Ответы (1)


Если я правильно понимаю, о чем вы говорите, то для этого и существует Func::specialize. Вы можете сделать что-то вроде:

// Only vectorize if output is large enough
f.specialize(f.output_buffer().width() > 8).vectorize(x, 8);

Halide sgemm использует это множество: https://github.com/halide/Halide/blob/master/apps/linear_алгебра/src/blas_l3_generators.cpp

person Andrew Adams    schedule 19.05.2016
comment
Да, это сработает, но, скажем, у меня есть функция Func, которую я сначала разбиваю и векторизую в направлении x, а затем объединяю оставшуюся часть x с y в xy. Затем я разделяю xy на другой фактор, а затем распараллеливаю это. Тогда коэффициент для разделения зависит от размера разделения по x, а также от размера изображения. Если я хочу принять это во внимание, это делает выражение if монстром. Я надеялся на что-то вроде того, как зажим работает на изображении. Вы даете ему число, но оно ограничивает его до максимально возможного на изображении. Но я так понимаю, что нет. - person pietervanderstar; 20.05.2016
comment
Я использовал specialize с некоторыми расчетами максимального значения, которое оно должно иметь, и обнаружил, что specialize принимает только Expr. Если я передам ему логическое значение, оно жалуется, что может принимать только логическое значение: аргумент, переданный для специализации, должен быть логического типа. Это баг или я что-то не так делаю? (обратите внимание, у меня это работает). - person pietervanderstar; 20.05.2016