処理されたデータ構造の 64 バイト アラインメントを必要とするスレッド化された C コードがあります。このアライメントは、gcc __builtin_prefetch などのプリフェッチ命令とどのように相互作用しますか? プリフェッチの効果は、アラインされていない配列を使用する場合と同じですか?
整列された配列を取得するために memalign を使用していることに注意してください。
ありがとう。
処理されたデータ構造の 64 バイト アラインメントを必要とするスレッド化された C コードがあります。このアライメントは、gcc __builtin_prefetch などのプリフェッチ命令とどのように相互作用しますか? プリフェッチの効果は、アラインされていない配列を使用する場合と同じですか?
整列された配列を取得するために memalign を使用していることに注意してください。
ありがとう。
これに対する答えは、実装に大きく依存します。
ただし、x86 および x86_64 では、GCC__builtin_prefetch
は単一のPREFETCH
アセンブリ命令として実装されます。
Intelのドキュメントによると(「PREFETCH」を検索):
ソース オペランドで指定されたバイトを含むメモリからデータの行を、ローカリティ ヒントで指定されたキャッシュ階層内の場所にフェッチします。
AMD バージョンも同じように動作することは 99% 確信していますが、忙しすぎて確認できません...
そのため、メモリ オペランドがアラインされていない場合、効果的に 64 バイトの倍数に切り捨てられ、そのキャッシュ ラインがプリフェッチされます。(ええと、私が知っている現在のすべての CPU で 64 バイトです。命令セット参照は、「最小 32 バイト」であることが保証されているだけです。なぜわざわざそんなことを言ったのかわかりません。このガジェットを使用する意味がある状況では、特定の CPU についてすでに多くのことを想定しておく必要があります。)