HaswellのRTM

Haswellでは、RTM(Restricted Transactional Memory)をサポートするため、XBIGIN、XEND、XABORTという3つの命令が新設されている。XBEGIN命令でトランザクションを開始し、XEND命令でトランザクションの終了を示す標準的なやり方で、プログラミングのフレキシビリティーが高く、粗粒度ロックのプログラムを改良するのではなく、新規にプログラムを作成する場合にはこちらが用いられることになる。

XBEGIN命令では、HLEのXAQUIRE付の命令と同様に、アーキテクチャ状態のセーブやRead Set、Write Setの管理を開始する。また、XBEGIN命令はトランザクションが中止された場合に実行を開始する命令アドレスを指定することができる。そして、トランザクションが中止された場合は、中止の原因コードがEAXレジスタに格納されているので、これを使って原因別の対処を行うことができるようになっている。

そして、XEND命令はHLEのXRELEASE付の命令と同様に、トランザクションが干渉なく成功した場合には、アトミックにWrite Setをメモリに書き出す。

また、XABORT命令はソフトウェア的にトランザクションを中止する命令である。干渉が検出されてトランザクションを中止する場合もXABORTで中止する場合もWrite Setのデータは廃棄され、開始時のセーブしたアーキテクチャ状態が復元される。

トランザクションメモリを実現するハードウェア機構

トランザクションメモリをソフトだけで実現するという方法も論文発表されているが、効率的に実行するには、やはり、ハードウェアでのサポートが必要である。今回公表されたIntelのドキュメントはプログラマ向けであり、どのようなハードウェアになっているかは書かれておらず筆者の推測であるが、おおよそ、以下のようになっていると思われる。

トランザクション間の干渉を検出するには、入力であるRead Setと結果を書き出すWrite Setのアドレスに対して、他のプロセサの書き込みアクセスがあったかどうかを検出する必要がある。プロセサコアごとのキャッシュを持っているプロセサでは、これらのRead SetやWrite Setはプログラムの実行に伴ってキャッシュに読み込まれる。

そして、キャッシュの各ラインに、これはRead Setのラインとか、Write Setのラインとかいう印を付けられるように拡張しておく。他のプロセサからの書き込みアクセスのためのインバリデーション要求が印のついたラインに対して行われると、トランザクションへの干渉があることが分かる。

問題はWrite Setの扱いで、書き込みデータを保持するバッファを設けるという方法も考えられるが、筆者は2次キャッシュに書き込んでいるのではないかと推測している。そして、Write Setの印がついたキャッシュラインは、内部のプロセサコアからは見えるが、他のプロセサからは見えないように制御する。

また、Write Setのアドレスの一覧表を持ち、トランザクション終了時点では、Write Setの全ラインに対応する他のプロセサのキャッシュラインをアトミックにインバリデートし、自分のラインの状態をModifiedに変更して他のプロセサから見える状態にするというような構造になっていると思われる。

このようにすれば、Read SetとWrite Setが2次キャッシュに収まれば、ハードウェアによる干渉の検出と、実質的に一括した書き戻しが可能になると考えられる。ただし、Read SetやWrite Setの印のついたラインが、他のデータの格納のためにキャッシュから追い出されてしまうと監視ができなくなりトランザクションを中止せざるを得ない。このため、印のついていないラインを優先して追い出し、印のついたラインはできるだけ追い出さないというようになっているのではないかと思われる。

なお、今回のドキュメントでは、どれだけのデータをRead SetやWrite Setとして持つことが出来るのかは実装依存とのことで、明らかにされていない。