16

最近のマルチコアおよびマルチプロセッシング ハードウェアの非常に重要性を考慮して、人々が実際に並列コードをどのように書いているかを把握しようとしています。私には、支配的なパラダイムは pthreads (POSIX スレッド) のように見えます。これは Linux でネイティブで、Windows で利用できます。HPC の人々は OpenMP や MPI を使用する傾向がありますが、ここ StackOverflow にはあまりないようです。それとも、移植可能な標準ではなく、Java スレッド化、Windows スレッド化 API などに依存していますか? あなたの意見では、並列プログラミングを行うための推奨される方法は何ですか?

それとも、Erlang、CUDA、RapidMind、CodePlay、Oz、または親愛なる古い Occam などのよりエキゾチックなものを使用していますか?

明確化: Linux、さまざまな UNIX、さまざまなホスト アーキテクチャなどのプラットフォームに移植可能で適用可能なソリューションを探しています。Windows は、サポートしてよかった稀なケースです。したがって、C# と .net はここでは狭すぎます。CLR はクールなテクノロジですが、Linux ホスト用にリリースして、JVM、Python、Erlang、またはその他の移植可能な言語と同じくらい普及するようにしてください。

C++ または JVM ベース: JVM はパフォーマンスを隠す傾向があるため、おそらく C++ です。

MPI: HPC 関係者でさえ、これを使いにくいツールと見なしていることには同意しますが、128000 プロセッサで実行する場合、map/reduce が適用されない問題に対する唯一のスケーラブルなソリューションです。ただし、メッセージ パッシングは、ローカル メモリ/AMP、共有メモリ/SMP、分散ランタイム環境に適切に拡張できる唯一のプログラミング スタイルであるため、非常に洗練されています。

興味深い新しい候補はMCAPIです。しかし、それを実際に経験する時間があった人はまだいないと思います。

全体として、私が知らなかった多くの興味深い Microsoft プロジェクトがあり、Windows API または pthreads が実際に最も一般的な実装であるという状況のようです。

4

20 に答える 20

10

MPI は、ほとんどの人が思っているほど難しくありません。最近では、マルチパラダイム アプローチが並列および分散アプリケーションに最適であると考えています。ノード間の通信と同期には MPI を使用し、より粒度の高い並列化には OpenMP または PThreads を使用します。各マシンの MPI と、各コアの OpenMP または PThreads を考えてみてください。これは、近い将来、コアごとに新しい MPI Proc を生成するよりも、少しはうまくスケーリングできるように思われます。

おそらく現在のデュアルまたはクアッド コアの場合、マシンのコアごとに proc を生成してもそれほど多くのオーバーヘッドはありませんが、キャッシュとオンダイ メモリがあまりスケーリングされないマシンごとのコア数が増えるにつれて、共有メモリ モデルを使用する方が適切です。

于 2008-11-21T14:42:36.310 に答える
6

OpenMPをお勧めします。MicrosoftはこれをVisualC++ 2005コンパイラに組み込んだため、十分にサポートされており、/ompディレクティブを使用してコンパイルする以外に何もする必要はありません。

使い方は簡単ですが、明らかにすべてを行うわけではありませんが、何もしません。私はこれを、一般的に面倒なことなく並列forループを実行するために使用します。より複雑なものについては、自分でロールする傾向があります(たとえば、私は何年も前のコードをカット、貼り付け、変更しています)。

見栄えがよく、電子書籍「マルチコアソフトウェア革命を生き残る方法」が掲載されているCilk++を試すことができます。

これらの種類のシステムはどちらも、シリアルコードを並列化しようとします。つまり、forループを使用して、可能な限り簡単な方法ですべてのコアで同時に実行します。それらは汎用スレッドライブラリではない傾向があります。(例えば、研究論文(pdf)は、openMPに実装されたさまざまなタイプのスレッドプールのパフォーマンスを説明し、それに2つの新しい操作(yieldとsleep)を追加する必要があることを示唆しました。OpenMPのポイントが少し欠けていると思います)

OpenMPについておっしゃったように、C#や.NETではなくネイティブC++について話していると思います。

また、HPCの人々(この種のドメインの専門家だと思います)がOpenMPまたはMPIを使用しているように見える場合は、SOの読者ではなく、これを使用する必要があります。

于 2008-10-03T13:42:03.973 に答える
4

Microsoft からの並行拡張機能の検討を開始しました。これはまだリリースされていませんが、確実に可能性を示しています。

于 2008-10-03T13:08:18.673 に答える
3

私はACEを使用して、開発者が任意のプラットフォームで POSIX (または Windows) スタイルのスレッドを使用できるようにしました。

于 2008-10-03T13:10:39.650 に答える
2

ここでの回答は、「実際に使用する」に対する統計的に代表的な回答ではないことに注意してください。すでに「Xはいい」という答えがたくさんあります。

