パフォーマンスに関しては、各スレッドが頻繁にアクセスするデータのブロックを取得すると仮定します。これらのデータは読み取り専用です。つまり、スレッドはデータの読み取り以外には何もしません。
では、スレッドごとにこれらのデータのコピーを 1 つ作成することは有益でしょうか (データが読み取り専用であると仮定します)。
頻繁にアクセスされるデータが (スレッドごとに 1 つのコピーではなく) すべてのスレッドで共有されている場合、これらのデータが適切にキャッシュされる可能性が高くなりませんか?
パフォーマンスに関しては、各スレッドが頻繁にアクセスするデータのブロックを取得すると仮定します。これらのデータは読み取り専用です。つまり、スレッドはデータの読み取り以外には何もしません。
では、スレッドごとにこれらのデータのコピーを 1 つ作成することは有益でしょうか (データが読み取り専用であると仮定します)。
頻繁にアクセスされるデータが (スレッドごとに 1 つのコピーではなく) すべてのスレッドで共有されている場合、これらのデータが適切にキャッシュされる可能性が高くなりませんか?
スレッドごとに読み取り専用データのコピーが 1 つだけでは、キャッシュには役立ちません。まったく逆に、スレッドが同じマルチコア (および場合によってはハイパースレッド化された) CPU で実行され、そのキャッシュを共有すると、代わりに悪影響を与える可能性があります。
ただし、マルチ CPU システムの場合、現在は事実上すべてが NUMA であり、通常、CPU ごとのメモリ バンクがあり、「ローカル」メモリと「リモート」メモリの間でアクセス コストが多少異なります。 - ローカル メモリ バンクに配置された、読み取り専用データのCPUコピー。
メモリ マッピングは OS によって制御されるため、この道をたどる場合は、OS の NUMA 関連の動作を調べることが理にかなっています。たとえば、Linux はファーストタッチ メモリ割り当てポリシーを使用します。つまり、メモリ マッピングはmalloc
、プログラムが初めてメモリ ページにアクセスしたときではなく、OS がローカル バンクから物理メモリを割り当てようとするときに発生します。
そして、通常のパフォーマンスのモットーが適用されます: 測定、推測しないでください。