intrinsics guide はvoid _mm_prefetch (char const* p, int i)
についてこれだけを述べています:
アドレスpを含むメモリのデータ行を、ローカリティヒントiで指定されたキャッシュ階層の場所にフェッチします。
int i
パラメーターの可能な値をリストし、それらの意味を説明できますか?
_MM_HINT_T0
、_MM_HINT_T1
、_MM_HINT_T2
、_MM_HINT_NTA
、および_MM_HINT_ENTA
を見つけましたが、これが完全なリストであるかどうか、およびそれらの意味がわかりません。
プロセッサ固有の場合、Ryzenおよび最新のIntel Coreプロセッサで何が行われるかを知りたいです。
組み込み関数は、説明で与えられた抽象的な意味としてではなく、表現する命令の観点からよりよく理解される場合があります。
今日のように、局所定数の完全なセットは
#define _MM_HINT_T0 1
#define _MM_HINT_T1 2
#define _MM_HINT_T2 3
#define _MM_HINT_NTA 0
#define _MM_HINT_ENTA 4
#define _MM_HINT_ET0 5
#define _MM_HINT_ET1 6
#define _MM_HINT_ET2 7
Intel Xeon Phiコプロセッサーのプリフェッチ機能に関するこのペーパー 。
IA32/AMDプロセッサーの場合、セットは
#define _MM_HINT_T0 1
#define _MM_HINT_T1 2
#define _MM_HINT_T2 3
#define _MM_HINT_NTA 0
#define _MM_HINT_ET1 6
_mm_prefetch
は、アーキテクチャとローカリティのヒントに基づいて異なる命令にコンパイルされます
Hint IA32/AMD iMC
_MM_HINT_T0 prefetcht0 vprefetch0
_MM_HINT_T1 prefetcht1 vprefetch1
_MM_HINT_T2 prefetcht2 vprefetch2
_MM_HINT_NTA prefetchtnta vprefetchnta
_MM_HINT_ENTA - vprefetchenta
_MM_HINT_ET0 - vprefetchet0
_MM_HINT_ET1 prefetchtwt1 vprefetchet1
_MM_HINT_ET2 - vprefetchet2
すべての要件が満たされている場合、(v)prefetch
命令が行うことは、キャッシュラインに相当するデータをローカリティヒントで指定されたキャッシュレベルに入れることです。
指示は単なるヒントであり、無視してもかまいません。
行がレベルXにプリフェッチされると、マニュアル(IntelとAMDの両方)は、他のすべての上位レベルにもフェッチされると述べています(ただし、X = 3の場合)。
これが実際に本当かどうかわかりません。ラインがプリフェッチwith-respect-toキャッシュレベルXで、キャッシュ戦略によってより高いレベル(包括的と非包括的)が存在する場合と存在しない場合があります。
(v)prefetch
命令の別の属性は、非時間属性です。
非一時的なデータがすぐに再利用されることはほとんどありません。
私の理解では、NTデータはIA32アーキテクチャの「ストリーミングロードバッファ」に保存されます1 一方、iMCアーキテクチャの場合、通常のキャッシュ(ハードウェアスレッドIDの方法として使用)に格納されますが、Most Recent Use置換ポリシーを使用します(必要に応じて次の削除ラインになります)。
AMDのマニュアルでは、ソフトウェアの不可視バッファーから専用の非一時キャッシュまで、実際の場所は実装に依存していると読みました。
(v)prefetch
命令の最後の属性は、「意図」属性または「排除」属性です。
MESI-and-variantプロトコルにより、ラインを排他状態にするために(要求を変更するために)所有権の要求を行う必要があります。
。後で書きますが.
IA32およびAMDアーキテクチャは、非一時キャッシュレベルが実装定義であるため、排他的な非一時ヒント(まだ)をサポートしていません。
iMCアーキテクチャでは、ローカリティコード_MM_HINT_ENTA
を使用できます。
1 WCバッファーであると理解しています。 Peter Cordesは、これを 以下のコメント :で明確にしました。USWCメモリ領域をプリフェッチする場合、prefetchntaはLine-Fillバッファのみを使用します。それ以外の場合、L1にプリフェッチします
参照用に、関連する指示の説明があります
PREFETCHh
ソースオペランドで指定されたバイトを含むメモリのデータ行を、ローカリティヒントで指定されたキャッシュ階層の場所にフェッチします。
•T0(一時データ)-キャッシュ階層のすべてのレベルにデータをプリフェッチします。
•T1(第1レベルのキャッシュミスに関する一時的なデータ)-レベル2以上のキャッシュにデータをプリフェッチします。
。
•NTA(すべてのキャッシュレベルに関して非一時的なデータ)-非一時的なキャッシュ構造とプロセッサに近い場所にデータをプリフェッチし、キャッシュ汚染を最小限に抑えます。
PREFETCHWT1
ソースオペランドで指定されたバイトを含むデータ行を、ヒントを書き込む意図で指定されたキャッシュ階層内の場所にフェッチします(したがって、データは所有権の要求により「排他的」状態になります)。ヒント:
•T1(1次キャッシュに関する一時データ)-2次キャッシュにデータをプリフェッチします。
VPREFETCHh
Cache Temporal Exclusive state Level VPREFETCH0 L1 NO NO VPREFETCHNTA L1 YES NO VPREFETCH1 L2 NO NO VPREFETCH2 L2 YES NO VPREFETCHE0 L1 NO YES VPREFETCHENTA L1 YES YES VPREFETCHE1 L2 NO YES VPREFETCHE2 L2 YES YES