10

主に高水準プログラミング言語を扱うソフトウェア開発者として、マルチコア コンピューターの今後の遍在化に適切に注意を払うために何ができるかわかりません。私はほとんどの場合、通常の要求の厳しいアプリケーションを作成しますが、将来をマスターするためにプログラミング パラダイムや言語を変更する必要があるかどうかを知ることは重要だと思います。

したがって、私の質問:
How to deal with increasing multicore presence in day-by-day hacking?

4

11 に答える 11

7

Herb Sutter は 2005 年にそれについて書いています: The Free lunch Is Over: A Fundamental Turn Toward Concurrency in Software

于 2009-02-19T22:47:19.263 に答える
4

ほとんどの問題は、多くの CPU 時間を必要としません。実際、シングル コアは多くの目的で十分に高速です。プログラムが遅すぎることがわかった場合は、まずプロファイルを作成し、選択したアルゴリズム、アーキテクチャ、およびキャッシングを調べます。それでも十分でない場合は、問題を別々のプロセスに分割してみてください。多くの場合、これは単純に障害を分離し、各プロセスの CPU とメモリの使用状況を理解できるようにする価値があります。また、通常、各プロセスは特定のコアで実行され、プロセッサ キャッシュを有効に活用するため、キャッシュ ラインの一貫性を維持するための実質的なパフォーマンス オーバーヘッドに苦しむ必要はありません。マルチプロセス設計を行っても、問題がマシンで得られるよりも多くの CPU 時間を必要としていることがわかった場合は、クラスター上で実行するように拡張することができます。

同じアドレス空間内に複数のスレッドが必要な場合もありますが、スレッドを正しく処理するのは非常に難しいことに注意してください。競合状態は、特に安全でない言語では、デバッグに数週間かかることがあります。多くの場合、単にトレースを追加したり、デバッガーで実行したりするだけで、問題を隠すのに十分なタイミングが変更されます。単純にどこにでもロックを配置すると、多くの場合、多くのロック オーバーヘッドが発生し、場合によっては非常に多くのロック競合が発生するため、期待していた並行性の利点が実際には得られません。ロックする権限を持っている場合でも、プロファイルを作成してキャッシュの一貫性を調整する必要があります。最終的に、非常に並行性の高いコードを実際に調整したい場合は、現在のマルチスレッド ライブラリよりもロックのない構造やより複雑なロック スキームを検討することになるでしょう。

于 2009-02-19T23:40:33.753 に答える
3

同時実行の利点と限界 (アムダールの法則など) を学びます。

そのため、可能であれば、オープンになる唯一のルートを利用してパフォーマンスを向上させることができます。より簡単なアプローチ (先物とタスク ライブラリ) で多くの革新的な作業が行われ、古い作業が再発見されています (関数型言語と不変データ)。

フリーランチは終わりましたが、それは悪用するものが何もないという意味ではありません。

于 2009-02-19T22:34:17.763 に答える
2

一般に、スレッド化に非常に親しみやすくなります。これは並列化のひどいメカニズムですが、私たちが持っているものです。

.NET を使用する場合は、Parallel Extensions を参照してください。これらを使用すると、多くの並列プログラミング タスクを簡単に実行できます。

于 2009-02-19T22:34:06.783 に答える
2

複数のコアを活用するには、コードの並列化を検討する必要があります。複数のスレッド、不変の型、および最小限の同期が新しい友達です。

于 2009-02-19T22:34:25.580 に答える
2

作成するアプリケーションの種類によって異なると思います。

一部の種類のアプリは、他のアプリよりもマルチコア CPU で実行されているという事実の恩恵を受けています。アプリケーションがマルチコアの利点を享受できる場合は、並列化する準備ができているはずです。無料のランチは終わりです。つまり、以前は、新しい CPU がリリースされたときにアプリケーションが高速になり、その余分な速度を得るためにアプリケーションに労力を費やす必要はありませんでした。ここで、マルチコア CPU が提供する機能を利用するには、アプリケーションがそれを利用できることを確認する必要があります。つまり、マルチスレッド/並行して実行できるタスクを確認する必要があり、これによりいくつかの問題が発生します...

于 2009-02-19T22:35:17.637 に答える
2
  • 不変のデータ構造を優先し、それらを使用すると、並行プログラムだけでなく、ソフトウェアが理解しやすくなります。

  • 自分の言語で並行処理を行うためのツールを学びます (例: java.util.concurrent、JCIP )。

  • 関数型言語 ( Haskellなど) を学びます。

于 2009-02-20T06:41:46.423 に答える
2

Erlang/F# を学ぶ (プラットフォームによって異なります)

于 2009-02-19T22:40:59.637 に答える
0

C および C++ コードの OpenMP と MPI について学習します。

OpenMP は、Fortran のような他の言語にも適用されると思います。

于 2009-02-19T23:58:19.043 に答える
0

私も同じ質問をされましたが、答えは「場合による」です。Joe Winforms の場合は、それほど多くないかもしれません。パフォーマンスが必要なコードを書く場合は、はい。並列プログラミングで私が見ることができる最大の問題の 1 つは、これです: 何かを並列化できず、ランタイムにとにかく並列に実行するように嘘をついて指示した場合、それはクラッシュすることはなく、間違ったことをするだけです。 、そしてあなたはがらくたの結果を得て、フレームワークを責めるでしょう.

于 2009-02-19T22:52:46.910 に答える
0

より小さなプログラムを作成します。

他のコード言語/スタイルを使用すると、マルチスレッドをより適切に実行できます (ただし、マルチスレッドはどの言語でも非常に困難ですが)、通常の開発者にとっての大きな利点は、私見ですが、多くの小さなプログラムを同時に実行して、より大きなタスクを達成できることです。

そのため、いつでも実行できる独立したコンポーネントに問題を分割する習慣を身につけてください。

より保守しやすいソフトウェアも構築できます。

于 2009-02-20T00:41:15.773 に答える