web-dev-qa-db-ja.com

「並行」実行と「並列」実行の違いは何ですか?

concurrentparallelの実行の違いは何ですか?私はその違いを理解することができませんでした。

このタグは同時実行を2つのプロセスを同時に実行する方法として定義していますが、並列処理はまったく同じものだと思っていました。

また、非同期I/Oのようなものを検討する場合、並行性または並列処理を扱っていますか?

113
blz

同時実行性と並列性は、2つの関連するが異なる概念です。

並行性とは、基本的に、タスクAとタスクBの両方が互いに独立して発生する必要があり、Aが実行を開始し、次にAが完了する前にBが開始することを意味します。

並行性を実現するには、さまざまな方法があります。それらの1つは並列処理です。複数のCPUが同時にさまざまなタスクを処理します。しかし、それが唯一の方法ではありません。もう1つはタスクの切り替え、によるもので、次のように機能します。タスクAが特定のポイントまで機能し、タスクAが停止してタスクBに切り替え、しばらくの間機能します。タスクAに戻ります。タイムスライスが十分に小さい場合、マルチタスクCPUによって実際にシリアルで処理されていても、両方に並行して実行されているように見えることがあります。

105
Mason Wheeler

2つの概念は関連していますが、異なります。

Concurrencyは、2つ以上の計算が同じ時間枠内で行われ、通常はそれらの間に何らかの依存関係があることを意味します。

Parallelismは、2つ以上の計算が同時に行われることを意味します。

大胆に言えば、並行性は問題(2つのことが同時に発生する必要がある)を表し、並列処理は解決策(2つのプロセッサコアを使用して2つのものを同時に実行する)を表します。

並列処理は同時実行性を実装する1つの方法ですが、それだけではありません。もう1つの一般的なソリューションは、インターリーブ処理(別名コルーチン)です。両方のタスクをアトミックステップに分割し、2つのタスクを切り替えます。

非並列並行処理の最もよく知られている例は、JavaScriptの動作です。スレッドは1つしかなく、非同期コールバックは、前のコードチャンクの実行が完了するまで待機する必要があります。これは知っておくことが重要です。これは、記述する関数がアトミックであることを保証するためです。コールバックは、関数が戻るまでそれを中断できません。しかし、これは「ビジーループ」が機能しないことも意味します。ループがタイムアウトコールバックの実行を妨げるため、タイムアウトを設定して、それが起動するまでループすることはできません。

39
tdammers

この答えは既存の答えよりも正確であり、それらを編集することで本質が変わったと思います。他の人が正しいことを確認できるように、さまざまなソースやウィキペディアのページにリンクを張ろうとしました。


同時実行性:プログラムのユニット、アルゴリズム、または問題を順序どおりに実行したり、影響を与えずに部分的な順序で実行したりできるシステムのプロパティ最終結果 12

この簡単な例は、連続加算です。

0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45

commutative property が追加されているため、これらの順序は、正確さに影響を与えることなく再配置できます。次の配置は同じ答えになります:

(1 + 9) + (2 + 8) + (3 + 7) + (4 + 6) + 5 + 0 = 45

ここでは、合計が10になるペアに数値をグループ化しました。これにより、頭の中で正しい答えにたどり着きやすくなります。

Parallel Computing:多くの計算またはプロセスの実行が同時に実行されるタイプの計算 4。したがって、並列計算は、並行性の特性を利用して、プログラム、アルゴリズム、または問題の複数のユニットを同時に実行します。

連続する加算の例を続けると、合計の異なる部分を並行して実行できます。

Execution unit 1:  0 + 1 + 2 + 3 + 4 = 10
Execution unit 2:  5 + 6 + 7 + 8 + 9 = 35

次に、最後に、各ワーカーの結果を合計して10 + 35 = 45

繰り返しますが、この並列処理が可能だったのは、連続した追加に同時実行性があるためです。

並行性は、並列処理だけでなく、それ以外にも利用できます。シングルコアシステムで プリエンプション を検討してください。一定期間、システムは複数の実行中のプロセスを完了せずに進行する場合があります。実際、非同期I/Oの例は、並列処理を必要としない同時実行の一般的な例です。


混乱

上記は比較的簡単です。辞書の定義が上で概説されたものと必ずしも一致しないため、人々が混乱するのではないかと思います。

  • 同時発生:同時に発生する、または同時に発生する、または同時に発生する 5
  • 同時実行性:2つ以上のイベントまたは状況が同時に発生または存在しているという事実 グーグルでの検索から:「定義:並行性」

ディクショナリは「同時実行性」を発生の事実として定義しますが、コンピューティング用語の定義はプログラム、プロパティ、またはシステムの潜在的なプロパティです。これらに関連するものは同じではありません。


個人的な推奨事項

同時実行が保証または期待される場合は「並列」という用語を使用し、同時実行を使用するかどうかが不確かまたは無関係な場合は「同時」という用語を使用することをお勧めします。

したがって、複数のコアでのジェットエンジンのシミュレーションを並列で説明します。

並行性の例としてMakefileについて説明します。 Makefileには、各ターゲットの依存関係が記述されています。ターゲットが他のターゲットに依存している場合、これにより部分的な順序が作成されます。関係とレシピが包括的かつ正しく定義されている場合、これにより並行性の特性が確立されます。結果に影響を与えずに特定のタスクの順序を再配置できるような部分的な順序が存在します。繰り返しになりますが、この並行性は複数のルールを同時に構築するために活用できますが、並行性は、並列処理が使用されているかどうかに関係なく、Makefileのプロパティです。

9
Levi Morrison

