KNLのメモリシステム

KNLでは、高バンド幅のMCDRAMと呼ぶ3D積層のメモリを8個搭載する。AMDやNVIDIAが使うHBMはDRAMチップだけを4枚積層したメモリである。これに対して、KNLで使用するMCDRAMは4枚のDRAMチップの下にロジックチップを積層した構造になっている。これは富士通のFX100スパコンなどで採用されているMicron製のHMC(Hybrid Memory Cube)と同様にロジックチップを積層するメモリであるが、両者のロジックチップの機能は異なっている。このMCDRAMの容量は2GBで、8個合計で16GBの高バンド幅メモリとなる。なお、HBMは1積層チップあたり128GB/sのバンド幅であるが、Sodani氏はKNLのMCDRAMメモリのバンド幅を400GB/sと述べており、個々のMCDRAMのバンド幅は50~64GB/sとHBMの半分程度となっているのではないかと思われる。

そしてKNLは6チャネルのDDRインタフェースを持っており、最大384GBのDDR DRAMを接続できるようになっている。AMDやNVIDIAのGPUは、DDRメモリをサポートしておらず、大容量のメモリを直結しているというのは、KNLのメモリアーキテクチャの大きな特徴である。

このDDRとMCDRAMという2種類のメモリには、次の3種類の組み合わせ方がある。Flat ModelはDDRとMCDRAMは異なるアドレスに配置するモデルで、アドレスにより、DDRをアクセスするのかMCDRAMをアクセスするのかが決まる。

Cache Modelは、MCDRAMをDDRのキャッシュとして使うモデルである。コアからのアクセスはすべてMCDRAM(のタグ)に行き、キャッシュヒットした場合はMCDRAMをアクセスし、ミスした場合は、DDRをアクセスするという風に使われる。そして、Hybrid Modelでは、MCDRAMを分割して一部はキャッシュとして使い、一部はDDRとは別アドレスのメモリとして使う。この場合、キャッシュとして使うMCDRAMの量として4GBあるいは8GBを選択することができる。

KNLでは3種類のMCDRAMとDDRの使い方がある

CPUのキャッシュの場合は、3次キャッシュにヒットすれば、DRAMをアクセスするよりもアクセス時間がかなり短く、平均的なメモリアクセス時間を短縮して性能を上げることができる。しかし、KNLのMCDRAMのキャッシュにヒットした場合は、DDRを直接アクセスする場合に比べて、必ずしもアクセス時間が短いわけではないという点が注意を必要とする。次の図は概念的なものであるが、必要なバンド幅が小さい場合のメモリ本来のアクセス時間は、MCDRAMよりDDRの方が若干速い。これはDRAMチップ自体はほぼ同じで、MCDRAMではロジックチップを通過する分、遅延時間が増えるからである。

従って、必要なメモリバンド幅が小さい領域ではMCDRAMをアクセスするよりも、独立のDDR領域をアクセスする方が速い。しかし、メモリアクセスの頻度が上がってDDR 6チャネルのバンド幅(90~100GB/s)に近づいてくると、渋滞が発生し、アクセス時間が急速に増加してしまう。一方、MCDRAMのキャッシュを使えば、負荷が低い時のアクセス時間は20ns程度長くなるが、400GB/sというMCDRAMのバンド幅限界に近いところまでアクセス時間に大きな変化はない。つまり、KNLのキャッシュはメモリアクセス時間を短縮するというよりは、メモリバンド幅を増幅する装置として働くことになる。

DDRとMCDRAMメモリのバンド幅に対するアクセスレーテンシ

MCDRAMをキャッシュとして使う場合は、64バイトのキャッシュラインに対して6バイト程度のタグが必要となる。つまり、16GBすべてのMCDRAMをキャッシュとして使う場合は1.5GB程度のタグメモリが必要になる。これはロジックチップに収容するには大きすぎるので、MCDRAMにタグメモリを追加し、ロジックチップにはタグマッチやキャッシュラインの入れ替え、エラー訂正などの機能を持たせているのではないかと推測される。このような構造とすると、3D積層するDRAMも汎用のHBMとは異なるものが必要となるが、Intelの生産量を持ってすれば汎用品と比べてコストの差は許容できる程度であろう。

KNLでは、C言語のmalloc( )でメモリ領域を確保すると、 DDRにメモリ領域が確保される。一方、FlatモデルやHybridモデルではアクセス頻度の高い変数はMCDRMにメモリ領域を確保する方が望ましく、その場合はhbw_malloc( )関数を使って領域を確保する。なお、このコードをXeon CPUで実行する場合は、hbw_malloc( )は単純にmalloc( )と同じというライブラリとしておけば、問題ない。