- Haskellでの並行・並列実行環境は整ってきた
- GHCのShared Memory Multiprocessor環境におけるParallel化等
- しかし、実装者に対するレクチャはまだないので書いた
- Audience
- RWH,Programming in Haskell,すごいH本 ... 等を読んでいる人たち
- この本の読み方
- 読むだけでなく、実装して確かめてほしい
- Haskell界の変化はこの20年で一番速いのでLibraryが古くなっている可能性はある
- Part 1 (Parallel), Part 2 (Concurrent)の2つに分かれている。どちらから始めても良い。
- threadsやlockを扱うプログラミングは難しい。そして、すべてをうまく扱えるツールはない。
- Haskellでは、各タスクに最適化された複数のツールが作られている。
- この本ではそうして作られた数多くのツールのうち、製品使用に耐えられるものを紹介する
- lowest layer workについて理解してもらうつもりなので、この本を読んだあと自分で抽象化してほしい
- Parallelism (並列)
- 計算時間を短縮するために、複数のハードを使用する
- 実行タスクの異なる部分を異なるプロセッサで実行する
- Concurrent (並行)
- program-structuring techniqueである
- threads of control
- シングルプロセッサでinterleaveで実行もできるし、複数のプロセッサで同時実行もできる
- Parallelは計算を早くするだけなので簡単だが、Concurrentは外部のエージェントに処理を委譲するため、デザイン設計にmodularityが必要。
- 純粋関数型では副作用や評価順序を気にする必要がないので、threads of controlを行う必要がない。純粋関数型であるHaskellにおいてthreads of controlを行うConcurrentな実装を行う場合は、IOモナドで包むことになる。
- Parallel / Concurrentのもう一つの違いは、決定性。Concurrentは外部エージェントに委譲するため、非決定となる。非決定性を持ったモデルは値がひとつに決まらないためテストしづらい。
- Parallelでは、できるだけdeterministicなモデルで実装したい。さもないとデバッグが大変。ParallelプログラムをConcurrencyモデルを使って実装することもできるが、大変なことになる。
- ただ、すべてのParallelタスクをParallelモデルで実装できるわけではない。
- 非決定の内部状態に依存する場合とか
- 副作用を持つParallelタスクを実行したい場合もある
- こういうときは、非決定Parallelか、Concurrentを使う必要がある。
- ParallelとConcurrentを混合して使用するときもある。
- Haskell Platform
- この本では2012.4.0.0を使用
- Sample Code :
- モニタリングツール
- threadscope
- Install方法
- 自分はFP-CompleteのHaskell-Eval Vagrantボックスを使いました。
- OS : Ubuntu 12.04 / Haskell-Platform : 2012.4.0.0
- Haskell Evaluation Virtual Box
- ちょっとしたVagrantの使い方
- threadscope