多くのスレッドから同じメモリから何度も読み取り専用にする必要があるアプリケーションを C++ で作成しています。私の質問は、パフォーマンスの観点から、スレッドごとにメモリをコピーするか、すべてのスレッドに同じポインタを与えて、すべてのスレッドに同じメモリにアクセスさせる方がよいでしょうか。
ありがとう
多くのスレッドから同じメモリから何度も読み取り専用にする必要があるアプリケーションを C++ で作成しています。私の質問は、パフォーマンスの観点から、スレッドごとにメモリをコピーするか、すべてのスレッドに同じポインタを与えて、すべてのスレッドに同じメモリにアクセスさせる方がよいでしょうか。
ありがとう
ターゲット システムなどについて提供されたわずかな情報から決定的な答えはありませんが、通常の PC では、コピーしないことが最も速いでしょう。
コピーが遅くなる理由の 1 つは、データ領域が大きい場合にキャッシュ ミスが発生する可能性があることです。通常の PC は、同じデータ領域への読み取り専用アクセスをスレッド間で非常に効率的にキャッシュします。たとえそれらのスレッドがたまたま異なるコアで実行されていたとしてもです。
Intel がキャッシングへのアプローチについて明示的に挙げている利点の 1 つは、「キャッシュを共有している個別のコアで実行されているスレッドに、より多くのデータ共有の機会を提供する」ことです。つまり、明示的にデータをキャッシュするためにスレッドをプログラムする必要がなく、CPU がそれを行うという慣行を奨励しています。
多くのスレッドについて具体的に言及しているので、少なくともマルチソケットシステムを持っていると思います。通常、メモリ バンクはプロセッサ ソケットに関連付けられています。つまり、1 つのプロセッサが自身のメモリ バンクに「最も近く」にあり、他のバンクのデータにアクセスするには、他のプロセッサ メモリ コントローラと通信する必要があります。(ここでのプロセッサとは、ソケット内の物理的なものを意味します)
データを割り当てるとき、通常は初回書き込みポリシーを使用して、データを割り当てるメモリ バンクを決定します。つまり、他のプロセッサよりも高速にアクセスできます。
したがって、少なくとも複数のプロセッサ (複数のコアだけでなく) では、少なくともすべてのプロセッサにコピーを割り当てることでパフォーマンスが向上するはずです。マスタースレッドからではなく、すべてのプロセッサ/スレッドでデータを割り当て/コピーするようにしてください (最初の書き込みポリシーを利用するため)。また、メモリとの密接な接続が失われる可能性があるため、スレッドがプロセッサ間で移行されないようにする必要があります。
単一のプロセッサ上のすべてのスレッドのデータをコピーすることがパフォーマンスにどのように影響するかはわかりませんが、コピーしないことで、コア間で共有される上位レベルのキャッシュの内容を共有する機能が向上する可能性があると思います。
いずれにせよ、ベンチマークして、実際の測定に基づいて決定してください。