Haswell のトランザクション同期

同カテゴリーの次の記事

インテル ソフトウェア開発製品:並列化、高速化をしよう!抽選でインテル グッズセットをプレゼント

この記事は、インテル® ソフトウェア・ネットワークに掲載されている「Transactional Synchronization in Haswell」(http://software.intel.com/en-us/blogs/2012/02/07/transactional-synchronization-in-haswell/) の日本語参考訳です。

インテルは、2013 年に製品化予定のマルチコア・プロセッサー「Haswell」 (開発コード名: 「ハズウェル」と読みます) 向けの新しい拡張命令、インテル® Transactional Synchronization Extensions (インテル® TSX) の詳細を発表しました。具体的な仕様は、『Intel® Architecture Instruction Set Extensions Programming Reference (インテル® アーキテクチャー命令セット拡張プログラミング・リファレンス)』(https://software.intel.com/en-us/avx/) に掲載されています。

ここでは、インテル® TSX の概要とその背景について簡単に説明します。詳細は、上記の『プログラミング・リファレンス』の第 8 章を参照してください。これらの新しい同期拡張命令 (インテル® TSX) は、ロックベースの同期メカニズムが要求される共有メモリー型のマルチスレッド・アプリケーションで効果を発揮します。

一言でいえば、インテル® TSX とは、トランザクション同期を行うコード領域を開発者が指定できる命令セットの拡張です。開発者は、これらの拡張命令を使用することで、粗粒度のロックを使用してプログラミングしている場合でも、細粒度のロックを使用した場合と同等のパフォーマンスが得られます。「粗粒度のロックとトランザクション同期」の図が参考になるでしょう。

ロックはハードウェアに近い低水準のプログラミング構造であるため、インテル® TSX に関する説明も同様に低レベルの話になります。インテル® TSX がどのように高水準のプログラミング手法に影響を与えるか、また新しいプログラミング手法を可能にするかについては、ここでは詳しく述べません。最後に少しだけコメントします。

インテル® TSX のメリット

トランザクション同期を行うと、プロセッサーは、スレッドをロックで保護されたクリティカル・セクションによりシリアル化する必要があるかどうかを動的に判断して、必要な場合にのみシリアル化を実行します。これにより、プロセッサーは、不要な同期によってアプリケーションに隠れている並行性 (コンカレンシー) を生かせるようになります。

インテル® TSX の最も低いレベルでは、開発者が指定したコード領域 (トランザクション領域とも呼ばれる) はトランザクション実行されます。トランザクション実行に成功すると、トランザクション領域内で行われたすべてのメモリー操作は、ほかの論理プロセッサーから見たときに瞬時に起こったように見えます。プロセッサーは、コミットに成功した場合のみ、ほかの論理プロセッサーに見える領域内でアーキテクチャーの更新を行います。このプロセスはアトミックコミットとも呼ばれます。

これらの拡張命令を使用することで、粗粒度のロックを使用している場合でも、細粒度のロックを使用した場合と同等のパフォーマンスが得られます。また、不要なシリアル化を避けつつクリティカル・セクションをロックすることもできます。複数のスレッドが同じロックで保護されたクリティカル・セクションを実行した場合でも、互いにデータ競合を引き起こす操作を行わなければ、スレッドはシリアル化することなく同時に実行されます。たとえプログラムが共通のロックでロック取得操作をした場合でも、ロック間のコミュニケーションが不要であれば、プロセッサーはロックを無効にして、ロック間のコミュニケーションを要求することなく、2 つのスレッドのクリティカル・セクションを実行します。

インテル® TSX のインターフェイス

インテル® TSX には 2 つのプログラム・インターフェイスが用意されています。Hardware Lock Elision (HLE) は、従来のプロセッサーと互換性のある命令セット拡張 (XACQUIRE および XRELEASE プリフィックス) で、トランザクション領域を指定するために使用します。この HLE は、従来のロックベースのプログラミング・モデルと互換性があります。HLE のヒントを使用して記述されたプログラムは、従来のプロセッサー (インテル® TSX 未対応) と新しいプロセッサー (インテル® TSX 対応) の両方で実行できます。Restricted Transactional Memory (RTM) は、新しい命令セット・インターフェイス (XBEGIN、XEND、XABORT 命令) で、開発者は、HLE よりも柔軟性の高い手法を使用してトランザクション領域を定義できます。HLE 拡張とは異なり、多くの新しい命令セット拡張と同様に、RTM 命令を RTM 未対応の以前のプロセッサーで実行すると、未定義命令例外 (#UD) が発生します。さらに、開発者は、トランザクション実行が成功しなかった場合の代替コードパスを指定する必要があります。

要約: 「インテル® Transactional Synchronization Extensions (インテル® TSX) には、HLE と RTM の 2 つのインターフェイスが用意されています。Hardware Lock Elision (HLE) は従来のプロセッサーと互換性があります。Restricted Transactional Memory (RTM) は柔軟性の高いインターフェイスですが、開発者は、トランザクション実行が成功しなかった場合の代替コードパスを指定する必要があります。」

仕様では、これらの拡張命令を詳細に説明しています。また、これらの拡張命令を最大限に活用するさまざまなプログラミングに関する考察も含まれています。

インテル® TSX の対象アプリケーション

インテル® TSX は、積極的にデータを共有する、共有メモリー型マルチスレッド・アプリケーションを対象としています。インテル® TSX を使用すると、複雑な細粒度のロックを行うことなく、細粒度のロックと同等のパフォーマンスが得られますが、

データ競合が多い場合、高いスケーラビリティーが実現できるようにアルゴリズムを変更する必要があります。データ競合が非常に多いということは、アルゴリズムが効率的にシリアル化されていることを意味するので、この問題を解決できる特効薬はありません。

トランザクション・プログラミング

インテル® TSX がどのように高水準のプログラミング手法に影響を与えるか、また新しいプログラミング手法を可能にするかについては、ここでは詳しく述べません。インテル® TSX に関連しない、いくつかの実験的なコンパイラー実装は、gcc 4.7 などで利用可能です。インテルでは、言語標準化委員会が、言語レベルでのトランザクション・モデルの追加方法に関する提案を調査することを期待しています (インテルは、C++ でのトランザクション言語構築のドラフト仕様の作成に協力しています)。インテル® TSX を利用すると、インテル® TSX を利用しない場合よりも、さまざまなトランザクション・モデルを効率良く実装できます。将来の使用法を開発および改良するため、使用法とアプリケーションの現実的な例に注目が集まっています。今後に期待しましょう。

インテル® TSX は新しいプログラミング・モデルを効率良く実装することを可能にしますが、実際には新しいプログラミング・モデルは必要なく、新しいプログラミング・モデルを提案することもありません。インテル® TSX は、プロセッサーがサポートするトランザクション実行の拡張命令を提供することで、既存のプログラミング・モデルによる開発を支援し、パフォーマンスを向上します。

まとめ

インテル® TSX とは、開発者がトランザクション実行を行う特定のコード領域を記述することを可能にする命令セットの拡張です。開発者は、これらの拡張命令を使用することで、より少ない労力でより高いパフォーマンスを達成できます。例えば、粗粒度のロックを使用したプログラミングで、細粒度のロックを使用した場合と同等のパフォーマンスが得られます。これは開発者にとって大きなニュースといえるでしょう。

この仕様をぜひ一読してください。そして、今後インテルや他社から提供されるツールに関する情報を見逃さないようにしてください。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事