为什么我们不能基于循环变量状态进行专门化?

时间:2017-03-02 16:28:06

标签: halide

假设我们有以下内容:

Var idx;
Func out;

out(idx) = select(idx == 0, VAL_1, select(idx == 1, VAL_2, VAL3));

能够强制Halide在循环体中使用if / then / else构造,而不是选择,这将是很好的。我假设这是使用specialize()调度命令完成的:

out.specialize(idx == 0);
out.specialize(idx == 1);

然而,这似乎是被禁止的:

"Error at (...): Specialization condition (...) depends on Var or RVar idx. 
Specialization conditions may not depend on any Vars or RVars.

这种限制存在的特殊原因是什么?或者可能是其他一些达到预期行为的方式,而不是展开?

谢谢和亲切的问候,

桑德

2 个答案:

答案 0 :(得分:2)

专门化将if语句放在最外层循环之外,这意味着其他Funcs是compute_at Func,它们是专门化的。

获取具有依赖于循环变量的条件的if语句的唯一方法是RDom :: where,并且没有办法给它一个else子句,所以这可能是不可能的。你能解释一下为什么if语句比展开你的情况更好吗? idx是否平行?

答案 1 :(得分:1)

我会unroll(idx)。然后,select将使用条件的常量,并将由Halide优化。