WEB+DB PRESS plusシリーズコンピュータアーキテクチャ技術入門
――高速化の追求×消費電力の壁
2014年5月1日紙版発売
2014年12月10日電子版発売
Hisa Ando 著
A5判/416ページ
定価3,058円(本体2,780円+税10%)
ISBN 978-4-7741-6426-7
書籍の概要
この本の概要
わずか70年余りで,150億倍もの演算速度向上を遂げたプロセッサ,
40年余りで記憶容量が800万倍に増加したメインメモリ,
55年余りで記憶密度が3億倍に達したストレージ。
そして,省電力化により,演算/W(1ワットあたりの演算能力)に至っては,
約70年で2兆倍もの差がある......。
驚くべき進化を遂げたコンピュータは,
今,どのように成り立っているのでしょうか。
本書では,コンピュータアーキテクチャの今に焦点を当て,
手のひらサイズのスマートフォンから,
巨大なスーパーコンピュータやデータセンターまで幅広く取り上げながら,
プロセッサ,メモリ,I/Oを中心に最新のしくみを徹底解説。
合わせて,現在ホットな消費電力や並列処理,GPUの話題も盛り込み,
各種プログラミングテクニックもカバー。
さまざまなスケールで共通する技術とは何か,
異なる/特長的な技術とは何かを押さえつつ,
コンピュータにおける性能向上の鍵を探っていきます。
未来に向かう,より効率的なソフトウェア開発のために,
長く役立つ技術知識を満載してお届けします。
こんな方におすすめ
- コンピュータ技術の今を知りたいエンジニアの方々
本書に関するお知らせ
本書に関連する記事を公開しております。
この書籍に関連する記事があります!
- 本書について
- コンピュータは,普及が著しいスマートフォンやタブレットに使われており,GoogleやFacebookなどのデータセンターにも大量に使われています。
- その差,“2兆”倍(!?)1Wあたりの演算性能の向上とは?―ENIACとスマートフォン
- 現在あるコンピュータの歴史の幕開けから,70年余り。いまや,コンピュータはいわゆるPC(Personal Computer)に止まりません。
本書のサンプル
本書の一部ページを,PDFで確認することができます。
- サンプルPDFファイル(187KB)
目次
- 本書について
- 本書の構成
- 基本用語の整理
第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 まとめ
- 本書の結びに
この本に関連する書籍
-
RISC-VとChiselで学ぶ はじめてのCPU自作 ――オープンソース命令セットによるカスタムCPU実装への第一歩
本書では,UCバークレーで開発されたオープンソースの命令セット(ISA)「RISC-V」を用いて,CPUの作り方を解説します。コンピュータアーキテクチャ,ハードウェアに関...
-
[増補改訂]GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎]
GPUの基本構造と技術動向に焦点を当てた『GPUを支える技術』の増補改訂版。GPU/AIアクセラレータの劇的進化に合わせて,解説も大幅に増強しました。 3Dグラフィック...
-
動かしてわかる CPUの作り方10講
野村達雄氏(『ポケモンGO』開発者)推薦!! 「簡潔明瞭な文章でソフトウェアからトランジスタまで漏れなく解説。 CPUをゼロから設計してFPGAで実装する, 僕の人生を...
-
GPUを支える技術 ――超並列ハードウェアの快進撃[技術基礎]
GPUの基本構造と技術動向に焦点を当てた解説書。3Dグラフィックス,ゲーム,モバイル,VR/AR,科学技術計算,そして人工知能/ディープラーニングに至るまで,幅広い分野...
-
[増補改訂]関数プログラミング実践入門──簡潔で,正しいコードを書くために
現場の方々に向け,関数プログラミングのエッセンスを厳選解説した入門書。関数型言語Haskellを用い,基本から,Java 8/C/C++/Python/JavaScript/Rubyをはじめ各種命令...
-
オンラインゲームを支える技術 ―壮大なプレイ空間の舞台裏
オンラインゲームをテーマとした技術解説書。 ソフトウェア開発において,オンラインゲーム開発者は卓越した技術力を持つ専門性の高い花形と言われています。そこでは...
-
プロセッサを支える技術 ― 果てしなくスピードを追求する世界
わずか60年余りで,200万倍もの演算性能向上を遂げたプロセッサ。システムの全体性能を左右する小さなチップには,どのような技術が搭載されているのでしょうか。 本書...
-
[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ
サーバを単に増やすだけでは解決しない(?!)。大規模サービスの難所は,サービスの成長に伴い巨大化するデータの処理です。データ量の変化は緩やかには推移せず,突然...