インテル スレッディング・ビルディング・ブロック

マルチコア時代のC++並列プログラミング

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

内容

マルチコア時代の並列プログラミングを独習できる入門書。オープンソースとして公開された話題のインテル スレッディング・ビルディング・ブロック(Intel Threading Building Blocks:TBB)は、C++のSTLを拡張した並列処理用のテンプレート・ライブラリー。TBBがスレッド管理を抽象化してくれるのでプログラマーはアルゴリズムに集中できる。本書ではTBBを使ったコードのスレッド化についてサンプルを示しながらわかりやすく解説する。マルチコア/マルチスレッド用に最適化されたスケーラブルなアプリケーションを開発するアーキテクトおよびプログラマー必携の一冊。TBB 1.0、1.1、2.0対応。

関連書籍

目次

日本語版の出版に寄せて
監訳者まえがき
推薦の言葉 −本書に対する賞賛の声
本書に寄せて
TBB開発責任者から
まえがき

1章 なぜスレッディング・ビルディング・ブロックなのか?
    1.1 概要
    1.2 利点
        1.2.1 ネイティブスレッド/MPIとの比較
        1.2.2 OpenMPとの比較
        1.2.3 再帰分割、タスクスチールとアルゴリズム

2章 並列思考
    2.1 並列思考の要素
    2.2 分解
        2.2.1 データの並列処理
        2.2.2 タスクの並列処理
        2.2.3 パイプライン化(タスクとデータ両方の並列処理)
        2.2.4 混合ソリューション
        2.2.5 並列処理の実現
    2.3 スケーリングとスピードアップ
        2.3.1 アプリケーションにどれだけの並列処理があるか?
    2.4 スレッドとは?
        2.4.1 スレッドのプログラム
        2.4.2 並列状態における安全性
    2.5 排他制御とロック
    2.6 正当性
    2.7 抽象化
    2.8 パターン
    2.9 直感による判断

3章 基本的なアルゴリズム
    3.1 ライブラリーの初期化と終了
    3.2 ループの並列化
        3.2.1 parallel_for
        3.2.2 parallel_reduce
        3.2.3 高度なトピック:異なる種類の反復空間
        3.2.4 parallel_scan
    3.3 再帰的な範囲指定
        3.3.1 分割可能コンセプト
        3.3.2 Rangeコンセプト
        3.3.3 Partitionerコンセプト
        3.3.4 再帰的なテンプレート
    3.4 ループのまとめ

4章 高度なアルゴリズム
    4.1 ストリーム用の並列アルゴリズム
        4.1.1 完了までの並列化:parallel_while
        4.1.2 組み立てラインでの作業:パイプライン
        4.1.3 parallel_sort

5章 コンテナー
    5.1 concurrent_queue
        5.1.1 デバッグ目的のconcurrent_queue上での反復
        5.1.2 キューを使用すべきではない状況
    5.2 concurrent_vector
        5.2.1 ベクトル全体の操作
        5.2.2 並列操作
        5.2.3 並列反復
        5.2.4 キャパシティー
        5.2.5 イテレーター
    5.3 concurrent_hash_map
        5.3.1 HashCompareの詳細
        5.3.2 テーブル全体の操作
        5.3.3 同時アクセス
        5.3.4 並列操作:find、insert、erase
        5.3.5 並列反復
        5.3.6 キャパシティー
        5.3.7 イテレーター

6章 スケーラブルなメモリー割り当て
    6.1 制限
    6.2 メモリー割り当ての問題
    6.3 メモリー・アロケーター
        6.3.1 どのライブラリーをアプリケーションにリンクすればいいか
        6.3.2 C++ STLテンプレート・クラスへのアロケーター引数の使用
    6.4 malloc、new、deleteの置換
        6.4.1 malloc、free、realloc、callocの置換
        6.4.2 newとdeleteの置換
        6.4.3 Allocatorコンセプト
        6.4.4 モデル型

7章 排他制御
    7.1 排他制御を使用すべき状況
    7.2 mutexの概要
        7.2.1 mutexの特性
        7.2.2 リーダー/ライターmutex
        7.2.3 アップグレード/ダウングレード
        7.2.4 ロックの問題
    7.3 mutexのインターフェイス
        7.3.1 Mutexコンセプト
        7.3.2 ReaderWriterMutexコンセプト
    7.4 アトミック操作
        7.4.1 atomic<T>にコンストラクターがない理由
        7.4.2 メモリーの一貫性とフェンス

8章 タイミング

