4

私たちは皆、シングルプロセッサ用のコードを書いています。いつ私たち全員がマルチプロセッサでコードを書くことができるのだろうか?

この切り替えには何が必要ですか(ソフトウェアツール、ロジック、アルゴリズム)?

編集:私の見解では、私たちは多くのタスクを並行して行うので、同じ方法でそれらの実際のソリューション(アルゴリズム)をコンピューター言語に変換する必要があります。OOPコーディングが手続き型コーディングに対して行ったのと同じように。OOPは、手続き型よりも実際のコーディングスタイルです。だから私はそのような解決策を望んでいます。

4

7 に答える 7

5

最も重要な要件は、並列処理をサポートするネイティブ構造を持つ優れた言語、または並列コードを自動的に生成できる言語であると思います。その説明に当てはまる言語はかなりの数ありますが、どれも実際に主流の使用と見なされるほど人気が​​あるわけではありません. それは、次のようないくつかの原因によって引き起こされます。

  1. これらの言語は、その性質上、今日の命令型言語とは大きく異なり、そのため習得が困難です (または、少なくともそのように見えます)。
  2. 多くの場合、優れたツールやライブラリが不足しているため、「実際の」プロジェクトでは使用できません。

もちろん、もっと人気があれば、もっと多くの人がそれを学びたいと思うだろうし、より多くのサポートが得られるだろう. 私たちにできるのは希望だけだと思います。:)

高度な並列化を念頭に置いて設計された言語の例は Erlang です。これは実際に商用プロジェクトで使用されています。

于 2008-09-18T05:53:01.903 に答える
4

私たちが必要としているのは、高度な並行アルゴリズムのための自然な抽象化です。アクター (Erlang を考えてみてください) はこの方向で長い道のりを歩んでいますが、万能のソリューションではありません。fork/join や map/reduce などのより具体的な抽象化は、一般的な問題にさらに簡単に適用できます。

これらすべての同時実行の抽象化の秘訣は、関数型のプログラミングが必要なことです。並行性は、共有された変更可能な状態とうまく噛み合いません。彼らが言うように、「ロックは有害と見なされます」。ほとんどの開発者は厳密に命令型のバックグラウンドを持っているため、共有なしの継続渡しアプローチに切り替えることは、多くの場合非常に困難です。

ちなみに、並行性の抽象化に関しては、Clojure にはこの方向で非常に興味深い機能がいくつかあります。ある種のアクターがあるだけでなく、グローバルなアトミック参照メカニズムとともに、トランザクション メモリ モデル (たとえばデータベース) も定義します。これら 2 つの機能により、ロックや競合状態を心配することなく、同時操作で「変更可能な」状態を共有できます。

結局は教育に尽きる。並行性の抽象化に必要な理論的作業の多くはすでに行われているので、それを受け入れる必要があります。残念ながら、Erlang と Haskell が証明しているように、最高のアイデアが非常に限られた人口統計に追いやられていることがあります。Scala や Clojure のような取り組みが、より高度な抽象化を、サポートの行き届いた既存のプラットフォーム (JVM) に忍び込ませることで、メインストリームに持ち込むことに成功することを願っています。

于 2008-09-18T06:15:17.573 に答える
3

残念なことに、大規模な並行プログラミングについては - コンパイラに役立つブレークスルーがない限り、アルゴリズムについて知っていることの多くを捨てることになります (Don Knuth もそう言ったと思います)。この可能性のある未来を垣間見るために、Erlang について読んでください。

于 2008-09-18T05:59:54.210 に答える
3

人気のある、または人気を得ているツール/言語がいくつかあります。FORTRAN、C、または C++ を使用する場合は、OpenMP (実装はそれほど難しくありません) またはMessage Passing Interface (MPI) ライブラリ (強力で最大のスピードアップの可能性がありますが、複雑で難しい) を使用できます。OpenMP は、プリプロセッサ ディレクティブを使用して、並列化できる領域 (特にループ) をマークします。MPI は、プロセス間でデータをやり取りするメッセージを使用します。最大の難点は、ボトルネックにぶつかったり、プロセスを待機させたりすることなく、すべての同期を維持することです。ただし、MPI は確実に廃止されつつあると思います。科学/高性能コンピューティング コミュニティでは、高速化が追加の開発時間に見合う価値はほとんどないことが明らかになりました。

新進気鋭の言語については、 Fortressをチェックしてください。まだ設計中ですが、FORTRAN よりもさらに簡単に科学計算を実行できる言語を作成することが目標です。プログラムは、非常に高度な数学的構文で指定されます。さらに、並列処理は暗黙的になります。プログラマーは、一連の作業を行う必要があります。さらに、それは Sun によって擁護されており、Java に基づいているため、移植可能です。

于 2008-10-09T00:40:35.590 に答える
0

単純な答えはありません。多くの点で複雑な答えでさえ、現在のところ不十分または不完全です。必要な返信をより具体的にすると、より良い答えが得られます: 開発ライブラリとツールへのポインタ、教材、現在の研究プロジェクトとこの分野の問題へのポインタ、または何か他のもの?

于 2008-09-18T05:41:55.283 に答える
0

最も重要な要件は、問題を互いに独立して解決できる小さな問題に分割できることです。それをどのように行うかを考え出すと、他のすべてのことを考えるのが簡単になり、実装に関するさらなる問題 (たとえば、「私の計算の一部は他の部分に依存します。それらが完了するのをどのように待ちますか?」) )ここで調査したり質問したりできる具体的で具体的なものになります。

于 2008-09-24T16:04:04.590 に答える
0

Java の場合、Parallel Java Library または DPJ (deterministic Parallel Java!) に目を向けることができるようになりました。これは、コードから並列処理を抽出するのに非常に役立ちます!!

于 2013-08-17T08:57:00.553 に答える