142

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

MOVDQA xmmi, m128

MOVNTDQA xmmi, m128

IA-32 Software Developer's Manual によると、MOVNTDQAのNTはNon-Temporalを表し、それ以外は MOVDQA と同じです。

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

4

3 に答える 3

172

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

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

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

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

于 2008-08-31T20:50:00.200 に答える
42

Espo はかなり狙い通りです。私の2セントを追加したかっただけです:

「非一時的」というフレーズは、一時的な局所性を欠いていることを意味します。キャッシュは、空間的および時間的という 2 種類の局所性を利用します。また、非一時的な命令を使用することで、データ項目が近い将来に使用されるとは思わないことをプロセッサに通知します。

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

于 2008-09-01T16:03:35.810 に答える