9章 タスク・スケジューラー
    9.1 タスクベースのプログラミングが適切ではない場合
    9.2 ネイティブスレッドより優れている点
        9.2.1 オーバーサブスクリプション
        9.2.2 フェア・スケジューリング
        9.2.3 コーディングのオーバーヘッド
        9.2.4 ロード・インバランス
        9.2.5 移植性
    9.3 ライブラリーの初期化
    9.4 フィボナッチ数のサンプルプログラム
    9.5 タスク・スケジューリングの概要
    9.6 タスク・スケジューリングの動作
    9.7 推奨するタスク回帰パターン
        9.7.1 ブロックスタイルと子
        9.7.2 継続渡しスタイルと子
    9.8 スケジューラーの活用
        9.8.1 再帰連鎖反応
        9.8.2 継続渡し
    9.9 タスク・スケジューラーのインターフェイス
    9.10 タスク・スケジューラーのまとめ

10章 成功への秘訣
    10.1 成功への重要なステップ
    10.2 緩和直列実行
    10.3 メソッドとライブラリーの安全な並列化
    10.4 デバッグとリリース
    10.5 効率に関する考察
    10.6 デバッグ機能を利用する
        10.6.1 TBB_DO_ASSERTマクロ
        10.6.2 TBB_DO_ASSERTを含むプログラムを出荷しない
        10.6.3 TBB_DO_THREADING_TOOLSマクロ
        10.6.4 デバッグ・ライブラリーとリリース・ライブラリー
    10.7 その他のスレッドパッケージとの併用
    10.8 命名規則
        10.8.1 tbb名前空間
        10.8.2 tbb::internal名前空間
        10.8.3 _ _TBBプリフィックス

11章 コードの例題
    11.1 Aha !(なるほど!)
    11.2 その他の重要なポイント
    11.3 parallel_forのコードの例題
        11.3.1 ParallelAverage
        11.3.2 地震波
        11.3.3 行列乗算
        11.3.4 ParallelMerge
        11.3.5 SubstringFinder
    11.4 ライフゲーム
        11.4.1 実装
        11.4.2 オートマトン
        11.4.3 オートマトン:実装
        11.4.4 アプリケーションの拡張
        11.4.5 参考文献
    11.5 parallel_reduceのコードの例題
        11.5.1 ParallelSum
        11.5.2 粒度を指定する必要のないParallelSum
        11.5.3 ParallelPrime
    11.6 CountStrings: concurrent_hash_mapの使用
    11.7 クイックソート:タスクスチールの視覚化
    11.8 高速な行列乗算(Strassen)
    11.9 高度なタスク・プログラミング
        11.9.1 メインプログラムで並列に大きなタスクを開始する
        11.9.2 2つの出入り口:パイプラインの同じタスクから2つ供給する
    11.10 パケット処理パイプライン
        11.10.1 インターネット・デバイス用の並列プログラミング
        11.10.2 ローカル・ネットワーク・ルーターの例
        11.10.3 ローカル・ネットワーク・ルーター用にパイプライン化されたコンポーネント
        11.10.4 実装
        11.10.5 フィルタークラス
    11.11 メモリー割り当て
        11.11.1 newとdeleteの置換
        11.11.2 malloc、calloc、realloc、freeの置換
    11.12 ゲームのスレッド化のコードの例題
        11.12.1 スレッド化アーキテクチャー:物理計算+レンダリング
        11.12.2 スケーラビリティーで重要なこと
        11.12.3 フレームループ
        11.12.4 ドメイン分解データ構造の必要性
        11.12.5 スレッドではなくタスクで考える
        11.12.6 ロードバランスとタスクスチール
        11.12.7 物理計算スレッド間の同期
        11.12.8 コードの例題の実際のゲームへの統合
        11.12.9 パフォーマンスの測定方法
    11.13 相互作用の物理計算と更新のコード
    11.14 オープン・ダイナミクス・エンジン(Open Dynamics Engine)
        11.14.1 hotspotの調査
        11.14.2 最初のソリューションの改善
        11.14.3 コードの例題

12章 歴史と関連プロジェクト
    12.1 ライブラリー
    12.2 言語
    12.3 プラグマ
    12.4 汎用プログラミング
        12.4.1 汎用プログラミングのコンセプト
        12.4.2 汎用プログラミングの擬似署名
        12.4.3 汎用プログラミングのモデル
    12.5 キャッシュ
    12.6 タイムスライスのコスト
    12.7 ラムダ関数の紹介
    12.8 参考文献

索引

正誤表

関連ファイル