ベンチマーク Halide コードの最適なスケジュールを作成しようとしていますが、タイミングの結果があまり意味をなさないため、何かを見落としている可能性があります。
私は 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 の両方に使用すると、これらの Func の 1 つだけにスケジュールを使用する場合よりも実行時間が長くなります。ステンシルの構造を考えると、両方をスケジューリングするとパフォーマンスが向上すると思いました。ここで何が欠けていますか?また、ループを印刷して生成されたコードを確認すると、次のようになります。
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 内にネストされていますか? より良いスケジュールのための提案はありますか?