暗黙的な並列処理/同時実行性がそれほど普及していないのはなぜですか?[閉まっている]


13

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


^暗黙的な並列処理とは、スレッドなどを使用してこの作業を行う必要のあるプログラマーの代わりに、コンピューターが一度に複数のことを行う方法を把握できるようにすることです。


parasailプログラミング言語をチェックしてください。暗黙の並列化を

回答:


11

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

本当の問題は、いくつかの例外を除いて、並行性をどのようにうまく行うかが依然として未解決の問題であるということです。ErlangコミュニティとHaskellコミュニティはかなり順調に進んでいるように見えますが、大規模なN向けにNコアシステムをプログラミングする方法を本当に理解するまでにはまだ長い道のりがあります。


1
Schemeには、順序を保証しないことを明示的に選択するループがいくつかあります。
ハビエル

クール
ザカリーK

5

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

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

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


4

他の回答(操作が独立していることを証明するのは困難であり、プログラマーが連続して考えること)で言及されている点とは別に、考慮すべき3番目の要素があります:並列化のコストです。

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

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

  • ミューテックスを介したスレッド通信は高価です。通常、これには各側でシステムコールが必要であり、スレッドをスリープ状態にして再度起動する必要があります。平均して、ミューテックスの取得と解放には約1マイクロ秒かかります。

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

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

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


0

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

すなわち、それは自然ではありません......


プログラマーは、プログラミング言語がプログラミングを奨励する方法でプログラミングするのと同じように、どのように考えるように教えられたかを考えます。プログラマーがいわゆるフリンジ言語にさらされていない場合、問題について推論する他の方法があることを学べません。これが、7週間の7つの言語が多くの人々の推奨リストで高い理由だと思います。
マークブース

おそらくフリンジは間違った言葉だった-私は商用アプリケーションで広く使用されていない言語を意味した(すなわちC ++やJavaではない)。
-mattnz

1
しかし、私は、それを裏付けるための自分の意見以外は何もありませんが、プログラマーは人間であり、マルチスレッド化と大規模なパラリサムを実際に「取得」するための金属的な能力を持っていると主張しています。同時に複数のタスクを実行するのは人間の性質ではありません。時間管理に不可欠なすべての本は、何かを始め、それを完成させてから次のことをするという概念を促進します。これらのパラダイムを効率的かつ効果的に使用するには、大規模なツールのサポートが必要ですが、現在サポートされていません。少数はそれを「取得」し、これらのツールを開発する必要があります。
-mattnz

1
don't have the patienceは、より正確な評価だと思いdon't have the mental capacityます。私のキャリアでは、愚かプログラマーよりも多くの怠け者のプログラマーを見てきました。幸運なことに、大学での最初の1年で、手続き型プログラミングとオブジェクト指向に沿って関数型プログラミングときめ細かい並列プログラミングを教えられました。多くのプログラマーはそれほど幸運ではなかったと思うので、彼らの思考プロセスは結果としてまっすぐになりました。
マークブース

0

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

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

また、並行性は機能自体ほどテストが容易ではないため、プログラマーはこれらの問題以外に放置する傾向があり、並行処理のコミットについては考えていませんが、間違いは何ですか

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.