インフォメーション
Cプログラム高速化研究班 〜コードを高速化する20の実験と達人の技〜
- 書名
- Cプログラム高速化研究班 : コードを高速化する20の実験と達人の技
- 著者
- 片山善夫
- 価格
- 1,944円(税込)
- 仕様
- A5判、172ページ
- ISBN
- 978-4904807057
筆者は、16ビットミニコンから32ビットμプロセッサまでの汎用CPU用コンパイラや、実時間動画像処理向けビジョンチップ用並列Cコンパイラなど、数多くの開発を経験した高速化の達人。
プロセッサは高速化しましたが、なお高速プログラムが必要とされる場面が存在します。それに対応できる技術者の減少を危惧する筆者が、ノウハウを惜しみなく開示します。
amazon.co.jp / 注文フォーム / お問い合わせ
高速なプログラムが求められる場面は少ないながらも厳然として存在している。しかし、いざ性能が必要になったときに対応できる技術者が非常に少なくなっている。
その原因のひとつは、高級言語と統合開発環境の普及によって、機械命令レベルのプログラム実行を意識しなくてもすむようになっていることを挙げることができる。どのように実行されるかを意識しないので、実行コストが高い処理が平気で使われている。もうひとつの原因は、アルゴリズムに対する理解不足である。
開発するプログラムが高度化、パターン化してきているため、アルゴリズムについて学ぶ機会がなくなっているように思う。本書ではプログラムを高速化する個々の方策を並べるのではなく、そういった高速化の方策を見つけるための道筋を示すように心がけてある。
- 序章 高度に進んだ技術は魔法と見分けがつかない
- 1章 CPUとコンパイラについてちょびっと
-
- 高速道路と横断歩道
-
- コンパイラは何をしているのか
- コンパイル後のアセンブリ言語プログラムを覗く
- 最適化オプションを付けるとどうなるか
-
- CPUは何をしているのか
- 命令セットアーキテクチャとマイクロアーキテクチャ
- 命令はどのように実行されるのか
- 命令パイプライン
- キャッシュメモリ
- もっとキャッシュ
- キャッシュブロックの置換アルゴリズム
- スーパースカラ実行
- [1章は重箱の隅なのか]
-
- 2章 実行コストの感覚を身につける
-
- プログラムの実行コスト
-
- 計る・測る・謀る
- 本書のアプローチ
-
- ベンチマークテストプログラムの最適化を防ぐ
- 操作の「おまとめ」を防ぐ
- 初期値設定の最適化を防ぐ
- 単純な繰り返し操作の最適化を防ぐ
- 本書のベンチマークテストプログラム
-
- 検証――遅いのはどの操作?
-
- 基本の加算と代入
- 単純な代入(レジスタ間の転送)
- 単純な代入(データの競合がある場合)
- 定数の代入
- 変数どうしの加算
- 変数に定数を加算
-
- 乗算は遅い
- 変数どうしの乗算
- 変数に定数を乗算
-
- 除算はとっても遅い
- 変数で除算(レジスタどうしの演算)
- 定数2、4で除算
- 2のべき乗以外の定数で除算
- 符号なし整数の場合はどうか
- 2のべき乗で除算するときはシフト演算がお得
-
- メモリへのアクセス
- 小さい配列へのアクセス(狭い範囲のメモリ操作)
- 大きい配列へのアクセス(広い範囲のメモリ操作)
- デスクトップ向けCPUとの比較
-
- コンディションで差がでる条件分岐
- else節のないif文
- else節のあるif文
-
- 32/64ビット環境で違う関数呼び出し
-
- 実験のまとめ
- [愛がほしくば愛を差し出せ]
-
- 3章 遅いのはどこか
-
- gprofを使ったプロファイリング
- gprofの使い方
-
- 何がどれだけ時間を喰っているか
- ライブラリ関数のプロファイルも取得する
- 時間喰いの関数たち
- ライブラリ関数の呼び出し回数を表示させるには
-
- 何が何を呼び出しているか
-
- プロファイリングの仕組み
-
- そのほかのプロファイラ
- [達人の技を伝える教育システム]
-
- 4章 達人の方法論
-
- 達人はどこに目をつけるか?
- ハードウェア編
- コンパイラ/ミドルウェア編
- アルゴリズム編
-
- [ハードウェア編]配列とキャッシュメモリの活用
- 行列の積を計算する
- 配列操作の順番を入れ替える
- ループを展開する
- 行列のタイリング
-
- [ライブラリ編]遅い関数をめぐる紆余曲折
- なぜstrcmp関数は遅いのか
- 最適化の落とし穴
-
- [ハードウェア編]SIMDを用いた文字列比較
-
- [ライブラリ編]入出力方法いろいろ比べ
- 行データの入力方法を比べる
- 出力方法はどうだろう
- パイプ入出力の特殊事情
- パイプ入出力 vs. ファイル入出力
-
- [アルゴリズム編]バイナリサーチと平衡二分探索木
- 大量データのソート
- [そこまでやる? ね、ね、そこまでやるの?]
-
- 5章 コンパイラを骨までしゃぶる
-
- レベル分けされている最適化オプション
- GCCの最適化オプション
- 「最適化なし」はデバッグに役立つ
- 未定義動作がないことを想定しているレベル2以上の最適化
-
- 最適化・レジスタ・外部変数
-
- 共通部分式削除を知ってプログラムすっきり
-
- ポインタと強度低減
-
- インライン関数でユーザー関数も展開
- [他人に差をつけろ!]
-
- 6章 業務システム向けのヒント 137
-
- ソートと文字列操作をねらえ
-
- 小数点数の計算と文字列/数値の変換
- ブロック入出力とフィールド分割
- 小数部付きの数を集計する
- 整数を文字列に変換する
- パフォーマンスチューニングの結果
-
- 半角文字から全角文字への変換
- 文字のバイト数を判別する
- ASCII文字と半角カナ文字の判別
- ASCII文字から全角文字への変換
- 半角カナから全角文字への変換
- パフォーマンスチューニングの結果
- 文字のバイト数を調べる別の方法
- より道UTF-8
-
- データの特性を利用した配列の探索
- データの特性を考慮する
- バイナリサーチとリニアサーチを組み合わせた照合
- パフォーマンスチューニングの結果
- [あとがきに代えて]
-
ソースコードダウンロード
- CPUcost.tar.gz
- 書籍で使われているベンチマークテストプログラム [MD5: 482454604ad8ef4776f37ffc58b0e9f9]