ベンチマークハライドコードに最適なスケジュールを作成しようとしています。タイミングの結果があまり意味がないので、何かが欠けている可能性があります。ハライド最適スケジューリング
私は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:
それだけインデントですか農産物F1内にネストされた農産物f2がある:私はループを印刷するときにも生成されたコードを確認するには? より良いスケジュールの提案はありますか?
.args()の部分が何をしているのか分かりませんでした。また、ステンシルの1つが垂直で、y軸の隣人を見ている場合の良いスケジュールを見つける方法についての提案はありますか?または、2つの組み合わせであり、これと同じくらい単純なステンシルではないでしょうか?私は(分割の代わりに)出力をタイルしようとしましたが、それは遅すぎるようです –