WEB+DB PRESS plus コンピュータアーキテクチャ技術入門 ――高速化の追求×消費電力の壁
- Hisa Ando 著
 - 定価
 - 3,058円(本体2,780円+税10%)
 - 発売日
 - 2014.5.1 2014.12.10
 - 判型
 - A5
 - 頁数
 - 416ページ
 - ISBN
 - 978-4-7741-6426-7 978-4-7741-7014-5
 
概要
わずか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かSIMTか
 - SIMTの実行ユニット ──プレディケード実行
- GPUコアの構造
 - NVIDIAのKepler GPU
 - Kepler GPUのSIMT命令実行 ──ワープスケジューラ、命令ディスパッチユニット
 
 - GPUの描画プログラムOpenGL
 
5.3 GPUの科学技術計算への利用
- なぜ、GPUを科学技術計算に使うのか
 - CUDAによるGPUプログラミング
- CUDAで並列計算を記述する
 - スレッド間のデータの受け渡し
 
 - CPUとGPUは分散メモリ ──異なるメモリ間のデータのコピーが必要
 - 理想的なCPUとGPUの関係
- CPUとGPUの共有メモリを実現するAMDのHSA
 
 
5.4 GPUを使いこなすプログラミング
- 条件分岐は避ける
 - スレッドは無駄なく使う
 - ある程度多くのワープを走らせる
 - ローカルメモリをうまく使う
 - メモリアクセスのパターンに注意する
 - ブロック数にも気をつける
 - 通信と計算をオーバーラップする
 
5.5 まとめ
- Column ゲームとグラフィックス
 
第6章 メモリ技術
6.1 プロセッサのメモリ技術 ──階層的な構造
- 高速小容量から低速大容量への「階層」を構成するメモリ
 - 各種のメモリ素子
- SRAM
 - DRAM
 - 不揮発性メモリ素子 ──NAND Flash、FeRAM、ReRAM、MRAM
 - 不揮発性メモリ素子とプロセッサの消費電力
 
 
6.2 メインメモリ技術
- メモリバンド幅の改善
- 必要なメモリバンド幅は?
 
 - DRAMチップの内部構造
 - DIMM
 - 各種のDRAM規格
- DDR3 ──PCやサーバ、あるいはビデオレコーダなどに広く使われている
 - DDR4
 - GDDR5 ──GPU向けの高いバンド幅を持つメモリ規格
 - DDR3L、LPDDR3 ──低消費電力規格
 - Wide I/OとHybrid Memory Cube ──3次元実装でバンド幅を高めるアプローチ
 
 - メモリコントローラ
 
6.3 DRAMのエラー対策
- エラー訂正コード
 - メモリスクラビング ──エラーの累積を防ぐ
 - データポイゾニング ──無駄なダウンを引き起こさない
 - 固定故障対策
 
6.4 まとめ
- Column DRAMメモリの歴史
 
第7章 ストレージ技術
7.1 コンピュータのストレージ ──不揮発性の記憶
- 磁気記録のメカニズム
- 熱ゆらぎとデータ化け、エラー訂正
 
 - HDD装置
- HDDには振動を与えないように
 
 - 光ディスク
 - 巨大データを保存するテープアーカイブ
 - NAND Flash記憶素子
- NAND Flashトランジスタの構造と動作原理
 - NAND Flashメモリの記憶セルアレイ
 - NAND Flashメモリのページとブロック ──NAND Flashメモリの書き換え回数制限
 - NAND Flashメモリの限界と3D化
 
 - NAND Flashメモリのウェアレベリング、NANDコントローラ
 - SSDとHDDの使い分け
 - ストレージの接続インタフェース
 
7.2 ストレージのエラー訂正
- 交替セクタ、交替ブロック
 - エラー訂正の考え方
 - LDPCの考え方
 - LDPCのデコード
 
7.3 RAID技術
- RAIDの考え方と方式
 - ストライピング/RAID0、RAID01、RAID10 ──ディスク性能を向上させる
 
7.4 まとめ
- Column HDDの進化
 
第8章 周辺技術
8.1 周辺装置インタフェース
- 周辺装置のインタフェースレジスタ
 - インタフェースレジスタを使った入出力制御
 - DMAによるデータ転送 ──大量データの入出力
 - 割り込みを使った周辺装置制御
 - アドレス変換の問題
- スキャッタ・ギャザーDMA
 - 周辺装置側にもアドレス変換機構を設ける方法
 
 - デバイスドライバの役割
 - PCI規格 ──インタフェースレジスタの衝突を解消
 - 周辺装置インタフェースの標準化 ──ATA、プリンタのページ記述言語
 - 高速シリアル伝送 ──差動伝送でクロストーク雑音を抑える
 - Column BIOS ──Basic Input Output System
 - クロック抽出 ──信号とクロックのタイミングのずれの問題を解消
 - PCI Express
 - USB
- USB 3.0
 
 
8.2 各種の周辺装置
- スマートフォンSoCに接続される周辺装置
 - PCに接続される周辺装置
 
8.3 フラットパネルディスプレイとタッチパネル
- 液晶ディスプレイパネルの基本構造
 - アクティブマトリクス液晶パネル
- 漏れ電流が少ないIGZO液晶パネル
 - 液晶コントローラをパネルに集積する
 
 - AMOLEDパネル
 - タッチパネル
 
8.4 まとめ
- Column 周辺装置が主役の時代
 
第9章 データセンターとスーパーコンピュータ
9.1 いまどきのデータセンターの基本
- データセンターの種々の形態 ──パブリックとプライベート
 - Googleなどの巨大データセンター
 - データセンターの計算ノード
 - データセンターのネットワーク
- 高い信頼度を実現するGoogleのMapReduce
 
 
9.2 いまどきのスーパーコンピュータの基本
- スーパーコンピュータの性能をランキングするTop500
- LINPACKによる性能ランキングの問題
 
 - スーパーコンピュータの計算ノード
 - ネットワークの基礎
- ネットワーク直径
 - バイセクションバンド幅
 
 - Top500スーパーコンピュータのネットワーク
- 3次元トーラス+αのトポロジを使うスーパーコンピュータ「京」
 
 - スーパーコンピュータのネットワークはInfiniBandが主流
- ファットツリー接続を使う東工大のスーパーコンピュータTSUBAME 2.0
 
 
9.3 巨大データセンターの電力供給と冷却
- データセンターの電源供給
- 電力供給系のロスの低減
 
 - 巨大データセンターやスーパーコンピュータの冷却
- ホットアイルとコールドアイルの分離
 - 外気を利用した冷却
 - 液冷
 - データセンターとスーパーコンピュータの冷却の違い
 
 
9.4 スーパーコンピュータの故障と対策
- スーパーコンピュータに使用する部品の故障を減らす
 - 故障ノードを交替ノードに置き換える
 - チェックポイントーリスタートの問題
 
9.5 まとめ
- 本書の結びに
 
プロフィール
Hisa Ando
先端プロセッサの開発に40年間従事。シリコンバレーでSPARC64プロセッサの開発に従事。現在は、テクニカルライターとしてプロセッサやスーパーコンピュータ関係の報道や解説を中心に活動しており、『プロセッサを支える技術』(技術評論社、2011)などコンピュータアーキテクチャ関係の3冊の著書がある。また、ブログでプロセッサ関係の話題を紹介している。博士(工学)。