6

次のシナリオを処理する必要があります: 5 つのタスク ("A"、"B"、"C"、"D"、"E") があります。それらを並列化したいのですが、それらの依存関係に関してです。次の順序で実行する必要があります。

A --> B --\
C ----------> E
D --------/

したがって、「E」は前のものがすべて終了したときに実行され、「B」は A の後に実行する必要があります。ここに私の質問があります。すぐに使えるソリューション (STL、Boost) はありますか? または、std::thread に基づいて実装する必要がありますか?

4

3 に答える 3

11

TBB の Flow GraphまたはPPLをチェックしてください。

TBB リンクの例は、スケッチした内容をほぼ示しています。タスクとして抽象化された問題を既に定式化しています。最初にスレッド レベルに到達する必要はありません。

于 2013-06-17T07:23:45.333 に答える
2

sectionこれは、ICC、GCC、および MSVC で実行できるOpenMP ディレクティブで実行できると思います。OpenMPtaskディレクティブはおそらくより良い選択であり、ICC と GCC で実行できますが、MSVC のどのバージョンでも実行できません。

以下のコードは OpenMP を使用していますsections。E は他のすべてのタスクが終了した後に実行されるため、それを並列化することも可能であるため、次のコードEでは終了後にすべてのスレッドによって実行されますA, B, C, D。がループを反復している場合E、この方法でループを並列化できます。それがあなたの望むものかどうかはわかりませんが、1 つのスレッドで実行するのは簡単です。

#include <stdio.h>
#include <omp.h>

void A() { printf("A\n"); }
void B() { printf("B\n"); }
void C() { printf("C\n"); }
void D() { printf("D\n"); }
void E() {
  printf("E: %d\n", omp_get_thread_num());
  #pragma omp for
  for(int i=0; i<10; i++) {
     //do something as a function of i
  }
}

void foo() {
#pragma omp parallel // starts a new team
 {  
   #pragma omp sections // divides the team into sections
   { 
     { A();  B(); }
     #pragma omp section
     { C(); }
     #pragma omp section
     { D(); }
   }
   E();
 }
}

int main() {
    foo();
}   
于 2013-06-17T08:30:58.447 に答える