
コンピュータアーキテクチャでは、メモリ階層は応答時間に基づいてコンピュータのストレージを階層化します。応答時間、複雑さ、容量は関連しているため、レベルはパフォーマンスと制御技術によっても区別できます。[ 1 ]メモリ階層は、コンピュータアーキテクチャ設計、アルゴリズム予測、および参照の局所性を含む低レベルのプログラミング構造のパフォーマンスに影響を与えます。
高性能な設計を実現するには、メモリ階層の制約、すなわち各コンポーネントのサイズと機能を考慮する必要があります。各コンポーネントは、メモリ階層(m 1、m 2、...、m n)の一部として見なすことができ、各メンバーm iは通常、階層内の次の上位メンバーm i +1よりも小さく、高速です。上位レベルでの待ち時間を制限するため、下位レベルはバッファを埋めてから転送の有効化を信号することで応答します。
ストレージレベルは大きく4つあります。[ 1 ]
これは一般的なメモリ階層構造の一例です。他にも多くの有用な構造が存在します。例えば、コンピュータアーキテクチャを設計する際には、ページングアルゴリズムを仮想メモリのレベルとして考えることができ、オンラインストレージとオフラインストレージの間にニアラインストレージのレベルを設けることも可能です。

メモリ階層のレベル数と各レベルの性能は、時間の経過とともに向上しています。メモリやストレージコンポーネントの種類も、歴史的に変化してきました。[ 6 ]
一部のCPUには、L3とメモリの間に追加のキャッシュレベルが含まれています。たとえば、Haswellマイクロアーキテクチャには、モバイルユニットに128MBのL4キャッシュが含まれています 。[ 13 ] [ 14 ]
階層の下位レベル(大容量ストレージから下位レベル)は、階層型ストレージとも呼ばれます。オンライン、ニアライン、オフラインストレージの正式な区別は次のとおりです。[ 15 ]
例えば、常時稼働している回転ディスクはオンラインですが、MAID(Massive Array of idle disk)のように回転が停止する回転ディスクはニアラインです。テープライブラリのように自動的にロードできるテープカートリッジなどのリムーバブルメディアはニアラインですが、手動でロードする必要があるカートリッジはオフラインです。
最新のCPUのほとんどは非常に高速であるため、ほとんどのプログラムワークロードでは、メモリアクセスの参照の局所性と、階層の異なるレベル間のキャッシュとメモリ転送の効率がボトルネックとなります。その結果、CPUはメモリI/Oの完了を待ってアイドル状態になる時間が長くなります。これは、メモリオブジェクトが大きいほど小さくて高速なレベルがオーバーフローしやすく、より大きくて低速なレベルを使用する必要が生じるため、スペースコストと呼ばれることもあります。結果としてメモリ使用に生じる負荷は、プレッシャー(レジスタプレッシャー、キャッシュプレッシャー、および(メイン)メモリプレッシャー)として知られています。上位レベルからデータが欠落し、下位レベルからフェッチする必要がある状態を表す用語は、それぞれ、レジスタスピリング(レジスタプレッシャーによる:レジスタからキャッシュ)、キャッシュミス(キャッシュからメインメモリ)、および(ハード)ページフォールト(実際のメインメモリから仮想メモリ、つまりマスストレージ(使用されている実際のマスストレージ技術に関係なく、一般的にディスクと呼ばれる))です。
現代のプログラミング言語は、主にメイン(作業)メモリとマスストレージという2つのレベルのメモリを前提としています。例外は、比較的低レベルのアセンブリ言語と、C言語などの高レベル言語のインラインアセンブラで、「プリフェッチ」命令を使用してキャッシュを事前にロードできます。メモリ階層を最適に活用するには、プログラマ、ハードウェア、コンパイラ(およびオペレーティングシステムによる基盤となるサポート)の連携が必要です。
多くのプログラマーは、メモリレベルが1つしかないと想定しています。これは、アプリケーションがパフォーマンスの限界に達するまでは問題なく機能します。その時点で、プログラマーはキャッシュリソースとうまく連携するようにコードのメモリアクセスパターンを変更する必要があります。局所性とキャッシングの効果を示す典型的な例は、3次元配列の反復順序を変更することです。コンピュータシステム:プログラマーの視点は、システムプログラミングのこの側面を扱った古典的な教科書です。[ 16 ]
メモリ階層化とは、メインメモリをパフォーマンス特性に基づいて複数のレベルに分割し、(ストレージ階層化と同様に)それらの間でメモリの内容を移動させる手法です。「メインメモリ」(物理アドレス空間)に見えるものは、NUMA、CXL接続メモリ(PCIeスロット上)、Optane DCPMM、またはコプロセッサやGPUなどの他の拡張ハードウェア上のメモリなど、異種混在の部品で構成されている可能性があるため、階層化が必要になります。スワッピングも階層化の一種と考えることができます。[ 17 ]
メモリ階層化は、Linux では NUMA の拡張として実装されており、各メモリプロバイダは、そのパフォーマンスを反映した適切な「抽象距離」を持つ CPU レス NUMA ノードを持ちます。ページフォールトによって示される「ホットネス」を使用して NUMA ノード間でメモリを移行する既存のスキームは、Huang Ying によって階層化に適合されています (Al Maruf の TPP スキームは Linux メインラインには含まれていません)。[ 18 ]また、重み付きインターリーブ割り当てポリシーも使用します。[ 19 ]
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)