2008-08-31 6 views
81

これはやや低レベルの質問です。 x86のアセンブリでは2つのSSE命令がありますx86での非一時的なメモリアクセスの意味

MOVDQA xmmi, m128

MOVNTDQA xmmi, m128

IA-32ソフトウェア・デベロッパーズ・マニュアルは、そのNTで言いますMOVNTDQAはの略です。 -Temporal、それ以外の場合はMOVDQAと同じです。

私の質問は、何ですか非一時的の意味ですか?

+1

SSE4.1の 'MOVNTDQA xmmi、m128'はNTロードであり、他のすべてのNT命令は' prefetchnta'以外のストアであることに注意してください。ここで受け入れられた答えは、店舗について話しているようです。 [これは私がNTの負荷について上げることができたものです](http://stackoverflow.com/questions/32103968/non-temporal-loads-and-the-hardware-prefetcher-do-the-work-together )。 TL:DR:CPUがキャッシュ汚染を最小限に抑えるためにNTのヒントに役立つものがありますが、「通常の」WBメモリの強く順序付けされたセマンティクスをオーバーライドしないため、キャッシュを使用する必要があります。 –

+1

アップデート:NT *のロード*は、ほとんどのCPU(例えば、Intel SnBファミリ)のUCSWメモリ領域を除いて、何も役に立たないかもしれません。しかし、NT /ストリーミング*ストアは間違いなく通常のメモリで動作します。 –

+0

@Peter:あなたはUSWCのメモリを意味しますか?以前はUCSWやUSWCのメモリについて聞いたことがありません。 –

答えて

106

非一時SSE命令(MOVNTI、MOVNTQなど)は、通常のキャッシュコヒーレンシの規則に従わないでください。したがって、結果を他のプロセッサがタイムリーに見るためには、一時的でないストアにSFENCE命令を続ける必要があります。

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

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

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

+10

ニースの答えは、ノン・非一時的な命令(すなわち、通常の命令)であっても、NT命令のある種類のプロセッサでは、次のように指摘したいと思います。キャッシュは「読み込まれてから変更されません」。キャッシュにないラインへの通常の命令書込みでは、キャッシュ内にラインが予約され、マスクはラインのどの部分が最新であるかを示す。このウェブページでは「店舗でのストールなし」と呼ばれています。http://www.ptlsim.org/Documentation/html/node30.html私はより正確な参照を見つけることができませんでしたが、私はプロセッサシミュレータを実装する仕事をしている人から聞いたことがあります。 –

+2

実際には、http://www.ptlsim.org/はサイクル精度のプロセッサシミュレータに関するウェブサイトです。「店舗でのストールはありません」と言われたのとまったく同じ種類のものです。私は彼らがこのコメントを見たことがある場合に備えて、あまりにもそれらを言及したい:http://unisim.org/ –

+0

ここでの答えとコメントからhttps://stackoverflow.com/questions/44864033/make-previous-memory-stores-可視性から後続のメモリ負荷まで、それはSFENCEが必要ではないように思われる。少なくとも同じスレッドで。あなたも見ることができますか? –

29

エスポーは、ターゲット上のほとんどの強打です。

「一時的でない」という語句は、時間的局所性がないことを意味します。キャッシュは、空間的および時間的な2つの地域を利用し、近い将来にデータ項目が使用されることを期待しない非一時的な命令をプロセッサーに使用します。

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

+0

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

+1

問題のドメイン、アルゴリズム、またはアプリケーションの既知のローカリティプロパティ(またはその不足)を利用することは避けてください。キャッシュ汚染を避けることは、実際には非常に魅力的で効果的な最適化タスクです。また、なぜ組立への嫌悪感?コンパイラが大部分を利用することができない、利用可能な利益のための膨大な機会があります –

+3

知識のある低レベルのプログラマが小規模なカーネルのコンパイラより優れていることは間違いありません。これは論文やブログ記事を出版するのに最適です。彼らはまた良い教訓的なツールであり、 "本当に"何が起こっているのか理解するのに役立ちます。私の経験では、実際には、多くのプログラマーが作業している実際のシステムがあり、正確性と保守性が重要な場合、低レベルのコーディングの利点はほとんどの場合、リスクよりも凌駕されます。 – Pramod

関連する問題