0

アセンブラでネオンに最適化されたボックス フィルタを作成しました。i.MX6 (cortex-a9) で実行されています。私は今、マシンのメモリ帯域幅の問題について説明していますが、これは私の観察を説明していません:

私のコード(インラインアセンブラ)

    "loopSlide: \n\t"
    "vld1.16 {q0-q1}, [%[add]]! \n\t"
    "vld1.16 {q2-q3}, [%[add]]! \n\t"
    "vsra.u16 q6, q0, #5 \n\t"
    "vsra.u16 q7, q1, #5 \n\t"
    "vsra.u16 q8, q2, #5 \n\t"
    "vsra.u16 q9, q3, #5 \n\t"
    "vld1.16 {q0-q1}, [%[sub]]! \n\t"
    "vld1.16 {q2-q3}, [%[sub]]! \n\t"
    "vshr.u16 q0, q0, #5 \n\t"
    "vsub.u16 q6, q6, q0 \n\t"
    "vshr.u16 q1, q1, #5 \n\t"
    "vsub.u16 q7, q7, q1 \n\t"
    "vst1.16 {q6-q7}, [%[sub]]! \n\t"
    "vshr.u16 q2, q2, #5 \n\t"
    "vsub.u16 q8, q8, q2 \n\t"
    "vshr.u16 q3, q3, #5 \n\t"
    "vsub.u16 q9, q9, q3 \n\t"
    "vst1.16 {q8-q9}, [%[sub]]! \n\t"

    "add %[dst], %[dst], %[inc] \n\t"
    "pldw [%[dst]] \n\t"
    "add %[add], %[add], %[inc] \n\t"
    "add %[sub], %[sub], %[inc] \n\t"
    "cmp %[src], %[end] \n\t"
    "bne loopSlide \n\t"

画像全体に 105 ミリ秒かかるため、命令ごとに 25 CPU サイクルになります!

vst 命令のみを削除すると、アルゴリズムは最大 9.5 ミリ秒まで高速化されます。これは、メモリ帯域幅に関する私の期待に適合しています。

ここで、入力バッファーと出力バッファーを交換してみましたが、同じ量のロードとストアに 17 ミリ秒もかかりませんでした! 入力バッファが以前に書き込まれたため、違いが予想されていた場合は、L2 キャッシュに残っている可能性があり、より高速に読み取ることができますが、キャッシュされていないデータから読み取って保存する方が 6 倍高速です。キャッシュされた...

どちらのバッファーも 512 ビットのアライメントを持ち、同じキャッシュ ポリシーで同じメモリ領域に存在します。

何が問題の原因であるか、またはそれをさらに調査するために何を試みるかについて何か考えがありますか?

4

0 に答える 0