我一直试图通过卤化物重建手动调谐的c功能。它是在源图像的垂直扫描线上完成的一系列直方图。因此,我使用1维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 :(得分:0)
乍一看,您发布的代码似乎并不完整:parade
是x_outer
维度wrapper
计算的,wrapper
从未分裂过来创造这样一个维度。查看确切的代码会有所帮助,您也可以找到print_loop_nest
和编译到降低的语句文件,这对于查看确切的结构和确定要执行预取的位置非常有用。
但很快,我不相信只能为所使用数据的子集发布预取 - 逻辑上,它们适用于以给定粒度使用的整个数据块。由于预取整列而不是单个像素,您是否观察到性能不佳?明确预取单个像素似乎只会有助于硬件预取器推测性地获取整列。
如果在当前的Halide模型中无法表示已知更好的方法,则应将其与卤素开发列表共享,或者作为GitHub上的问题与目标平台的简单重现器共享( 86?)。