小さなコードを ARM Cortex A8 プロセッサに移植したいと考えています。L1 キャッシュと L2 キャッシュはどちらも非常に制限されています。私のプログラムには 3 つの配列があります。そのうちの 2 つはシーケンシャル アクセス (サイズ > 配列 A: 6MB、配列 B: 3MB) であり、3 つ目の配列 (サイズ > 配列 C: 3MB) のアクセス パターンは予測できません。計算はそれほど厳密ではありませんが、配列 C にアクセスするための巨大なキャッシュ ミスがあります。私が考えた 1 つの解決策は、配列 C により多くのキャッシュ (L2) スペースを割り当て、配列 A と B には少ないスペースを割り当てることです。しかし、私はできませんこれを達成する方法を見つけるために。ARM のプリロード エンジンを調べましたが、有用なものは見つかりませんでした。
2 に答える
キャッシュを分割し、各配列をその別の部分に割り当てることをお勧めします。
残念ながら、それは不可能です。CortexA8 のキャッシュはそれほど柔軟ではありません。古き良きStrongArmには、まさにこの分割目的のための2次キャッシュがありましたが、もう利用できません. 代わりに L1 および L2 キャッシュがあります (全体的に良い変更です)。
ただし、できることがあります。
CortexA8 の NEON SIMD ユニットは、汎用処理ユニットよりも約 10 プロセッサ サイクル遅れています。巧妙なプログラミングにより、汎用ユニットからキャッシュ プリフェッチを発行できますが、アクセスは NEON 経由で実行できます。2 つのパイプライン間の遅延により、キャッシュがプリフェッチを行うための少しの時間が与えられるため、平均キャッシュ ミス時間は短くなります。
欠点は、計算結果を NEON から ARM ユニットに戻してはならないことです。NEON はこれより遅れるため、完全な CPU パイプライン フラッシュが発生します。キャッシュ ミスと同じくらいコストがかかるとは言えません。
パフォーマンスの違いは非常に大きい場合があります。突然、20% から 30% の速度向上が見込めます。
Google 経由で見つけたものから、ARMv7 (Cortex A8 がサポートする ISA のバージョン) にはキャッシュ フラッシュ機能があるように見えますが、その使用方法に関する明確なリファレンスは見つかりませんでした。検索ボックスに「ARM キャッシュ フラッシュ」と入力して結果を読むのに費やした 1 ~ 2 分よりも多くの時間を費やした方がよいでしょう。
いずれにせよ、「フラッシュ」命令を定期的に発行して、A と B の不要であることがわかっている部分をフラッシュすることで、目的の近似値を達成できるはずです。