Я пытаюсь сделать некоторые вычисления трафарета, используя Halide. Итак, предполагая базовый 5-точечный 2D-трафарет, для оценки некоторого значения в ячейке i,j мне нужны значения i-1,j i-2,j, i+1,j i+2,j. Теперь то, как это работает в C++, заключается в том, что у меня есть оператор for:
for(int i = 2; i < max_i - 2; i++)
for(int j = 2; j < max_j - 2; j++)
Calculate out = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j))
Теперь я пытаюсь сделать то же самое с Halide. поэтому у меня есть вызванный буфер, который имеет то же значение, что и мой входной массив в коде C++. И у меня Func окликнул:
out(i,j) = select(i >= 2 && j >= 2, some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) ,0.0f)
Когда я запускаю этот код, я получаю следующую ошибку:
Ошибка: Доступ к входному буферу b0 осуществляется с -1, что предшествует минимуму (0) в измерении 0. Прервано (дамп ядра)
Насколько я понимаю, причина этой ошибки заключается в том, что оператор select оценивает оба оператора, поэтому, хотя я не хочу ничего вычислять для значений i и j меньше двух, функция оценивается при i = 0 и j = 0 и, следовательно, неверный адрес доступа.
Так можно ли это сделать в Halide? Существуют ли какие-либо другие эквиваленты для операторов if/else?