46

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

OpenMP と Intel の Thread Building Blocks の両方が、この仕事に非常に適しているように思えます。また、どちらも Visual Studio の C++ コンパイラと他のほとんどの一般的なコンパイラでサポートされています。また、どちらのライブラリも非常に使いやすいようです。

では、どちらを選択すればよいでしょうか。両方のライブラリを試した人はいますか?どちらかのライブラリを使用することの長所と短所を教えてください。また、最終的にどんな仕事に就きましたか?

ありがとう、

エイドリアン

4

7 に答える 7

26

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

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

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

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

  • TBB には、再帰的データ並列アプローチなど、学術研究に由来するいくつかの優れた研究が組み込まれています。
  • たとえば、キャッシュの使いやすさに関するいくつかの作業があります。
  • インテルのブログの講義は本当に面白そうです。
于 2009-03-05T15:41:12.340 に答える
19

一般に、TBB を使用するとコード ベースにはるかに多くの時間のかかる変更が必要になり、結果として高い利益が得られますが、OpenMP では迅速ではあるが適度な利益が得られます。新しいモジュールを最初から検討していて、長期的に考えている場合は、TBB を使用してください。小さくてもすぐに利益を得たい場合は、OpenMP を使用してください。

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

于 2009-03-06T10:51:20.810 に答える
8

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

TBB は前もってより多くのデータ構造を提供しますが、前もってより多くのデータ構造が必要であることは間違いありません。プラスとして、競合状態のバグを認識できるようになる可能性があります。これが意味することは、OpenMP では、共有されるべきもの (またはその他のもの) を共有しないことで、競合状態を有効にするのが非常に簡単だということです。これは、悪い結果が得られた場合にのみ表示されます。これはTBBで発生する可能性が少し低いと思います.

全体的に、私の個人的な好みは OpenMP でした。特に、タスクの表現力が向上したことを考えると。

于 2009-04-28T11:54:25.210 に答える
2

私の知る限り、TBB (GPLv2 で利用可能な OpenSource バージョンがあります) は、C 領域よりも C++ に対応しています。最近では、C++ および一般的な OOP 並列化固有の情報を見つけるのが難しくなっています。ほとんどの場合、c のような機能的なものに対応しています (CUDA または OpenCL でも同じです)。並列化のための C++ サポートが必要な場合は、TBB をお勧めします。

于 2012-01-10T07:14:45.103 に答える
2

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

于 2013-01-24T06:51:44.780 に答える
1

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% になりました。

于 2010-06-28T17:43:23.547 に答える