中編はコチラ

HaswellのHTMの構造を推測してみた

Read Set、Write Setはキャッシュライン単位の管理で、L1キャッシュで他のプロセサからのアクセスをチェックすると書かれている。これを実現するためには、L1データキャッシュのタグを拡張する必要がある。それぞれのキャッシュラインのタグにRead SetかWrite Setかの識別ビットを付け、かつ、それがどのトランザクション開始命令に対応するのかが判別できるようにする必要がある。

HaswellのTSXでは、トランザクション領域の中にトランザクション領域を入れ子にすることができるが、ハードウェア的には最も外側の1つのトランザクション領域として扱われるので、1つのL1キャッシュにはたかだか、HyperThreadの2つのトランザクションのRead Set、Write Setしか存在しない。つまり、トランザクションを識別するID(TxID)としては、ハードウェアスレッド番号の0か1という1bitがあればよい。そして、TxIDでインデックスされる2エントリのテーブルにトランザクション開始時のレジスタファイルの状態などのアーキテクチャ状態を記憶しておけば、アボート時にはこれを読み出して、トランザクション開始命令の直前の状態に戻すことができる。

キャッシュラインのタグにRead Set、Write SetビットとトランザクションID(TxID)情報を付加する

そして、トランザクションを実行中のコアからのキャッシュアクセスに対しては、Readアクセスがヒットすれば、タグのRead Setビットをセットし、そのトランザクションのTxIDを記憶する。また、Writeアクセスであれば、まず、他のすべてのキャッシュにWriteback-Invalidate要求を送り、最新のデータを持っているキャッシュからメモリに書き戻し(Writeback)、そのアドレスのデータを持つキャシュには、Invalidにするよう要求(Invalidate)する。これは、通常のストアの場合と同じ処理である。そして、他のプロセサのキャッシュがInvalidateされてそのデータを持っていない状態になると、自分のL1キャッシュにWriteデータを書き込みModified状態にする。このとき、タグのWrite Setビットをセットし、TxIDを記憶する。

Readアクセスの場合、それがWrite Setのラインであれば TxIDもタグマッチングに含め、書き込みを行ったトランザクションだけがキャッシュヒットして、Write Setのデータを読めるようにする。なお、他のコアからのアクセスに対しては、TxIDはマッチしないようにしておく。TxIDがマッチしないアクセスが来た場合は、他のスレッドがWrite Setを読もうとしているので、干渉を起こさないように、実行中のトランザクションをアボートする。

他のソケットのプロセサコアからのスヌープは、L3キャッシュ(Intelの用語はLLC)が、そのチップ内のキャッシュにそのアドレスのキャッシュラインがあるかどうかを判断するので、書き込み権を得るためのWriteback-Invalidateに対して、L3キャッシュのラインのデータ自体はInvalidであるが、チップ内のどのコアにはInvalidでないデータが存在する可能性があり、スヌープを送る必要があるという情報をタグに保持する。マルチコア共通のL3キャッシュは、 HTMサポートとは関係なく、この機能を持っている筈である。

L3キャッシュは、この情報を使って、チップ外からのスヌープをRead Set、Write Setを管理しているコアのL1キャッシュに送る。この要求を受け取ったL1キャッシュはRead Set、Write SetのビットがセットされたラインへのWriteアクセス、あるいは、Write SetのビットがセットされたラインへのReadアクセスが検出されると、そのTxIDのトランザクションをアボートする。

トランザクションをアボートすると、Read Setビットをリセットし、Write SetのビットをリセットしてラインをInvalid状態にする。なお、これはアボートするトランザクションとTxIDがマッチしたラインだけに行う必要があるので、TxIDとのマッチングロジックが必要となる。L1データキャッシュタグがSRAMの場合には全ラインを順次に読み出してマッチを行う必要があり時間が掛って大変であるが、L1データキャッシュは256ラインとか512ラインと数が少ないので、次の図のように、この部分をレジスタと一致回路で作れば1サイクルで処理することができる。

タグの各エントリに一致回路をつけ、終了するトランザクションのRS、WSビットをリセットする。Abortの場合は状態をInvalidにして書き込みを取り消す

トランザクション終了命令が実行されるまでに干渉が検出されなければ、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を設計して動作上の問題や特許権の侵害などの問題が出ても、筆者は一切の責任を負わないことをお断りしておく。

■Intel 次世代プロセッサ「Haswell」関連記事
【レポート】Intelの次世代Core「Haswell」のトランザクションメモリを読み解く(前編) (2012年10月9日)
【レポート】Intelの次世代Core「Haswell」のトランザクションメモリを読み解く(中編) (2012年10月10日)
【レポート】HPC性能が大幅に強化されたHaswell(前編) -各コアに256bit長のFMAを2個装備 (2012年10月3日)
【レポート】HPC性能が大幅に強化されたHaswell(中編) - TLBミスによる性能低下を減少 (2012年10月4日)
【レポート】HPC性能が大幅に強化されたHaswell(後編) - HPCとして通用する性能を実現 (2012年10月5日)
【レポート】IDF 2012 - 次期Intel Core「Haswell」の内部構造を探る - Uncore(GPU/Media Block)編 (2012年9月25日)
【レポート】IDF 2012 - 次期Intel Core「Haswell」の内部構造を探る - マイクロアーキテクチャ編 (2012年9月18日)
【レポート】IDF 2012 - 次期Intel Core「Haswell」の内部構造を探る - 拡張命令(AVX2/TSX)編 (2012年9月18日)
【レポート】トランザクションメモリのサポートが明らかとなったIntelのHaswell (2012年2月16日)