C++ 卤化物优化调度
我正在努力为基准卤化物代码制定最佳时间表,但我可能遗漏了一些东西,因为计时结果对我来说没有多大意义 我正在使用AOT编译,下面是代码的算法部分:C++ 卤化物优化调度,c++,schedule,halide,C++,Schedule,Halide,我正在努力为基准卤化物代码制定最佳时间表,但我可能遗漏了一些东西,因为计时结果对我来说没有多大意义 我正在使用AOT编译,下面是代码的算法部分: ImageParam input1(type_of<float>(), 3); ImageParam input2(type_of<float>(), 3); Func in1 = BoundaryConditions::constant_exterior(input1, 0.0f); Func in2 = BoundaryC
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使用上述计划时,执行时间比仅对其中一个函数使用计划时长。考虑到模具的结构,我认为调度这两个模具将提高性能。我错过了什么?此外,当我打印循环以查看生成的代码时:
for k:
parallel j.j:
store f1:
store f2:
for j.in_y in [0, 7]:
produce f1:
for k:
for j:
for i.i:
vectorized i.v122 in [0, 7]:
f1(...) = ...
consume f1:
produce f2:
for k:
for j:
for i.i:
vectorized i.v126 in [0, 7]:
f2(...) = ...
consume f2:
for i.i:
vectorized i.v133 in [0, 7]:
result(...) = ...
consume result:
是缩进还是产品f2嵌套在产品f1中?
有没有更好的时间表的建议 我认为这可能是内存带宽有限。将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);
也就是说,只需拉入每个输入的填充扫描线,然后进行所有内联数学运算
但它几乎没有你的快。区别可能是噪音。我的全部实验:
f2的生成嵌套在f1的消耗中。这很正常-它不使用f1,但它被使用f1的东西使用,所以这是它结束的合理位置。我不明白.args()部分在做什么!?另外,对于其中一个模板是垂直的,并且正注视着y轴上的相邻模板的情况,您对如何着手寻找一个好的时间表有什么建议吗?或者可能是两个模板的组合,而不是像这一个简单?我试图平铺输出(而不是分割),但这似乎太慢了
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);