内容紹介
並列・並行プログラミングをHaskellで実現するための決定版!
マルチコアプロセッサの登場以来、並列・並行プログラミングは第一線のプログラマの重要な関心事であり、常に注目を集めている話題です。その中で、純粋な関数型言語であるHaskellは以前からそれを実現するのに最適な言語と言われてきました。本書はその期待に応えるべく、Haskellでの並列・並行プログラミングの現在の状況を俯瞰しつつ、実際の問題を解決するときに陥りがちな罠や、高い性能を出すためのtipsなどが読みやすくまとまった一冊になっています。
このような方におすすめ
Haskellユーザ、並行・並列プログラミングに興味を持つエンジニア
目次
詳細目次
目次
訳者まえがき
まえがき
1章 はじめに
1.1 用語:並列性と並行性
1.2 ツールとリソース
1.3 サンプルコード
I部 並列Haskell
2章 基本の並列性:Evalモナド
2.1 遅延評価と弱頭部正規形
2.2 Evalモナド、rpar、rseq
2.3 例:並列数独ソルバ
2.4 Deepseq
3章 評価戦略
3.1 戦略の並列化
3.2 リストを並列に評価する戦略
3.3 例:K平均法
3.3.1 K平均法の並列化
3.3.2 性能と分析
3.3.3 スパーク活動の可視化
3.3.4 粒度
3.4 GCされるスパークと投機的並列性
3.5 parBufferを使った遅延ストリームの並列化
3.6 チャンク分け戦略
3.7 同一性特性
4章 データフロー並列:Parモナド
4.1 例:グラフの最短路
4.2 パイプライン並列
4.2.1 生産者の流量制限
4.2.2 パイプライン並列の制限
4.3 例:会議の時間割
4.3.1 並列性の追加
4.4 例:並列型推論器
4.5 別のスケジューラを使う
4.6 戦略と比較したParモナド
5章 Repaを用いたデータ並列プログラミング
5.1 配列、シェイプ、添字
5.2 配列に対する操作
5.3 例:最短路の計算
5.3.1 プログラムの並列化
5.4 畳み込みとシェイプ多相
5.5 例:画像の回転
5.6 まとめ
6章 AccelerateによるGPUプログラミング
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バックエンドのデバッグ
6.10 例:マンデルブロ集合の生成器
II部 並行Haskell
7章 並行制御の基本:スレッドとMVar
7.1 例:備忘通知
7.2 通信:MVar
7.3 簡単なチャネルとしてのMVar:ログサービス
7.4 共有状態としてのMVar
7.5 組み立て部品としてのMVar:無制限チャネル
7.6 公平性
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章 ソフトウェアトランザクショナルメモリ
10.1 ウィンドウマネージャの例
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 セマフォを使ったスレッド数の制限
13.2.5 ParIOモナド
14章 分散プログラミング
14.1 distributed-processパッケージファミリー
14.2 分散並行性か分散並列性か
14.3 最初の例:ピン(ping)
14.3.1 プロセスとProcessモナド
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.2 イベントログとThreadScope
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 スレッドと外部からの呼び出し
索引
続きを見る