並行性は並列性ではないのか? [closed] 質問する

並行性は並列性ではないのか? [closed] 質問する

こここれについては Rob Pike のスライドがあります。これを読むたびに自分がバカみたいに感じます。要点が理解できません。並行処理とは複雑な問題を小さなコンポーネントに分解することだということはよく知られています。何かを正しく小さな部分に分割できない場合、並行処理を使用して解決するのは困難です。

しかし、同時実行性を達成した後、どのように並列性を実現するかについては、スライドにはあまり詳しく書かれていません。レッスンのスライド (番号 52) では、同時実行性について「並列性さえも可能」と書かれています。しかし、疑問は -同時実行性はいつ、どのようにして正しく効率的に並列処理につながるのでしょうか?

私の推測では、Rob は、開発者は並行性のレベルで作業する必要があり、並列性は言語/VM の問題であるべきだ (gomaxprocs?) と指摘しているのでしょう。小さな単位へのインテリジェントな分解だけを気にし、正しい並行性だけを気にすれば、並列性は「システム」によって処理されます。

どうか光を当ててください。

ベストアンサー1

ロブ・パイクが意味するもの

アルゴリズムの抽象形式を念頭に置いたら、それをメッセージ パッシング、共有メモリ、あるいはハイブリッドのどれで実装するかを選択する必要があります。また、メモリ アクセスのタイプ (NUMA、UMA など) と使用するトポロジ (ハイパーキューブ、トーラス、リング、メッシュ、ツリーなど) も考慮する必要があります。

これは、単に何かを並列に実行したい (例: parallel for) 人にとっては、大変な作業に思えます。

また、特にトポロジを変更する場合(そのすべての利点を享受できるようにするため)は、多大な作業が必要になります。

つまり、並列コード(単純なものでも複雑なものでも)を記述すると、VMまたはコンパイラが最適な方法を選択します。順番に実行することもできます。(例としては、.net 用のタスク並列ライブラリがあります)

重要な編集:

ここで言及しているのは、システム内で実行される独立したプログラム間の並行性ではなく、プログラム/アルゴリズム内の並行性についてです。

あなたが言った

並行処理とは複雑な問題を小さな要素に分解することであることはよく知られています。何かを正しく小さな要素に分割できない場合、並行処理を使用して解決することは困難です。

しかしそれは間違っている。これらの小さなコンポーネントは、順番に相互に依存している可能性がある。完了するまでに時間がかかるため、小さなコンポーネントに分割しても、同時実行性/並列性を実現できるわけではありません。

並列および分散アルゴリズムのすべてのクラスで(BSとMSの両方で)私たちは「同時実行性が得られました。次に並列性を得る方法を見てみましょう「アルゴリズムを説明するために並行性という言葉を使用する場合、並列性を意味します。逆もまた同様です。」

文献を見ると、分散と並列の間には微妙な違いがあることが分かります。

アルゴリズムの観点から見ると、同時実行性、並列性、分散性を使用すれば同じ考え方が得られます。

実装の観点から見ると、「並列処理」と言う場合、通常はローカル コンピューターまたはクラスター (共有メモリ通信) で実行されるプログラムを意味し、「分散処理」と言う場合はグリッド (メッセージ パッシング通信) でプログラムを実行することを意味します。

現在、分散と並列処理はどちらも同時実行性を意味します。

これらの用語の正確な意味についてはもっと懐疑的であるべきだと思います。なぜなら、文献においても(ここで言うのは、単に言語を作った人ではなく、この分野に実際に貢献した人たちのことですが)、これらの用語は抽象的な概念を表現するために使われているからです。

アルゴリズム (プログラム) の並行性とは、他のコード部分を最終的に待機する場合でも、他のコード部分とは独立して実行できるコード部分を持つことを意味します (このことの正確な意味については、アムダールの法則を確認してください)。

したがって、アルゴリズム/プログラムに同時実行性がある場合は、並列性も存在します。

背後にある考え方をよりよく理解するには、並列かつ分散されたアルゴリズムをいくつか実装する方がよいと思います。C/C++ の知識があれば、分散 (メッセージ パッシング) 実装には OpenMPI を使用し、並列 (共有メモリ) 実装には OpenMP を使用できます。

編集:

彼はまた、同時実行性を抽象的な原理として、並列性をその実装方法(共有メモリ、メッセージ パッシング、両者のハイブリッド、メモリ アクセスのタイプ(numa、uma など))として意味している可能性もあります。

おすすめ記事