summary:
主記憶[DRAM]やキャッシュメモリと比較して,最も低レイテンシかつ高スループットなメモリであり,CPUやGPUの動作において中心的な役割を担う.
レジスタは,プロセッサ内部の制御ユニットや演算ユニットと直結しており,機械語の命令実行時に直接操作される.
CPUのレジスタは少数の高性能な汎用レジスタおよび特殊レジスタで構成される.一般的に,汎用レジスタ[General Purpose Register] は整数演算やアドレス計算に使用され,浮動小数点レジスタ は浮動小数点演算専用に割り当てられる.また,プログラムカウンタ[PC] やスタックポインタ[SP] などの制御用レジスタも存在する.CPUのレジスタ数はアーキテクチャによって異なるが,典型的なx86系プロセッサでは数十個,RISC系[例:ARM, RISC-V]では100個近くのレジスタを備えることもある.
一般的なx86 CPUにおいては,整数演算用の汎用レジスタ[例:RAX, RBX 等]や,浮動小数点演算用のXMM/YMMレジスタなどが存在する.
GPUにおけるレジスタは,大量のスレッドを同時に処理するために,並列処理に最適化された構造を持つ.GPUは,数千ものスレッドを同時に実行するため,レジスタの総量はCPUより圧倒的に多いが,各スレッドが使用できるレジスタ数には制約がある.例えば,NVIDIAのCUDAアーキテクチャでは,各スレッドブロック[Warp]ごとに一定数のレジスタが割り当てられ,リソースの制約を超えるとレジスタスピル[Register Spill] が発生し,処理速度が大幅に低下する.
CPUは逐次処理が基本であり,少数のスレッドで効率的にレジスタを活用する.コンテキストスイッチが発生すると,レジスタの内容をスタックやキャッシュに保存し,他のプロセスがレジスタを使用できるようにする.
また,CPUでは,レジスタが不足すると,L1キャッシュやメインメモリにデータを保存しながら処理を継続する.
一方,GPUは大規模並列処理が前提であり,レジスタがオーバーコミットされるとスレッド数が制限される[レジスタ圧迫によるスレッドのスケジューリング低下].このため,レジスタ使用量を最適化することがGPUプログラミングにおいて重要となる.
GPUでは,レジスタが不足すると,ローカルメモリ[L1キャッシュやGDDR6/HBMといったグローバルメモリ]に退避するが,これにより大幅な性能低下が発生する.特に,レジスタスピル[register spill]が発生すると,グローバルメモリへのアクセスが増加し,スレッドの並列実行効率が低下する.
Mathematics is the language with which God has written the universe.