卤化物最优调度

时间:2016-12-23 00:22:01

标签: c++ schedule halide

我正在尝试制定基准Halide代码的最佳时间表,我可能会遗漏一些东西,因为时间效果对我来说没有多大意义。

我正在使用AOT编译,这里是代码的算法部分:

Buffer.BlockCopy

对于时间表,这就是我所拥有的:

ImageParam input1(type_of<float>(), 3);
ImageParam input2(type_of<float>(), 3); 
Func in1 = BoundaryConditions::constant_exterior(input1, 0.0f);
Func in2 = BoundaryConditions::constant_exterior(input2, 0.0f);   
f1(x, y, z) = (in1(x + 1, y, z) + in1(x, y, z) + in1(x - 1, y,z));
f2(x, y, z) = (in2(x + 2, y, z) + in2(x + 1, y, z) + in2(x, y, z) +in2(x - 1, y, z) + in2(x - 2, y, z));
res(x, y, z) = f1(x, y, z) + f1(x - 1, y, z) + f2(x - 1, y, z) + f2(x, y, z);

我使用current_time函数来计算代码的执行时间。当我对f1和f2使用上述时间表时,执行时间比仅在其中一个Func上使用时间表的时间要多。考虑到模板的结构,我认为调度它们都会提高性能。我在这里错过了什么?当我打印循环以查看生成的代码时:

f1.store_at(res, y).compute_at(res, yi).vectorize(x, 8);
f2.store_at(res, y).compute_at(res, yi).vectorize(x, 8);
res.split(y, y, yi, 8).vectorize(x, 8).parallel(y);
res.print_loop_nest();

它只是缩进还是产品f2嵌套在产品f1中? 有什么建议更好的时间表?

1 个答案:

答案 0 :(得分:1)

我认为这可能是内存带宽有限的。通过将f1或f2内联到res中而隐含的额外补充并不重要。实际上,我通过以下时间表获得了最佳表现:

in1.compute_at(res, yi).vectorize(in1.args()[0], 8);
in2.compute_at(res, yi).vectorize(in2.args()[0], 8);
res.split(y, y, yi, 8).vectorize(x, 8).parallel(y);

即。只需拉入每个输入的填充扫描线,然后进行所有数学内联。

但它几乎没有比你的快。差异可能是噪音。我的完整实验:

https://gist.github.com/abadams/c2e6f67d79e1768af6db5afcabb1caab

f2的产品嵌套在f1的消耗中。这是正常的 - 它没有使用f1,但是它确实使用了f1,所以这是一个合理的结局。