x86での「非一時的」メモリアクセスの意味は何ですか


123

これはやや低レベルの質問です。x86アセンブリには、2つのSSE命令があります。

MOVDQA xmmi, m128

そして

MOVNTDQA xmmi, m128

IA-32ソフトウェア開発者マニュアルでは、MOVNTDQA のNTNon-Temporalを表し、それ以外はMOVDQAと同じであると述べています。

私の質問は、非時間的とはどういう意味ですか?


6
SSE4.1 MOVNTDQA xmmi, m128はNTのロードですが、を除く他のすべてのNT命令はストアであることに注意してくださいprefetchnta。ここで受け入れられた答えは、店舗についてのみ話しているようです。 これは、NTの負荷について私が確認できたことです。TL:DR:うまくいけば、CPUはキャッシュヒントを最小限に抑えるためにNTヒントを使用して何か便利なことを行いますが、「通常の」WBメモリの強く順序付けられたセマンティクスをオーバーライドしないため、キャッシュを使用する必要があります。
Peter Cordes

5
更新:ほとんどのCPU(例:Intel SnBファミリ)のUCSWメモリ領域を除いて、NT ロードは何の役にも立ちません。ただし、NT /ストリーミングストアは通常のメモリで確実に機能します。
Peter Cordes 2017

4
@ピーター:あなたはUSWCのメモリを意味するのですか?私は、UCSWやUSWCの記憶について聞いたことがありません。間違った頭字語のグーグルは役に立たなかった:-)
Andrew Bainbridge

4
@AndrewBainbridge:はい、WCメモリタイプ属性。キャッシュ不可の投機的書き込み結合。私はUnCacheableを大文字にしていて、長さが4文字になるはずだったことを思い出しました。:P
Peter Cordes

回答:


147

非一時的なSSE命令(MOVNTI、MOVNTQなど)は、通常のキャッシュコヒーレンシ規則に従っていない。したがって、一時的ではないストアの後には、他のプロセッサがタイムリーに結果を表示できるように、SFENCE命令を実行する必要があります。

データが生成され、すぐには(すぐには)消費されない場合、メモリストア操作が最初にキャッシュライン全体を読み取り、次にキャッシュデータを変更するという事実は、パフォーマンスに悪影響を及ぼします。この操作はキャッシュからデータをプッシュしますが、すぐに使用されないデータのために、再び必要になる可能性があります。これは、行列のように大きなデータ構造の場合に特に当てはまります。これは、塗りつぶされて後で使用されます。マトリックスの最後の要素が満たされる前に、実際のサイズでは最初の要素が削除され、書き込みのキャッシュが無効になります。

このような状況では、プロセッサは非一時的な書き込み操作をサポートします。このコンテキストでの非一時的とは、データがすぐに再利用されないことを意味するため、データをキャッシュする必要はありません。これらの非一時的な書き込み操作では、キャッシュラインを読み取って変更することはありません。代わりに、新しいコンテンツが直接メモリに書き込まれます。

出典:http : //lwn.net/Articles/255364/


15
いい答えですが、NT命令を使用する種類のプロセッサでは、非一時的でない命令(つまり、通常の命令)を使用しても、ラインキャッシュが「読み取られてから変更される」ことはありません。キャッシュにないラインに書き込む通常の命令の場合、ラインはキャッシュに予約され、マスクはラインのどの部分が最新かを示します。このWebページでは、「ストアにストールがない」と呼びます:ptlsim.org/Documentation/html/node30.html。これ以上正確なリファレンスは見つかりませんでした。プロセッサシミュレータを実装する仕事をしている人からのみ、これについて聞きました。
Pascal Cuoq

2
実際、ptlsim.orgは、サイクル精度のプロセッサシミュレータに関するWebサイトであり、「店頭での屋台なし」について私に言った人たちがやっていることとまったく同じです。彼らがこのコメントを見た場合に備えて、私も彼らに言及した方がいいでしょう:unisim.org
Pascal Cuoq

1
ここで回答やコメントからstackoverflow.com/questions/44864033/...それはそうSFENCE必要とされなくてもよいです。少なくとも同じスレッドで。見てもらえますか?
セルジュロガッチ2017

1
@SergeRogatchこれは、話しているシナリオによって異なりますがsfence、通常、NTストアに必要なシナリオがありますが、通常のストアだけに必要なシナリオはありません。NTストアは、他のスレッド見られるように、他のストア(NTであるかどうかに関係なく)に対して順序付けされていませんsfence。ただし、ストアを実行したのと同じスレッドからの読み取りの場合、必要はありませんsfence。特定のスレッドは、NTストアであるかどうかに関係なく、常にプログラム順に自分のストアを表示します。
BeeOnRope

40

Espoはターゲットにかなり強いです。ちょうど私の2セントを追加したかった:

「非時間的」という表現は、時間的局所性がないことを意味します。キャッシュは2種類の局所性を利用します。空間的および時間的であり、非時間的命令を使用することで、近い将来にデータアイテムが使用されることを予期しないことをプロセッサに通知します。

