2017.09.20
NUMA
目次
定義
NUMAは、マルチプロセッサで使用されるメモリ構造の一つであり、この構造では、メモリのアクセス時間がCPUに対するメモリの相対的な位置によって決定されます。つまり、CPUのローカルメモリの場合、メモリアクセス時間が非常に速く、他のCPUのローカルメモリ、または複数のプロセスが共有するメモリである場合のアクセス時間が遅くなる特性を持っています。
基本的な考え方
コンピュータが開発されたばかりの1950〜60年代には、CPUの速度がメインメモリの速度よりも遅かったといいます。それが、1970年代を経てCPU速度が、メモリ速度を追い越すことになりました。その結果、メモリからデータを適時インポートできず、CPUが処理をできずに遅延される現象が発生しました。したがって、1980〜90年代のスーパーコンピュータは、高速でメモリにアクセスすることができる方法に焦点を置いてデザインされたのです。最近のコンピュータは、メインメモリへのアクセス回数を制限し、高い性能を出してきています。これは速度が速いキャッシュメモリを搭載し洗練されたアルゴリズムを使用して、キャッシュミス(cache miss)を避ける方法を意味します。しかし、オペレーティング・システムとオペレーティング・システムで動作するアプリケーションが以前とは比較できないほど大きくなったため、キャッシュを利用して、パフォーマンスを向上させる方法は、限界に近づきました。マルチプロセッサシステムでは、状態がさらに悪くなりました。メインメモリに同時にアクセスすることができないため、同時にアクセスしたいくつかのプロセッサは、メモリを使用できないために遅延される事態が発生しています。
NUMAは、それぞれのプロセッサにメモリを分割して提供することで、複数のプロセッサが同時にメモリにアクセスするときに発生するパフォーマンスの問題を回避しようとしています。広く分布されたデータについては、プロセッサの数、あるいはメモリバンクの数に比例して、単一の共有メモリに格納することにより、速度を高めているのです。
もちろん、すべてのデータが特定の一つのタスク(task)に依存している訳ではありません。つまり複数のプロセッサで同じデータが必要とする状況もあります。このような場合、NUMAは分離されたメモリバンク間でデータを移動するように、追加のハードウェアやソフトウェアを使用します。したがって、他のメモリバンクのデータを使用すると、速度が遅くなります。したがって、NUMAの性能は、完全にそのシステムのタスクの特徴に依存しています。
Cache coherent NUMA(ccNUMA
ほとんどのCPUではメモリ参照のローカル性を活用するために、キャッシュと呼ばれる小型でも高速なメモリを使用します。つまり、よく使われるメモリのデータは、速度が高速なローカルメモリに置き換えて使用するのです。キャッシュを使用すると、キャッシュの一貫性(cache coherence)を維持することが非常に重要となります。つまり、メモリのデータと、各CPUのキャッシュ値の一貫性が保たれてこそ、このシステムを信頼することができるのです。NUMAでも共有メモリのキャッシュの一貫性を維持するためのオーバーヘッドが非常に大きいものとなります。
もちろん、単純なハードウェア設計のために、キャッシュの一貫性を考慮していないNUMAシステムを考えることもできますが、ノイマン型のプログラミングモデルを使うしかない現在のプログラムとしては、プログラミングが非常に複雑になってしまいます。したがって、商用すべてのNUMAシステムは、キャッシュの一貫性を維持するための特別な目的のハードウェアを使用しています。そして、これがccNUMA(cache coherent NUMA)なのです。
キャッシュの一貫性を維持するための方法は、常にキャッシュコントローラ間のプロセッサ通信を介して行われます。これらの理由により、複数のプロセッサが同じメモリ領域を同時に高速でアクセスする場合、NUMAの速度は非常に遅くなります。したがって、これらの種類のメモリアクセスを減らすために、オペレーティングシステムでは、プロセッサとメモリをNUMAらしく割り当てたりNUMA外のスケジューリングやlocking方法を避けるなどの方策がが必要となります。
参考資料
Metalink:DATA NOT READ FROM CACHE ON SECOND EXECUTION ON WIN2003 ON AMD64