数日前、Stephan T. Lavavejによるこの非常に興味深いプレゼンテーションを偶然見ました。このプレゼンテーションでは、「 We Know Where You Live」の最適化について言及しています(質問のタイトルに頭字語を使用して申し訳ありません。それ以外の場合は質問が閉じられた可能性があると警告しました。 )、そしてマシンアーキテクチャに関するハーブサッターによるこの美しいもの。
簡単に言うと、「We Know Where You Live」の最適化は、作成中のオブジェクトと同じメモリブロックに参照カウンターを配置することで構成されますmake_shared
。これにより、2つではなく1つのメモリ割り当てが行われ、shared_ptr
よりコンパクトになります。
しかし、上記の2つのプレゼンテーションから学んだことを要約すると、異なるコアで実行されている複数のスレッドがアクセスした場合に、WKWYLの最適化によってパフォーマンスが低下することはないのではないかと思い始めました。shared_ptr
参照カウンターがメモリ内の実際のオブジェクトに近い場合、実際には、オブジェクト自体と同じキャッシュラインにフェッチされる可能性が高くなります。これにより、レッスンを正しく受けた場合、同じキャッシュラインを競合する必要がない場合でも、スレッドの速度が低下する可能性が高くなります。
スレッドの1つが参照カウンターを数回更新する必要があり(たとえば、shared_ptr
周りをコピーするとき)、他のスレッドはポイントされたオブジェクトにアクセスする必要があると仮定します:これは、スレッドを競合させることによってすべてのスレッドの実行を遅くすることはありません同じキャッシュラインに対して?
refcountがメモリ内の別の場所にある場合、競合が発生する可能性は低くなります。
これは、同様のケースでの使用に反対する良い議論にmake_shared()
なりますか(もちろん、WKWYL最適化を実装している限り)?それとも私の推論に誤りがありますか?