1

ベンチマーク 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 内にネストされていますか? より良いスケジュールのための提案はありますか?

4

1 に答える 1