卤化物总和循环嵌套
Halide sum loops nesting
Halide::sum 的打印循环嵌套并不等同于 tutorial 中所写的最优。
此代码为零初始化和求和提供了单独的循环。
Halide::Func f("f");
Halide::Var x("x");
Halide::RDom r(0, 3);
f(x) = Halide::sum(r + x);
f.print_loop_nest();
f.realize(10);
输出:
produce f:
for x:
produce sum:
for x:
sum(...) = ...
for x:
for r4:
sum(...) = ...
consume sum:
f(...) = ...
可以融合这个循环还是不影响性能?谢谢!
更新: 像这样熔断:
produce f:
for x:
produce sum:
for x:
sum(...) = ...
for r4:
sum(...) = ...
consume sum:
f(...) = ...
这是 print_loop_nest 令人困惑的情况。 x 上的内部循环的大小为 1,因此它消失了。编译循环嵌套就是你想要的那个。 x 的外层循环是 non-trivial 循环,所以这才是真正发生的事情:
produce f:
for x:
produce sum:
sum(...) = ...
for r4:
sum(...) = ...
consume sum:
f(...) = ...
Halide::sum 的打印循环嵌套并不等同于 tutorial 中所写的最优。
此代码为零初始化和求和提供了单独的循环。
Halide::Func f("f");
Halide::Var x("x");
Halide::RDom r(0, 3);
f(x) = Halide::sum(r + x);
f.print_loop_nest();
f.realize(10);
输出:
produce f:
for x:
produce sum:
for x:
sum(...) = ...
for x:
for r4:
sum(...) = ...
consume sum:
f(...) = ...
可以融合这个循环还是不影响性能?谢谢!
更新: 像这样熔断:
produce f:
for x:
produce sum:
for x:
sum(...) = ...
for r4:
sum(...) = ...
consume sum:
f(...) = ...
这是 print_loop_nest 令人困惑的情况。 x 上的内部循环的大小为 1,因此它消失了。编译循环嵌套就是你想要的那个。 x 的外层循环是 non-trivial 循环,所以这才是真正发生的事情:
produce f:
for x:
produce sum:
sum(...) = ...
for r4:
sum(...) = ...
consume sum:
f(...) = ...