我正在尝试为基准卤化物代码制定最佳时间表,但我可能会遗漏一些东西,因为计时结果对我来说没有多大意义。
我正在使用 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);
对于时间表,这就是我所拥有的:
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();
我使用 current_time 函数来计时我的代码的执行。当我对 f1 和 f2 都使用上述时间表时,执行时间比我仅在其中一个 Funcs 上使用时间表时要长。考虑到模板的结构,我认为调度它们会提高性能。我在这里想念什么?此外,当我打印循环以查看生成的代码时:
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 中?对更好的时间表有什么建议吗?