私は多くのプロジェクトで個人的にWindowsスレッドを使用しました。私が広く使用している他のAPIはpthreadです。HPCの面では、MPIは、私が使用していないMPIを使用している人々に今でも真剣に受け止められてい<subjective>ます。これは、C++のすべてのエレガンスとJavascriptのパフォーマンスを兼ね備えています。まともな選択肢がないので、それは生き残ります。一方では緊密に結合されたNUMAマシンに、もう一方ではGoogleスタイルのmap-reduceに負けます。</subjective>

于 2008-10-03T14:45:02.440 に答える
2

より多くのデータ Parallel Haskellがあればいいのですが、それがなくても、GHC>6.6 にはControl.Parallel .Strategiesを介してアルゴリズムを簡単に並列化する素晴らしい機能があります。

于 2008-10-05T01:37:52.840 に答える
2

Parallel FX Library (PFX) - .NET Framework の将来のリビジョンに含めるために、Microsoft Research と Microsoft の CLR チームとの共同作業によって開発されているマネージ コンカレンシー ライブラリ。これは、Parallel LINQ (PLINQ) と Task Parallel Library (TPL) の 2 つの部分で構成されています。また、一連の調整データ構造 (CDS) (同時実行タスクの実行を同期および調整するために使用される一連のデータ構造) で構成されます。ライブラリは 2007 年 11 月 29 日に CTP としてリリースされ、2007 年 12 月と 2008 年 6 月に再び更新されました。

経験は少ないですが…

于 2008-10-03T13:16:10.607 に答える
1

オープンCLはどうですか?

于 2008-12-19T09:15:22.203 に答える
1

私が書いた並列プログラムのほとんどはAdaで作成されたもので、言語でネイティブに並列処理を完全にサポートしています。これの優れた利点の 1 つは、並列コードが Ada コンパイラを備えた任意のシステムに移植できることです。特別なライブラリは必要ありません。

于 2009-03-18T15:06:51.977 に答える
1

.Net の場合、私はRetLangを使用して大成功を収めました。JVM の場合、スケールは優れています。

于 2008-10-03T13:31:00.297 に答える
1

環境に大きく依存します。

palin old C にとって、POSIX に勝るものはありません。

C++ には、BOOST.ORG から無料で提供されている非常に優れたスレッド ライブラリがあります。

Java は、ネイティブの Java スレッドを使用するだけです。

アプリケーションをクライアント プロセスとサーバー プロセスに分割し、非同期メッセージングを使用して通信するなど、スレッド化以外の並列処理を実現する他の方法を検討することもできます。これを適切に行うと、数十のサーバーで数千のユーザーにスケールアップできます。

また、Windows MFC、Gnome、または Qt ウィンドウ環境を使用している場合は、自動的にマルチスレッド環境になることも覚えておく価値があります。Apache ISS または J2EE を使用している場合、アプリケーションはすでにマルチスレッド マルチプロセス環境内で実行されています。

于 2008-12-19T09:27:39.010 に答える
0

PLINQの+1

Win32 スレッド、スレッドプールとファイバー、同期オブジェクト

于 2008-10-03T14:47:42.810 に答える
0

主にその単純さ、移植性、および柔軟性のために、私は OpenMP をよく使用しました。全能の C++/Cli でさえ、複数の言語をサポートしています :)

于 2009-02-27T17:16:36.433 に答える
0

私は open cl を使用しています。mpi に比べてかなり使いやすいと思います。以前、並列および分散コンピューティングのコースの要件として mpi を使用したこともありましたが、手作業が多すぎると思います。数日で CUDA で動作します。CUDA は open cl と非常に似ていますが、CUDA は nvidia 製品専用であるという問題があります。

于 2013-04-04T06:13:04.697 に答える
0

glibc ライブラリhttp://library.gnome.org/devel/glib/stable/glib-Threads.htmlの gthreads はpthreads にコンパイルされるため、パフォーマンスが低下することはありません。また、非常に強力なスレッド プールと、スレッド間のメッセージ キューも提供します。私はそれらを数回うまく使用しており、利用可能な機能に非常に満足しています.

于 2009-04-30T16:39:29.593 に答える
0

私は並行リンク ブログを維持しており、これらの多くを時間の経過とともに取り上げてきました (今後も継続していきます)。

http://concurrency.tumblr.com

于 2008-10-05T02:19:10.870 に答える
0

私はこれまでJavaしか知りませんでしたが、そこでのマルチスレッドサポートは私にとってうまくいきました..

于 2008-12-19T09:24:27.940 に答える
0

I use MPI and like it very much. It does force you to think about the memory hierarchy, but in my experience, thinking about such things is important for high performance anyway. In many cases, MPI can largely be hidden behind domain-specific parallel objects (e.g. PETSc for solving linear and nonlinear equations).

于 2009-03-18T14:58:28.970 に答える