1

計算が複数のスレッドに分割されるように、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 に関連するいくつかのデータ) としてデータを含むクラスです。
  • 各サイクルは、多くの点に対して同様の行列乗算を行い、これらの点をベクトルに追加します (理論的には、計算時間はサイクルごとにほぼ同じになるはずです)。

全体の順序は頂点のインデックス値を考慮しますが、基本的にはメッシュ データ (データのベクトルで構成される) を相互に追加します (メッシュを結合します)。頂点インデックスは一貫性があり、再構築可能である必要があります。

4

2 に答える 2