我有四个Funcs A,B,C,D我希望交错((0,0)在左上角):
A B A B ...
C D C D ...
A B A B ...
C D C D ...
...
所以,我有类似的东西:
Func out; // why can't this be on the same line as the implementation?
out(x, y) = select((x&1)==0,
select((y&1)==0, A(x/2,y/2), C(x/2,y/2)),
select((y&1)==0, B(x/2,y/2), D(x/2,y/2)) );
有更好(更有效)的方法吗?我注意到A,B,C,D也包含一些select()(它们是非常非线性的Funcs。)
同样,我在A:
中有这个结构Func choose0, choose1, a0, a1, a2, A;
choose0, choose1, a0, a1, a2 = something complicated...;
A(x,y) = select(choose0(x,y), a0(x,y), select(choose1(x,y), a1(x,y), a2(x,y)));
Halide会在选择之前生成计算a0,a1和a2的代码吗?我真的宁愿只为(x,y)的任何特定值计算所选择的Func。
答案 0 :(得分:3)
如果你说:
out.unroll(x, 2)
.unroll(y, 2)
.bound(x, 0, input.width())
.bound(y, 0, input.height());
然后在第一个例子中选择应该消失。你告诉Halide要展开两倍,并且计数从零开始(所以它知道从A开始)。
在第二个例子中,Halide确实会评估选择的两面 - 否则矢量化并不能很好地工作。诀窍是通过在某处计算a * Funcs来使这些评估变得便宜(只是加载):
a0.compute_at(A, x);
a1.compute_at(A, x);
a2.compute_at(A, x);
我选择在x处计算它们,因为这样决定它们是否被使用的条件(选择*(x,y))在计算的生命周期中是恒定的(单个x值) ,y)。 Halide应该检测到这一点并将它们的计算结果用于if语句中。