並列化する必要があるプログラムがあります。大量のデータが含まれる場合があります。これらのデータは ID で識別でき、同じ ID を持つデータがさらに存在する可能性があります。私のプログラムの各スレッドは、特定の ID を持つすべてのデータを回復して処理します。
私の質問は、並列プログラムの場合、データの ID でソートされたマルチマップまたはベクトルを使用するのが最善の解決策ですか?
ありがとうございました。
並列化する必要があるプログラムがあります。大量のデータが含まれる場合があります。これらのデータは ID で識別でき、同じ ID を持つデータがさらに存在する可能性があります。私のプログラムの各スレッドは、特定の ID を持つすべてのデータを回復して処理します。
私の質問は、並列プログラムの場合、データの ID でソートされたマルチマップまたはベクトルを使用するのが最善の解決策ですか?
ありがとうございました。
データ型を抽象化し、一般的なソリューションを実装します。次に、2つのデータ型を置き換えて、どちらがパフォーマンスが優れているかを確認します。
データのサイズによって異なります。たとえば、データがA
B
C
ありD
、サイズが 2、10、20、30 で、4 つのスレッドで実行されている場合、負荷分散の問題が発生します。スレッド A は、残りのスレッドよりも少ない作業を行います。残念ながら、データを並べ替えても役に立ちません。
データを (たとえば) スタックに格納し、ID とは関係なく、スレッドがスタックから作業を実行できるようにする方がよい場合があります。ただし、スタックを同期する必要があります。
各 ID データに含まれるサイズが事前にわかっている場合は、それらをデータ ID で構成されるブロックにグループ化できます。このブロックはほぼ同じサイズになります。
次に、ブロックと、それらのブロックを計算するスレッドの ID に<K,V>
なるV
マップを作成できます。K
unordered_map は良い解決策かもしれません。ハッシュとして実装されるため、同じ ID は同じバケットになります。
また、ハッシュ テーブルは、データを個別に処理できるバケットにグループ化するメカニズムを提供するため、大規模なデータ セットを処理する場合に適しています。