キャッシュ制御命令を使用する手動でコード化されたアセンブリについては、少し懐疑的です。私の経験では、これらのことは、効果的なパフォーマンスの向上よりも悪質なバグにつながります。


「キャッシュ制御命令を使用する手動でコード化されたアセンブリ」に関する質問。JavaVMのようなものについては、「手動でコーディングした」と明示的に言っていたと思います。これはより良いユースケースですか?JavaVM /コンパイラはプログラムの静的および動的な動作を分析し、これらの非一時的な命令を使用します。
Pat

4
問題のドメイン、アルゴリズム、またはアプリケーションの既知の局所性プロパティ(またはその欠如)を悪用することは避けてください。キャッシュ汚染を回避することは、非常に魅力的で効果的な最適化タスクです。また、なぜアセンブリへの嫌悪?コンパイラーが活用できない可能性のある利益を得る機会は膨大です
awdz9nld

5
知識のある低レベルのプログラマが小さなカーネルのコンパイラよりも優れていることは間違いありません。これは論文やブログ投稿を公開するのに最適です。また、それらは優れた教訓的なツールであり、「実際に」何が起こっているのかを理解するのに役立ちます。ただし、実際には、多くのプログラマーが作業する実際のシステムがあり、正確性と保守性が重要な場合、低レベルのコーディングの利点は、ほとんどの場合リスクよりも重要です。
Pramod、2015

4
@Pramodその同じ議論は一般的に最適化に簡単に一般化され、実際には議論の範囲内にはありません-明らかに、非一時的な命令について話しているという事実を踏まえると、トレードオフはすでに考慮されているか、そうでなければ無関係であると見なされています
awdz9nld 2016年

7

インテル®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(ライトバック)メモリでは役に立たないことに注意してください。 。prefetchntaWBメモリからの汚染削減負荷として使用できます

STORE(MOVNTDQ-非時間的ヒントを使用したパックされた整数のストア)

非時間ヒントを使用して、ソースオペランド(第2オペランド)のパック整数を宛先オペランド(第1オペランド)に移動し、メモリへの書き込み中にデータがキャッシュされないようにします。

[...]プロセッサはデータをキャッシュ階層に書き込まず、対応するキャッシュラインをメモリからキャッシュ階層にフェッチしません。

キャッシュ書き込みポリシーとパフォーマンスで定義された用語を使用する、それらは書き込みアラウンド(書き込みなし割り当てなし、フェッチ失敗時書き込みなし)と見なすことができます。

最後に、非テンポラリーストアに関するJohn McAlpinのメモを確認することは興味深いかもしれません。


3
SSE4.1 MOVNTDQAは、WC(キャッシュ不可の書き込み結合)メモリ領域(ビデオRAMなど)で特別なことのみを行います。現在のHW上の通常のWB(ライトバック)メモリではまったく役に立ちません。NTヒントは無視され、完全に強く順序付けされたロードセマンティクスが適用されます。 prefetchntaただし、WBメモリからの汚染を軽減する負荷としては役立ちます。 現在のx86アーキテクチャは、(「通常の」メモリからの)非一時的なロードをサポートしていますか?
Peter Cordes

2
正解です。NTストアはWBメモリで正常に動作し、順序が弱く、通常、メモリの大きな領域を書き込むのに適しています。しかし、NTロードはそうではありません。紙に書かれたx86マニュアルでは、NTヒントはWBメモリからのロードに対して何かを行うことができますが、現在のCPUでは何もしませ。(おそらくNT対応のHWプリフェッチャーがないためです。)
Peter Cordes

その関連情報を回答に追加しました。どうもありがとうございました。
chus

1
@LewisKelsey:NT ストアはメモリタイプを上書きします。これが、WBメモリで弱く順序付けできる理由です。主な効果はRFOの回避です(memに到達したときに他のダーティラインをクリアする無効化を送信しているようです)。また、順序どおりに表示されない可能性があるため、以前のキャッシュミス(通常の)ストアのコミット後、または以前のキャッシュミスのロードがデータを取得するまで待機する必要はありません。つまり、ボトルネックの種類について尋ねられます。マルチコアシステムでは、各コアの外側のメモリは常に概念的にフラット/均一/同期ですか?
Peter Cordes

1
@LewisKelsey:メモリーオーダーマシンのクリアは、必要に応じて、早期に実行されるべきではないUCストアの後からのロードを強制終了する可能性があります。それ以外の場合、コミット順は、ストアが順不同のバックエンドから撤退するまで機能しません。これは、store-address uopが実行されるまで発生しません。この時点で、アドレスのメモリタイプを確認できます。store-address uopは、実行時にTLBをチェックします。これが、CPUがリタイアする前に障害のあるストアを検出できる方法です。SBエントリがL1dにコミットする準備ができるまで待つことができません。その時点で、実行はそれを超えています。
Peter Cordes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.