このページの本文へ

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

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

文● 塩田紳二

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

メモリーロックによる制御

 TSXのもうひとつの機能が、メモリーロックに「Lockプリフィックス」を使うプログラムを効率化する「Hardware Lock Elision」(HLE)だ。

 基本的な動作はRTMと同じだが、HLEはLockプリフィックスによるメモリーロックを対象にしている点が違う。原理的には、同じ処理をHLEとRTMのどちらでも記述できるのだが、HLEは従来からのLockプリフィックスを使うプログラムに対して、簡単な変更で導入できるので、プログラムを大幅に書き換える必要がない点が違う。

 x86アーキテクチャーでは、メモリーのロックはLockプリフィックスで行なう。プリフィックスとは命令の「前」に置くことで、後続する命令の動作を変える特殊なx86アーキテクチャーの仕組みである。Lockプリフィックスの場合、メモリーに書き込む特定の命令の前に配置して、後続する命令の実行中にメモリーロックしたり、命令途中での割り込みを禁止する。対象となる命令の動作は、「Read-Modify-Write」と呼ばれるもので、メモリーから値を読み出し(Read)、演算したうえで(Modify)、読み出したメモリーアドレスに値を書き込む(Write)動作だ。

 このロックの動作は、x86 CPUのマイクロアーキテクチャーによって違いがある。ロック機構は、対象となるメモリーアドレスに命令が終了するまで、他のスレッドやCPUからの書き込みが行なわれないことを保証するが、どのように保証するのかは、アーキテクチャーやハードウェア構成によって違いがある。

 例えばP6(Pentium Pro)より前のアーキテクチャーでは、バスロックのみを行なっていたが、P6以後はバスロックだけでなくキャッシュロックも行なえる。バスロックとは、ロック中に他のスレッドからのバスアクセスを止めてしまって、Lockプリフィックスの付いた命令の動作が完了するまで待たせるものだ。

 マルチプロセッサー(マルチコアではなく、複数CPUパッケージの環境)の場合には、「Lock#」信号線を使って、他のCPUからのバスアクセスを禁止する。Lockプリフィックスが付いた命令の実行が終われば、「Lock#」信号はオフになり、他のCPUもバスアクセスを再開できる。

 一方のキャッシュロックは、CPUのキャッシュコヒーレンシ(一貫性、整合性)メカニズムを使うロック機構だ。マルチプロセッサー環境では、それぞれのパッケージやCPUコアにあるキャッシュに矛盾が起きないように、お互いのメモリーアクセスを監視する機能(スヌーピング)がある。キャッシュはメモリーの書き込みに対しても有効(ライトバックキャッシュ)で、メモリーへの書き込みをまとめて行なうために、書き込みデータはキャッシュに保存される。このとき、他のCPUが同じアドレスをキャッシュしていたら、その値を無効にしなければならない。

 こうした機構を使ったロックが、キャッシュロックだ。特定のアドレスをロックしたとき、そこに書き込みが行なわれたのと同様に、他のCPUのキャッシュを無効にして、書き込みが終わるまでそのアドレスへの書き込みを禁止する。

 ちなみにハードウェアによる「Lock」は、Lockプリフィックスの付いた命令だけでなく、特定の命令の実行時に自動的に行なわれる場合もある。例えば、メモリー上に置かれるセグメントディスクリプタ※2を書き換える場合などである。
※2 メモリーセグメントの範囲やアクセス権などを保持しているデータ。CPUがこれを読んで、セグメントの動作を決める。

ミューテックスを使ったメモリーロックの仕組み

 TSXのHLEとは、このLockプリフィックスによるロック動作を省略して、楽観的に実行する。スレッド同士で書き換えの競合が起こらなければロックせずに、複数のスレッドが並行して実行可能になる(つまり処理性能が上がる)。

 アプリケーションによるメモリーのロックは、OSが提供している「ミューテックス」を使っている。例に挙げた銀行口座の引き落としのような処理を「クリティカルセクション」というが、その実行に先立ち「ミューテックスオブジェクト」を作成して、同じ処理を行なうスレッド間で共有しておく。先ほどの引き落とし処理の例なら、自動引き落としを行なうスレッドとATMの処理を行なうスレッドが同じミューテックスを共有する。

 ミューテックスは、同時にひとつのスレッドだけが「所有」できる。スレッドがミューテックスを所有している間は、他のスレッドは所有できない。ミューテックスは値が「0」のときには誰も所有しておらず、誰かが所有すると値が「1」となる。これを利用して、「メモリーアクセスを行なうクリティカルセクションを開始する前に、ミューテックスが取得できるまで待つ」プログラムが作られる。ミューテックスはひとつのスレッドしか所有できないため、クリティカルセクションに入ることができるスレッドも、一度にひとつだけに限定できるわけだ。

 このミューテックス自体の処理に、Lockプリフィックスが使われる。ミューテックスはメモリー上のデータに過ぎないので、これを書き換え可能なスレッドをひとつに限定するために、Lockプリフィックスを使っている。

注目ニュース

ASCII倶楽部

最新記事

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

ピックアップ

ASCII.jp RSS2.0 配信中

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