プロセッサを支える技術
Last updated
Was this helpful?
Last updated
Was this helpful?
13.5 時間
を読んだ
プロセッサの動作とプロセッサと周辺の装置がどのように連携して動作しているのか
OS のシステムコールを発行してカーネルが処理をする際に、CPU にどのような命令を実施しているのか、またどのような手順で実施しているのか
特権命令、非特権命令などのプロセッサの命令の概念を理解する
プロセッサ内にメモリコントローラを内包し、I/Oコントローラはバスを経由するなどして周辺デバイスと連携していることがわかった
VMMまわりのプロセッサの動きは面白い。特権命令違反を検知してハードウェアが割り込みして命令を代行するなど
準仮想化のI/Oの仕組みも面白くて、一部のVMMの命令をゲストOSが実行できるようにして操作を変換する
ハードウェアレベルの回路設計などはあまり理解できていない
コンピュータアーキテクチャの基本的な要素の説明
プロセッサ
メモリ
入出力装置
半導体技術の概観
ムーアの法則
デナートスケーリング
コンピュータでデータをどのように表現するのか
文字コード
浮動小数点(IEEE754)
ビッグエイディアンとリトルエンディアン
プロセッサと命令
命令アーキテクチャがプロセッサの仕様
各プロセッサ(x86とARMなど)は互換性がない
機械命令プログラムの作り方
アセンブラ
インタプリタ
JITコンパイル
繰り返し実行されるプログラムは実行中にコンパイルして機械命令に変換
プロセッサを構成する素子の変遷
真空管、トランジスタ、IC、LSI、VLSI
命令アーキテクチャの変遷
プログラム内蔵式コンピュータ、仮想記憶、マルチプロセス、TSS、メモリ管理機構、特権状態、ISA
特権状態ではOSを動作させることができる。ユーザ状態ではメモリ管理機構などを操作する命令は使えない
ISAは後方互換がある命令アーキテクチャ
マイクロアーキテクチャの変遷
単位時間により多くの命令を実行できるようにする改善
パイプライン処理、演算器の高速化、RISCとCISC、スーパースカラ実行、Out-of-Order実行、分岐予測、キャッシュ、マルチコア
その他参考
上巻・中巻もある。システムプログラミングに関する資料は下巻の本資料。
特権レベルの話は p.127 にある
プロセッサの命令の実行
フェッチ:メモリから命令を読み出す
デコード:解釈してどこにあるデータをどのように加工するなどの命令の意味を解釈する
オペランド:デコード後、必要なデータを取り揃える
演算:データに加減算などの指定された加工を行う
ライトバック:結果を命令で指定されたところに格納する
構造的ハザード
同時に複数の命令がメモリやレジスタファイル、演算ユニットなどの1つしかない資源を必要として取り合う問題
ハードウェアレベルで対応する
対応策1:優先する命令に資源を使わせて、他の命令の処理を待たせる(パイプラインバブル、パイプラインストール)
対応策2:資源を追加する
データハザード
直前の命令の結果を次の命令が必要とすることで、パイプライン処理ができなくなること
現在のプロセッサはレジスタをバイパスすることができる
交換法則が成り立つ命令(ADD, XOR, OR)はレジスタへのライトバックをバイパスできる
ハードウェア的なアプローチとしては、パイプラインバブルや無関係な命令を差し込むことで待つ
ソフトウェア的なアプローチもあって、並行に処理できるようにアルゴリズムを書き換える
コンパイラによる最適化のアプローチもあり、ソフトウェアパイプラインのコードを生成するコンパイラが存在する
制御ハザード
条件分岐をする場合に、飛び先のアドレスが確定するまで次の命令のフェッチを始めることができない。パイプラインバブルが発生する
関数のインライン化(ソフトウェア的なアプローチ)
ジャンプを必要とするコールとリターンをなくす
ループアンローリング(ソフトウェア的なアプローチ)
ループの中身を記述することでループする回数を減らす
キャッシュ
データ単位
キャッシュライン
メモリから持ってくるデータの単位(塊)
タグをつけておく。タグにはメモリアドレスや状態ビットが含まれる
キャッシュラインの大きさは32バイト~256バイト程度。タグは32ビット空間の場合32ビット、64ビット空間の場合は64ビット程度。
キャッシュラインが小さすぎるとタグのオーバーヘッドが大きくなり、大きすぎるとキャッシュの大部分のデータが無駄になることが増え、キャッシュが有効活用できなくなる
キャッシュの構成
データアレイ、タグアレイ、キャッシュコントローラ
データ構造
フルアソシエイティブ方式
すべてのキャッシュラインのタグにそれぞれ比較回路を設けて、プロセッサの要求するアドレスとタグの一致を並列にチェックする
比較回路はタグを記憶するメモリよりも大きなチップ面積を必要とし、消費電力も大きいので、大容量のキャッシュを構成するのに向いていない
ダイレクトマップ方式
ラインアドレスとキャッシュラインを1対1に対応させる(ラインアドレスには複数のキャッシュラインの中間ビットが含まれる)
タグの中に、nビットのラインアドレスとライン内のバイトの位置を指定する
スラッシングという問題が起こる
キャッシュラインの奪い合いによる性能の低下
セットアソシエイティブ方式
メモリアドレスに対応するキャッシュラインを複数設ける
メモリアドレスに対応するキャッシュラインが複数存在することで、スラッシングが生じにくくなっている
商用のマイクロプロセッサではほぼセットアソシエイティブ方式が採用されている
キャッシュを多段で構成することでメモリアクセス回数を減らす
RISCとCISC
RISCの場合は命令長が4バイトと決まっているので、命令の開始位置を見つけるのが容易。CISCは命令長が可変長なので、命令をデコードしないと難しく、1サイクルで実施するのが難しい
x86はCISC命令を扱いつつ、内部の命令実行はハードウェアのレベルでRISCに変換して実行することができるようになった
CISCでもRISCと同程度の性能が出せるようになっている
演算器の高速化(TODO)
プロセッサの処理が複雑で時間がかかることの1つが演算回路
整数加算器の高速化
全加算器を考えると、32ビットのオペランドの計算を実施するには31つの全加算器を通過することになる
キャリー入力を高速化
G信号、P信号を用いた高速な加算器がプリフィックスアダー
整数乗算器の高速化
除算高速化のポイント
浮動小数点演算機の仕組みと使い方
スーパースカラ
プロセッサに備わっている並列性を利用して1サイクルで複数の命令を同時に実行する
例えば整数演算命令と浮動小数点演算命令など
命令に必要な資源が競合していないこと、条件分岐命令などのチェックは必要。ハードウェアレベルで制御
Out-of-Order実行
書かれた順(In-Order)に実行すると命令の実行に待ちが発生する
機械命令の順番を変更して、後の命令でも実行可能な命令を先に実行することがOut-of-Order実行
データ依存関係のためにすぐには実行できない命令を後回しにすることができるのでデータハザーの影響を軽減する効果がある
リザベーションステーション
デコードした命令を直接パイプラインに送るのではなく、それぞれの命令種別ごとに設けられたリザベーションステーションに命令を格納
オペランドが揃って命令が実行可能になった命令を順次実行パイプラインに送出して演算を実施させる
逆依存性の問題
ADD命令はLD命令が完了していないと実行することができない。SUBはr5とr4が求まっていれば実行することができる。しかしOut-of-Order実行でADD命令よりも前にSUB命令が実行されてしまうと結果が変わってしまう。逆依存性がある場合は命令の順序を入れ替えると正しい結果が得られなくなってしまう。
リネーム
逆依存性の問題を避けるための方法
プログラムに書かれたレジスタ番号を物理レジスタ番号に対応させ、命令が結果を書き込む論理レジスタには空いている物理レジスタを割り当てる
Out-of-Order実行されても影響がなくなる
レジスタリネームの仕組み
Out-of-Order実行を行うプロセッサは、物理レジスタのプールと論理-物理レジスタの対応テーブルを持つ
命令デコードのときに、空き物理レジスタを割り当てて対応をテーブルに記録する
命令の実行が完了したときに、不要になった物理レジスタを回収して空き物理レジスタプールに戻す
メモリバリア命令
命令以前のメモリアクセス命令が完了しないと、その命令の後のロードストア命令が実行されない仕組み
分岐予測(TODO)
制御ハザードによる損失を低減する仕組み
メモリ、I/Oと入出力インターフェース(TODO)
パフォーマンスカウンタ
プロファイラとパフォーマンスカウンタ
プロファイラは対象となるプログラムを実行させながら、タイマー割り込みなどを用いて定期的にその時点で実行中の命令のアドレスをロギングする
その時点でどの関数を実行中だったかがわかる
パフォーマンスカウンタ
ある関数がなぜ長い実行時間がかかっているか?などに関して詳細なプロセッサ内部の実行状況の情報を与える
カウント値を読めるレジスタの集まり
カウントがenableされている期間にプロセッサが実行した命令数
各レベルのキャッシュのアクセス回数
各キャッシュのミス回数
実行された条件分岐命令数
予測ミスになった条件分岐数
メモリ管理機構
セグメント方式では物理メモリのアドレスがフラグメンテーションをおこし、メモリ使用を効率が悪い
ページ方式を取ることが一般的。x86のプロセッサ的にはセグメント方式もページ方式もどちらも対応している
x86では1ページの大きさは4KB。ページに割り当てる物理アドレスは任意
論理アドレスに対応する物理アドレスの対応表はページテーブルと言われる
TLB(Translation Lookaside Buffer):ページテーブルのキャッシュ
論理アドレスの一部のビットをIndexとして使用。都度ページテーブルを参照する必要がなくなる
ページテーブルには物理アドレスが存在しない論理アドレスを割り当てることができ、仮想的に実メモリよりも大きいメモリ空間を持つことができる
64ビットアドレス空間で1ページが4KBの場合、ページテーブルのサイズが2^55バイトとなるため、多階層のアドレス変換を用いる
ページサイズが小さいとTLBミスが頻発して性能が低下する
1ページの大きさがMBオーダのラージページを使うことができる
TLBは通常のページテーブルのためのTLBとラージページ用のTLBが存在する
割り込み
I/Oコントローラのステータスレジスタの状態を確認することで完了したかどうかがわかる
OSがステータスレジスタの状態をポーリングすることで状態を知る方法
ポーリングではなく、I/Oが完了したタイミングでプロセッサに割り込みすることができる
割り込みはエラー発生時などにも用いることができる。ゼロ除算や許容範囲外のメモリアクセスなど
プロセッサ内部の割り込みのことをトラップという
割り込みの緊急度を加味して、高速に割り込むことができるようにしたものがベクタ割り込み
割り込みレベルを用いる
仮想化
VMM(Hypervisor)によって1つのハードウェアを複数のハードウェアが存在するように見せることが仮想化
VMM上のOSがメモリアクセスする際、仮想物理アドレスから物理アドレスに変換する必要がある
効率よく変換するためのハードウェア機構が追加されている
マルチメディア/暗号など
ハードウェアとして高速に処理するための機構が追加された(詳細は割愛)
IA-32eモード
Compatibilityモード(IA-32e Compatibilityモード)
従来の16ビットや32ビット空間用に作られたバイナリプログラムをそのまま動作させることができる
64ビットモード(IA-32e 64モード)
64ビットアドレス空間を使うアプリケーションが動作する
x86のレジスタセット
汎用レジスタ
整数演算データを保持するレジスタ
SSE(Streaming SIMD Extensions)用のXMMレジスタ
SSE関連のレジスタ
命令ポインタ
次に実行する命令のアドレスを指定するレジスタ。プログラムカウンタとも言う
x86で扱うことができるデータタイプ
8ビットのバイトがデータの単位
リトルエンディアン(下位アドレスから上位アドレスに向けて書き込んでいく)で配置される
2アドレス命令形式
Core i7プロセッサの構成
フロントエンド、実行エンジン、キャッシュ階層から構成される
仮想化のメリット
分割されたハードウェアのイメージを提供する
ゲストOSは仮想マシンのハードウェアを操作する命令を実行するだけ
リソースの稼働率の向上
VMMの実行オーバヘッド
大量のメモリが必要
資源の割り当て管理が必要
メモリの仮想化
ゲストOSが物理アドレスと思っているものは、各ゲストOS個別の仮想物理アドレスでVMMは仮想物理アドレスを物理アドレスに変換する
I/Oの仮想化
VMMは各ゲストOSがハードウェアを操作する命令を発行したときにインターセプトしてVMMがゲストOSの代わりに命令を完了させたかのように振る舞う
ハードウェア操作命令の検出
特権状態とユーザ状態を区別する。VMMが特権状態、ゲストOSはユーザ状態として扱う
ゲストOSが特権命令を実行すると特権違反となりトラップが発生する
そしてVMMの中の例外処理部に命令実行が移る、という方法でゲストOSのハードウェア資源のアクセスを検出する
ハードウェア状態の退避、復元
Intelのプロセッサはハードウェアの状態を退避、復元を一括で行う命令を実装している
二重のアドレス変換
二重のアドレス変換した結果をTLBとして保存しておけばキャッシュヒットする限りは二重の変換は不要
x86ではハードウェアが自動でページテーブルを参照して変換結果をTLBに書き込むハードウェアテーブルウォークという機構がある
Intelの場合はハードウェアのシャドウページテーブルを用いることで二重の変換をキャッシュする
ゲストOSがプログラムを切り換えてページテーブルが変わるたびにシャドウページテーブルを作る必要があり、仮想化の大きなオーバーヘッドとなる
仮想TLB方式
ゲストOSはVMMの介在なしに自分のページテーブルを自由に書き換えることができる
ハードウェアがアドレス変換に使うシャドウページテーブルはVMMが管理
ハードウェア上にシャドウページテーブルとTLBで2つのキャッシュが存在する。VMMのページテーブルも存在する
IntelのEPT(Extended Page Table)というハードウェア機構で二重のページテーブルウォークを自動で実施しTLBに書き込む
ハードウェアがVMMのアドレス変換の役割を担うことで仮想化のオーバーヘッドを軽減している
I/Oの仮想化
エミュレート方式
ゲストOSがI/Oコントローラのレジスタを操作し、ハードウェアアクセを特権違反命令例外として検出して、VMMが矛盾のない操作を実施する方式
デバイスドライバのエミュレートは大変
種類が多く、VMM側がすべてのデバイスドライバをサポートするのは大変
ハードウェアの操作やデータ転送のオーバヘッドが大きいので性能的な限界がある
パススルー方式
ホストOSのI/OコントローラをゲストOSに直接割り当ててしまう方式
それぞれのI/Oコントローラが各ゲストOSに対応するためたくさんの入出力装置が必要になってしまう
ナイーブなパススルーでは、誤った物理アドレスが指定されることで他の仮想マシンへ影響が及ぶ可能性がある
Para Virtualization(準仮想化)方式
ゲストOSがI/Oコントローラのレジスタ操作ではなく、ディスクのデータブロックのR/WやLANのパケット送受のような抽象度の高いI/O要求に変換する方式
ゲストOS側にフロントエンドドライバ(FEドライバ)が必要
VMMでI/O要求を処理する専用のゲストOSを構築。I/O専用ゲストはハイレベル要求をI/Oコントローラなどのレジスタ操作に変換して入出力装置を通信する
マルチスレッドの2つの方式
VMT(垂直マルチスレッド)
複数のスレッドを切り替えて実行する(切り替えにはマイクロ秒などかかる)
キャッシュミスやTLBミス、I/Oアクセスなどでスレッドの実行が止まるタイミングで別の実行可能なスレッドに切り替える
レジスタファイルやプログラムカウンタは各スレッド個別に保有
演算器やキャッシュ、TLBなどは共有
SMT(同時マルチスレッド)
独立に実行できるスレッドの命令を混ぜて実行することでスーパースカラプロセッサを有効活用できる。同時実行しているイメージ
命令のデコードをマルチスレッドでできるようにする必要がある。スレッド番号を見てどのスレッドのレジスタを使うか判断する
命令のフェッチはスレッドごとに交互に行う
マルチスレッドではレジスタはスレッドごとに設けられるが、キャッシュやTLBは共有する
キャッシュの競合によってミス率が増えるとメモリアクセス回数が増え、メモリバンド幅がボトルネックとなり性能が出ないこともある
マルチスレッド化による性能向上は10~30%程度
SMTのほうが追加ハードウェア量は増えるが性能向上が見込める
マルチスレッドの考え方は実行機構の待ちなどによる空きサイクルを減らして有効活用しようという考え方
マルチプロセッサではコアが複数搭載されている。コアには各種ユニット、1次命令キャッシュ、1次データキャッシュ、TLBなどを含む
3次キャッシュやメモリコントローラ、外部インターフェースなどは全コア共通
キャッシュコヒーレンシ制御
プロセッサのキャッシュの整合性
MSIプロトコル
1プロセッサの場合は、キャッシュラインが空かそうでないかを占めるインバリデート状態(空/無効)を持っていればOK
MSIプロトコルではキャッシュラインの内容がメモリと同じかどうかを示す Shared という状態を保持する
Modified
Shared
Invalid
メモリからロードしたデータを書き替える場合は、他のプロセッサのキャッシュに対して インバリデート 要求を送る
同じアドレスのデータを持っている場合は無効にしてください、という要求
スヌープともいう
他のプロセッサからの回答(Invalid=1にした、そのアドレスのデータは持っていない)を確認してキャッシュに書き込みする
ライドバックキャッシュの場合
他のプロセッサがキャッシュを更新した内容がまだメモリに反映されていない場合がある
あるプロセッサがメモリからReadするときに、他のプロセッサに対してそのアドレスのModified状態のキャッシュラインを持っている場合はメモリに書き戻す要求を送る
書き戻しが完了したことを確認して、メモリアクセスする
MESIプロトコル
MSIプロトコルでは書き込みする前にスヌープが必要で時間がかかる
一般に各プロセッサは独立した処理をしていることが多く大部分のスヌープは無駄
無駄を省くためにMESIプロトコルという方法がある
キャッシュラインの状態として Exclusive という状態を追加する
Exclusive状態はそのキャッシュラインのデータはメモリから読み込まれたままで変更されておらず、同じデータは他のプロセッサのキャッシュには入っていない状態
Exclusive状態であれば、インバリデート要求なしにメモリに書き込むことができる
Modified状態の場合も同様に、他のプロセッサには同じデータがないのでインバリデート要求なしに書き込むことができる
MOSIプロトコル、MOESIプロトコル
MOSIプロトコルでは、メモリからReadするためのスヌープを他のプロセッサが受け取ったときに、メモリに書き戻さずに、他のプロセッサのキャッシュから要求元のキャッシュにデータを送る
いずれメモリに書き戻す必要があり、書き戻しの責任をもつのがOwner状態
インクルージョンキャッシュ/ノンインクスージョンキャッシュ
1次、2次、LLCでキャッシュの重複を持つかどうか
インクルージョンキャッシュでは1次、2次キャッシュに格納されているキャッシュラインが必ずLLC(ラストレベルキャッシュ)にも格納されている
プロセッサ間での通信
IntelではQPI(Quick Path Interconnect)というチップ間のP2Pを接続する高速インターコネクトを用いている
マルチプロセッサの性能向上の限界
資源競合
コアで共通して使うリソース(L3キャッシュ、メモリコントローラ、I/Oコントローラなど)がボトル
キャッシュコヒーレンシ
キャッシュラインのフォールスシェアリング
同一アドレスに複数のプロセッサコアが書き込みを行う場合
プロセッサが書き込む際にインバリデート要求が必要で、相互のコア同士でインバリデート要求が発生する
プロセッサ間でキャッシュラインが行き来することになる
同一のキャッシュラインでもアドレスの位置が異なる場合は、同一のキャッシュラインでもデータの共有は発生していない。偽の共有なのでフォールスシェアリング(False Sharing)という
共有メモリシステムと分散メモリシステム
SRAM(Static Random Access Memory)
1ビットの記憶に6個のトランジスタが必要
ビットあたりの単価が高い
静止した状態でも情報を保持することができる
DRAM(Dynamic Random Access Memory)
1ビットの記憶に1個のトランジスタと1個のキャパシタ(コンデンサ、蓄電器)が必要
同じチップ面積でSRAMの8倍程度の情報を記憶できる
キャパシタとトランジスタで作られたスイッチがついた記憶セルがマトリクス状に並んでいる
トランジスタはDRAM記憶セルへのスイッチ
電位を上げるとオンになり、キャパシタをビット線に接続する
キャパシタの電位がビット線の電位になる
DRAMから読み出す場合は0でも1でもないフロート状態にしてワード線をハイにする
DRAM記憶セルのスイッチトランジスタはオフ状態でも漏れ電流が発生するので時間が経つを記憶した情報がわからなくなる
各行を32~64ミリ秒ごとに1回は読み出してキャパシタの電位を元の状態に戻す必要がある。DRAMの リフレッシュ が必要
DDRはDRAMの規格
DDR2,DDR3,DDR4など
主にデータ転送速度の違い
DIMMは8ビット幅のDRAMチップを8個搭載して64ビット幅とし、アドレスやコマンド信号は全チップに同じ信号が伝わるように結線したもの
DIMMはエラー検出のためにDRAMチップが1つ追加されて、合計で9つのチップが搭載されている
プロセッサにあるメモリコントローラは、コマンド線を使ってRASやCAS信号を送ってアドレスを指定する
メモリのシステムのエラー検知
パリティチェック
ECC
エラー訂正符号
ハミングコード
参考
CPUと周辺機器の接続は以下のような構成になっている。
出典:Intel® X99 Chipset Block Diagram
プロセッサチップから直接PCI Express 2.0への接続してI/OできるタイプとIOH(Input/Output Hub)経由でI/Oするタイプがある
PCIバスもPCI Expressもソフトウェアからは同じに見える
PCIバス
アドレスとデータで共用する32本or64本の信号線とバス上の情報がアドレスなのかデータなのか区別するための信号や各種制御信号を持ったコモンバス構造のバス
クロック周波数の向上が難しい
多くの信号線が必要でプリント基板の配線設計が難しい
PCI Express
1ペアの信号線で2.5Gbit/sで信号を送電する「高速シリアル伝送」技術を採用
データにクロックを混ぜ込む方法
受けて側にもデータとクロックを分離する必要はある
最大で16本まで束ねて使用することができる
IO空間を制御するIN、OUT命令をx86プロセッサはサポート
Config_Addressレジスタ
バス番号(Bus#)
デバイス番号(Dev#)
ファンクション番号(Func)
レジスタ番号(Reg#)
デバイス番号ごとに存在するConfig_Dataのアドレスを参照してPCIデバイスごとの情報にアクセスすることができる
BIOSが空間ヘッダを読んで、各デバイスに必要なアドレス空間を確保して、物理メモリ空間にデバイスを制御するレジスタを配置する
設定完了後は各デバイスの制御レジスタがメモリ空間に配置されているので、デバイスドライバが経由でデバイスを動かすことができるようになる
バスブリッジによる接続できるデバイスの拡張
一旦省略
理想的なCMOS回路ではオフ時には電力は消費しないが実際にはわずかに漏れ電流が発生する
消費電力を求める式
C:静電容量(チップ全体の信号線の容量)
V:電源電圧
W:消費電力
f:クロック周波数
α:チップ電帯の信号線がスイッチする比率
漏れ電流がある状態でクロック周波数を上げると、さらに消費電力が増えてしまう
クロック周波数を増やす方針から、複数のマルチプロセッサを作るマルチコアへの方向転換
省電力技術の工夫
DVFS(Dynamic Voltage Frequency Scaling)
OSが仕事量をモニタリングして、仕事量に応じて電源電圧とクロック周波数を変える方法
ターボブースト、ターボコア
マルチコアプロセッサの一部のコアだけしか使用していないときに、使っていないコアの消費電力枠を動作しているコアに割り当てる
動作コアの処理スピードをアップさせる
クロックゲート、キャッシュ機構
使っていないユニットへのクロック入力を止める方法
トランジスタの使用用途は、マルチコア化と周辺機能の取り込み
プロセッサの誤作動は「故障」、「電源ノイズ」、「中性子、α線」
エラーを検知する仕組み(ECC)などをプロセッサに取り込む
用途に応じたプロセッサ設計