インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
Restricted Transactional Memory (RTM) は、トランザクション実行用のソフトウェア・インターフェイスを提供します。RTM には、トランザクション実行を開始、コミット、アボートする、3 つの新しい命令 (XBEGIN、XEND、XABORT) が用意されています。
プログラマーは、XBEGIN 命令を使用してトランザクション・コード領域の開始を指定し、XEND 命令を使用してトランザクション・コード領域の終了を指定します。XBEGIN 命令は、RTM 領域がトランザクション実行に成功しなかった場合、相対的なオフセットで指定したフォールバック命令アドレスを処理します。
プロセッサーは、さまざまな理由により RTM トランザクション実行をアボートすることがあります。ハードウェアはトランザクション・アボート条件を自動的に検出して、XBEGIN 命令の開始および (アボートステータスを示すために更新された) EAX レジスターに対応するアーキテクチャー・ステートで、フォールバック命令アドレスから実行を再開します。
プログラマーは、XABORT 命令を使用して、RTM 領域の実行を明示的にアボートすることができます。XABORT 命令には、RTM アボートの後にソフトウェアで利用可能になる、EAX レジスターにロードされる 8 ビットの即時引数を指定します。
RTM 命令とデータメモリーの位置は関連付けられません。ハードウェアは RTM 領域がトランザクションのコミットに成功するかどうか保証しませんが、推奨されるガイドラインに従う多くのトランザクションは、トランザクションのコミットに成功すると予想されます。
プログラマーは、コードの実行が完了することを保証するため、フォールバック・パスに代替コードシーケンスを常に提供しなければなりません。例えば、ロックを取得して指定されたコード領域を非トランザクション実行します。さらに、指定された実装では常にアボートされるトランザクションが将来の実装では正しく終了する可能性もあります。このため、プログラマーは、トランザクション領域と代替コードシーケンスのコードパスが機能的にテストされていることを保証しなければなりません。
プロセッサーは、CPUID.07H.EBX.RTM [bit 11] = 1 の場合に RTM 実行をサポートします。アプリケーションは、RTM 命令 (XBEGIN、XEND、XABORT) を使用する前に、プロセッサーが RTM 命令をサポートしているかどうかを確認する必要があります。RTM 命令をサポートしていないプロセッサーで実行すると、#UD (未定義オペコード) 例外が発生します。
RTM は、EAX レジスターを使用してアボートステータスをソフトウェアに伝えます。RTM アボートの後、EAX レジスターには次の値がセットされます。
EAX レジスターのビット | 意味 |
---|---|
0 | XABORT 命令でアボートした場合にセットされます。 |
1 | セットされている場合、トランザクションは再試行で成功する可能性があります。ビット '0' がセットされると、このビットは常にクリアされます。 |
2 | 別の論理プロセッサーが、アボートされたトランザクションの一部だったメモリーアドレスと競合している場合にセットされます。 |
3 | 内部バッファーがオーバーフローした場合にセットされます。 |
4 | デバッグ・ブレークポイントにヒットした場合にセットされます。 |
5 | 入れ子のトランザクションの実行中にアボートした場合にセットされます。 |
23:6 | 予約済み。 |
31:24 | XABORT 引数 (ビット '0' がセットされている場合のみ有効。その他の場合は予約済み)。 |
RTM の EAX アボートステータスで分かるのは、アボートの原因のみです。アボートまたはコミットした RTM 領域は分かりません。EAX の値は、RTM アボートの後に '0' になることがあります。例えば、RTM 領域の内部で CPUID 命令を使用すると、トランザクションはアボートされますが、EAX ビットをセットする要件は満たされません。この場合、EAX の値は '0' になります。
RTM がコミットに成功すると、RTM 領域のすべてのメモリー操作はアトミックに実行されます。RTM 領域でメモリー操作が行われない場合でも、XBEGIN の後に XEND が続き、コミットに成功した RTM 領域のメモリーの順序設定は、LOCK 付きの命令と同じです。XBEGIN 命令にはフェンス・セマンティクスはありません。ただし、RTM 実行がアボートされると、RTM 内から更新されたメモリーはすべて破棄され、別の論理プロセッサーから見えなくなります。