1

処理されたデータ構造の 64 バイト アラインメントを必要とするスレッド化された C コードがあります。このアライメントは、gcc __builtin_prefetch などのプリフェッチ命令とどのように相互作用しますか? プリフェッチの効果は、アラインされていない配列を使用する場合と同じですか?

整列された配列を取得するために memalign を使用していることに注意してください。

ありがとう。

4

1 に答える 1

1

これに対する答えは、実装に大きく依存します。

ただし、x86 および x86_64 では、GCC__builtin_prefetchは単一のPREFETCHアセンブリ命令として実装されます。

Intelのドキュメントによると(「PREFETCH」を検索):

ソース オペランドで指定されたバイトを含むメモリからデータの行を、ローカリティ ヒントで指定されたキャッシュ階層内の場所にフェッチします。

AMD バージョンも同じように動作することは 99% 確信していますが、忙しすぎて確認できません...

そのため、メモリ オペランドがアラインされていない場合、効果的に 64 バイトの倍数に切り捨てられ、そのキャッシュ ラインがプリフェッチされます。(ええと、私が知っている現在のすべての CPU で 64 バイトです。命令セット参照は、「最小 32 バイト」であることが保証されているだけです。なぜわざわざそんなことを言ったのかわかりません。このガジェットを使用する意味がある状況では、特定の CPU についてすでに多くのことを想定しておく必要があります。)

于 2011-06-24T22:12:15.803 に答える