Cortex-A15のキャッシュコヒーレンシについて(2)
キャッシュにはL1キャッシュ、L2キャッシュ、L3キャッシュ…があるわけだけど、それぞれのデータに同じデータが含まれている構造のキャッシュは「inclusionキャッシュ」と呼ばれる。
一方、一部だけ同じデータが含まれている、もしくは含まれていない構造のキャッシュは「Non inclusionキャッシュ」と呼ばれる。
CPU間のキャッシュコヒーレンシを保つためには、他のCPUのキャッシュに、これから変更したいアドレスのデータが含まれているか確認作業が必要となる。これを「スヌープ」という。
inclusionキャッシュでは、L1,L2,L3のコヒーレンシが保たれているため、L3キャッシュのみをチェックすればL1,L2までさかのぼってスヌープしなくてもいい。
Non inclusionキャッシュではL1,L2,L3すべてのキャッシュをチェックする必要がある。
Cortex-A15ではL1キャッシュへのアクセスは全てL2キャッシュに届く。(Cortex-A15L3キャッシュはCPUコア内部にはなくDDR3などに該当する)
これによりL1キャッシュとL2キャッシュの間でやり取りが無くなるので性能が上がる。
Cortex-A15のキャッシュコヒーレンシについて(1)
Cortex-A15には複数のコアでキャッシュを共有するため、ACP(Accelerator Coherency Port)とACE(AXI Coherency Extensions)というのがある。
Cortex-A15にはCPUコアをオプションで4つ(クアッドコア)まで構成することができ、Cortex-A15単体では一体何に使用するポートなのかがわかりにくい。
どのような時に使用するのかというと、このACPやACEを通して他のコアとキャッシュデータを共通で利用したいときに使用する。
ARMが提唱するbig.LITTLEのような、処理能力は高いが消費電力が大きいCortex-A15と、処理能力は劣るが消費電力が小さいCortex-A7を組み合わせた時や、ARMのGPUコア「Mali-T658」とCPUのキャッシュを共有したいときに利用する。
ARMが発表しているCortex-A15の図では「Accelerator Coherence」と書かれている部分がACP,ACEに相当する。
Mali-T658の図ではAMBA4 ACE-Liteインタフェースの部分が相当する。
ACEとAPBを理解するための事前知識
ACEについて説明する前に前置きをいくつか説明しておこう。ACEはAMBA4というバス規格で規定されているプロトコルで、2011/06/10にARMが発表した。「4」という数字からもわかるように、それ以前のバージョンも存在する。AMBA3のAXIや、AMBA2のAHB、APBといったバスがそれにあたる。AMBA3が発表されたのは2003年なので、それほど頻繁に更新されないのがわかる。
あくまでプロトコル仕様であるため、どのように実装するかは決まっていない。CPUとメモリだけ繋ぐのであれば仕様を更新するような必要はそれほどないのだが、複数のCPUと接続したり、CPUとGPUを接続したいといった需要が出てきたために仕様を追加しようといった背景がある。
複数のCPUを繋げたときに問題になるのは、複数のCPUで共通のメモリにアクセスしたときにある。
一つのメモリに対して複数のCPUからアクセスしようと、あるCPUが計算している途中で、他のCPUがデータを書き換えてしまい、結果が期待しているものと異なってしまう危険がある。
そのためにアービタとよばれるもので、メモリへのアクセス経路であるコモンバスを使うのが一つのCPUになるように調整を行う。
これはあくまでキャッシュを持たないCPUの時。CPUがキャシュを持っている場合は話が違ってくる。キャッシュというのはCPUの処理能力を高めるための技術の一つ。CPUの処理能力に比べてメモリへのアクセスというのはすごく遅い。CPUはメモリに対してデータを頂戴とお願いするわけだが、メモリからデータが返ってこない時間ができてしまう。その間CPUは処理の続きができないわけだが、その間には数十の命令が実行できるため、これでは効率が悪い。
そこで考えだされたのがキャッシュ。CPUの近くに一時的なデータを置いておく場所を作っておき、メモリへのアクセスを少なくするために考えだされた。
このメモリへのアクセスをしないことが、複数のCPUを接続したときに話をややこしくしている。
アービタの説明の時に、他のCPUがデータを書き換えてしまうのが問題だと言ったが、メモリのデータは書き換わっていなくても、他のCPUのキャッシュにあるデータが書き換わっていたら元も子もない。
そのため他のCPUが持っているキャッシュに、データが書き換わっていないかを確かめる必要が出てくる。このやり取りをキャッシュコヒーレンシプロトコルという。
キャッシュコヒーレンシプロトコルには以下のような種類がある。
- MSIプロトコル
- MOSIプロトコル
- MESIプロトコル
- MOESIプロトコル
キャッシュはアドレスと制御情報、データを一つのセット(キャッシュラインという)としている。下の図ではMSIの場合を示している。MSIの場合は制御情報はModify、Shared、Invalidとなる。
- Modify・・・・キャッシュラインが書き換えられメモリと一致しない
- Shared・・・・キャッシュラインがメモリと同じ
- Invalid・・・・キャッシュラインにデータが無い状態
MSI、MOSI、MESI、MOESIの違いは制御情報の違いにある。MSIでは制御情報は3つ(Modify,Shared,Invalid)だが、MESIでは4つ(Modify,Exclusive,Shared,Invalid)、MOESIでは5つ(Modified, Owned,Exclusive,Shared,Invalid)となる。
Cortex-A15ではMESIプロトコルとMOESIプロトコルに対応している。