0

それぞれがイベントを処理する必要がある「サイト」(m)の数があります(データのチャンク。すべてすぐに利用できます)。各イベント (n 個) は、処理のために各サイトに送信されます。したがって、私には nxm タスクがあると思われるかもしれません。処理の順序は重要ではありません。ただし、1 つのサイトが一度に複数のイベントを処理できない場合があります (そのため、Task(m,x) は Task(m,y) と並行して実行できません)。

現在、サイトで「OMP parallel for」を使用して実装されており、イベントの通常の for ループにネストされています。

for(...event...)
#pragma omp parallel for
    for(...site...)
        site.process(event)

これは正常に機能していますが、すべてのサイトが各イベントに対して同じ複雑さを持っているわけではありません。つまり、すべてのサイトは、次のイベントに移る前に、最も遅いサイトを待つ必要があります。労働者が次のイベントに移れるようにすれば、2 倍節約できると思います。

これを実装する最良の方法は何ですか? 私は C++ を使用しています。TBB フロー グラフ、または複数のパイプラインを調べています...

もう1つの考慮事項は、各「イベント」をディスクから読み取る必要があり、メモリを少し占有することです。まだ重要ではありませんが、一度にシステムで発生するイベントをできるだけ少なくしたい (または制限したい) と思います。現在の実装では、私は1つしか持っていません(さらに、バックグラウンドで準備されているカップル)ありがとう

4

1 に答える 1

0

各側の処理済みイベント (m*n bool matrix ) と現在「使用中」のイベントを追跡するマネージャー プロセスを使用します。

すべてのサイトは「ランダムな」イベントから始まります。マネージャーは、サイトを循環して現在のイベントを終了したかどうかを確認し、可能であれば新しいイベントを割り当てます。

C++11 は、そのようなタスクのためにstd::asyncを提供します。

各プロセス呼び出しは非同期で行われ、対応する将来の要素を循環して、それらが終了したかどうかを確認できます ( wait_for )。

于 2014-09-09T15:37:03.673 に答える