Haskellによる並列・並行プログラミング

Ebook Storeで電子版を購入:
価格3,960円
カートに入れる

内容

並列・並行プログラミングはプログラマの重要な関心事であり、常に注目を集めている話題です。これまで、関数型言語は並列・並行プログラミングに有利であると言われてきましたが、それを説明する書籍はありませんでした。本書では、純粋関数型言語Haskellが提供する並列・並行プログラミングの機能を俯瞰し、実践的な問題を解いていきます。その根底にある考え方は、関数プログラミングの核心であるモジュラリティです。また本書では、実際の問題を解決するときに陥りがちな落とし穴や、高い性能を出すためのtipsなどをまとめています。

関連書籍

目次

目次


訳者まえがき
まえがき

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 スレッドと外部からの呼び出し

索引

正誤表