コンピュータアーキテクチャ技術入門 ――高速化の追求×消費電力の壁
この本の概要
わずか70年余りで,150億倍もの演算速度向上を遂げたプロセッサ,
40年余りで記憶容量が800万倍に増加したメインメモリ,
55年余りで記憶密度が3億倍に達したストレージ。
そして,省電力化により,演算/W(1ワットあたりの演算能力)に至っては,
約70年で2兆倍もの差がある......。
驚くべき進化を遂げたコンピュータは,
今,どのように成り立っているのでしょうか。
本書では,コンピュータアーキテクチャの今に焦点を当て,
手のひらサイズのスマートフォンから,
巨大なスーパーコンピュータやデータセンターまで幅広く取り上げながら,
プロセッサ,メモリ,I/Oを中心に最新のしくみを徹底解説。
合わせて,現在ホットな消費電力や並列処理,GPUの話題も盛り込み,
各種プログラミングテクニックもカバー。
さまざまなスケールで共通する技術とは何か,
異なる/特長的な技術とは何かを押さえつつ,
コンピュータにおける性能向上の鍵を探っていきます。
未来に向かう,より効率的なソフトウェア開発のために,
長く役立つ技術知識を満載してお届けします。
こんな方におすすめ
- コンピュータ技術の今を知りたいエンジニアの方々
目次
- 本書について
- 本書の構成
- 基本用語の整理
第1章 コンピュータシステムの基本
1.1 コンピュータシステムの構造
- 命令とデータ
- コンピュータシステムの構成要素 ──プロセッサ,メモリ,入出力装置
- コンピュータは2進数で処理を行う
- 2進法とビット,バイト,ワード
- プロセッサの命令 ──プログラムは命令の集まりでできている
- 分岐命令,条件分岐命令
- 命令セットアーキテクチャ ──Intel 64,AMD64,ARMv8
- 命令セットアーキテクチャは上位互換で拡張する
- バイト列を記憶するメモリ ──メモリセル,メモリの記憶容量
- メモリにはバイト単位でアドレスを付ける
- 記憶容量の単位 ──1024B,1KB,1KiB
- DRAMチップとメモリセルの価格
- 入出力装置
- スマートフォン用LSIの入出力装置
- PC用LSIの入出力装置
- スマートフォン用SoCとデスクトップPCプロセッサの違い
1.2 プロセッサの基礎
- プロセッサはどのように命令を実行するのか
- サイクルタイムとクロック周波数
- 流れ作業で性能を上げるパイプライン処理
- メモリの読み書き速度の問題
- 階層構造のメモリ ──実効的なメモリ速度を改善する
- キャッシュ
1.3 半導体技術
- 半導体とは
- MOSトランジスタの原理 ──N型とP型
- CMOS論理回路
- 現代のデジタル回路は省電力のCMOSが主流
- プロセッサチップの作り方
- ムーアの法則 ──1個のチップに集積できる素子の数は毎年倍増(!?)
- マルチコア化の流れ ──性能と消費電力
- 性能と消費電力 ──1Wの電力あたりのプロセッサの性能を上げる
- CMOSの消費電力 ──スイッチ,アクティブ電力,クロックゲート
1.4 まとめ
- Column 文字の表現
第2章 プロセッサ技術
2.1 プロセッサの命令セットアーキテクチャ
- プロセッサの実行環境 ──レジスタとメモリ空間
- 命令で操作できる各種のレジスタ
- メモリ空間 ──メモリを抽象化
- 命令の実行はレジスタやメモリの内容を変える ──命令実行の実行環境への影響
- スーパーバイザモードとユーザモード ──2つの実行状態
- ユーザモードではバイナリ互換が必要
- 3アドレス命令と2アドレス命令 ──x86命令アーキテクチャは2アドレス命令
- 固定長命令と可変長命令 ──メモリアドレスの指定,可変長命令,固定長命令
- メモリアドレスの指定法
- Intel x86アーキテクチャの可変長命令
- SPARCやARMプロセッサで使用されている固定長命令
- 固定長命令のメリット,デメリット
2.2 プロセッサの基本構造 ──マイクロアーキテクチャの基礎
- パイプラインプロセッサ ──プロセッサはどのように命令を実行するのか
- フェッチユニット ──命令の読み出し
- デコードユニット ──命令のデコードとスケジュール
- 資源予約表
- レジスタ状態表
- デコードユニットが要 ──パイプライン全体の動作を制御する
- 実行パイプライン ──命令を実行する
- ロード/ストアユニット
- 条件分岐命令の処理 ──命令の実行の順序を変える命令
- 分岐ユニット
- 入出力装置との接続 ──メモリと入出力レジスタ,メモリマップドI/O
- デバイスドライバ
2.3 演算を速くする
- 数値の表現
- 負の整数をどう表すか ──コンピュータでは「2の補数表現」が使われる
- 小数点を含む数字をどう表すか ──IEEE 754浮動小数点数のフォーマット
- 加算器の高速化 ──フルアダー
- 基本のリップルキャリーアダー
- 上位のキャリーを速く求める ──G信号とP信号
- 引き算はどうするのか
- リザルトバイパス ──汎用レジスタをバイパスして,演算結果を次の演算に渡す
- 乗算器とその高速化
- 変形ブースエンコード
- 部分積の数を減らすブースのアルゴリズム
- 部分積の和を高速化するウォレスツリー
- 除算器とその高速化
- 浮動小数点演算器
- SIMD演算ユニット ──SSE,AVX
- SIMD演算は専用のビット長の長いレジスタを使う
- SIMD命令は長いレジスタを分割して並列に演算する
2.4 高速化を支えるキャッシュメモリ
- キャッシュメモリの構造
- キャッシュライン,キャッシュラインサイズ
- キャッシュメモリのアクセス ──キャッシュラインとタグ
- フルアソシアティブキャッシュ ──自由度が高い方式
- ダイレクトマップキャッシュ ──構造が簡単な方式
- セットアソシアティブキャッシュ ──良いとこ取りの中間的な方式
- 頻繁に使われるデータをキャッシュに入れるには?
- LRU
- キャッシュコヒーレンシの必要性
- MSIプロトコル ──キャッシュコヒーレンシを実現する基本手順
- ストアの前に同一アドレスのキャッシュラインを無効化する
- ロードの前にキャッシュの「スヌープ」を行う
- MESIFプロトコル ──Intelが採用している
- MOESIプロトコル ──AMDが採用している
- キャッシュの階層化 ──メモリアクセス時間の改善
- キャッシュの階層化のしくみ
- ハーバードアーキテクチャ ──命令,データ分離キャッシュ
2.5 プロセッサの高速化技術
- スーパースカラ実行
- Out-of-Order実行
- リザベーションステーション ──入力オペランドが揃うと実行を開始する
- レジスタリネーミング ──逆依存性を解消する
- レジスタリネーミングの実行の様子
- 分岐予測 ──条件分岐命令の条件成立/不成立を予測する
- 分岐予測とループの回数
- 2ビット飽和カウンタを用いる分岐予測 ──過去に分岐が行われた履歴を記憶しておく
- 2ビット飽和カウンタの構造
- ローカル履歴を用いる分岐予測 ──ループ回数が少ない場合の予測精度の向上に効果あり
- その他の分岐予測
- 分岐予測ミスからの回復 ──投機実行とレジスタリネーム機構の利用
- リターンアドレススタック ──リターン命令の分岐先のアドレスを予測する
- BTB ──分岐先アドレスを予測する
- プリフェッチ ──先回りしてデータをキャッシュに入れる
- ネクストラインプリフェッチ
- ストライドプリフェッチ
- ストライドプリフェッチは配列アクセスに有効
- ソフトウェアプリフェッチ
- 可変長命令をRISC命令に分解して実行 ──Nx586プロセッサ,μOP,μOPキャッシュ
2.6 プロセッサの性能
- 命令実行に必要なサイクルを数える ──IPS,IPC
- 階層キャッシュの速度を測ってみる
- メモリアクセスサイクルの測定結果
- キャッシュやメモリのアクセスには何サイクル掛かっているのか
- 1次キャッシュからの読み込みのケース
- 1次キャッシュをミスして2次,3次キャッシュから読み込む
- ステップ値が80を超えるとメインメモリへのアクセスが出てくる
- Mode=1とMode=2の違い
- 性能を引き出すプログラミング
- キャッシュを有効に使う
- 構造体の配列
- 配列の構造体
- 構造体の配列か,配列の構造体か
- ソフトウェアプリフェッチを使う
- 演算時間の長い命令は避ける
- 性能を左右する最内ループ
2.7 マルチプロセス化の技術
- メモリ管理機構
- セグメント方式のメモリ管理
- 断片化の問題
- ページ方式のメモリ管理
- ページテーブルを使うメモリ割り当てとプロセスの分離
- ページテーブルをキャッシュするTLB
- TLBミスとメモリアクセス時間,ラージページでTLBミスを低減
- スーパーバイザモードとユーザモードによる分離
- バッファオーバーフロー攻撃
- バッファオーバーフロー攻撃とその対策 ──NXビット,XDビット
- 割り込み
- 例外
- スーパーバイザコール ──ソフトウェア割り込み
- 仮想化技術
- ベアメタル型とホストOS型
- VMM上でのゲストOSの動作
- 「二重のアドレス変換」を行うメモリ管理機構
- 仮想化とWeb,データセンターの世界
2.8 まとめ
- Column デナードスケーリングとは何か? ──性能向上の鍵
第3章 並列処理
3.1 OSによるマルチプロセスの実行
- OSは多くのプロセスを並列に実行する
- OSで複数のプロセッサを使う
3.2 マルチコアプロセッサとマルチプロセッサ
- マルチコアプロセッサ
- マルチコアプロセッサのメモリアクセス
- マルチプロセッサシステム
- マルチスレッドとマルチコア
- Column マルチXX ──プロセス,スレッド,タスク,マルチコア
3.3 排他制御
- 複数プロセッサのメモリアクセスで矛盾が起こる
- アトミックなメモリアクセスとロック
- ロックの問題点 ──ロックの粒度とデッドロック
- トランザクショナルメモリ
- トランザクショナルメモリの実現方法
3.4 巨大プロセスで多数のコアを使う
- プロセスを分割して並列実行する
- スレッド
- pthreadライブラリでスレッドを生成
- OpenMPを使う
- OpenMPを使う上での注意点
3.5 分散メモリシステムと並列処理
- 分散メモリ型クラスタシステム
- 分散メモリ型のマルチプロセッサシステムの実現
- 分散メモリシステムでの並列処理
- 分散メモリを共有メモリに近づける ──ビッグデータ時代の工夫
- ccNUMAシステム ──ハードウェアで共有メモリを作る
- ディレクトリベースのキャッシュコヒーレンシ維持
- 仮想マシンで共有メモリを実現する
3.6 並列処理による性能向上
- 並列化する部分の狙いを定める
- アムダールの法則
- すべてのコアの実行時間を均等に近づける
- OpenMPではスレッド数に注意
3.7 まとめ
- Column GPUを含むシステムの並列化を行うOpenACC
第4章 低消費電力化技術
4.1 CMOSの消費電力
- スイッチに伴う電力消費
- 漏れ電流による電力消費
- 漏れ電流の小さいFinFET
4.2 消費電力を減らす技術 ──プロセッサコア単体での電力削減
- スイッチ1回あたりのエネルギーを減らすDVFS
- ARMのbig.LITTLE
- スイッチ回数を減らすクロックゲート
- 低リーク電流トランジスタで漏れ電流を減らす
- 漏れ電力をさらに減らすパワーゲート
4.3 プロセッサチップの電力制御
- Cステートによる電力制御
- チップ温度の余裕を利用するターボブースト
- プロセッサコア間やコアとGPUの間で電力枠を融通
- パッケージの熱容量を利用して瞬間ダッシュ
- メモリコントローラとPCI Expressリンクなどの電力ステート
4.4 コンピュータとしての低電力化
- 用事をまとめて休み時間を長くする
- 応答時間の余裕を知らせるLTR
- 寝た子を起こさないOBFF
- 割り込みやデータ転送要求のタイミングを遅らせて長い休みを作る
- 消費電力の減少
- 入出力装置のアイドル時の電力を減らす
- SATAストレージのデバイススリープ
- 液晶パネルのセルフリフレッシュ ──自分でリフレッシュ
- プロセッサチップへの電源供給
- ボルテージレギュレータの効率改善
- オンチップレギュレータ
- IVRチップの研究と製品化
4.5 省電力プログラミング
- プログラムを最適化して性能を上げる
- 最も重要なのは処理アルゴリズム
- ビデオのエンコードやデコード
- コンパイラの最適化オプション
- 無駄な動作を省いて効率的に処理を行う
- 無駄な動作を省いたプログラムを作る
- HDDアクセス
- Windows OSのタイマー周期
- 使わないファイルや入出力はクローズする
4.6 まとめ
- Column ENIACとスマートフォン ──2兆倍もの進歩を遂げた演算/W
- Column 目で見る電力制御
第5章 GPU技術
5.1 3Dグラフィックスの基礎
- 張りぼてモデルを作る ──サーフェスモデル
- モデリング変換,視点変換,モデルビュー変換 ──マトリクスを掛けて位置や向きを変えて配置を決める
- シェーディング ──光の反射を計算する
5.2 GPUとその処理
- CPUとGPUの違い
- グラフィックスパイプライン
- バーテックスシェーダ ──頂点の座標変換を行う
- ラスタライザとZバッファ
- 壁紙を貼り付けるテクスチャマッピング
- 各種のピクセルシェーディング
- フォンシェーディング
- ジオメトリシェーダ
- プログラマブルシェーダとユニファイドシェーダ
- SIMD