2016-06-20 5 views
-2

私は、タスクリストの各タスクが互いに独立しているので、単純な並列化の恩恵を受けることができる計算集約型のプログラムを持っています。複数のスレッドにタスクを正しく配布する方法

私はすべての並列コンピューティングの基礎となる理論とその慣れていないと私は、私の質問に明確な答えを見つけるように見えることはできません。

はどのようにして、n個のスレッド間メートルのタスクを分散んがきれいな標準的な方法で?

私の解決策は、処理されるプロセスのブロックを実行することです。つまり、リスト内の最初のn個のタスクをn個のスレッドに割り当てることです(ここでは、私の特定のプログラムでは、そのブロックが完了した後、すべてのタスクがほぼ同じ時間を要する)、次のn個のタスクなどを割り振り、タスクの数がnで割り切れない場合、残りのk個のタスクをn個それらはk個のスレッド上にあり、残りのnk個のスレッドはアイドルです。

C++では、forループと%演算子を使用してこれを簡単に実行できると確信しています。私はそれを行うのが最も効率的な方法ではないことを知っていますが、私はスピードアップが「適切に」(つまり、スレッドがアイドルでないことを保証する)ことが私の特定のケースでは無視できると思います。

これは正しい方法ですか?あるいは、m個のスレッドをジョブに割り振って、プロセッサがタスクを分散させるようにすれば、おそらく可能でしょうか?あなたの問題が<algorithm>で見つかった施設を活用することができれば

+2

経験則として、使用可能なCPUコアよりもアクティブなタスク(スレッド)はありません。 –

+0

これはどのような仕事ですか?そして、彼らはどのように割り当てられていますか?ほんの少しのアイデア:スレッドが終了するとすぐに、次のタスク自体を作成/割り当てて続けることができます。また、競合状態に対して適切に保護されたキュー(std :: list/std :: deque)にタスクを配置し、スレッドがタスクを終了するとすぐにキューから次のタスクを取ります。 – Aconcagua

+0

各タスクの時間がほぼ同じであれば、それは完全に良い方法です。 taksの長さが変わった場合は、スレッドに小さなタスクブロックを与えなければならず、スレッドが完了したときにスレッドをもっと与えなければならないかもしれません。 – vu1p3n0x

答えて

1

手でこれをロールアウトする前に、以下を参照してください

http://en.cppreference.com/w/cpp/algorithm

このように、あなたは、実行ポリシーを利用することができ、実装中スレッド関連の機械やコンテクストの切り替えに起因する不要な廃棄物を発生させることなく、CPUの飢餓状態とアイドル状態の間の理想的なスイートスポットを見つけようとします。少なくとも、プラットフォームに物理的にマッピングできる数のスレッドを生成し、より高度なケースでは、そのスイートスポットを検索しながらプロファイル自体を生成します。

+0

選択したツールチェーンがすでにこれを実装していると仮定します:) – ZaldronGG

関連する問題