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

Why can we not specialize based on loop variable states?

假设我们有以下内容:

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.

存在此限制是否有特定原因?或者除了展开之外还有其他方法可以达到预期的行为?

谢谢和亲切的问候,

桑德

特化将 if 语句放在最外层循环之外,这意味着 compute_at 被特化的 Func 的其他 Func 包含在特化中。

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

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