計算が複数のスレッドに分割されるように、C++ で for ループをマルチスレッド化しようとしています。ただし、順序どおりに結合する必要があるデータが含まれています。
したがって、アイデアは、最初に多くのコア (25.000 以上のループ) で小さなビットを結合し、最後に結合されたデータをもう一度結合することです。
std::vector<int> ids; // mappings
std::map<int, myData> combineData; // data per id
myData outputData; // combined data based on the mappings
myData threadData; // data per thread
#pragma parallel for default(none) private(data, threadData) shared(combineData)
for (int i=0; i<30000; i++)
{
threadData += combineData[ids[i]];
}
// Then here I would like to get all the seperate thread data and combine them in a similar manner
// I.e.: for each threadData: outputData += threadData
これにアプローチするための効率的で良い方法は何でしょうか?
スケジューリングがチャンクに均等に分割されるようにopenmpループをスケジュールするにはどうすればよいですか
たとえば、2 つのスレッドの場合: [0, 1, 2, 3, 4, .., 14999] & [15000, 15001, 15002, 15003, 15004, .., 29999]
データを結合するためのより良い方法がある場合 (多くの std::vectors を結合し、いくつかの行列計算を行う必要があります)、それへの加算ポインターの順序を保持することも同様に役立ちます。
追加情報
- 足し算は可換ではありませんが、結合的です。
- myData は組み込み型ではありません。複数の std::vectors (および Autodesk Maya API に関連するいくつかのデータ) としてデータを含むクラスです。
- 各サイクルは、多くの点に対して同様の行列乗算を行い、これらの点をベクトルに追加します (理論的には、計算時間はサイクルごとにほぼ同じになるはずです)。
全体の順序は頂点のインデックス値を考慮しますが、基本的にはメッシュ データ (データのベクトルで構成される) を相互に追加します (メッシュを結合します)。頂点インデックスは一貫性があり、再構築可能である必要があります。