質問

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

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

では、どちらを選択する必要がありますか?誰かが両方のライブラリを試してみましたが、どちらかのライブラリを使用することの短所と長所を私に与えることができますか?また、最終的には何を選択しましたか?

ありがとう、

エイドリアン

役に立ちましたか?

解決

TBBを広範囲に使用したことはありませんが、私の印象では、それらは競合するよりも相互に補完し合っているという印象です。 TBBはスレッドセーフコンテナといくつかの並列アルゴリズムを提供しますが、OpenMPは既存のコードを並列化する方法の1つです。

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

繰り返しが独立している(またはかなり簡単に行える)ループを並列化するだけであれば、OpenMPを使用します。スレッド間でより多くの対話が必要になる場合は、TBBがその点でもう少し提供できると思います。

他のヒント

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

スタイルの問題でもあります-私にとってTBBは非常にC ++に似ていますが、OpenMPプラグマはあまり好きではありません(Cを少し書かないといけないので、Cで書く必要があります)。

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

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

  • TBBには、学術研究から生まれた素晴らしい研究の一部が組み込まれています。たとえば、再帰的データ並列アプローチ
  • Intelブログの講義は本当に興味深いようです。

一般に、TBBを使用するとコードベースを大幅に変更する必要があり、OpenMPを使用すると迅速かつ中程度のペイオフが得られることがわかりました。新しいモジュールを一から見つめ、長期的に考えている場合は、TBBを使用してください。小さくてもすぐに利益を得るには、OpenMPを使用します。

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

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

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

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

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

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

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

私が知っている限りでは、TBB(GPLv2の下にオープンソースバージョンがあります)は、CエリアよりもC ++をより多く扱っています。今回は、C ++および一般的なOOP並列化固有の情報を見つけるのは困難です。ほとんどの場合、c(CUDAまたはOpenCLでも同じ)のような機能的なものが扱われます。並列化のC ++サポートが必要な場合は、TBBをお試しください!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top