目次
- 本書について
- 本書の構成
- 基本用語の整理
第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 まとめ
- 本書の結びに