2

Writerデータを生成するクラスとReader、それを消費するクラスがあるとします。私はそれらを異なるスレッドで常に実行したいと考えています。OpenMPでそれを行うにはどうすればよいですか?

これは私がしたいことです:

class Reader
{
public:
  void run();
};

class Writer
{
public:
  void run();
};

int main()
{
  Reader reader;
  Writer writer;

  reader.run(); // starts asynchronously
  writer.run(); // starts asynchronously

  wait_until_finished();
}

section最初の答えは、各操作を に分けることを指していると思いますがsections、コードブロックが異なるスレッドに与えられることを保証するものではありません。

できるtaskかな?読んだ後に理解した限りでtaskは、各コードブロックは一度だけ実行されますが、割り当てられたスレッドは変更される可能性があります。

他の解決策はありますか?

pthreads複数のスレッドを明示的に作成するを使用する、継承したコードを OpenMP で記述できるかどうかを知りたいです。問題は、一部のスレッドが適切に作成されておらず、アクティブな待機ループが含まれていることです。そのような状況で、待機中のアクティブな 2 つのオブジェクトが同じ OpenMP スレッドに割り当てられる (したがって、順次実行される) と、デッドロックに達する可能性があります。少なくとも では起こりうると思いますがsections、s についてはわかりませんtask

4

2 に答える 2

2

シリアル化は、タスクでも発生する可能性があります。恐ろしい解決策の 1 つはsections、各セクションが個別のスレッドで実行されることを保証して、独自に再実装することです。

#pragma omp parallel num_threads(3)
{
   switch (omp_get_thread_num())
   {
      case 0: wait_until_finished(); break;
      case 1: reader.run(); break;
      case 2: writer.run(); break;
   }
}

wait_until_finished()このコードは、と を並行して実行するreader.run()ことを前提としていますwriter.run()。これが必要なのは、OpenMP ではparallel構造体のスコープのみがプログラムが並列に実行される場所であり、物事をバックグラウンドに置く方法がないためです。

于 2013-11-08T18:48:59.740 に答える
0

いずれにしてもコードを書き直す場合は、Threading Building Blocks (TBB; http://www.threadingbuildingblocks.org ) に移行することをお勧めします。TBB はパイプライン スタイルの操作 (またはより複雑なタスク グラフ) を明示的にサポートし、キャッシュの局所性と基になるスレッド数の独立性を維持します。

于 2013-11-11T09:34:34.453 に答える