L1 または L2 キャッシュにデータをロードするコードを体系的に記述するにはどうすればよいでしょうか?
具体的には、より高度な分析のために、システムの L1 I キャッシュを埋めることを目標にしています。アセンブリ コードの記述または単純な C プログラミングに関して、どんな提案でも構いません。このトピックに関する関連記事はさらに役に立ちます。
CPU のキャッシュ アソシアティビティと交換ポリシーを確認する必要があります。私が使用したすべての CPU で機能するこの問題の一般的な解決策は思いつきません。LRU 置換ポリシーに完全に関連付けられていると宣伝されているキャッシュでさえ、実際にはそうではなく、キャッシュを完全に満たすメモリ アクセスのパターンを把握することは非常に困難です。
非常に特定のベンチマークでこれが必要な場合 (他の理由でこれは悪い考えです)、代わりにキャッシュをフラッシュする方法を見つけようとすることをお勧めします。それは実際に実行可能です。
ちょうど先週、l1 および l2 キャッシュの ECC 充填のためにこのタスクを実行しました。
基本的に、たとえば 64K バイトのキャッシュがある場合、データの合計 (ウェイ数 x、キャッシュ ライン数 y など) は、キャッシュを介してその量のデータに直線的にアクセスするだけです (キャッシュを有効にするには mmu on が必要になる場合があります)。いくつかの 64K バイト境界と、理想的にはキャッシュ ライン サイズの読み取り (またはその倍数) で 64K バイト相当のデータを読み取ります。icache の場合、その多くのバイトに相当する命令 (nops または add reg+1 など) が必要です。おそらく最後にプリフェッチがあることを覚えておいてください。そのため、プリフェッチが実行されるように、いくつかの命令を返す最終リターンをバックオフする必要があるかもしれません。あなたは最後までずっと(いくつかの練習が必要かもしれませんし、ロジック(チップシム)への可視性がない場合は、それを理解できないかもしれません.
mmu またはその他のゲームを使用して、ロジックで必要なメモリ量を減らす必要がある場合があります。異なる mmu エントリ (16 の異なる仮想アドレスを持つ) と、4K を介した 16 の読み取りのそれぞれについて。もちろん、キャッシュが mmu の仮想アドレス側にある場合です。
mmu が命令のキャッシュを妨げている場合は、テストを実行するコードをキャッシュされていないスペースに配置して、icache を混乱させず、キャッシュを埋めるために使用される命令のみが含まれるようにすることができます。キャッシュされたアドレス空間。
幸運を...