このページの本文へ

前へ 1 2 3 4 次へ

Haswellで導入された新機能「TSX」とは? IDF 2012より

2012年09月18日 22時20分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

 一方でTSXのHLEには、「XAQUIRE」と「XRELEASE」プリフィックスが用意される。どちらも命令の前において、後続する命令の動作を変えるプリフィックスだ。まずXAQUIREプリフィックスをLockプリフィックスの前に置くと、HLE動作の開始がCPUに伝わる。XAQUIREはRTMでのXBEGIN命令と同様に、それ以後の処理をトランザクション処理とするが、XBEGINと違ってアボートルーチンは指定しない。コンフリクトが発生したら、自動的に処理を最初からやり直すだけだ。

 XAQUIRE+Lockプリフィックスがついた命令は、Lock動作を行なわない。後続する命令が書き込むメモリーアドレスは※3、トランザクション処理と同じく、1次キャッシュ内に保存される(図5の①)。
※3 実はミューテックスのデータを保持するアドレス。

図5 HLEによるメモリーロックの仕組み

 しかしそのメモリーアドレス自体は、コンフリクトの原因にはならない。他のスレッドが同じメモリーアドレスに書き込んでも、無視されるだけだ。ミューテックスが「0」(誰も所有していない)だったとして説明しよう。もし「1」だった場合には、「0」になるまで待つプログラムを経由して、開始時点に戻るだけだ。

 ミューテックスが「1」になっているということは、他のスレッドがすでにクリティカルセクションに入っていることを示すので、「0」に戻るまで待たねばならない。HLEを使うものとそうでない処理が混在する可能性があるからだ。クリティカルセクションに入るすべてのプログラムがHLEを使っているとすると、後述するようにここでは「0」だけが読み込まれるはずだ。

 その後の処理はトランザクション処理と同じで、プログラムが読んだメモリーアドレスを他のスレッドが書き込むと、アボートが発生し、自動的にロールバックされる(振り出しに戻る、ようなもの)(図5の②)

 クリティカルセクション内で、コンフリクトが発生しなければ、処理はそのまま終了して、「XRELEASE」プリフィックス(後述)が付いた命令の実行でコミットされて、1次キャッシュに保留されていたデータが書き込まれる(図5の③)。クリティカルセクション内で、コンフリクトが発生した場合には、自動的にクリティカルセクションが再実行される。

 HLEの重要な点は、ミューテックスに使われるメモリーアドレスが1次キャッシュ上のテンポラリデータとなるので、他のスレッドからは書き換えられていないように見える点だ。つまり、他のスレッドもミューテックスを所有でき(1にできる)、それぞれがクリティカルセクションに入れる点だ。

 XAQUIREプリフィックが付くとロック動作を行なわなくなるため、ミューテックスの処理で、他のスレッド(またはCPU)が強制的にバスアクセスを遅延させられることもなく、それぞれがそのまま処理を継続できる。これがHLEつまり「ハードウェアロックの省略」というわけだ。

 最後にミューテックスに「0」を書き戻す処理(MOV X,0命令)には、XRELEASEプリフィックスを付けて実行する。このときにコミットされて1次キャッシュに保存されていた書き込みデータが、メモリーへ書き戻される。しかしXRELEASEプリフィックスの付いた命令では、メモリーアドレス「X」への書き込みを省略する。なぜならこのクリティカルセクション内では、1次に置かれたミューテックスのコピーを使っていたからだ。

 同じクリティカルセクションの処理を並行して実行する場合でも、書き込むメモリーが一致しないので、コンフリクトが発生しない場合もありえる。このような場合には「楽観的な実行」により、処理を繰り返すことなく実行できる。楽観的な実行が可能かどうか、HLEを使うと効率的な実行ができるかどうかは、プログラマーの判断となる。

 ミューテックスの処理では、命令途中での割り込みなどを禁止する「原子性」(Atomic)のある「XCHG」命令(レジスタの値とメモリー上の値を交換する命令)と、Lockプリフィックスを使う。そのためC言語などの高級言語で書かれたOSであっても、この部分は、インラインアセンブラ(Cのプログラムの途中にアセンブラ命令を入れる機能)で作られているため、XAQUIREなどのプリフィクスを挟みやすい。

 ミューテックスの処理は、OS自体や多くのアプリケーション、システムモジュールに影響を与えてしまうため、プログラムの書き換えには慎重さが必要になる。そのため、長年使い続けて実績のある(安定した)プログラムが使われることが多い。HLEはこうしたプログラムを変更することなく、Lockプリフィックスによる他のスレッドへの影響を回避できるため、システムの高速化が容易に行なえるというメリットがある。

 TSXが導入されたからと言って、これによってHaswellが劇的に速くなるということはないが、地道な高速化の一端と言えるだろう。

前へ 1 2 3 4 次へ

カテゴリートップへ

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン