web-dev-qa-db-ja.com

C ++並列化ライブラリ:OpenMPとスレッドビルディングブロック

マルチコアCPUを利用できるように、カスタムグラフィックエンジンを改造します。より正確には、ループを並列化するライブラリを探しています。

OpenMPとIntelのスレッドビルディングブロックの両方がこの仕事に非常に適しているように思えます。また、どちらもVisual StudioのC++コンパイラと他のほとんどの一般的なコンパイラでサポートされています。そして、どちらのライブラリーも非常に簡単に使用できます。

それで、どちらを選ぶべきですか?誰かが両方のライブラリを試しましたか、どちらのライブラリを使用することの短所と長所を私に与えることができますか?また、最終的に何を選んだのですか?

おかげで、

エイドリアン

44
Adrian Grigore

私はTBBをあまり使用していませんが、競合するよりもお互いを補完し合うという印象があります。 TBBはスレッドセーフなコンテナーといくつかの並列アルゴリズムを提供しますが、OpenMPは既存のコードを並列化するためのものです。

個人的に、OpenMPは、並列実行可能なループまたは並列に実行できる一連のセクションがある既存のコードにドロップするのが非常に簡単であることがわかりました。ただし、一部の共有データを変更する必要がある場合は特に役立ちません。TBBの同時コンテナーがまさに必要な場合があります。

反復が独立している(または非常に簡単にできる)ループを並列化したい場合は、OpenMPを使用します。スレッド間でより多くの相互作用が必要になる場合は、TBBがその点でもう少し多く提供できると思います。

48
Peter

インテルのソフトウェアブログから: Windows *スレッド、OpenMP *、並列プログラミング用インテル®スレッディングビルディングブロックを比較

それはスタイルの問題でもあります。私にとってはTBBはC++に非常に似ていますが、OpenMPプラグマはそれほど好きではありません(Cを少し入力する必要があるので、Cで記述する必要がある場合)。

また、チームの既存の知識と経験も考慮します。新しいライブラリの学習(特にスレッド化/同時実行に関して)には時間がかかります。今のところ、OpenMPはTBBよりも広く知られ、展開されていると思います(ただし、これは私の意見です)。

さらに別の要因-しかし、最も一般的なプラットフォームを考慮すると、おそらく問題ではない-移植性。しかし、ライセンスが問題になる可能性があります。

  • TBBには、学術研究に由来するニースの研究の一部が組み込まれています。たとえば、 再帰的データ並列アプローチ などです。
  • example の場合、キャッシュの使いやすさについていくつかの作業があります。
  • Intelブログの講義は本当に興味深いようです。
25
Anonymous

一般に、私はTBBを使用するには、高いペイオフを伴うコードベースの変更により多くの時間のかかる変更が必要であり、OpenMPは迅速かつ中程度のペイオフを提供することを発見しました。新しいモジュールをゼロから見て長期的に考える場合は、TBBを使用してください。小さくてもすぐに利益を得たい場合は、OpenMPを使用してください。

また、TBBとOpenMPは相互に排他的ではありません。

16
Nikhil

私は実際に両方を使用しましたが、私の一般的な印象は、アルゴリズムを並列化するのがかなり簡単である場合(たとえば、ループのサイズが均一で、データの相互依存が多すぎない場合)、OpenMPの方が簡単で、非常に使いやすいです。実際、OpenMPを使用できる場合は、プラットフォームでサポートされていることがわかっている場合は、おそらくOpenMPを使用する方が良いでしょう。 OpenMPの新しいタスク構造を使用していません。これは、元のループおよびセクションオプションよりもはるかに一般的です。

TBBはより多くのデータ構造を事前に提供しますが、間違いなくより多くのデータを事前に必要とします。プラスとして、それはmightが競合状態のバグを認識するのに優れています。つまり、OpenMPでは、共有すべきもの(または何でも)を共有しないようにすることで、競合状態を有効にするのはかなり簡単です。これは、悪い結果が出たときにのみ表示されます。これはTBBで発生する可能性が少し低いと思います。

全体的に、私の個人的な好みはOpenMPでした。特に、タスクの表現力が高まっているためです。

6
Ben

はい、TBBははるかにC++に対応していますが、OpenMPはその設計を考慮してFORTRANスタイルのCコードに適しています。 OpenMPの新しいタスク機能は非常に興味深いように見えますが、同時にC++ 0xのLambdaおよび関数オブジェクトによってTBBが使いやすくなる場合があります。

2
Richard

Visual Studio 2008では、次の行を追加して「for」ループを並列化できます。複数のネストされたforループでも機能します。次に例を示します。

#pragma omp parallel for private(i,j)
for (i=0; i<num_particles; i++)
{
  p[i].fitness = fitnessFunction(p[i].present);
  if (p[i].fitness > p[i].pbestFitness)
  { 
     p[i].pbestFitness = p[i].fitness;
     for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j];
  }
}  
gbest = pso_get_best(num_particles, p);

#pragma omp parallelを追加した後、私のCore 2 Duoの両方のコアが最大容量まで使用されたため、合計CPU使用率は50%から100%になりました。

1
Contango

Viva64リンク: 並列プログラミング

1
Andrey

私の知る限り、TBB(GPLv2で利用可能なオープンソースバージョンがあります)は、C++よりもC領域に対応しています。これらの時間は、C++と一般的なOOP=並列化固有の情報を見つけるのは困難です。cなどのほとんどの機能的なもの(CUDAまたはOpenCLでも同じです)。並列化のC++サポートが必要な場合は、TBBを使用してください!

1
Peter Meyer