2

NASM ドキュメントで以下の手順に出くわしましたが、それらの表と裏を完全に作成することはできません。悲しいことに、これらの手順に関するインテルのドキュメントもやや不足しています。

PREFETCHNTA m8                ; 0F 18 /0        [KATMAI] 
PREFETCHT0 m8                 ; 0F 18 /1        [KATMAI] 
PREFETCHT1 m8                 ; 0F 18 /2        [KATMAI] 
PREFETCHT2 m8                 ; 0F 18 /3        [KATMAI]

特定のアドレスに256バイトをキャッシュするなど、命令の簡潔な例を誰かが提供できますか? 前もって感謝します!

4

2 に答える 2

7

これらの命令は、CPU がキャッシュ ラインをキャッシュにプリフェッチしようとすることを示唆するために使用されるヒントです。これらはヒントであるため、CPU はそれらを完全に無視できます。

CPU がそれらをサポートしている場合、CPU はプリフェッチを試みますが、TLB ミスが含まれる場合はあきらめます (プリフェッチしません)。これは、ほとんどの人が間違っているところです (たとえば、ダミーの読み取りを挿入して TLB ロードを強制し、プリフェッチが機能しないようにする「プリロード」を行わないなど)。

プリフェッチされるデータの量は、CPU などによって 32 バイト以上になります。CPUID を使用して、実際のサイズを決定できます (CPUID 関数 0x00000004、EBX ビット 0 ~ 31 で返される「システム コヒーレンシ ライン サイズ」)。

プリフェッチが遅すぎると役に立ちません。プリフェッチが早すぎると、データが使用される前にキャッシュから追い出される可能性があります (これも役に立ちません)。Intel の「IA-32 Intel Architecture Optimization Reference Manual」には、「Mathematics of Prefetch Scheduling Distance」と呼ばれるプリフェッチのタイミングを計算する方法を説明する付録があり、おそらく読む必要があります。

また、プリフェッチによってパフォーマンスが低下する可能性があること (たとえば、領域を確保するために必要なデータを削除する必要がある場合) と、何もプリフェッチしない場合でも、CPU にはハードウェア プリフェッチャーがあり、おそらくそれが実行されることを忘れないでください。おそらく、このハードウェア プリフェッチャーがどのように機能するか (および機能しない場合) についても読む必要があります。たとえば、シーケンシャル リード (例: memcmp()) の場合、ハードウェア プリフェッチャーがそれを行いますが、明示的なプリフェッチを使用することは、ほとんどの場合時間の無駄です。CPUのハードウェアプリフェッチャーが予測できない/予測できない「ランダム」(非順次)アクセスの明示的なプリフェッチを気にするだけの価値があるでしょう。

于 2013-01-07T08:45:33.637 に答える
1

高度に最適化されたmemcmp関数などの例をいくつか調べた後、これらの命令を(ある程度)効果的に使用する方法を理解しました。

これらの命令は、32バイトのキャッシュ「行」を意味します。これは私が最初に見逃したものです。したがって、256バイトのバッファをL1とL2にキャッシュするには、次の命令セットを使用できます。

prefetcht1 [buffer]
prefetcht1 [buffer+32]
prefetcht1 [buffer+64]
prefetcht1 [buffer+96]
prefetcht1 [buffer+128]
prefetcht1 [buffer+160]
prefetcht1 [buffer+192]
prefetcht1 [buffer+224]

t0サフィックスは、CPUにキャッシュ階層全体にプリフェッチするように指示します。

t1は、データをL1、L2などにキャッシュするように指示します。

t2はこの傾向を継続し、L2などにプリフェッチします。

「nta」サフィックスは、キャッシュラインの読み取り/書き込みではなく、データをメモリに直接書き込むように(理想的には)CPUに指示するため、少し混乱します。これは、キャッシュの汚染を回避し、代わりにより関連性の高いデータをキャッシュできるため、非常に大きなデータ構造の場合に実際に非常に役立ちます。

于 2013-01-07T08:22:20.957 に答える