レジスタ

レジスタ

執筆済 コンピュータアーキテクチャ

CPU 内部の最速の記憶場所。

記憶階層での位置#

階層 容量 アクセス
レジスタ 数十個 × 64 bit 1 サイクル未満
L1 キャッシュ 32〜64 KB 約 4 サイクル
L2 数百 KB〜数 MB 約 12 サイクル
L3 数 MB〜数十 MB 約 40 サイクル
主記憶 数 GB〜 200〜300 サイクル

レジスタとメモリでは2 桁以上の差がある。

種類#

種類 用途
汎用レジスタ 演算のオペランド。x86-64 で 16 個、RISC-V で 32 個
プログラムカウンタ 次の命令のアドレス
スタックポインタ スタックの先端
ステータスレジスタ 演算結果のフラグ(ゼロ、桁上げ、符号)
ベクトルレジスタ SIMD 用。128〜512 bit

なぜ数が少ないのか#

  • 命令の中でレジスタ番号を表すビットが要る。 32 個なら 5 bit、これが命令長を圧迫する
  • 物理的に近い場所に置く必要があり、面積の制約がある
  • 関数呼び出しのたびに退避・復帰するコストが増える

レジスタ割り当て#

コンパイラの主要な仕事のひとつ。 プログラム中の無数の変数を、有限個のレジスタに割り当てる。

グラフ彩色問題に帰着でき、一般には NP 困難。 実用的には線形走査法などの近似が使われる。

割り当てきれない変数はメモリに追い出される(スピル)。 これが起きると 2 桁遅くなるため、 性能に敏感なコードではレジスタ数が実質的な制約になる。

参考文献#

  • David A. Patterson, John L. Hennessy. Computer Organization and Design: RISC-V Edition, 2nd ed. Morgan Kaufmann, 2020.
  • Randal E. Bryant, David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 3rd ed. Pearson, 2016. https://csapp.cs.cmu.edu/
  • Gregory J. Chaitin. Register allocation & spilling via graph coloring. SIGPLAN Notices 17(6), 1982. https://doi.org/10.1145/872726.806984
ノート一覧を閉じる