假设我们有以下内容:
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.
这种限制存在的特殊原因是什么?或者可能是其他一些达到预期行为的方式,而不是展开?
谢谢和亲切的问候,
桑德
答案 0 :(得分:2)
专门化将if语句放在最外层循环之外,这意味着其他Funcs是compute_at Func,它们是专门化的。
获取具有依赖于循环变量的条件的if语句的唯一方法是RDom :: where,并且没有办法给它一个else子句,所以这可能是不可能的。你能解释一下为什么if语句比展开你的情况更好吗? idx是否平行?
答案 1 :(得分:1)
我会unroll(idx)
。然后,select将使用条件的常量,并将由Halide优化。