2010-11-26 13 views
4

私はARM cortex-a8プロセッサ上で動作する画像処理プロジェクトを改善しようとしています。ARM Cortex-A8:1つのメモリに読み込まれるバイト数は何バイトですか?

私はメモリから8ビットのグレースケールイメージデータにアクセスしていました。私の関数では、今私は個々のピクセル値にバイト単位でアクセスしています。

NEONを使用することで、メモリからワンショットで128/8 = 16バイトにアクセスし、それを自分の機能で使用することでこれを改善できると思いました。しかし、変更されたバージョンを実行すると、これは実際にはより多くのバイト単位のアクセスよりも時間かかることがわかります。私はNEONを使ったフェッチがボトルネックになり、計算時間よりも時間がかかると思います。

ARM Cortex-A8のデータバスサイズはどのくらいですか? 1回のメモリフェッチでメモリからアクセスされるバイト数はいくつですか? Cortex A8 TRMから

+0

キャッシュは、通常これを抽象化しています。 SDRAMから、バースト読み書きを行います。ダイレクトスクリーンメモリを使用している場合、キャッシュは* write through *かもしれません。答えは、使用しているメモリによって異なります。あなたは常に*メモリパフォーマンス*をベンチマークして、あなたのコードと比較するべきです。 「Cortex-A8メモリコピー」(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html)を参照してください。 –

答えて

3

を「あなたは、システムの設計に柔軟性を提供していずれかの64ビットまたは128ビットのAXIインターコネクトに接続するようにプロセッサを構成することができ、」おそらく、NEON必要ですあなたはリンゴとオレンジを比較していますか? ldrb/strbではなく、ldrd/strdまたはldm/stmを使用して64ビット転送を行うことができます。 ARM/AXIは先を見越して小さな転送をより大きな転送にグループ分けすることができます。たとえば、2つの32ビット転送を1つの64ビットにグループ分けすることができます。しかし、私はそれに頼るつもりはありません。私はあなたがldr/strまたはldrd/strdに変更することで、パフォーマンスを向上させることができない場合にのみ言及します。

読み取りループまたは書き込みループを分離(データ処理なし)し、バイト対ワードかダブルワードを試しましたか?単語からバイトを抽出するコードがバスの節約を圧倒している可能性があります。

これはどのタイプのメモリですか?これはチップ上にあるのか、それともオフチップなのでしょうか?AXI(ARM)のクロック速度に比べてこのメモリの速度はどれくらいですか?

この地域のデータキャッシュを有効にしていますか?もしそれがミュートポイントである可能性がある場合、最初のバイトは最適なデータバスサイズを使用してキャッシュラインフィルを行い、そのキャッシュライン内の後続のリードは、ターゲットメモリよりもはるかに少ないAXIバスに到達しません。同様に、書き込みは、キャッシュまで移動し、後でより広いバス最適化サイズで目標に行くべきである。キャッシュ/ライトバッファの設定方法によって異なります。

+0

あなたはそれが64または128ビット幅axiバスであるかどうかをベンダーから調べる必要があります。 –

+0

128ビット境界で128ビットの倍数でldmを使って試してみたいと思うかもしれませんが、私はよく知っているプロセッサ上の64ビットaxiバスが1つのaxiコマンドで複数のバス幅を読み取ると思いますしかし、ベンダーがそのaxiバスに配線したものと、実装した方法は依然としてあなたを噛ませることができます。 –

+0

私は私の答えを編集することができたことを知っている、私はしなかった。ldmは、多くの作業である各バイトをシフトして隔離しなければならないことになります。そして、それぞれのバイトで実行したいものを実行します。個々のバイトの読み込みでは、シフトを行うが、l2の場合は個々のaxi転送を、l1の場合はaxi転送を行わない。あなたがsimdの指示をしなければならない場合は、おそらく固定小数点のLDMなどの問題が問題です。 –

0

パイプラインのストールが発生する可能性があります。 Neonを読みたい場合は、そのデータをCPUコアで使用できるようになるまでに待ち時間があります。

関連する問題