web-dev-qa-db-ja.com

並列プログラミング==マルチスレッドプログラミングですか?

並列プログラミング==マルチスレッドプログラミングですか?

マルチスレッドプログラミングは並列ですが、並列プログラミングは必ずしもマルチスレッドである必要はありません。

マルチスレッドがシングルコアで発生する場合を除き、その場合は同時のみです。

30

ない必然的に。複数のプロセス間、さらには複数のマシン間でジョブを分散できます。各プロセスが単一のスレッドしか使用しない可能性があるため、「マルチスレッド」プログラミングとしては分類しませんが、確かに並列プログラミングです。確かに、複数のプロセスでは、システム全体に複数のスレッドがあると主張することができます...

最終的に、このような定義はコンテキスト内でのみ役立ちます。あなたの特定のケースでは、それはどのような違いを生むのでしょうか?それとも、これは興味がないだけですか?

28
Jon Skeet

いいえ。マルチスレッドプログラミングとは、単一のプロセスがあり、このプロセスが多数のスレッドを生成することを意味します。すべてのスレッドは同時に実行されていますが、すべて同じプロセススペースの下にあります。つまり、同じメモリにアクセスしたり、同じオープンファイル記述子を使用したりできます。

並列プログラミングは、定義としてもう少し「一般的」です。 MPIでは、同じプロセスを複数回実行して並列プログラミングを実行しますが、すべてのプロセスが異なる「識別子」を取得するという違いがあるため、必要に応じて各プロセスを区別できますが、必須ではありません。また、これらのプロセスは互いに独立しており、パイプまたはネットワーク/ UNIXソケットを介して通信する必要があります。 MPIライブラリは、同期または非同期のスタイルで、ノード間でデータを移動するための特定の機能を提供します。

対照的に、OpenMPはマルチスレッドと共有メモリを介して並列化を実現します。コンパイラに特別なディレクティブを指定すると、自動的に並列実行が実行されます。

OpenMPの利点は、非常に透過的であることです。並列化するループがありますか?いくつかのディレクティブを追加するだけで、コンパイラはそれを分割してチャンクし、ループの各部分を異なるプロセッサに割り当てます。残念ながら、これには共有メモリアーキテクチャが必要です。ノードベースのアーキテクチャを持つクラスターは、クラスターレベルでOpenMPを使用できません。 MPIを使用すると、ノードベースのアーキテクチャで作業できますが、より複雑で透過的ではない使用法の代償を払う必要があります。

26
Stefano Borini