0

假设我们有以下内容:

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.

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

谢谢和亲切的问候,

桑德

4

2 回答 2

2

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

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

于 2017-03-02T16:58:54.197 回答
1

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

于 2017-03-02T18:30:20.063 回答