OpenMPを使用して(したがって、C++プログラマであると仮定するとサードパーティのライブラリとリンクする)C++ 0xが優れた並列構造を提供するという利点を知りたいのです。OpenMPに対するC++ 0xのパラレル化構文
誰かが私にプロを提供できますか?短所OpenMPをC++ 0xビルドインの代わりに使用していますか?
OpenMPを使用して(したがって、C++プログラマであると仮定するとサードパーティのライブラリとリンクする)C++ 0xが優れた並列構造を提供するという利点を知りたいのです。OpenMPに対するC++ 0xのパラレル化構文
誰かが私にプロを提供できますか?短所OpenMPをC++ 0xビルドインの代わりに使用していますか?
gccを使用したOpen MPの場合、libgomp
にはgcc自体が付属しており、サードパーティ製ではありません。これは他のコンパイラでも同様です。
私はまだC++ 0xを深く掘り下げていないことを認めなければなりませんが、私が見ている限り、「単なる」は汎用の並列化のためのプリミティブを提供しています。
OpenMPは、単一の目的でコードを並列化する比較的高度な抽象化です。つまり、複数のCPUコアに作業を分散させることでパフォーマンスを向上させることです(UIの応答性を向上させる方法や、 )。
OpenMPは、コンパクトな構文を提供し、自動的に多くの機能を提供するため、非常に簡単です。スレッドプールの管理とスレッドのスケジューリングを行い、ワークを均等に分散させます。最良のケースで、これは既存のアルゴリズムを並列化すると、(適切な位置に)あなたのコードに次のように置くのと同じくらい簡単であることを意味します
#pragma omp parallel for
(もちろん、それは通常、もう少し複雑です。)
OpenMPのは、プラグマによって実装され、C++の構文で不十分に統合され:
はしかし、これは2つありコストがかかります。たとえば、次のように簡単に見えるコードが不正です:あなたが途中でOpenMPの「ブロック」を残すことはできませんので
void f() {
#pragma omp critical
{
return;
}
}
だこと。まあまあ。
OpenMPはできるだけプラットフォームに依存しないように努めています。結果として、いくつかの興味深いプリミティブが欠けています。たとえば、OpenMPにはyield
コマンドがなく、fetch_and_add
プリミティブはなく、compare_and_swap
またはLL/CSもありません。
あなたが正しいですが、私はそれがC++標準の一部ではないと思うが、私はほとんどのコンパイラベンダーがコンパイラにバンドルすることを選択したことを別の標準だと思いますが、これは必須ではありません、なら、私を修正してください私は間違っています。 –
しかし、代わりにlibpthreadに頼ることはできますか? –
番号。この質問で述べたように、代替案はC++ 0x(または無数の他のマルチスレッドライブラリのどれかを使用して)を待っています。 –