同時実行は、並列実行の一般化された形式です。たとえば、並列プログラムは並行して呼び出すこともできますが、逆は当てはまりません。

  1. 単一プロセッサー(スケジューラーによって管理される複数のスレッド)で並行実行が可能
  2. 並列実行は、単一のプロセッサでは実行できず、複数のプロセッサで実行できます。 (プロセッサーごとに1つのプロセス)

詳細については、この研究論文を読んでください 並行プログラミングの概念

7
user183296

並列処理は、並行処理のサブセットです。

並行処理では、非同期で発生する2つのタスクが記述されます。つまり、タスクの実行順序は事前に決定されていません。 2つのスレッドは、実行可能命令をインターリーブすることにより、同じプロセッサコアで同時に実行できます。たとえば、スレッド1は10ミリ秒、スレッド2は10ミリ秒実行されます。

並列処理は、複数の命令セットが同時に実行されるタイプの並行処理です。これは、分散コンピューティングなどの一般的な問題に取り組んでいる複数のシステム、または同じシステム上の複数のコアである可能性があります。

3
ConditionRacer

明らかに、これらの用語は異なる文化では異なる方法で使用されます。

私の理解は次のとおりです。

並列処理は、処理を高速化する方法です。単一のコア、複数のコア、またはGPUで行列乗算を実行しても、結果は同じです(またはプログラムが壊れます)。一部のプログラムに新しい機能を追加するのではなく、速度を向上させます。

同時実行性とは、逐次的に実行できなかった処理に関するものです。たとえば、次のリクエストを待っている間、3つのクライアントに同時に3つの異なるWebページを提供します。 (これは、昔から行われていたように、インターリーブによってある程度シミュレーションできます。)並行プログラムの動作は非決定的であることに注意してください。たとえば、3つのクライアントのうちどれが最初に完全に提供されるかは明確ではありません。かなりの数のテストを実行して、リクエストが完了する順序に関して毎回異なる結果を得ることができます。ランタイムシステムは、a)すべてのクライアントにサービスが提供され、b)適切な時間内に処理されることを保証する必要があります。

通常、並列計算の主力は、並列性を認識しておらず、気にしていません。並行タスクは、多くの場合、プロセス間通信またはスレッド間通信(ブロッキングキュー、同期、ロックメカニズムなど)を明示的に使用します。

0
Ingo

私の意見では、アプリケーションプログラミングの観点からは、これらの2つの概念に違いはなく、2つの単語があることは混乱のために混乱します。スレッドインターリービングは、マルチコアが不可能だった時代にマルチコア処理をシミュレートするためにもたらされたと思います。なぜ私たちはこの時代遅れの考え方についての言葉を持っているのですか?

メイソンウィーラーとペンギンは同じ答えを出しました。タスクの切り替えやマルチコアを備えた1つのコアは同時実行であり、厳密にはマルチコア=並列です。

私の意見では、これらの2つの用語は1つにまとめるべきであり、「並行」とは言わないように努めています。 OSプログラミングレベルでは区別が重要だと思いますが、アプリケーションプログラマの観点からはそれほど重要ではありません。私はmapReduce、Spark、MPI、cuda、openCL、およびマルチスレッドのc ++を作成しました。ジョブをインターリーブスレッドで実行しているか、複数のコアで実行しているかを停止して考える必要はありませんでした。

たとえば、マルチスレッドのc ++を書くとき、取得できるコアの数がわからないことがありますが、ここで説明するように、取得するコアの数を要求する方法はあります https://stackoverflow.com/ questions/2166425/how-to-structure-ac-application-to-use-a-multicore-processor 。 sparkでは、操作をマップして削減するだけで、jvmがハードウェアレベルで操作をどのように処理しているかがわかりません。GPUでは、thinkすべてのスレッドは独自の単純なプロセッサに割り当てられますが、問題が発生する可能性がある場合は常にスレッドを同期します。MPIを使用すると、マシン間の通信が明示的に指定されますが、インターリーブできますシングルコア上の複数のマシンで実行されている関数と、適切なシングルスレッド関数を介して結果を結合します。MPIを使用してシングルコアマシンの束を調整し、それぞれがマルチスレッド化されている場合はどうなりますか?それはどのような違いをもたらしますか?私は何も言わないでしょう。

0

tdammerの発言は間近に迫っていますが、残りはすべて要点を外しています。彼は言う:

「大胆に言えば、並行性は問題(2つのことが同時に発生する必要がある)を示し、並列処理は解決策を示します(2つのプロセッサコアを使用して2つのものを同時に実行する」

単語を分析してみましょう。

現在とは、現在発生していることを意味します。コンとは、反対すること、反対すること、一致しないことを意味します。

平行とは、交差することなく、互いに邪魔されることなく、同じ方向に向かうことを意味します。

したがって、同時実行性は、同じリソースで競合することを意味します。並列処理は行いません。並列プロセスが同じリソースを使用している可能性がありますが、問題とは見なされず、問題ではありません。並行性に関しては、対処する必要がある問題です。

0
Martin Maat

「並列」という用語のもう1つの一般的で具体的な使用法は、アレイプロセッサを指します。(コンピューターのGPUは、この主要な例です。)非常に冗長な計算ユニットliterallyは、同時に多くの結果を計算します。

この文脈では、「並行性」は少し緩やかです。私たち人間は、最後の1秒間で多くのタスクが実行されたと言うかもしれません。したがって、それらは「並行して」処理されましたが、特定のナノ秒では、そのうちの1つだけが実際に処理されていました。

しかし: "それは依存します。"2つの単語は同じcolloquial一般的な人間の会話における意味。したがって、より正確な意味が意図されていたか、意図されていなかったかを判断するために、説明を求める必要があるかもしれません。

0
Mike Robinson