第4世代Coreプロセッサーとなる「Haswell」では、新規搭載された機能に「Transactional Synchronization Extensions」(TSX)がある。これは以前よりインテルが「トランザクションメモリー」と呼んで、研究成果を発表していた技術だ。IDF 2012で公開された情報を元に、TSXの仕組みについて解説しよう。
マルチコア環境で生じる問題のひとつ
メモリーの書き換え
Haswellで実装されたTSXには、「メモリーロック処理を高速化する機能」と「トランザクション機能を実現する機能」の2つがある。この2つは目的は違うものの、基本的な動作の機構は同じ。複数のスレッドを並行して実行しているときに、メモリーの書き込みにより他のスレッドの処理が無効になったことを検出すると、他のスレッドを最初からやり直しさせる。
マルチコアCPU環境では、複数のスレッドが同時に動作する。このときに、あるスレッドがメモリーを読んで演算を行ない、ふたたび同じメモリーアドレスに書き込みを行なう間に、他のスレッドがそのメモリーを書き換えてしまう可能性がある。これがもし、銀行口座の残高のような重要な情報であったとすると大問題だ。
例えば、ある口座の残高が特定のメモリーアドレスに書き込まれていたとしよう。口座からの引き出しは、以下のような手続きになる。
- ①現在の残高を読む
- ②残高から引き出し額を引き算
- ③残高を書き込む
銀行口座にはATMなどからの引き出し処理のほかに、各種料金の自動引き落としなども発生する。電気料金の自動引き落としの処理をしている間に、ATMからの現金引き出しが発生したとしよう。自動引き落とし処理が②の処理をしているときに、ATMの処理が残高の確認を始める。しかしATMの処理が読む残高は、自動引き落としが行なわれる前の残高だ。このような状態になると、ATMの処理は残高以上の金額を引き出してしまうかもしれない(図1)。
問題は、2つのスレッドの書き込みにあるのではなく、スレッドが計算のために読んだアドレスに対して、他のスレッドが書き込んでしまうことにある。ひとつのスレッドが計算に使ったメモリー内容が変更されることで、計算自体が間違ったものになってしまい、これを書き込むと状態が「矛盾」してしまうことになる。これを「コンフリクト」という。
こうした問題は、マルチスレッド/マルチプロセッサーシステムで発生する問題だが、その対処方法が「メモリーロック」と「トランザクション処理」だ。メモリーロックとは、メモリーに対して他のスレッドからの書き込みを防ぐための「ロック」をかける方法だ(図2)。
