現在のIntelのCore iシリーズのプロセサはSandy Bridgeアーキテクチャであるが、その次のIvy Bridgeアーキテクチャのプロセサが、数か月以内に登場すると見られている。Ivy Bridgeでは256bit幅でSIMD演算を行うAVX命令が追加される。このAVX命令などのIntelアーキテクチャを拡張する命令の使い方を記述した"Intel Architecture Instruction Set Extensions Programming Reference"というドキュメントが公開された。

AVX命令は以前にも情報が公開されているのであるが、このドキュメントが注目されるのは、その8章に"Transaction Synchronization Extensions(TSX)"という章が入っている点である。そして、Intelのブログで、このトランザクションメモリ機能はIvy Bridgeの次のHaswellでサポートされることが明らかにされた。

ロックによる排他制御

話がちょっと長くなるが、このTSX拡張命令の意義を理解してもらうためには、マルチプロセサでのロックの必要性から説明する必要がある。

例えば、銀行の預金を引き出す場合は、その口座の残高をデータベースから読み出し、引き出し額を引いてお金を払い出し、更新した残高をデータベースに書き戻す。この一連の動作が途切れなく行われればよいが、図1に示すように、マルチプロセサでの処理の場合は、プロセサAが(1)で残高を読み、引出し額を引くが、その結果を書き戻す前にプロセサBが(2)で同じ口座の残高を読むと、元の残高を読んでしまう。その後、(3)でプロセサAが更新された残高を書くが、それは(4)のプロセサBの更新された残高で上書きされてしまう。その結果、プロセサAの引き出しが残高に反映されないことになってしまう。

図1 同一口座へのアクセスが入り乱れると問題になる

このような問題は2つのプロセサの残高データベースへのアクセスが入り乱れてしまったことから発生しており、これを避けるためには、1つのプロセサがデータベースを読んだら結果を書き戻して使用済みになるまで、他のプロセサはデータベースを使えないように排他制御を行う必要がある。

この場合、データベースの使用許可を制御するロック変数を作る。図2のように、データベースをアクセスする前に、このロック変数を読む。それが"0"の場合は、誰もデータベースを使っていないので、ロック変数を"非0"の値に書き変える。そして、この一連の操作の途中には他のプロセサが割り込まないようにする。そして、データベースの読み書きを行う。そうすると、別のプロセサがロック変数を読むと、"非0"になっているので、再度、ロック変数を読むところでループして待つことになる。

図2 ロック変数を使う排他制御

そして、データベースのアクセスが終わると、ロック変数に"0"を書き込んでやる。そうするとロック変数を読むループを廻っているプロセサは"0"を読むことになり、データベースの使用権を得ることになる。このようにすればデータベースのアクセスの排他制御ができ、前記のような問題は発生しないが、一時には1つのプロセサしかデータベースを使用できないので、マルチプロセサにした意味が薄れてしまう。