Есть ли ограничения с LUT: неограниченный путь в размерности

При попытке запустить приведенный ниже пример кода (похожий на справочную таблицу) он всегда генерирует следующее сообщение об ошибке: «Чистое определение функции «out» вызывает функцию «color» неограниченным образом в измерении 0».

RDom r(0, 10, 0, 10);
Func label, color, out;
Var x,y,c;

label(x,y) = 0;
label(r.x,r.y) = 1;

color(c) = 0;
color(label(r.x,r.y)) = 255;

out(x,y) = color(label(x,y));

out.realize(10,10);

Перед вызовом реализации я безуспешно пытался статически установить привязку, как показано ниже.

color.bound(c,0,10);
label.bound(x,0,10).bound(y,0,10);
out.bound(x,0,10).bound(y,0,10);

Я также посмотрел примеры гистограмм, но они немного другие.

Это какие-то ограничения в Halide?


person Marcelo    schedule 21.05.2017    source источник


Ответы (1)


Halide предотвращает доступ за пределы допустимого диапазона (и решает, что вычислять), анализируя диапазон значений, которые вы передаете в качестве аргументов функции Func. Если эти значения не ограничены, он не может этого сделать. Способ сделать их ограниченными с помощью зажима:

out(x, y) = color(clamp(label(x, y), 0, 9));

В этом случае причина отсутствия ограничений заключается в том, что метка имеет определение обновления, из-за чего анализ прекращается. Если вместо этого вы написали метку следующим образом:

label(x, y) = select(x >= 0 && x < 10 && y >= 0 && y < 10, 1, 0);

Тогда хомут не понадобится.

person Andrew Adams    schedule 22.05.2017
comment
Я бы хотел, чтобы были value_bound_promise( Expr val, Expr min, Expr max ) и EnforcePromises и/или AssertPromises целевые функции. Таким образом, сгенерированный код не нуждался бы в clamp или select. - person Khouri Giordano; 22.05.2017