web-dev-qa-db-ja.com

Haskellのマルチスレッド化はどの程度難しいですか?

Haskellでは、マルチスレッドアプリケーションの作成は、標準のHaskellアプリケーションを取得し、-threadedフラグを使用してコンパイルするのと同じくらい簡単であると聞きました。ただし、他のケースでは、実際のソースコード内でのparコマンドの使用について説明しています。

Haskellマルチスレッドの状態はどうですか?プログラムに導入するのは簡単ですか?これらのさまざまなコマンドとその使用法について説明する優れたマルチスレッドチュートリアルはありますか?

62
Mantas Vidutis

Haskellマルチスレッドの状態はどうですか?

成熟した。実装は約15年前で、トランザクションメモリは5年間です。 GHCは広く使用されているコンパイラーであり、大規模なオープンソースのサポートと商用の裏付けがあります。

プログラムに導入するのは簡単ですか?

これはアルゴリズムに依存します。場合によっては、並列性を得るためにparを1行で使用することもできます。新しいアルゴリズムを開発する必要がある場合があります。一般的に、Haskellでは、一般的な言語よりも安全な並列処理と同時実行性を導入する方が簡単で、パフォーマンスは良好です。

これらのさまざまなコマンドとその使用法について説明する優れたマルチスレッドチュートリアルはありますか?

Haskellには3つの主要な並列および並行プログラミングモデルがあります。

  • parによる暗黙の並列処理
  • forkIO/MVarとソフトウェアトランザクションメモリを介した明示的な同時実行性と並列処理
  • dPHライブラリを介したデータの並列処理

これらが主なものです。どの場合でも、マルチスレッドランタイムを使用するために-threadedでコンパイルしますが、特定の問題を並列化するのがどれほど簡単かは、使用するアルゴリズムと、そのリストから採用する並列プログラミングモデルによって異なります。

これが Haskellの主な並列プログラミングモデルの概要 と高速化を実現する方法です。

Real World Haskellの第24章 は良いチュートリアルだと思います。

65
Don Stewart

同時実行性の用語もあります。

コードに変更を加えないと、haskell rtはそれらを内部プロセスに使用しようとしますが、アプリケーションで使用するには、par b (f a b)によって行われるヒントを与える必要があります。 bは、たとえfが結果にそれを必要としない場合でも。

すべての引数を必要とするすべての関数(a+bなど)でこれを行わない理由の1つは、同期(計算のスケジュールと結果の待機)によってオーバーヘッドが発生し、おそらく余分に費やしたくないためです(2*3)+(3*4)のティックは、乗算を並列で計算できるからです。そして、おそらく単一のプロセッサでそれを行うときに行われるいくつかのキャッシュヒットまたはこのようなものや最適化を失うでしょう(つまり、とにかく1つのプロセッサから別のプロセッサに結果を渡す必要があります)。

もちろん、parを使用するコードは醜いです。軽いサブ要素を持つリストやその他のデータ構造を折りたたむときは、おそらく、その軽い要素のいくつかのチャンクを計算して、オーバーヘッド/計算が確実に行われるようにする必要があります。本当に小さくなります。これを解決するには、 parallel を見てください。

Data Parallel Haskell(DPH)もあります。

あなたのプログラムがIOモナドよりももっと多くの変更を必要とするよりも確かなら。 forkIO を参照してください、 ソフトウェアトランザクションメモリ(STM) および 同時実行カテゴリ の他の多く

18
ony