2017-08-25 26 views
0

我一直试图通过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); 

它似乎预取每个像素读?我希望对要读取的第一个像素执行一次预取。

回答

0

乍一看,它似乎不是你发布的代码完成:parade计算在wrapperx_outer尺寸,但wrapper从未分开来创建这样一个维度。看到确切的代码会有所帮助,并且您还可以找到print_loop_nest并编译为降低语句文件,这对于查看确切结构以及确定要执行预取的位置很有用。尽管如此,我并不认为只有一部分使用的数据可以发布预取 - 在逻辑上,它们适用于以给定粒度使用的整个数据块。由于预取整列而不是单个像素,您是否观察到性能不佳?显式预取单个像素看起来很可能仅在可能触发硬件预取器推测性地提取整个列时才有帮助。

但是,如果在当前Halide模型中无法表示已知更好的方法,那么您应该将它与halide-dev列表共享,或者作为GitHub上的问题使用目标平台的简单再现器(86?)。