2012-03-24 9 views
3

私は、特に方程式の線形方程式(Ax = b形式)を繰り返し解くための科学計算コミュニティ向けのコードを開発しています。Scientific Computing :: OpenMPまたはPthreads

私はBLASとLAPACKをプリミティブ行列サブルーチンに使用しましたが、私は現在、手動並列化のためのいくつかの範囲があることを認識しています。 OpenMPとPThreadsの2つの選択肢を私に残す共有メモリシステムに取り組んでいます。

時間が最大の要因ではないと仮定すると(これはコードの性能が向上している)、これは将来の証明であり、多分ポータブルな(CUDAへの)並列化の方法でしょうか?パフォーマンス向上に値するPthreadの使用に費やされた時間は?

私のアプリケーション(基本的に多くのことを一度にオフにしてから、それらのすべてから「最高」の値を操作することを基本的に扱います)は明示的なスレッド制御の恩恵を受けると思いますが、あまりにも多くの時間を取って、最終的にパフォーマンスが上がることはありません。

私はすでに類似の質問をほとんど見ていませんが、それらはすべて一般的なアプリケーションに関連しています。

This Linuxでの一般的なマルチスレッドアプリケーションに関するものです。

Thisも一般的な質問です。

私はSciComp.SEを認識していますが、ここでの話題はもっと多いと感じました。

+0

