2016-12-23 8 views
1

ベンチマークハライドコードに最適なスケジュールを作成しようとしています。タイミングの結果があまり意味がないので、何かが欠けている可能性があります。ハライド最適スケジューリング

私は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がある:私はループを印刷するときにも生成されたコードを確認するには? より良いスケジュールの提案はありますか?

答えて

1

おそらくメモリ帯域幅に制限があると思います。 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); 

Ie.各入力のパッド付きスキャンラインを引っ張り、すべての数学的インライン化を実行するだけです。

しかし、それはあなたよりも少し速いです。違いはノイズの可能性があります。私の完全な実験:F2の生産が内にネストされ

https://gist.github.com/abadams/c2e6f67d79e1768af6db5afcabb1caab

はf1の消費します。それは正常です - それはf1を使用しませんが、それはf1を使用する何かによって使用されるので、それはそれが終わるための合理的な場所です。

+0

.args()の部分が何をしているのか分かりませんでした。また、ステンシルの1つが垂直で、y軸の隣人を見ている場合の良いスケジュールを見つける方法についての提案はありますか?または、2つの組み合わせであり、これと同じくらい単純なステンシルではないでしょうか?私は(分割の代わりに)出力をタイルしようとしましたが、それは遅すぎるようです –

関連する問題