インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

インテル® トランザクショナル・シンクロナイゼーション・エクステンション (インテル® TSX) の概要

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

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

インテル® TSX には、Hardware Lock Elision (HLE) または Restricted Transactional Memory (RTM) のいずれかで指定されたトランザクション領域で、論理プロセッサーがトランザクション実行しているかどうかをソフトウェアで確認できる、XTEST 命令も用意されています。

成功したトランザクション実行ではアトミックなコミットが保証されるため、プロセッサーは明示的な同期を行うことなくコード領域を安全だと推定して実行します。特定の実行で同期が不要だった場合、クロススレッドのシリアル化を行うことなく実行をコミットできます。プロセッサーがアトミックにコミットできない場合、安全だと推定した実行は失敗します。安全だと推定した実行に失敗すると、プロセッサーは実行をロールバックし、プロセスはトランザクション・アボートと見なされます。トランザクションがアボートすると、プロセッサーは領域で実行された更新をすべて破棄し、安全だと推定した実行が行われなかったように見えるようにアーキテクチャー上の状態を復元し、非トランザクションに実行を再開します。

プロセッサーは、さまざまな理由によりトランザクション実行をアボートします。最も多い原因は、トランザクション実行している論理プロセッサーと別のプロセッサー間のアクセス競合によるものです。このようなアクセス競合はトランザクション実行の成功の妨げとなります。トランザクション領域内から読み取られたメモリーアドレスによりトランザクション領域の読み取りセットが構成され、トランザクション領域内に書き込まれたアドレスによりトランザクション領域の書き込みセットが構成されます。インテル® TSX は、キャッシュラインの粒度で読み取りセットと書き込みセットを維持します。別の論理プロセッサーがトランザクション領域の書き込みセットの一部の場所で読み取りを行うか、トランザクション領域の読み取りセットまたは書き込みセットの一部の場所で書き込みを行うと、アクセス競合が発生します。

アクセス競合が発生するということは、そのコード領域をシリアル化する必要があることを意味します。インテル® TSX は、キャッシュラインの粒度でデータ競合を検出するため、同じキャッシュラインに配置された無関係なデータ位置は競合として検出されます。トランザクション・アボートは、トランザクション・リソースの制限により発生することもあります。例えば、領域でアクセスされるデータの量が、実装固有の処理能力を超えた場合です。一部の命令とシステムイベントがトランザクション・アボートを引き起こすこともあります。頻繁なトランザクション・アボートは無駄なサイクルを発生させます。

インテル® TSX には、トランザクション実行用のコード領域を指定する 2 つのソフトウェア・インターフェイスが用意されています。

Hardware Lock Elision (HLE)

Hardware Lock Elision (HLE) は、従来のプロセッサーと互換性のある命令セット拡張 (XACQUIRE および XRELEASE プリフィクス) で、トランザクション領域を指定するために使用します。HLE は、従来の相互排他プログラミング・モデルの後方互換性を保ったまま、従来のハードウェアで HLE 対応のソフトウェアを実行したいが、HLE をサポートするハードウェアでは新しいロック無効化機能を活用したいというプログラマー向けに提供されています。

Hardware Lock Elision (HLE) 組込み関数は、Windows* 向けの C/C++ アプリケーションにのみ適用されます。

Restricted Transactional Memory (RTM)

Restricted Transactional Memory (RTM) は、新しい命令セット・インターフェイス (XBEGINXENDXABORT 命令) で、開発者は、HLE よりも柔軟性の高い手法を使用してトランザクション領域を定義できます。

RTM は、トランザクション実行ハードウェアに柔軟なインターフェイスを使用したいプログラマー向けです。