"基本的には、すぐに多くのことを開始してから、すべての"最良の "値を操作します。"私は[CPlex](http://www-01.ibm.com/software/integration/最適化/ cplex-optimizer /)は、あなたと同様のアルゴリズムを備えています。私は彼らが基本となる並列化ツールを選んだのかどうか分からないかもしれませんが、おそらくあなたはそれを知ることができます(必ずしもあなたの選択があなたのために最善であるとは限りませんが、 – Francesco

+0

ブーストスレッドは、あなたがC++を使っているならば、pthreads(あるいは何でも)に対するとても良いインターフェイスを提供します。それはまったく価値がある。しかし、私は最終的にプログラミングのしやすさのためにopenmpを選択しました。また、intel IPP/TBBも検討してください。 – Anycorn

+0

BLASまたはLAPACKを使用している場合は、代わりにEigenを使用してください。これは、SIMD(SSE)とOpenMPのサポートを内蔵しています。 –

答えて

7

OpenMPでのコード効率がPthreadsより高く、Pthreadsでの実行効率がOpenMPよりも高いと思われるかのように、あなたの質問は読んでいます。一般的に私はあなたが正しいと思います。しかし、しばらくして、自分のコンピュータの時間よりも自分の時間が重要であり、OpenMPを選ぶことに決めました。それは私が後悔する原因となった決断でも、検証するための確固たる証拠もないという決定でもありません。

しかし、あなたの選択はOpenMPとPthreadsに限られていると思って間違っていますが、MPI(これについては少なくとも聞いたことがあると思いますが、もしそうでなければ投稿してください)も共有メモリマシン上で実行されます。いくつかのアプリケーションでは、MPIを共有メモリコンピュータ上でOpenMPよりも優れた性能でプログラムすることができます。

3年前(+/-数年前)、科学開発者のツールボックスに必須の並列化ツールは、OpenMPとMPIでした。これらのツールを使用している人は、PthreadsやMPIのユーザーコミュニティよりも大きな、(逸話的な証拠だけでは)仲間のユーザーの大きなコミュニティの一部でした。今日、GPUやその他のアクセラレータがポップアップしているため、状況ははるかに細分化されており、HMPP、ACC、Chapel、MPI-3、OpenMP4、CUDA、OpenCLなどから勝者を選ぶのは難しいOpenMP + MPIは便利な組み合わせですが、ブロック上の新しい子供を無視することはできません。

FWIW私は地球物理学アプリケーション用の計算EMコードの開発に取り組んでおり、非常にハードなコア「科学計算」を行っています。

+0

さて、私はBLASの代わりにScaLapackを共有メモリ上で実行しようとしましたが、Hello World自体は非常に難しいのでオフラインです。誤解されていないと、CUDAはpthreadの "モデル"に基づいていますか?私はCUDAで多くの経験がありませんが、CuBlasのコードが書かれているようですが、pthreadsと似ています。私のアプリケーションが間もなくGPUに移植されることを確信したら、あなたは何をお勧めしますか?それ以外の要因はあまり重要ではありません。 –

+0

私はGPUコンピューティングで十分なアドバイスを提供するのに十分な経験がありません。 –

+0

GPUコンピューティング!=一般的な並列計算。 OpenMP/MPI/"OSスレッド"をOpenCL/CUDAと同じボートに置いているのは単なる...変です。 – rubenvb

1

私は私の答えはかなり長いので、私はimpatientsのための最初の結論を入れているされていることを実感:私は、OpenMPとpthreadは、本質的に同じであり、あなたがすべきだと思い

短い答えをあなたのための最小のdev時間を必要とするものを選んでください(おそらくあなたのニーズに合ったopenMPでしょう)。しかし、開発時間を投資したい場合は、他のパラダイムに適応できるようにコードを再設計する必要があります(たとえば、SSE/AVXやGPUを利用するベクトル化など)。

開発:

あなたは線形ソルバを開発する場合、私はあなたのコードは、(すなわち、それはおそらくそれを使用する物理モデルよりも長生きします)(非常に)長寿命になりますと仮定します。このような状況では、特に大規模な開発チームがいない場合は、主に開発時間、保守性に基づいて選択する必要があると思います。

また、今日の「最良の」選択肢明日はまだ最高の選択ではないでしょう。したがって、openMP vs pthreadsの問題に直面していても、(今のところ、@ HighPerformanceMarkの回答で述べたようにスペクトルがすでに大きくなっていても)、将来選択する選択肢が増えることが予想されます。

あなたが今開発する時間があれば、コード内のすべての計算集中型カーネルを抽象化して、異なる並列化のパラダイムに簡単に適応できるようにすれば、より良い投資をすることができます。 GPGPU計算の合体の恩恵を受けるには、従来のキャッシュ最適化方法とは異なる順序でデータを配置する必要があります。

私は結論に至りました。すべてのスレッドベースのソリューションは本質的に同等であり(パフォーマンスとコードアーキテクチャの両面で)、開発時間が最小限になるソリューションを選択する必要があります。しかし、開発時間を投資する場合は、コードを並列化またはベクトル化できるように再設計する必要があります(したがって、SSE/AVXまたはGPUを活用する)。これを行うことができれば、ハードウェア/ソフトウェアの進化に追随してパフォーマンスを維持することができます。

+0

"..:すべてのスレッドベースのソリューションは基本的に同等です(パフォーマンスとコードの両方でアーキテクチャー)、開発時間を最小限に抑える必要があるソリューションを選択する必要があります。「OpenMPにコードを書くのはPthreadsよりもはるかに速いので、OpenMPをデフォルトの勝者にしていないのですか? –

+0

@Nunoxicはい、しかし、pThreadsはOpenMPがコードを開発するのが難しいかもしれませんが、OpenMPが行うことができないことがいくつかあります(または簡単にすることはできません) )しかし、pThreadsすることができます。 (実際の例として、[この質問](http://stackoverflow.com/q/9685403/1225607)を参照してください。ここでは、複数のネストされたOpenMP構文が、そのネイバーとは異なる操作を実行する孤立スレッドをセットアップするために必要ですそのようなことはpThreadsの実装では問題を引き起こさなかったでしょう) – Francesco

+0

シンプルさと柔軟性の古典的なケース。ダン。ありがとう+1! –

0

すでに優れた答えに追加するには:OpenMPは、pthreadを書くときよりもコードを並列化するのが一般的です。 OpenMPがより簡単であることを考えると、それらが私の選択肢であるならば、私はいつもそれを選ぶでしょう。私はあなたがこの質問をしているのではないかと疑っています.pthreadsではないので、OpenMPをpthreadsで使うこともお勧めします。