ヘイヘイHaskell
https://gyazo.com/0d6c33073a8b6e02367bfdd2a6315bc4
2014/8/21
訳
サンプルコード
手に取った動機
並行の章がオススメらしい
並行、並列、分散とあって、割と独立してるから、途中から読める
あまりHaskell固有の概念に囚われず、広く並列並行プログラミングの知識を入れたいmrsekut.icon
ただし、すぐに必要としているわけではないのでそこまで深く知るモチベもない
軽く概要を頭に入れておきたい
Haskell固有の部分で言えば、以下のような点に着目したい
型による並列並行プログラミングのサポート
遅延評価の扱い
並列並行という概念の構造化
訳者まえがき
まえがき
Haskellの方言
並行プログラミング
1章 はじめに
I部 並列Haskell
2章 基本の並列性: Evalモナド
3章 評価戦略
(ここでの)評価戦略とは、
並行性からアルゴリズムを分離して並行コードをモジュール化する手法のこと
ちょっと読んだけど、ちゃんと楽しむためには時間取って動かしたほうがいいかなあmrsekut.icon
3.3.1 K平均法の並列化
3.3.2 性能と分析
3.3.4 粒度
3.4 GCされるスパークと投機的並列性
3.5 parBufferを使った遅延ストリームの並列化
3.6 チャンク分け戦略
4章 データフロー並列
4.1 例:グラフの最短路
4.2 パイプライン並列
4.2.1 生産者の流量制限
4.2.2 パイプライン並列の制限
4.3 例:会議の時間割
4.3.1 並列性の追加
4.4 例:並列型推論器
4.5 別のスケジューラを使う
4.6 戦略と比較したParモナド
5.1 配列、シェイプ、添字
5.2 配列に対する操作
5.3 例:最短路の計算
5.3.1 プログラムの並列化
5.4 畳み込みとシェイプ多相
5.5 例:画像の回転
5.6 まとめ
6.1 概要
6.2 配列と添字
6.3 単純なAccelerate計算を実行する
6.4 スカラ配列
6.5 配列に添字でアクセスする
6.6 Accの中で配列を作る
6.7 2つの配列を綴じ合わせる
6.8 定数
6.9 例:最短路問題
6.9.1 GPU上で実行する
6.9.2 CUDAバックエンドのデバッグ
II部 並行Haskell
7章 並行制御の基本: スレッドとMVar
MVarの基本
MVarでロックを扱う例
MVarで複数項チャネルを表現する例
8章 入出力の重ね合わせ
8.1 Haskellの例外
8.2 Asyncのエラー処理
8.3 マージ
9章 キャンセルとタイムアウト
9.1 非同期例外
9.2 非同期例外のマスク
9.3 bracket
9.4 チャネルに対する非同期例外の安全性
9.5 タイムアウト
9.6 非同期例外の捕捉
9.7 maskとforkIO
9.8 非同期例外に関して
10.2 ブロッキング
10.3 変更されるまでのブロッキング
10.4 STMを使ったマージ
10.5 Async再考
10.6 STMを使ったチャネルの実装
10.6.1 より多くの操作が可能
10.6.2 ブロックされる操作の合成
10.6.3 非同期例外安全
10.7 もう1つのチャネル実装
10.8 有界チャネル
10.9 STMでできないこと
10.10 性能
10.11 まとめ
11章 並行性の高水準な抽象化
11.1 スレッド漏れの回避
11.2 対称型並行性コンビネータ
11.2.1 raceを使ったタイムアウト
11.3 Functorインスタンスの追加
11.4 まとめ:Async API
12章 並行ネットワークサーバ
マルチスレッドを用いたネットワークアプリケーションの構築
12.1 簡単なサーバ
12.2 単純なサーバの状態による拡張
12.2.1 設計1:1つのジャイアントロック
12.2.2 設計2:サーバスレッドごとに1つのチャネル
12.2.3 設計3:放送チャネルの利用
12.2.4 設計4:STMの利用
12.2.5 実装
12.3 チャットサーバ
12.3.1 アーキテクチャ
12.3.2 クライアントのデータ
12.3.3 サーバのデータ
12.3.4 サーバ
12.3.5 新しいクライアントの準備
12.3.6 クライアントの起動
12.3.7 まとめ
13章 スレッドを用いた並列プログラミング
13.1 並行性を用いて並列性を達成する方法
13.2 例題:ファイル探索
13.2.1 直列版
13.2.2 並列版
13.2.3 性能とスケール
13.2.4 セマフォを使ったスレッド数の制限
14章 分散プログラミング
14.2 分散並行性か分散並列性か
14.3 最初の例:ピン(ping)
14.3.2 メッセージ型の定義
14.3.3 ピンサーバのプロセス
14.3.4 マスタープロセス
14.3.5 main関数
14.3.6 例題のまとめ
14.4 複数ノードでのピン
14.4.1 1つのマシン上で複数のノード
14.4.2 複数のマシン
14.5 型付きチャネル
14.5.1 チャネルのマージ
14.6 失敗処理
14.6.1 分散プログラムにおける失敗の哲学
14.7 分散チャットサーバ
14.7.1 データ型
14.7.2 メッセージ送信
14.7.3 放送
14.7.4 配布
14.7.5 サーバのテスト
14.7.6 失敗とノードの追加/削除
14.8 練習問題:分散KVS
15章 デバッグ、チューニング、外部コードとのインタフェース
15.1 並行プログラムのデバッグ
15.1.1 スレッド状態の検査
15.1.3 デッドロックの検出
15.2 並行(および並列)プログラムのチューニング
15.2.1 スレッドの生成とMVar操作
15.2.2 並行データ構造の共有
15.2.3 微調整のためのRTSオプション
15.3 並行性と外部関数インタフェース
15.3.1 スレッドと外部呼び出し
15.3.2 非同期例外と外部呼び出し
15.3.3 スレッドと外部からの呼び出し
索引