なお、これはアボートするトランザクションとTxIDがマッチしたラインだけに行う必要があるので、TxIDとのマッチングロジックが必要となる。

L1データキャッシュタグがSRAMの場合には全ラインを順次に読み出してマッチを行う必要があり時間が掛って大変であるが、L1データキャッシュは256ラインとか512ラインと数が少ないので、次の図のように、この部分をレジスタと一致回路で作れば1サイクルで処理することができる。

トランザクション終了命令が実行されるまでに干渉が検出されなければ、Write Setを一括してメモリに書き込んでトランザクションをコミットする。

Write Setへの書き込み時点で、他のすべてのキャッシュにWriteback-Invalidateを送り、そのアドレスのキャッシュラインを持っていない状態にしている。

それ以降、Write SetへのReadアクセスもWriteアクセスも検出されなかったということは、Write Setのアドレスのキャッシュラインは他のどのキャッシュにも存在しないという状態が続いているということである。

したがって、L1キャッシュに保持しているWrite SetのキャッシュラインのタグのWrite Setビットをリセットし、他のスレッド/コア/ソケットからのアクセスに対してもヒットするようにしても矛盾は起きない。

この図のようにタグをレジスタで作り一致回路を付けておけば、Read Set、Write Setビットリセットするのは1サイクルで実行できる。

そうすると、L1キャッシュに、どのコアからのスヌープにも応答する普通のModifiedのキャッシュラインが残るので、一瞬で全部のWrite Setの書き込みが行われたのと等価になる。

なお、2番目のスライドにはRead SetはL1キャッシュを追い出されてもWriteアクセスをチェックできると書かれており、Hot Chips 24の発表での質疑では、Read SetのサイズはL2キャッシュの容量で制限されるという趣旨の回答があったので、L2キャッシュのタグにもRead SetのビットとTxIDがあり、Writeback-Invalidateを検出してトランザクションをアボートすることが出来るようになっているのかも知れない。

ということで、概ね、このようなやり方で、実現可能な程度の物量のハードウェアの追加でHTMを実現できそうである。

ただし、これはあくまで筆者の推定であり、IntelのHaswellの実装と一致していることを保証するものではないし、この方式でHTMを設計して動作上の問題や特許権の侵害などの問題が出ても、筆者は一切の責任を負わないことをお断りしておく。



続きを読む