並行プログラミングと並列プログラミングの違いは何ですか? 質問する

並行プログラミングと並列プログラミングの違いは何ですか? 質問する

並行プログラミングと並列プログラミングの違いは何ですか? Google で調べましたが、その違いを理解するのに役立つものは見つかりませんでした。両方の例を挙げていただけますか?

今のところ、次のような説明を見つけました:http://www.linux-mag.com/id/7411- しかし、「並行性はプログラムの特性である」と「並列実行はマシンの特性である」という説明だけでは私には不十分で、まだ何が何だかわかりません。

ベストアンサー1

並行プログラミングは、重複しているように見える操作を考慮し、主に非決定論的な制御フローによって生じる複雑さに関係します。並行プログラムに関連する定量的なコストは、通常、スループットとレイテンシの両方です。並行プログラムは多くの場合 IO バウンドですが、常にそうであるとは限りません。たとえば、並行ガベージ コレクターは完全に CPU 上にあります。並行プログラムの教育的な例は、Web クローラーです。このプログラムは Web ページへの要求を開始し、ダウンロードの結果が利用可能になると同時に応答を受け入れ、すでにアクセスされたページのセットを蓄積します。制御フローが非決定論的なのは、プログラムが実行されるたびに応答が必ずしも同じ順序で受信されるとは限らないためです。この特性により、並行プログラムのデバッグが非常に困難になる可能性があります。一部のアプリケーションは基本的に並行です。たとえば、Web サーバーはクライアント接続を同時に処理する必要があります。アーラン、F#非同期ワークフローそしてScalaのアッカライブラリは、おそらく高度な並行プログラミングに対する最も有望なアプローチです。

マルチコア プログラミングは、並列プログラミングの特殊なケースです。並列プログラミングは、スループットを向上させるという特定の目標のために重複する操作に関係します。並行プログラミングの難しさは、制御フローを決定論的にすることで回避されます。通常、プログラムは並行して実行される一連の子タスクを生成し、親タスクはすべてのサブタスクが終了した場合にのみ続行されます。これにより、並行プログラムよりも並列プログラムのデバッグがはるかに簡単になります。並列プログラミングの難しい部分は、粒度や通信などの問題に関するパフォーマンスの最適化です。後者は、1 つのキャッシュから別のキャッシュにデータを転送するのにかなりのコストがかかるため、マルチコアのコンテキストでも依然として問題です。密行列-行列乗算は、並列プログラミングの教育的な例であり、Straasen の分割統治アルゴリズムを使用してサブ問題を並行して処理することで効率的に解決できます。シルクおそらくマルチコア上での高性能並列プログラミングのための最も有望なアプローチであり、Intelのスレッドビルディングブロックそしてマイクロソフトのタスク並列ライブラリ(.NET 4 の場合)。

おすすめ記事