我一直试图通过halide重新创建一个手动调整的c函数。这是在源图像的垂直扫描线上完成的一系列直方图。因此,我使用1维RDom来迭代源图像。在halide rdom更新阶段调度预取
RDom reductionY(0, input.height());
parade(x,y,c) = Halide::cast<uint16_t>(0);
parade(x, input(x, reductionY, c), c) += Halide::cast<uint16_t>(1);
为了增加局部性,我把rdom换成了另一个func,所以我可以使用compute_at进行调度。
wrapper(x,y,c) = parade(x, y, c);
parade.update(0).reorder(c, reductionY, x);
parade.update(0).split(x, x_outer, x_inner, THREADWIDTH);
parade.compute_at(wrapper, x_outer);
这个(加上一些我为这个问题解开了的矢量化/并行化)与我的手调整的原始版本非常吻合。我无法弄清楚如何调度的原始好处之一是在更新(0)阶段中从输入中预取每条垂直线的第一次读取。如果我的日程安排
parade.update(0).prefetch(inputParam, x_inner, 3);
它似乎预取每个像素读?我希望对要读取的第一个像素执行一次预取。