これはやや低レベルの質問です。x86アセンブリには、2つのSSE命令があります。
MOVDQA xmmi, m128
そして
MOVNTDQA xmmi, m128
IA-32ソフトウェア開発者マニュアルでは、MOVNTDQA のNTはNon-Temporalを表し、それ以外はMOVDQAと同じであると述べています。
私の質問は、非時間的とはどういう意味ですか?
これはやや低レベルの質問です。x86アセンブリには、2つのSSE命令があります。
MOVDQA xmmi, m128
そして
MOVNTDQA xmmi, m128
IA-32ソフトウェア開発者マニュアルでは、MOVNTDQA のNTはNon-Temporalを表し、それ以外はMOVDQAと同じであると述べています。
私の質問は、非時間的とはどういう意味ですか?
回答:
非一時的なSSE命令(MOVNTI、MOVNTQなど)は、通常のキャッシュコヒーレンシ規則に従っていない。したがって、一時的ではないストアの後には、他のプロセッサがタイムリーに結果を表示できるように、SFENCE命令を実行する必要があります。
データが生成され、すぐには(すぐには)消費されない場合、メモリストア操作が最初にキャッシュライン全体を読み取り、次にキャッシュデータを変更するという事実は、パフォーマンスに悪影響を及ぼします。この操作はキャッシュからデータをプッシュしますが、すぐに使用されないデータのために、再び必要になる可能性があります。これは、行列のように大きなデータ構造の場合に特に当てはまります。これは、塗りつぶされて後で使用されます。マトリックスの最後の要素が満たされる前に、実際のサイズでは最初の要素が削除され、書き込みのキャッシュが無効になります。
このような状況では、プロセッサは非一時的な書き込み操作をサポートします。このコンテキストでの非一時的とは、データがすぐに再利用されないことを意味するため、データをキャッシュする必要はありません。これらの非一時的な書き込み操作では、キャッシュラインを読み取って変更することはありません。代わりに、新しいコンテンツが直接メモリに書き込まれます。
SFENCE
必要とされなくてもよいです。少なくとも同じスレッドで。見てもらえますか?
sfence
、通常、NTストアに必要なシナリオがありますが、通常のストアだけに必要なシナリオはありません。NTストアは、他のスレッドで見られるように、他のストア(NTであるかどうかに関係なく)に対して順序付けされていませんsfence
。ただし、ストアを実行したのと同じスレッドからの読み取りの場合、必要はありませんsfence
。特定のスレッドは、NTストアであるかどうかに関係なく、常にプログラム順に自分のストアを表示します。
Espoはターゲットにかなり強いです。ちょうど私の2セントを追加したかった:
「非時間的」という表現は、時間的局所性がないことを意味します。キャッシュは2種類の局所性を利用します。空間的および時間的であり、非時間的命令を使用することで、近い将来にデータアイテムが使用されることを予期しないことをプロセッサに通知します。
キャッシュ制御命令を使用する手動でコード化されたアセンブリについては、少し懐疑的です。私の経験では、これらのことは、効果的なパフォーマンスの向上よりも悪質なバグにつながります。
インテル®64およびIA-32アーキテクチャーソフトウェア開発者向けマニュアル、第1巻:基本アーキテクチャー、「インテルストリーミングSIMD拡張命令(インテルSSE)によるプログラミング」の章によると、
時間的データと非時間的データのキャッシュ
プログラムによって参照されるデータは、一時的(データが再度使用される)または非一時的(データが1回参照され、すぐには再利用されない)にすることができます。たとえば、プログラムコードは一般に一時的ですが、3-Dグラフィックアプリケーションの表示リストなどのマルチメディアデータは非一時的であることがよくあります。プロセッサのキャッシュを効率的に使用するには、一時的データをキャッシュし、非一時的データをキャッシュしないことが一般的に望ましいです。非一時的なデータでプロセッサのキャッシュをオーバーロードすることは、「キャッシュの汚染」と呼ばれることがあります。SSEおよびSSE2のキャッシュ可能性制御命令により、プログラムは、キャッシュの汚染を最小限に抑える方法で非一時的なデータをメモリに書き込むことができます。
非一時的なロードおよびストア命令の説明。出典:Intel 64およびIA-32アーキテクチャソフトウェア開発者マニュアル、第2巻:命令セットリファレンス
LOAD(MOVNTDQA—ダブルクワッドワードの非時間的整列ヒントのロード)
メモリソースがWC(書き込み結合)メモリタイプの場合、非時間ヒントを使用して、ソースオペランド(第2オペランド)から宛先オペランド(第1オペランド)にダブルクワッドワードをロードします[...]
[...]プロセッサはデータをキャッシュ階層に読み込まず、対応するキャッシュラインをメモリからキャッシュ階層にフェッチしません。
Peter Cordesがコメントしているように、NTヒントは無視され(おそらくNT対応のHWプリフェッチャーがないため)、完全に強く順序付けされたロードセマンティクスが適用されるため、現在のプロセッサの通常のWB(ライトバック)メモリでは役に立たないことに注意してください。 。prefetchnta
WBメモリからの汚染削減負荷として使用できます
STORE(MOVNTDQ-非時間的ヒントを使用したパックされた整数のストア)
非時間ヒントを使用して、ソースオペランド(第2オペランド)のパック整数を宛先オペランド(第1オペランド)に移動し、メモリへの書き込み中にデータがキャッシュされないようにします。
[...]プロセッサはデータをキャッシュ階層に書き込まず、対応するキャッシュラインをメモリからキャッシュ階層にフェッチしません。
キャッシュ書き込みポリシーとパフォーマンスで定義された用語を使用すると、それらは書き込みアラウンド(書き込みなし割り当てなし、フェッチ失敗時書き込みなし)と見なすことができます。
最後に、非テンポラリーストアに関するJohn McAlpinのメモを確認することは興味深いかもしれません。
MOVNTDQA
は、WC(キャッシュ不可の書き込み結合)メモリ領域(ビデオRAMなど)で特別なことのみを行います。現在のHW上の通常のWB(ライトバック)メモリではまったく役に立ちません。NTヒントは無視され、完全に強く順序付けされたロードセマンティクスが適用されます。 prefetchnta
ただし、WBメモリからの汚染を軽減する負荷としては役立ちます。 現在のx86アーキテクチャは、(「通常の」メモリからの)非一時的なロードをサポートしていますか?。
MOVNTDQA xmmi, m128
はNTのロードですが、を除く他のすべてのNT命令はストアであることに注意してくださいprefetchnta
。ここで受け入れられた答えは、店舗についてのみ話しているようです。 これは、NTの負荷について私が確認できたことです。TL:DR:うまくいけば、CPUはキャッシュヒントを最小限に抑えるためにNTヒントを使用して何か便利なことを行いますが、「通常の」WBメモリの強く順序付けられたセマンティクスをオーバーライドしないため、キャッシュを使用する必要があります。