オブジェクトの (二重に) リンクされたリスト (C++) が与えられた場合、マルチスレッドで各オブジェクトに対して実行したい操作があります。操作のコストは、オブジェクトごとに均一ではありません。リンクされたリストは、さまざまな理由から、このオブジェクトのセットに適したストレージです。各オブジェクトの最初の要素は、次のオブジェクトへのポインターです。2 番目の要素は、リスト内の前のオブジェクトです。
ノードの配列を構築し、OpenMP を適用することで問題を解決しました。これにより、まともなパフォーマンスが得られました。次に、独自のスレッド ルーチン (Windows プリミティブに基づく) に切り替え、InterlockedIncrement() (配列へのインデックスに作用する) を使用することで、全体的な CPU 使用率を高め、スループットを高速化することができます。基本的に、スレッドは要素に沿って「跳躍」することによって機能します。
最適化への次のアプローチは、リンクされたリスト内の要素の配列の作成/再利用を排除しようとすることです。ただし、この「リープフロッグ」アプローチを続行し、「InterlockedCompareDereference」と呼ばれる存在しないルーチンを何らかの方法で使用して、NULL (リストの最後) とアトミックに比較し、条件付きで逆参照して保存し、逆参照された値を返したいと思います。 .
ポインターをアトミックに逆参照してこの Interlocked() メソッドを呼び出すことができないため、 InterlockedCompareExchangePointer() が機能するとは思いません。私はいくつかの読書をしましたが、他の人はクリティカルセクションまたはスピンロックを提案しています。ここではクリティカル セクションが重く見えます。スピンロックを試してみたくなりましたが、最初にここで質問をして、他の人が何をしているのか聞いてみようと思いました. InterlockedCompareExchangePointer() メソッド自体がスピンロックのように使用できるとは確信していません。次に、取得/解放/フェンスのセマンティクスも考慮する必要があります...
アイデア?ありがとう!