web-dev-qa-db-ja.com

暗黙の並列処理/並行処理がなぜそれほど普及していないのですか?

暗黙的な並列処理^ は、多くのプログラマから大きな負担を取り除いて、コンピュータに配置することができます。では、なぜ現在はそれほど普及していないのでしょうか。


13
Abbafei

いくつかの例外を除いて(Haskell)、コンパイラがループをアンラップする方法はありません。問題は、ループを繰り返すたびにグローバル状態が変更される可能性があることです。そのため、別の順序で実行すると、問題が発生する可能性があります。 haskellでは、関数が純粋であることを期待できます。つまり、グローバル状態を読み取ったり変更したりしないため、任意の順序で実行できます。

本当の問題は、いくつかの例外を除いて、同時実行性を適切に行う方法が未だ非常に未解決の問題であることです。 ErlangコミュニティとHaskellコミュニティは順調に進んでいるようですが、大きなN向けにNコアシステムをプログラミングする方法を実際に理解するまでには、まだ長い道のりがあります。

11
Zachary K

現在使用しているプログラミング言語のほとんどは、シングルスレッドプログラミングとシングルユーザーインタラクションが多くのアプリケーション(例:スタンドアロンデスクトップアプリケーション)で最も使用されている時期に使用されました。 Webアプリケーション、クラウドコンピューティング、マルチユーザーアプリケーションの登場により、マルチスレッドアプリケーションの必要性が高まっています。

レガシープログラミング言語は、言語自体からのマルチスレッド機能をゆっくりとサポートしようとしています(Java追加されたJava.util.concurrentのように)。

将来登場する新しい言語では、スレッド化と並行処理のサポートが強化されています。

5
Dhanunjai

他の回答で述べられている点(操作が独立していることを証明するのが難しく、プログラマーが逐次的に考える)とは別に、考慮する必要がある3番目の要素があります。並列化のコストです。

真実は、スレッドの並列処理には非常に大きなコストがかかるということです。

  • スレッドの作成はvery高コストです。カーネルにとって、スレッドの開始はプロセスの開始とほとんど同じです。正確なコストはわかりませんが、10マイクロ秒程度だと思います。

  • ミューテックスを介したスレッド通信は負荷が高くなります。通常、これには両側でシステムコールが必要であり、スレッドをスリープ状態にして再びウェイクアップする可能性があり、レイテンシやコールドキャッシュ、フラッシュされたTLBが発生します。平均すると、ミューテックスの取得と解放には約1マイクロ秒かかります。

ここまでは順調ですね。なぜこれが暗黙の並列処理の問題なのですか?暗黙的な並列処理は小規模で証明するのが最も簡単だからです。単純なループの2つの反復が互いに独立していることを証明することは1つです。何かをstdoutに出力し、データベースにクエリを送信することが互いに独立していることを証明することはまったく異なります。並行して実行できます(データベースプロセスはパイプの反対側にある可能性があります!)。

つまり、並列化のコストは並列処理の利点よりも大きいため、コンピュータプログラムが証明できる暗黙的な並列処理はおそらく悪用可能です。一方、アプリケーションを本当に高速化できる大規模な並列処理は、コンパイラーには証明できません。 CPUが1マイクロ秒以内に実行できる処理について考えてみてください。ここで、並列化がシリアルプログラムよりも高速であることが想定されている場合、並列プログラムは、2つのmutex呼び出しの間のすべてのCPUを数マイクロ秒間ビジー状態に保つことができる必要があります。これには非常に粗い粒度の並列処理が必要であり、自動的に証明することはほとんど不可能です。

最後に、例外のないルールはありません。暗黙的な並列処理の活用は、スレッドが含まれていない場合に機能します。これは、コードのベクトル化(AVX、AltivecなどのSIMD命令セットを使用)の場合に当てはまります。これは確かに、比較的簡単に証明できる小規模の並列処理に最適です。

プログラマーは逐次的に考え、現在の言語はそのモデルをサポートするように構築されています。 Haskell Erlangなどの周辺言語を除いて、言語(私は形容詞「モダン」の使用は控えています)は基本的に高レベルのアセンブリであり、コンピュータに何をすべきか、いつ、どのように行うかを指示します。希望する結果が得られるかどうかをコンピューターに伝えるエコーシステムができるまでは、プログラマーとして、マルチスレッド機能をフルに活用する精神的能力がありません。

つまり、それは自然なことではありません......

0
mattnz

トランザクションはACIDでなければならないため、プログラマーは主に1つのスレッドについて考える傾向があります。

言語とプラットフォームは、プログラマができる限りの並行性からプログラマを保護する必要があります

また、並行性は機能性自体ほど簡単にテストできないので、プログラマーはこれらの問題に加えて、コミットの並行性の処理について考えていなくても、間違いは何ですか?

0
Llistes Sugra