web-dev-qa-db-ja.com

_mm_prefetch()局所性ヒントとは何ですか?

intrinsics guidevoid _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プロセッサで何が行われるかを知りたいです。

15
Serge Rogatch

組み込み関数は、説明で与えられた抽象的な意味としてではなく、表現する命令の観点からよりよく理解される場合があります。


今日のように、局所定数の完全なセットは

#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
17
Margaret Bloom