C++ 卤化物优化调度

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

我正在努力为基准卤化物代码制定最佳时间表,但我可能遗漏了一些东西,因为计时结果对我来说没有多大意义

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

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);