嵌套 select 行为和效率
Nested select behavior and efficiency
我有四个 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()(它们是非常非线性的函数。)
同样的,我在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 会在 select 之前生成计算 a0、a1 和 a2 的代码吗?我真的宁愿只为 (x,y) 的任何特定值计算所选的 Func。
如果你说:
out.unroll(x, 2)
.unroll(y, 2)
.bound(x, 0, input.width())
.bound(y, 0, input.height());
然后 selects 应该在第一个示例中消失。你告诉 Halide 展开两倍,计数从零开始(所以它知道从 A 开始)。
在第二个示例中,Halide 确实会评估 select 的两边 - 否则矢量化效果不佳。诀窍是通过在某处计算 a* Funcs 来使这些评估便宜(只需加载):
a0.compute_at(A, x);
a1.compute_at(A, x);
a2.compute_at(A, x);
我选择在 x 处计算它们,因为这样确定它们是否被使用的条件 (choose*(x, y)) 在它们的计算生命周期内是不变的(x 的单个值, y). Halide 应该检测到这一点并为您在 if 语句中阻塞它们的计算。
我有四个 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()(它们是非常非线性的函数。)
同样的,我在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 会在 select 之前生成计算 a0、a1 和 a2 的代码吗?我真的宁愿只为 (x,y) 的任何特定值计算所选的 Func。
如果你说:
out.unroll(x, 2)
.unroll(y, 2)
.bound(x, 0, input.width())
.bound(y, 0, input.height());
然后 selects 应该在第一个示例中消失。你告诉 Halide 展开两倍,计数从零开始(所以它知道从 A 开始)。
在第二个示例中,Halide 确实会评估 select 的两边 - 否则矢量化效果不佳。诀窍是通过在某处计算 a* Funcs 来使这些评估便宜(只需加载):
a0.compute_at(A, x);
a1.compute_at(A, x);
a2.compute_at(A, x);
我选择在 x 处计算它们,因为这样确定它们是否被使用的条件 (choose*(x, y)) 在它们的计算生命周期内是不变的(x 的单个值, y). Halide 应该检测到这一点并为您在 if 语句中阻塞它们的计算。