为什么我们不能基于循环变量状态进行专门化?
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 优化。
假设我们有以下内容:
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 优化。