従来、コンピュータ・システム又はプロセッサは、シングル・プロセッサ(別名、処理ユニット又は中央処理ユニット)しか有していなかった。プロセッサは、命令処理ユニット(IPU)、分岐ユニット、メモリ制御ユニット等を含んでいた。こうしたプロセッサは、一度に単一のプログラム・スレッドを実行することができた。一定の期間プロセッサ上で実行されるようにプログラムをディスパッチし、次に、別の期間プロセッサ上で実行されるように別のプログラムをディスパッチすることによって、プロセッサを時分割する(time-share)ことが可能なオペレーティング・システムが開発された。技術が発展すると、メモリ・サブシステム・キャッシュ、並びに変換ルックアサイド・バッファ(TLB)を含む複雑な動的アドレス変換が、プロセッサに付加されることが多くなった。IPU自体が、多くの場合、プロセッサと呼ばれた。技術が発展し続けると、プロセッサ全体を単一の半導体チップ又はダイとしてパッケージ化できるようになり、こうしたプロセッサは、マイクロプロセッサと呼ばれた。その後、複数のIPUを組み入れたプロセッサが開発され、こうしたプロセッサは、多くの場合、マルチプロセッサと呼ばれた。マルチプロセッサ・コンピュータ・システム(プロセッサ)のこうしたプロセッサの各々は、個々の又は共有のキャッシュ、メモリ・インターフェース、システム・バス、アドレス変換機構等を含むことができる。仮想マシン及び命令セット・アーキテクチャ(instruction set architecture、ISA)エミュレータは、ソフトウェアの層をプロセッサに付加し、シングル・ハードウェア・プロセッサ内にシングルIPUのタイムスライスを使用することにより、複数の「仮想プロセッサ」(別名、プロセッサ)を有する仮想マシンを提供した。技術がさらに発展すると、マルチスレッド・プロセッサが開発され、シングル・マルチスレッドIPUを有するシングル・ハードウェア・プロセッサが異なるプログラムのスレッドを同時に実行する能力を提供することを可能にし、従って、コンピュータ・システムには、マルチスレッド・プロセッサの各スレッドが1つのプロセッサとして見えるようになった。技術がさらに発展すると、単一の半導体チップ又はダイ上に複数のプロセッサ(各々がIPUを有する)をのせることが可能になった。これらのプロセッサは、プロセッサ・コア、又は単にコアと呼ばれた。従って、例えば、プロセッサ、中央処理ユニット、処理ユニット、マイクロプロセッサ、コア、プロセッサ・コア、プロセッサ・スレッド及びスレッドといった用語は、交換可能に使用されることが多い。本明細書における実施形態の態様は、本明細書での教示から逸脱することなく、上に示されるものを含むいずれかの又は全てのプロセッサによって実施することができる。「スレッド」又は「プロセッサ・スレッド」という用語が本明細書で用いられる場合、実施形態の特定の利点は、プロセッサ・スレッドの実装において有することができたと考えられる。
Intel(登録商標)ベースの実施形態におけるトランザクション実行
その全体を引用により本明細書に組み入れる、非特許文献1において、第8章は、部分的に、マルチスレッド・アプリケーションが、より高い性能を達成するためにCPUコアの数の増大を利用できることを教示する。しかしながら、マルチスレッド・アプリケーションの書き込みでは、プログラマーが、複数のスレッド間のデータ共有を理解し、考慮に入れる必要がある。共有データへのアクセスは、一般的に、同期機構を必要とする。これらの同期機構を用いて、多くの場合、ロックで保護されたクリティカル・セクション(critical section)を用いて、共有データに適用される動作をシリアル化することにより、複数のスレッドが共有データを更新することを保証する。シリアル化により、並行性(concurrency)が制限されるので、プログラマーは、同期に起因するオーバーヘッドを制限しようと試みる。
intel(登録商標) Transactional Synchronization Extensions(Intel(登録商標)TSX)は、プロセッサが、ロックで保護されたクリティカル・セクションによりスレッドをシリアル化する必要があるかどうかを動的に判断し、必要な場合にのみこのシリアル化を行うことを可能にする。これにより、プロセッサは、動的な不要な同期のためにアプリケーション内に隠れている並行性を顕在化させ利用することができる。
Intel(登録商標)TSXでは、プログラマーが指定したコード領域(「トランザクション領域」又は単に「トランザクション」とも呼ばれる)がトランザクション実行される。トランザクション実行が成功裏に完了すると、トランザクション領域内で実施された全てのメモリ操作は、他のプロセッサから見たときに瞬時に起こったように見える。プロセッサは、成功裏にコミットが行われる場合にのみ、即ち、トランザクションが成功裏に実行を完了した場合にのみ、他のプロセッサに見えるトランザクション領域内で実施される、実行されたトランザクションのメモリ操作を行う。このプロセスは、アトミック・コミットと呼ばれることが多い。
Intel(登録商標)TSXは、トランザクション実行のためのコード領域を指定するための、2つのソフトウェア・インターフェースを提供する。Hardware Lock Elision(HLE)は、トランザクション領域を指定するための、従来の(legacy)互換命令セット拡張(compatible instruction setextension)(XACQUIRE及びXRELEASEプリフィックスを含む)である。Restricted Transactional Memory(Restricted Transactional Memory、RTM)は、新しい命令セット・インターフェース(XBEGIN、XEND、及びXABORT命令を含む)であり、プログラマーは、HLEで可能なよりも柔軟性の高い手法でトランザクション領域を定義できる。HLEは、従来の相互排他プログラミング・モデルの後方互換性(backward compatibility)を好み、従来のハードウェア上でHLE対応のソフトウェアを実行したいが、HLEサポートを有するハードウェア上で新しいロック無効化機能を利用したいと望むプログラマー向けのものである。RTMは、トランザクション実行ハードウェアよりも柔軟なインターフェースを好むプログラマー向けのものである。さらに、Intel(登録商標)TSXはまた、XTEST命令も提供する。この命令は、論理プロセッサが、HLE又はRTMのいずれかによって識別されたトランザクション領域においてトランザクション実行しているかどうかを、ソフトウェアが照会することを可能にする。
成功したトランザクション実行はアトミック・コミットを保証するので、プロセッサは、明示的な同期を行うことなく、コード領域を楽観的に実行する。特定の実行で同期が不要であった場合、いかなるクロススレッドのシリアル化も行うことなく、実行をコミットすることができる。プロセッサがアトミックにコミットできない場合、楽観的実行に失敗する。楽観的実行に失敗すると、プロセッサは実行をロールバックし、プロセスはトランザクション・アボートと呼ばれる。トランザクションがアボートすると、プロセッサは、トランザクションが使用するメモリ領域で実行された全ての更新を廃棄し、あたかも楽観的に実行が行われなかったように見えるようにアーキテクチャ上の状態を復元し、非トランザクションに実行を再開する。
プロセッサは、多くの理由によりトランザクションをアボートすることがある。トランザクションをアボートする主たる理由は、トランザクションを実行している論理プロセッサと別の論理プロセッサとの間のメモリ・アクセスの競合によるものである。このようなメモリ・アクセス競合は、トランザクション実行の成功の妨げとなり得る。トランザクション領域内から読み取られたメモリ・アドレスによりトランザクション領域の読み取りセット(read set)が構成され、トランザクション領域内に書き込まれたアドレスによりトランザクション領域の書き込みセット(write set)が構成される。Intel(登録商標)TSXは、キャッシュラインの粒度で読み取りセットと書き込みセットを維持する。別の論理プロセッサがトランザクション領域の書き込みセットの一部の場所で読み取りを行うか又はトランザクション領域の読み取りセット若しくは書き込みセットの一部の場所で書き込みを行う場合、メモリ・アクセス競合が発生する。アクセス競合は、一般的には、そのコード領域に対してシリアル化が必要であることを意味する。Intel(登録商標)TSXは、キャッシュラインの粒度でデータ競合を検出するため、同じキャッシュラインに置かれた無関係なデータ位置は競合として検出され、その結果、トランザクション・アボートがもたらされる。トランザクション・アボートはまた、トランザクション・リソースの制限により発生することもある。例えば、領域内でアクセスされるデータの量が、実装固有の能力を超えた場合である。さらに、一部の命令とシステム・イベントがトランザクション・アボートを引き起こすこともある。頻繁なトランザクション・アボートは無駄なサイクル及び非効率性の増大をもたらす。
Hardware Lock Elision
Hardware Lock Elision(HLE)は、プログラマーがトランザクション実行を使用するための従来の互換命令セット・インターフェースである。HLEは、2つの新しい命令プリフィックス・ヒント、即ちXACQUIRE及びXRELEASEを提供する。
HLEでは、プログラマーは、クリティカル・セクションを保護するロックの取得に使用する命令の前に、XACQUIREプリフィックスを付加する。プロセッサは、ロック取得操作と関連付けられている書き込みを無効化する(elide)ヒントとしてプリフィックスを扱う。ロック取得がロックと関連付けられている書き込み操作を有していても、プロセッサは、トランザクション領域の書き込みセットにロックのアドレスを追加せず、ロックに対するいかなる書き込み要求も発行しない。代わりに、ロックのアドレスが読み取りセットに追加される。論理プロセッサがトランザクション実行に入る。XACQUIREプリフィックス付加された命令の前にロックが利用可能であった場合、命令の後に他の全てのプロセッサはそのロックを利用可能なものとして見なし続ける。トランザクション実行する論理プロセッサは、書き込みセットにロックのアドレスを追加せず、外部に明確な書き込み操作を行わないため、他の論理プロセッサは、データ競合を引き起こすことなくロックを読み取ることができる。これにより、他の論理プロセッサがロックで保護されたクリティカル・セクションに入り、同時実行することが可能になる。プロセッサは、トランザクション実行中に引き起こされるあらゆるデータ競合を自動的に検出し、必要に応じてトランザクション・アボートを実行する。
無効化を行うプロセッサがロックに対するいかなる外部書き込み操作も行わないにもかかわらず、ハードウェアは、ロックに対する操作のプログラム順を保証する。無効化を行うプロセッサ自体がクリティカル・セクションにおいてロックの値を読み取ると、プロセッサがロックを取得したように見える、即ち、読み取りにより、非無効化(non-elide)値が戻される。この挙動は、HLE実行が、HLEプリフィックスなしの実行と機能的に等しくなることを可能にする。
XRELEASEプリフィックスは、クリティカル・セクションを保護するロックの解放(release)に使用される命令の前に追加することができる。ロックの解放には、ロックに対する書き込みが含まれる。この命令により、ロックの値が、同じロックのXACQUIREプリフィックスでロック取得操作の前にロックが有していた値に戻された場合、プロセッサは、ロックの解放に関連付けられている外部書き込み要求を無視し、書き込みセットにロックのアドレスを追加しない。次に、プロセッサは、トランザクション実行をコミットしようとする。
HLEでは、複数のスレッドが同じのロックで保護されたクリティカル・セクションを実行する場合でも、互いのデータに対していかなる競合が発生する操作を行わないのであれば、スレッドをシリアル化することなく同時に実行することができる。ソフトウェアが共通のロックでロック取得操作を使用した場合でも、ハードウェアはこれを認識し、ロックを無効化し、ロックを通じていずれの通信も行うことなく、2つのスレッドでクリティカル・セクションを実行する(こうした通信が動的に不要だった場合)。
プロセッサが領域をトランザクション実行できない場合、プロセッサは、その領域を、非トランザクションに且つ無効化を行わずに実行する。HLE対応のソフトウェアは、基礎をなす非HLEのロック・ベースの実行と同じように前方進行を保証する。HLE実行を成功させるためには、ロック及びクリティカル・セクションコードが特定のガイドラインに従わなければならない。これらのガイドラインは性能にのみ影響し、これらのガイドラインに従わなかった場合でも機能的不具合は生じない。HLEサポートを有していないハードウェアは、XACQUIRE及びXRELEASEプリフィックス・ヒントを無視するが、これらのプリフィックスはXACQUIRE及びXRELEASEが有効な場合に命令で無視されるREPNE/REPE IA−32プリフィックスに対応しているので、いかなる無効化も行わない。重要なことに、HLEは既存のロック・ベースのプログラミング・モデルと互換性がある。ヒントを不適切に使用しても機能的なバグは起こらないが。コードに既に含まれている潜在的なバグが暴露する可能性がある。
Restricted Transactional Memory(RTM)は、トランザクション実行用の柔軟なソフトウェア・インターフェースを提供する。RTMは、プログラマーがトランザクション実行を開始、コミット、アボートする3つの新しい命令(XBEGIN、XEND、及びXABORT)を提供する。
プログラマーは、XBEGIN命令を使用してトランザクション・コード領域の開始を指定し、XEND命令を使用してトランザクション・コード領域の終了を指定する。XBEGIN命令は、RTM領域がトランザクション実行に成功しなかった場合、相対的なオフセットをフォールバック命令アドレスに与えるオペランドを利用する。
プロセッサは、多くの理由によりRTMトランザクション実行をアボートすることがある。ハードウェアは、トランザクション・アボート条件を自動的に検出して、XBEGIN命令の開始、及びアボート・ステータスを説明するために更新されたEAXレジスタに対応するアーキテクチャ状態で、フォールバック命令アドレスから実行を再開する。
XABORT命令は、プログラマーが、RTM領域の実行を明示的にアボートすることを可能にする。XABORT命令には、RTMアボートの後にソフトウェアで利用可能になる、EAXレジスタにロードされる8ビットの即時引数を利用する。RTM命令は、いずれのデータ・メモリ位置とも関連付けられない。ハードウェアは、RTM領域がこれまでトランザクション・コミットに成功したかどうかに関して保証しないが、推奨されるガイドラインに従う大部分のトランザクションは、トランザクション・コミットに成功すると予想される。しかしながら、プログラマーは、前方進行を保証するため、フォールバック経路に代替コード・シーケンスを常に提供しなければならない。これは、ロックを取得して指定されたコード領域を非トランザクションに実行するのと同じくらい簡単であり得る。さらに、所与の実装では常にアボートされるトランザクションが、将来の実装ではトランザクションに完了する可能性がある。従って、プログラマーは、トランザクション領域と代替コード・シーケンスのコード経路が機能的にテストされることを保証しなければならない。
HLEサポートの検出
プロセッサは、CPUID.07H.EBX.HLE[bit4]=1の場合に、HLE実行をサポートする。しかしながら、アプリケーションは、プロセッサがHLEをサポートするかどうかをチェックすることなく、HLEプリフィックス(XACQUIRE及びXRELEASE)を使用することができる。HLEサポートを有していないプロセッサは、これらのプリフィックスを無視し、トランザクション実行に入ることなく、コードを実行する。
RTMサポートの検出
プロセッサは、CPUID.07H.EBX.RTM[bit11]=1の場合に、RTM実行をサポートする。アプリケーションは、RTM命令(XBEGIN、XEND、XABORT)を使用する前に、プロセッサがRTMをサポートしているかどうかをチェックする必要がある。これらの命令は、RTMをサポートしていないプロセッサで使用されると、#UD例外が発生する。
XTEST命令の検出
プロセッサが、HLE又はRTMのいずれかをサポートしている場合、XTEST命令をサポートする。アプリケーションは、XTEST命令を使用する前に、これらの特徴フラグのどちらかをチェックする必要がある。この命令は、HLE又はRTMのいずれもサポートしていないプロセッサで使用されると、#UD例外が発生する。
トランザクション実行状態を照会する
XTEST命令は、HLE又はRTMによって指定されたトランザクション領域のトランザクション状態を判断するために使用することができる。HLEプリフィックスは、HLEをサポートしていないプロセッサ上で無視されるが、XTEST命令は、HLE又はRTMのいずれもサポートしていないプロセッサ上で使用されると、#UD例外が発生することに留意されたい。
HLEロックの要件
HLE実行がトランザクション・コミットに成功するために、ロックが特定の特性を満たし、ロックへのアクセスが次の特定のガイドラインに従っていなければならない。
XRELEASEプリフィックスの付いた(prefixed)命令は、無効化されたロックの値を、ロック取得の前に有していた値に復元する必要がある。これにより、ハードウェアは、書き込みセットに追加することなく、安全にロックを無効化することができる。ロック解放(XRELEASEプリフィックスが付加された)命令のデータ・サイズ及びデータ・アドレスは、ロック取得(XACQUIREプリフィックスの付いた)命令のものと一致していなければならず、ロックはキャッシュライン境界をまたぐことはできない。
ソフトウェアは、XRELEASEプリフィックス命令以外のいかなる命令によってもトランザクションHLE領域内の無効化されたロックに書き込みを行うべきではなく、さもなければ、こうした書き込みがトランザクション・アボートを引き起こすことがある。さらに、再帰ロック(recursive lock)(スレッドが、最初にロックを解放することなく、同じロックを複数回取得する場合)もトランザクション・アボートを引き起こすことがある。ソフトウェアは、クリティカル・セクション内で取得された無効化されたロックの結果を観察できることに留意されたい。こうした読み取り操作は、書き込みの値をロックに戻す。
プロセッサは、これらのガイドラインの違反を自動的に検出し、無効化を行うことなく、安全に非トランザクション実行に遷移する。Intel(登録商標)TSXは、キャッシュラインの粒度で競合を検出するので、無効化されたロックと同じキャッシュライン上に配置されたデータへの書き込みは、同じロックを無効化を行う他の論理プロセッサによってデータ競合として検出される可能性がある。
トランザクション・ネスト
HLE及びRTMの両方とも、ネスト化された(nested)トランザクション領域をサポートする。しかしながら、トランザクション・アボートは、状態を、トランザクション実行を開始した操作に、即ち、最外(outermost)XACQUIREプリフィックスの付いたHLE適格(HLE-eligible)命令、又は最外XBEGIN命令のいずれかに復元する。プロセッサは、全てのネスト化トランザクションを1つのトランザクションとして扱う。
HLEのネスト化及び無効化
プログラマーは、HLE領域を、MAX_HLE_NEST_COUNTの実装指定深さまでネスト化することができる。各論理プロセッサは、ネスト化カウントを内部で追跡するが、このカウントはソフトウェアに利用可能でない。XACQUIREプリフィックスの付いたHLE適格命令はネスト化カウントをインクリメントし、XRELEASEプリフィックスの付いたHLE適格命令はこれをデクリメントする。論理プロセッサは、ネスト化カウントがゼロから1になったとき、トランザクション実行に入る。論理プロセッサは、ネスト化カウントがゼロになったときにのみ、コミットしようと試みる。ネスト化カウントがMAX_HLE_NEST_COUNTを上回った場合には、トランザクション・アボートが発生することがある。
ネスト化されたHLE領域をサポートすることに加えて、プロセッサはまた、複数のネスト化されたロックを無効化することもできる。プロセッサは、無効化に関してロックを追跡し、そのロックに対するXACQUIREプリフィックスの付いたHLE適格命令から開始し、その同じロックに対するXRELEASEプリフィックスの付いたHLE適格命令で終了する。プロセッサは、常に、ロックのMAX_HLE_ELIDED_LOCKS数まで追跡することができる。例えば、実装が2のMAX_HLE_ELIDED_LOCKS値をサポートし、プログラマーが3つのHLE識別クリティカル・セクションをネスト化する場合(ロックのどれに対しても介在するXRELEASEプリフィックスの付いたHLE適格命令を実行することなく、3つの個別ロックに対して介在するXACQUIREプリフィックスの付いたHLE適格命令を実行することによって)、最初の2つのロックは無効化されるが、第3のロックは無効化されない(しかし、トランザクションの書き込みセットに追加される)。しかしながら、実行は依然としてトランザクションに続行する。2つの無効化されたロックの1つに対してXRELEASEに遭遇すると、XACQUIREプリフィックスの付いたHLE適格命令を介して取得された後続のロックが無効化される。
プロセッサは、全ての無効化されたXACQUIRE及びXRELEASEのペアが一致し、ネスト化カウントがゼロになり、ロックが要件を満たした場合に、HLE実行をコミットしようと試みる。実行がアトミックにコミットできない場合、実行は、あたかも最初の命令がXACQUIREプリフィックスを有していなかったかのように、無効化を行わない非トランザクション実行に遷移する。
RTMのネスト化
プログラマーは、RTM領域を、実装指定のMAX_RTM_NEST_COUNTまでネスト化することができる。論理プロセッサは、ネスト化カウントを内部で追跡するが、このカウントはソフトウェアに利用可能でない。XBEGIN命令はネスト化カウントをインクリメントし、XEND命令はネスト化カウントをデクリメントする。論理プロセッサは、ネスト化カウントがゼロになった場合にのみ、コミットを試みる。ネスト化カウントがMAX_RTM_NEST_COUNTを上回った場合には、トランザクション・アボートが発生する。
HLE及びRTMのネスト化
HLE及びRTMは、2つの代替的なソフトウェア・インターフェースを一般的なトランザクション実行機能に提供する。トランザクション処理の挙動は、例えばHLEがRTMの内部にある又はRTMがHLEの内部にあるなど、HLE及びRTMが互いにネスト化された場合、実装固有のものである。しかしながら、全ての場合において、実装は、HLE及びRTMのセマンティクスを維持する。ある実装は、RTM領域内で使用されるとき、HLEヒントを無視するように選択することができ、RTM命令がHLE領域内で使用されるとき、トランザクション・アボートを発生させることがある。後者の場合、プロセッサは実際に無効化を行わずにHLE領域を再実行し、次にRTM命令を実行するので、トランザクション実行から非トランザクション実行への遷移はシームレスに行われる。
アボート・ステータスの定義
RTMは、EAXレジスタを使用して、アボート・ステータスをソフトウェアに伝える。RTMアボートの後、EAXレジスタは、以下の定義を有する。
RTMに関するEAXアボート・ステータスは、アボートの原因のみを提供する。これ自体が、RTM領域に関してアボートが発生したか又はコミットが発生したかをコード化するものではない。EAXの値は、RTMアボートの後に、0になることがある。例えば、RTM領域の内部でCPUID命令を使用すると、トランザクション・アボートを引き起こすが、EAXビットのいずれかを設定する要件を満たさない場合がある。これにより、EAXの値が0になる場合がある。
RTMメモリの順序付け
RTMがコミットに成功すると、RTM領域内の全てのメモリ操作はアトミックに実行されるように見える。RTM領域内でメモリ操作が行われない場合でも、XBEGINの後にXENDが続き、コミットに成功したRTM領域は、LOCKプリフィックス命令と同じ順序付けセマンティクスを有する。
XBEGIN命令には、フェンス・セマンティクスがない。しかしながら、RTM実行がアボートした場合、RTM領域内部から全てのメモリ更新が廃棄され、あらゆる他の論理プロセッサから見えなくなる。
RTM対応デバッガのサポート
デフォルトでは、RTM領域内部のあらゆるデバッグ例外がトランザクション・アボートを引き起こし、アーキテクチャ状態が復旧し、ビット4がEAX内に設定された状態で、制御フローをフォールバック命令アドレスにリダイレクトする。しかしながら、ソフトウェア・デバッガが、デバッグ例外時に実行をインターセプトするのを可能にするために、RTMアーキテクチャは付加的な機能を提供する。
DR7のビット11及びIA32_DEBUGCTL_MSRのビット15が両方とも1である場合、デバッグ例外(#DB)又はブレークポイント例外(#BP)に起因するいずれかのRTMアボートにより、実行がロールバックし、フォールバック・アドレスの代わりにXBEGIN命令から再開する。このシナリオでは、EAXレジスタもまた、XBEGIN命令の時点に復元される。
プログラミング上の考慮事項
一般的に、通常プログラマーが指定した領域は、トランザクション実行及びコミットに成功することが想定される。しかしながら、Intel(登録商標)TSXでは、そうした保証はない。トランザクション実行は、様々な理由によりアボートされることがある。トランザクション機能を最大限に利用するために、プログラマーは、特定のガイドラインに従い、トランザクション実行のコミットが成功する可能性を高める必要がある。
このセクションでは、トランザクション・アボートを引き起こし得る様々なイベントについて論じる。アーキテクチャは、後で実行をアボートするトランザクション内で行われた更新は決して見えるようにならないことを保証する。コミットされたトランザクション実行のみが、アーキテクチャ状態の更新を開始する。トランザクション・アボートは、決して機能的不具合を引き起こすことはなく、性能にのみに影響を与える。
命令ベースの考慮事項
プログラマーは、トランザクション(HLE又はRTM)の内部であらゆる命令を安全に使用することができ、あらゆる特権レベルでトランザクションを使用することができる。しかしながら、一部の命令は常にトランザクション実行をアボートさせ、実行は非トランザクション経路にシームレスかつ安全に遷移される。
Intel(登録商標)TSXでは、殆どの一般的な命令を、アボートを引き起こさずに、トランザクション内部で使用することができる。通常、以下の操作により、トランザクションでアボートが引き起こされることはない。
・命令ポインタ・レジスタ、汎用レジスタ(GPR)及びステータス・ラグ(CF、OF、SF、PF、AF、及びZF)に対する操作、及び、
・XMMレジスタ及びYMMレジスタ、並びにMXCSRレジスタに対する操作。
しかしながら、プログラマーは、トランザクション領域内でSSE操作及びAVX操作を混在させる際に注意深くなければならない。XMMレジスタにアクセスするSSE命令と、YMMレジスタにアクセスするAVX命令との混在により、トランザクションがアボートする可能性がある。プログラマーは、トランザクション内でREP/REPNEプリフィックスの付いた文字列操作を使用することができる。しかしながら、長い文字列はアボートを引き起こすことがある。さらに、CLD及びSTD命令の使用は、これらがDFフラグの値を変えた場合に、アボートを引き起こすことがある。しかしながら、DFが1である場合、STD命令はアボートを引き起こさない。同様に、DFが0である場合、CLD命令はアボートを引き起こさない。
トランザクション内部で使用されたときにアボートを引き起こすものとしてここで列挙されていない命令によりトランザクションがアボートされることは通常ない(例として、これらに限定されるものではないが、MFENCE、LFENCE、SFENCE、RDTSC、RDTSCP等が挙げられる)。
以下の命令は、あらゆる実装でトランザクション実行をアボートする。
・XABORT
・CPUID
・PAUSE
さらに、一部の実装では、以下の命令は常にトランザクション・アボートを引き起こし得る。これらの命令は通常、トランザクション領域の内部で使用されることは想定されていない。しかしながら、これらの命令がトランザクション・アボートを引き起こすかどうかは実装に依存するため、プログラマーは、これらの命令に依存してトランザクション・アボートを強制すべきではない。
・X87及びMMX(商標)のアーキテクチャ状態に対する操作。これには、FXRSTOR及びFXSAVE命令を含む、全てのMMX及びX87命令が含まれる。
・EFLAGの非ステータス部分の更新:CLI、STI、POPFD、POPFQ、CLTS。
・セグメント・レジスタ、デバッグ・レジスタ、及び/又は制御レジスタを更新する命令:DS/ES/FS/GS/SSに対するMOV、POP DS/ES/FS/GS/SS、LDS、LES、LFS、LGS、LSS、SWAPGS、WRFSBASE、WRGSBASE、LGDT、SGDT、LIDT、SIDT、LLDT、SLDT、LTR、STR、Far CALL、Far JMP、Far RET、IRET、DRxに対するMOV、CR0/CR2/CR3/CR4/CR8に対するMOV、及びLMSW。
・リング遷移:SYSENTER、SYSCALL、SYSEXIT、及びSYSRET。
・TLB及びキャッシュ可能な制御:CLFLUSH、INVD、WBINVD、INVLPG、INVPCID、及び非一時的ヒントを有するメモリ命令(MOVNTDQA、MOVNTDQ、MOVNTI、MOVNTPD、MOVNTPS、及びMOVNTQ)。
・プロセッサ状態の保存:XSAVE、XSAVEOPT、及びXRSTOR。
・割り込み:INTn、INTO。
・IO:IN、INS、REP INS、OUT、OUTS、REP OUTS、及びその変形。
・VMX:VMPTRLD、VMPTRST、VMCLEAR、VMREAD、VMWRITE、VMCALL、VMLAUNCH、VMRESUME、VMXOFF、VMXON、INVEPT、及びINVVPID。
・SMX:GETSEC。
・UD2、RSM、RDMSR、WRMSR、HLT、MONITOR、MWAIT、XSETBV、VZEROUPPER、MASKMOVQ、及びV/MASKMOVDQU。
ランタイムの考慮事項
命令ベースの考慮事項に加えて、ランタイム・イベントによりトランザクション実行がアボートされる場合がある。これは、データ・アクセス・パターン又はマイクロ・アーキテクチャの実装機能に起因し得る。以下のリストは、全てのアボートの原因を包括的に説明したものではない。
ソフトウェアに対して暴露しなければならないトランザクションのフォルト又はトラップは抑止される。トランザクション実行がアボートすると、フォルト又はトラップが発生しなかったように、実行は非トランザクション実行に遷移する。例外がマスクされない場合、そのマスクされない例外はトランザクション・アボートを引き起こし、状態は、例外が発生しなかったように見える。
トランザクション実行中に同期例外イベント(#DE、#OF、#NP、#SS、#GP、#BR、#UD、#AC、#XF、#PF、#NM、#TS、#MF、#DB、#BP/INT3)が発生すると、トランザクション実行はコミットされず、非トランザクション実行が必要となる場合がある。これらのイベントは、発生しなかったかのように抑止される。HLEでは、非トランザクション・コード経路はトランザクション・コード経路と同一であるため、例外を引き起こした命令が非トランザクションに再実行されると、これらのイベントは再度現れ、非トランザクション実行で関連する同期イベントが適切に配信される。トランザクション実行中に非同期イベント(NMI、SMI、INTR、IPI、PMI等)が発生すると、トランザクション実行はアボートされ、非トランザクション実行に遷移し得る。非同期イベントは保留され、トランザクション・アボートが処理された後に処理される。
トランザクションは、ライトバック・キャッシュが可能なメモリ・タイプの操作のみをサポートする。トランザクションがいずれかの他のメモリ・タイプの操作を含む場合、トランザクションは常にアボートし得る。これには、UCメモリ・タイプにフェッチする命令が含まれる。
トランザクション領域内のメモリ・アクセスには、プロセッサが参照するページ・テーブル・エントリのアクセス(Accessed)フラグ及びダーティ(Dirty)フラグを設定しなければならないことがある。プロセッサがこの制御をどのように行うかの挙動は、実装固有である。一部の実装では、トランザクション領域が続いてアボートされた場合でも、これらのフラグに対する更新を外部から見えるようにすることが可能である。一部のIntel(登録商標)TSXの実装では、これらのフラグを更新する必要がある場合、トランザクション実行のアボートを選択することがある。さらに、プロセッサのページ・テーブル・ウォークが、それ自体に書き込まれるが、コミットされていない状態へのアクセスをもたらす場合がある。一部のIntel(登録商標)TSXの実装では、このような状況でトランザクション領域の実行のアボートを選択することがある。それにも関わらず、アーキテクチャは、トランザクション領域がアボートした場合、トランザクションに書き込まれた状態が、アーキテクチャ上、TLBのような構造の挙動により目に入らないようにすることを保証する。
自己修正(self-modifying)コードのトランザクション実行がトランザクション・アボートを引き起こすこともある。プログラマーは、HLE及びRTMを使用する場合でも、自己修正コード及びクロス修正コードの記述に際してIntel(登録商標)が推奨するガイドラインに引き続き従う必要がある。RTM及びHLEの実装では通常、共通のトランザクション領域を実行するための十分なリソースが提供されるが、トランザクション領域の実装を制約したり、サイズを必要以上に大きくすると、トランザクション実行がアボートされ、非トランザクション実行に遷移することがある。アーキテクチャは、トランザクション実行で利用可能なリソース量を保証せず、また、トランザクション実行が常に成功することを保証しない。
トランザクション領域内にアクセスするキャッシュラインに対して競合する要求を行うと、トランザクション実行の成功の妨げとなることがある。例えば、論理プロセッサP0がトランザクション領域内のラインAを読み取り、別の論理プロセッサP1がラインA(トランザクション領域の内部又は外部のいずれか)に書き込み、論理プロセッサP1の書き込みがプロセッサP0のトランザクション実行能力を妨げる場合には、論理プロセッサP0はアボートし得る。
同様に、P0がトランザクション領域内のラインAに書き込み、P1がラインA(トランザクション領域の内部又は外部のいずれか)を読み取る又は書き込む場合にも、P1のラインAへのアクセスがP0のトランザクション実行能力を妨げる場合には、P0はアボートし得る。さらに、他のコヒーレンス・トラフィックが競合する要求として見え、アボートを引き起こすことがある。これら偽の競合(false conflict)が発生することはあるが、一般的ではないと考えられる。上記のシナリオにおいて、P0がアボートするか又はP1がアボートするかを決定するための競合解消ポリシーは、実装固有である。
一般的なトランザクション実行の実施形態:
その全体を引用によりここに組み入れる非特許文献2によれば、基本的に、アトミックな及び分離された(isolated)トランザクション領域を実装するのに必要な3つの機構:即ち、バージョニング(versioning)、競合検出、及びコンテンション管理(contentionmanagement)が存在する。
トランザクション・コード領域がアトミックに見えるようにするために、そのトランザクション・コード領域により行われた全ての修正を、コミット時まで格納し、他のトランザクションから分離する必要がある。本システムは、バージョニング・ポリシーの実装によってこれを行う。2つのバージョニング・パラダイム:即ち、eager及びlazyが存在する。eagerバージョニング・システムは、新しく生成されたトランザクション値をイン・プレースに(in place)格納し、以前のメモリ値は、undo(取り消し)ログと呼ばれるものの中に別に格納する。lazyバージョニング・システムは、新しい値を、書き込みバッファと呼ばれるものの中に一時的に格納し、コミット時にのみこれらをメモリにコピーする。どちらのシステムにおいても、新しいバージョンの格納の最適化のために、キャッシュが使用される。
トランザクションがアトミックに実行されるように見えることを保証するために、競合を検出し、解決する必要がある。2つのシステム、即ちeager及びlazyバージョニング・システムは、楽観的(optimistic)又は悲観的(pessimistic)のいずれかの競合検出ポリシーを実装することにより、競合を検出する。楽観的システムは、トランザクションを並行して実行し、トランザクションのコミット時にのみ競合をチェックする。悲観的システムは、ロード及びストアごとに競合をチェックする。バージョニングと同様に、競合検出もまたキャッシュを使用し、各ラインを読み取りセットの一部、書き込みセットの一部、又はその両方としてマーク付けする。2つのシステムは、コンテンション管理ポリシーを実装することにより、競合を解決する。多数のコンテンション管理ポリシーが存在し、一部は楽観的競合検出により適し、一部は悲観的競合検出により適している。幾つかの例示的なポリシーを以下に説明する。
各トランザクション・メモリ(TM)システムは、バージョニング検出と競合検出の両方を必要とするので、これらの選択肢は4つの個別のTM設計:Eager−悲観的(Pessimistic)(EP)、Eager−楽観的(Optimistic)(EO)、Lazy−悲観的(LP)、及びLazy−楽観的(LO)を生み出す。表2は、4つの個別のTM設計の全てを簡単に説明する。
図1及び図2は、マルチコアTM環境の一例を示す。図1は、相互接続制御120a、120bの管理下で、相互接続122と接続された、1つのダイ100上の多数のTM対応CPU(CPU1 114a、CPU2 114b等)を示す。各々のCPU114a、114b(プロセッサとしても知られる)は、実行されるメモリからの命令をキャッシュするための命令キャッシュ116a、116bと、CPU114a、114bによって動作されるメモリ位置のデータ(オペランド)をキャッシュするためのTMをサポートするデータ・キャッシュ118a、118bとから成る分割キャッシュ(split cache)を有することができる。1つの実装において、複数のダイ100のキャッシュが相互接続され、複数のダイ100のキャッシュ間のキャッシュ・コヒーレンシをサポートする。1つの実装においては、分割キャッシュではなく単一のキャッシュが使用され、命令及びデータの両方を保持する。1つの実装においては、CPUキャッシュは、階層キャッシュ構造におけるキャッシュ・レベル1である。例えば、各ダイ100は、共有キャッシュ124を、ダイ100上の全てのCPU114a、114bの間で共有されるように使用することができる。別の実装においては、各ダイ100は、全てのダイ100の全てのプロセッサの間で共有される共有キャッシュ124へのアクセスを有することができる。
図2は、TMをサポートするための追加物を含む、例示的なトランザクションCPU114の詳細を示す。トランザクションCPU114(プロセッサ)は、レジスタ・チェックポイント126及び特殊TMレジスタ128をサポートするためのハードウェアを含むことができる。トランザクションCPUキャッシュは、従来のキャッシュのMESIビット130、タグ140及びデータ142を含むことができるが、同様に、例えば、トランザクション実行中にCPU114によりラインが読み取られたことを示すRビット132と、トランザクション実行中にCPU114によりラインに書き込まれたことを示すWビット138とを含むことができる。
いずれのTMシステムにおいても、プログラマーにとって重要な詳細は、非トランザクション・アクセスがどのようにトランザクションと対話するかである。意図的に、トランザクション・アクセスは、上記の機構を用いて互いから遮蔽される。しかしながら、通常の非トランザクション・ロードと、そのアドレスについての新しい値を含むトランザクションとの間の対話を依然として考慮する必要がある。さらに、非トランザクション・ストアとそのアドレスを読み取ったトランザクションとの間の対話も検討する必要がある。これらは、データベースの概念分離の問題である。
あらゆる非トランザクション・ロード及びストアがアトミック・トランザクションのように動作する場合、TMシステムは、強い分離性(strong isolation)(強いアトミック性(strong atomicity)と呼ばれることもある)を実装すると言われる。従って、非トランザクション・ロードは、コミットされないデータを見ることができず、非トランザクション・ストアは、そのアドレスを読み取ったいずれのトランザクションにおいても、アトミック性違反を引き起こす。これが当てはまらないシステムは、弱いアトミック性(weak atomicity)と呼ばれることもある、弱い分離性(weakisolation)を実装すると言われる。
強い分離性の概念化及び実装が相対的に容易であるため、強い分離性は、弱い分離性よりも望ましいことが多い。さらに、プログラマーが何らかの共有メモリ参照をトランザクションで囲うことを忘れた場合、バグが生じ、強い分離性では、プログラマーはアトミック性違反を引き起こす非トランザクション領域を見るので、プログラマーは、単一のデバッグ・インターフェースを用いて見落としを検出することが多い。また、1つのモデルにおいて書かれたプログラムは、別のモデル上では異なるように動作する場合がある。
さらに、強い分離性は、弱い分離性よりもハードウェアTMにおいてサポートが容易であることが多い。強い分離性では、コヒーレンス・プロトコルが既にプロセッサ間のロード及びストア通信を管理しているので、トランザクションは、非トランザクション・ロード及びストアを検出し、適切に動作することができる。ソフトウェア・トランザクション・メモリ(TM)において強い分離性を実装するためには、非トランザクション・コードを、読み取りバリア(read barrier)及び書き込みバリア(write barrier)を含むように修正する必要があり、性能を損なう可能性がある。多くの不要なバリアを取り除くために多大な努力が費やされてきたが、こうした技術は複雑であることが多く、性能は、通常、HTMのものに比べてはるかに低い。
表2は、トランザクション・メモリの基本的な設計空間を示す(バーショニング及び競合検出)。
Eager−悲観的(EP)
後述するこの最初のTM設計は、Eager−悲観的として知られる。EPシステムは、その書き込みセットを「イン・プレースに」格納し(従って、「eager」の名がある)、かつ、ロールバックをサポートするために、上書きされたラインの古い値を「undoログ」に格納する。プロセッサは、Wキャッシュ・ビット138及びRキャッシュ・ビット132を用いて、読み取り及び書き込みセットを追跡し、スヌープした(snooped)ロード要求を受信したときに競合を検出する。恐らく、既知の文献におけるEPシステムの最も顕著な例は、LogTM及びUTMである。
EPシステムにおけるトランザクションの開始は、他のシステムにおけるトランザクションの開始とよく似ている:tm_begin()がレジスタ・チェックポイントを取り、あらゆるステータス・レジスタを初期化する。EPシステムはまたundoログの初期化も必要とし、この詳細はログ・フォーマットに依存するが、多くの場合、予め割り当てられたスレッド・プライベート・メモリの領域へのログ・ベース・ポインタを初期化すること、及びログ境界レジスタをクリアすることを含む。
バージョニング:EPにおいては、eagerバージョニングが機能するように設計される方法に起因して、MESI 130の状態遷移(Modified(修正)、Exclusive(排他)、Shared(共有)、及びInvalid(無効)のコード状態に対応するキャッシュライン・インジケータ)は、殆ど変更されないままである。トランザクションの外部では、MESI 130の状態遷移は、全く変更されないままである。トランザクション内部のラインを読み取るとき、標準的コヒーレンス遷移が適用され(S(Shared)→S、I(Invalid)→S、又はI→E(Exclusive))、必要に応じてロード・ミスを発行するが、Rビット132も設定される。同様に、ラインの書き込みに、標準的遷移が適用され(S→M、E→I、I→M)、必要に応じてミスを発行するが、加えてW(Write、書き込み)ビット138も設定する。現トランザクションがアボートした場合には、ラインが初めて書き込まれる際、ライン全体の古いバージョンをロードし、次に、undoログに書き込んで保存する。次に、新しく書き込まれたデータが、古いデータの上に「イン・プレースに」格納される。
競合検出:悲観的競合検出は、ミス、又はアップグレード時に交換されるコヒーレンス・メッセージを用いて、トランザクション間の競合を探す。トランザクション内で読み取りミスが発生すると、他のプロセッサはロード要求を受信するが、それらが必要とされるラインを有していない場合には、この要求を無視する。他のプロセッサが、必要とされるラインを非投機的に有する又はラインR132(Read、読み取り)を有する場合、このラインをSにダウングレードし、ある場合には、それらがMESIのM又はE状態でラインを有する場合、キャッシュ間転送(cash-to-cash transfer)を発行する。しかしながら、キャッシュがラインW138を有する場合には、2つのトランザクション間に競合が検出され、追加のアクションを取らなければならない。
同様に、(最初の書き込み時に)トランザクションがラインをsharedからmodifiedにアップグレードしようとした際、トランザクションは、競合の検出にも使用される排他的ロード要求を発行する。受信しているキャッシュがラインを非投機的に有する場合、次に、そのラインは無効にされ、特定の場合には、キャッシュ間転送(M又はE状態)が発行される。しかしながら、このラインがR132又はW138である場合には、競合が検出される。
妥当性検査:競合検出はあらゆるロードで実施されるので、トランザクションは常に、それぞれの書き込みセットに対する排他的アクセスを有する。従って、妥当性検査は、いずれの付加的な作業も必要としない。
コミット:eagerバージョニングはデータ項目の新たなバージョンをイン・プレースに格納するので、コミット・プロセスは、単にWビット138及びRビット132をクリアし、undoログを廃棄する。
アボート:トランザクションがロールバックすると、undoログ内の各キャッシュラインのオリジナルのバージョンを復元しなければならず、プロセスは、ログの「アンロール(unrolling)」又は「適用」と呼ばれる。これは、tm_discard()の間に行われ、他のトランザクションに関してアトミックでなければならない。具体的には、競合を検出するために、書き込みセットを依然として使用しなければならない:このトランザクションは、そのundoログ内にラインの正しいバージョンのみを有し、要求中のトランザクションは、そのログから正しいバージョンを復元するのを待たなくてはならない。こうしたログは、ハードウェア状態マシン又はソフトウェア・アボート・ハンドラを用いて適用することができる。
Eager−悲観的は、以下の特徴を有する:コミットは単純であり、イン・プレースにあるため非常に高速である。同様に、妥当性検査はノー・オペレーション(no−op)である。悲観的競合検出は、競合を早期に検出し、それにより、「失敗させられた(doomed)」トランザクションの数が減少する。例えば、2つのトランザクションが、Write−After−Read依存関係に関与する場合、その依存関係は、悲観的競合検出において瞬時に検出される。しかしながら、楽観的競合検出においては、ライタ(writer)がコミットするまで、そうした競合は検出されない。
Eager−悲観的はまた、以下の特徴も有する:上述したように、初めてキャッシュラインに書き込まれる際、古い値をログに書き込む必要があり、余分なキャッシュ・アクセスを招く。アボートはログの取り消し(undo)を必要とするため、費用がかかる。ロードは、ログ内のキャッシュラインごとに発行しなければならず、恐らく、次のラインに進む前にメインメモリまで前進する。悲観的競合検出はまた、特定のシリアル化可能なスケジュールの存在を防止する。
さらに、競合は、それらが発生した時に処理されるので、ライブロック(livelock)の可能性があり、前方進行を保証するために、慎重なコンテンション管理機構を利用しなければならない。
Lazy−楽観的(LO)
別の一般的なTM設計は、Lazy−楽観的(LO)であり、これは、その書き込みセットを「書き込みバッファ」又は「redoログ」に格納し、コミット時に競合を検出する(依然として、R及びWビットを使用する)。
バージョニング:EPシステムと同様に、LO設計のMESIプロトコルが、トランザクションの外側で実施される。トランザクションの内部に入ると、ラインの読み取りは標準的MESI遷移を招くが、同様にRビット132も設定する。同様に、ラインの書き込みは、ラインのWビット138を設定するが、LO設計のMESI遷移の処理は、EP設計のものとは異なる。第1に、lazyバージョニングにおいては、書き込まれたデータの新しいバージョンは、コミットまでキャッシュ階層に格納されるが、他のトランザクションは、メモリ又は他のキャッシュにおいて利用可能な古いバージョンにアクセスすることができる。古いバージョンを利用可能にするために、トランザクションによる最初の書き込み時に、ダーティ・ライン(Mライン)を無効化しなければならない。第2に、楽観的競合検出の特徴のため、アップグレード・ミスは必要とされない:競合検出はコミット時に行われるので、トランザクションがS状態のラインを有する場合、トランザクションは単にラインに書き込み、変更を他のトランザクションと通信することなく、そのラインをM状態にアップグレードするだけでよい。
競合検出及び妥当性検査:トランザクションを検証し、競合を検出するために、LOは、コミットの準備をしているときのみ、投機的に修正されたラインのアドレスを他のトランザクションに通信する。妥当性検査において、プロセッサは、書き込みセット内の全てのアドレスを含む、1つの、恐らくは大容量の、ネットワーク・パケットを送信する。データは送信されないが、コミッタ(committer)のキャッシュ内に残され、ダーティ(M)とマーク付けされる。Wとマーク付けされたラインを求めてキャッシュを検索することなくこのパケットを構築するために、これらの投機的に修正されたラインを追跡するために、キャッシュラインごとに1ビットを有する、「ストア・バッファ」と呼ばれる簡潔ビットベクトル(simple bit vector)を使用する。他のトランザクションは、このアドレス・パケットを使用して競合を検出する:アドレスがキャッシュ内に見つかり、Rビット132及び/又はWビット138が設定された場合、競合が開始される。ラインは見つかったが、R132もW138も設定されない場合には、ラインは単に無効にされ、これは排他的ロードの処理に類似している。
トランザクションのアトミック性をサポートするために、これらのアドレス・パケットをアトミックに処理しなければならない、即ち、同じアドレスに対して2つのアドレス・パケットが同時に存在することはできない。LOシステムにおいては、これは、アドレス・パケットを送信する前に、単にグローバル・コミット・トークンを獲得することにより達成することができる。しかしながら、最初にアドレス・パケットを送信し、応答を収集し、順序付けプロトコルを実施し(恐らく最も古いトランザクションを先頭に)、そして、全ての応答が満たされた場合にコミットすることによって、2段階コミット・スキームを用いることもできる。
コミット:ひとたび妥当性検査が行われると、コミットは、いかなる特別な処理も必要とせず、単にWビット138及びRビット132、並びにストア・バッファをクリアするだけである。トランザクションの書き込みは既にキャッシュ内でダーティとしてマーク付けされており、これらのラインの他のキャッシュのコピーは、アドレス・パケットにより無効にされる。次に、他のプロセッサは、通常のコヒーレンス・プロトコルを通じてコミットされたデータにアクセスすることができる。
アボート:ロールバックは等しく容易である:書き込みセットがローカル・キャッシュ内に含まれているので、これらのラインを無効にすることができ、次に、Wビット138及びRビット132、並びにストア・バッファをクリアする。ストア・バッファは、キャッシュを検索する必要なしに、Wラインを見つけて無効にすることを可能にする。
Lazy−楽観的は、以下の特徴を有する:即ち、アボートは非常に高速であり、付加的なロード又はストアを必要とせず、ローカル変更のみを行う。EPにおいて見出されるよりも多くのシリアル化可能なスケジュールが存在することができ、これにより、トランザクションが独立であることを、LOシステムがより積極的に推測することが可能になり、そのことはより高い性能をもたらし得る。最終的に、競合検出が遅いと前方進行の可能性が高くなり得る。
Lazy−楽観的はまた、以下の特徴を有する:即ち、妥当性検査では、書き込みセットのサイズに比例してグローバル通信時間を要する。コミット時にしか競合が検出されないので、失敗させられたトランザクションは無駄な作業になり得る。
Lazy−悲観的(LP)
Lazy−悲観的(LP)は、EPとLOとの間のどこかに位置する第3のTM設計選択肢を表し:新しく書き込まれたラインを書き込みバッファに格納するが、アクセスごとに競合を検出する。
バージョニング:バージョニングはLOのものと類似しているが、同一ではない:ラインの読み取りによりRビット132が設定され、ラインの書き込みによりWビット138が設定され、ストア・バッファは、キャッシュ内のWラインを追跡するために使用される。また、LOと同様に、トランザクションによる最初の書き込み時に、ダーティ(M)ラインを無効化しなければならない。しかしながら、競合検出は悲観的であるので、トランザクション・ラインをI,S→Mにアップグレードするときに、load exclusiveを実行しなければならず、これはLOとは異なる。
競合検出:LPの競合検出は、EPのものと同様に動作する:コヒーレンス・メッセージを用いて、トランザクション間の競合を探す。
妥当性検査:EPにおけるように、悲観的競合検出は、どの時点でも、実行中のトランザクションがいずれの他の実行中のトランザクションとも競合しないことを保証し、従って、妥当性検査はノー・オペレーションである。
コミット:LOにおけるように、コミットは、特別な処理を必要としない:単にWビット138及びRビット132、並びにストア・バッファをクリアするだけである。
アボート:ロールバックもまた、LOのものに類似している:単にストア・バッファを用いて書き込みセットを無効にし、Wビット138及びRビット132、並びにストア・バッファをクリアするだけである。
LPは、以下の特徴を有する:LOと同様に、アボートは非常に高速である。EPと同様に、悲観的競合検出の使用により、「失敗させられた」トランザクションの数が低減する。EPと同様に、一部のシリアル化可能なスケジュールは許容されず、キャッシュ・ミスごとに競合検出を実施しなければならない。
Eager−楽観的(EO)
バージョニングと競合検出の最終的な組み合わせは、Eager−楽観的(EO)である。EOは、HTMシステムにとって最適とはいえない選択肢であり得る:新しいトランザクション・バージョンはイン・プレースに書き込まれるので、競合の発生時に(即ち、キャッシュ・ミスの発生時に)競合に気付かざるを得ない。しかしながら、EOはコミット時まで競合の検出を待つので、これらのトランザクションは「ゾンビー(zombie)」になり、実行を続行し、リソースを浪費し、しかもアボートする「運命にある」。
EOは、STMにおいて有用であることが分かっており、Bartok−STM及びMcRTにより実装される。lazyバージョニングSTMは、読み取りごとに書き込みバッファをチェックし、最新の値を読み取っていることを保証する必要がある。書き込みバッファはハードウェア構造ではないので、高価であり、従って、write−in−placeを好む。付加的に、競合のチェックもまた、STMにおいて高価であるので、楽観的競合検出は、この操作をまとめて実行する利点をもたらす。
コンテンション管理
ひとたびシステムがそのトランザクションのアボートを決定すると、トランザクションがどのようにロールバックするかについて上述したが、競合には2つのトランザクションが関与するので、どのトランザクションをアボートすべきか、そのアボートをどのように開始すべきか、及びアボートされたトランザクションをいつ再試行すべきかのトピックを検討する必要がある。これらは、トランザクション・メモリの重要なコンポーネントである、コンテンション管理(CM)により対処されるトピックである。システムがどのようにアボートを開始するか、及び、競合においてどのトランザクションをアボートすべきかを管理する種々の確立された方法が後述される。
コンテンション管理ポリシー
コンテンション管理(CM)ポリシーは、競合に関与するどのトランザクションをアボートすべきか、及び、アボートされたトランザクションをいつ再試行すべきかを決定する機構である。例えば、アボートされたトランザクションを瞬時に再試行することが最良の性能につながらない場合が多い。逆に、アボートされたトランザクションの再試行を遅延させるバックオフ機構を用いるが、より良い性能をもたらすことがある。STMは最初に最良のコンテンション管理ポリシーを見出すことに取り組んでおり、以下に概説したポリシーの多くは、もともとSTM向けに開発されたものである。
CMポリシーは、トランザクションのエイジ(age)、読み取りセット及び書き込みセットのサイズ、以前のアボート数などを含む、判断を行うための多数の尺度を利用する。こうした判断を行うための尺度の組み合わせは無限にあるが、特定の組み合わせを、複雑性が高い順に大まかに後述する。
幾つかの専門語を確立するために、最初に、競合においては、アタッカ(attacker)及びデフェンダ(defender)の両者が存在することに留意されたい。アタッカは、共有メモリ位置へのアクセスを要求しているトランザクションである。悲観的競合検出においては、アタッカは、load又はload exclusiveを発行するトランザクションである。楽観的競合検出においては、アタッカは、検証を行おうとするトランザクションである。デフェンダは、どちらの場合も、アタッカの要求を受け取るトランザクションである。
積極的な(Aggressive)CMポリシーは、瞬時にかつ常にアタッカ又はデフェンダのいずれかを再試行する。LOにおいては、積極的とは、アタッカが常に勝つことを意味し、従って、積極的は、コミッタの勝利と呼ばれることもある。こうしたポリシーは、最も初期のLOシステムに使用された。EPの場合には、積極的は、デフェンダの勝利、又はアタッカの勝利のいずれかとすることができる。
直ちに別の競合に直面する競合するトランザクションの再開は、必ず作業の無駄を引き起こす、即ち、相互接続される帯域幅がキャッシュ・ミスを再充填する。丁寧な(Polite)CMポリシーは、競合を再開する前に、指数関数的バックオフ(exponentialbackoff)を使用する(しかし、線形を用いることもできる)。スターベーション(starvation)、即ち、プロセスがスケジューラにより割り当てられたリソースを有していない状況を防止するために、指数関数的バックオフは、およそn回の再試行後、トランザクションの成功の勝算を大幅に高める。
競合解決の別の手法は、アタッカ又はデフェンダをランダムにアボートすることである(ランダム化(Randomized)と呼ばれるポリシー)。こうしたポリシーは、不必要なコンテンションを回避するためのランダム化バックオフ・スキームと組み合わせることができる。
しかしながら、アボートするトランザクションを選択する際、ランダムな選択を行うことは、「多くの作業」を完了したトランザクションのアボートをもたらすことがあり、これによりリソースが無駄になり得る。こうした無駄を回避するために、どのトランザクションをアボートするかを決定するときに、トランザクションにおける完了した作業の量を考慮に入れることができる。作業の1つの尺度は、トランザクションのエイジとすることができる。他の方法として、Oldest、Bulk TM、Size Matters、Karma、及びPolkaが挙げられる。Oldestは、競合における若い方のトランザクションをアボートする単純なタイムスタンプである。Bulk TMはこのスキームを使用する。Size Mattersは、Oldestに類似しているが、トランザクションのエイジの代わりに、読み取り/書き込みワードの数が優先順位として用いられ、一定数のアボートの後、Oldestに戻る。Karmaは類似しており、書き込みセットのサイズを優先順位として用いる。次に、一定の時間バックオフした後、ロールバックが進行する。アボートされたトランザクションは、アボートされた後もその優先順位を保持する(従って、Karmaの名が付いている)。Polkaは、Karmaと同様であるが、所定の時間バックオフする代わりに、毎回指数関数的により多くバックオフする。
アボートは作業を無駄にするので、デフェンダがそのトランザクションを終了するまでアタッカをストールすることがより良い性能をもたらすという議論は理にかなっている。残念なことに、こうした単純なスキームは、容易にデッドロックをもたらす。
この問題を解決するために、デッドロック回避技術を用いることができる。Greedyは、デッドロックを回避するために2つの規則を用いる。第1の規則は、第1のトランザクションT1が第2のトランザクションT0よりも低い優先順位を有する場合、又は、T1が別のトランザクションを待っている場合、T1は、T0との競合時にアボートするというものである。第2の規則は、T1がT0よりも高い優先順位を有し、待機していない場合、T0は、T1のコミットまで待つか、アボートするか、又は待機を開始する(この場合、第1の規則が適用される)というものである。Greedyは、トランザクションのセットを実行するための期限についての何らかの保証を提供する。1つのEP設計(LogTM)は、Greedyに類似したCMポリシーを用いて、保守的なデッドロック回避によるストールを達成する。
例示的なMESIコヒーレンシ規則は、マルチプロセッサ・キャッシュ・システムのキャッシュラインが存在し得る4つの可能な状態、即ち、次のように定義される4つの可能な状態M、E、S、Iを提供する。:
Modified(M):キャッシュラインは現キャッシュ内にのみ存在し、ダーティである。即ち、キャッシュラインは、メインメモリ内の値から修正されている。キャッシュは、(もはや有効ではない)メインメモリ状態のいずれかの他の読み取りを可能にする前に、将来のいずれかの時点で、データをメインメモリにライトバックしなければならない。ライトバックによりラインはExclusive状態に変化する。
Exclusive(E):キャッシュラインは現キャッシュ内にのみ存在するが、クリーンである。即ち、キャッシュラインはメインメモリと一致する。キャッシュラインは、読み取り要求に応答して、いつでもShared状態に変わることが可能である。代替的に、キャッシュラインは、書き込みがなされると、Modified状態に変わることが可能である。
Shared(S):このキャッシュラインは、マシンの他のキャッシュ内に格納することができ、「クリーン」であることを示す。即ち、このキャッシュラインはメインメモリと一致する。ラインは、いつでも廃棄する(Invalid状態に変更する)ことができる。
Invalid(I):このキャッシュラインが、無効である(未使用である)ことを示す。
MESIコヒーレンシ・ビットに加えて又はそこに符号化された、各キャッシュラインに対して、TMコヒーレンシ状態インジケータ(R132、W138)を設けることができる。R132インジケータは、現トランザクションがキャッシュラインのデータから読み取りを行ったことを示し、W138インジケータは、現トランザクションがキャッシュラインのデータに書き込みを行ったことを示す。
TM設計の別の態様において、システムは、トランザクション・ストア・バッファを用いて設計される。2000年3月31日に出願され、その全体が引用により本明細書に組み入れられる、「Methods and Apparatus for Reordering and Renaming Memory References in a Multiprocessor Computer System」という名称の特許文献3は、少なくとも第1及び第2のプロセッサを有するマルチプロセッサ・コンピュータ・システムにおいて、メモリ参照を再順序付けし、再命名するための方法を教示する。第1のプロセッサは、第1のプライベート・キャッシュ及び第1のバッファを有し、第2のプロセッサは、第2のプライベート・キャッシュ及び第2のバッファを有する。この方法は、第1のプロセッサが受信した、データを格納する複数のゲート付きストア要求(gated store request)の各々について、第1のプライベート・キャッシュによって、データを含むキャッシュラインを排他的に取得するステップと、データを第1のバッファに格納するステップとを含む。第1のバッファが、第1のプロセッサから、特定のデータをロードするロード要求を受信すると、ロード及びストア操作のイン・オーダー・シーケンスに基づいて、特定のデータが、第1のバッファに格納されたデータの中から第1のプロセッサに提供される。第1のキャッシュが所定データのロード要求を第2のキャッシュから受信すると、エラー条件が示され、所定データのロード要求が第1のバッファに格納されたデータに対応する場合、プロセッサの少なくとも1つの現在の状態が以前の状態にリセットされる。
1つのこうしたトランザクション・メモリ機能の主要実装コンポーネントは、トランザクション前の(pre-transaction)GR(汎用レジスタ)のコンテンツを保持するためのトランザクション・バックアップ・レジスタ・ファイル、トランザクション中にアクセスされたキャッシュラインを追跡するためのキャッシュ・ディレクトリ、トランザクションが終了するまでストアをバッファするためのストア・キャッシュ、及び種々の複雑な機能を実施するためのファームウェア・ルーチンである。本セクションでは、詳細な実装を説明する。
IBM zEnterprise EC12エンタープライズ・サーバの実施形態
IBM zEnterprise EC12エンタープライズ・サーバは、トランザクション・メモリにトランザクション実行(TX)を導入し、その全体が引用によりここに組み入れられる非特許文献3に部分的に説明される。
表3は、例示的なトランザクションを示す。例えば他のCPUとの競合の繰り返しが原因で、あらゆる実行の試行においてアボート条件に遭遇し得るので、TBEGINで開始されたトランザクションが、TENDで常に成功裏に完了することは保証されない。このことは、プログラムが、例えば従来のロック・スキームを用いることにより、同じ操作を非トランザクション的に実行するためにフォールバック経路をサポートすることを必要とする。このことは、特にフォールバック経路が信頼できるコンパイラによって自動的に生成されない場合、プログラミング及びソフトウェア検証チームに著しい負担をかける。
アボートされたトランザクション実行(TX)のトランザクションに対してフォールバック経路を提供する要件は、負担になり得る。共有データ構造で動作する多くのトランザクションは短いものであり、ぼんの数個の個別メモリ位置にタッチし、単純な命令しか使用しないと考えられる。これらのトランザクションに対して、IBM zEnterprise EC12は、制約付き(constrained)トランザクションの概念を導入する。通常の条件下で、CPU114は、制約付きトランザクションが、たとえ必要な再試行の数に厳密な制限を与えなくても最終的に成功裏に終了することを保証する。制約付きトランザクションは、TBEGINC命令で開始し、通常のTENDで終了する。制約付きトランザクション又は制約なしトランザクションとしてのタスクの実装は、一般的に、極めて匹敵する機能をもたらすが、制約付きトランザクションは、フォールバック経路に対する必要性を取り除くことにより、ソフトウェア開発を簡単化する。IBMのトランザクション実行アーキテクチャは、その全体が引用により本明細書に組み入れられる非特許文献4にさらに説明される。
制約付きトランザクションは、TBEGINC命令で開始する。TBEGINCで開始されたトランザクションは、プログラミング上の制約のリストに従わなければならない。そうでない場合には、プログラムはフィルタリング可能でない制約違反割り込み(non-filterable constraint-violation interruption)を利用する。例示的な制約として、これらに限定されるものではないが、トランザクションは最大32個の命令を実行することができる、全ての命令テキストはメモリの連続した256バイトの範囲内になければならない、トランザクションは前方を指示する相対分岐のみを含む(即ち、ループ又はサブルーチン呼び出しはない)、トランザクションはメモリの最大4つの位置合わせされたオクトワード(オクトワードは32バイトである)にアクセスすることができる、及び10進演算又は浮動小数点数演算のような複雑な命令を除外するための命令セットの制限を挙げることができる。最大4つの位置合わせされたオクトワードをターゲットにするアトミックcompare−and−swapの非常に強力な概念を含む、二重連結リスト(doubly linked list)−挿入/削除演算のような多くの一般的な演算を実行できるように、制約が選択される。同時に、制約は、将来のCPU実装が、制約の調整を必要とせずにトランザクションの成功を保証できるように保守的に選択されるが、それは、そうでない場合にソフトウェアの非互換性を招くためである。
TBEGINCは、浮動小数点数レジスタ(FPR)制御及びプログラム割り込みフィルタリング・フィールドが存在せず、制御はゼロであると見なされる点を除いて、大部分は、Intel(登録商標)TSXにおけるXBEGIN又はIBM(登録商標)のzEC12サーバ上のXBEGINのように挙動する。トランザクションがアボートすると、命令アドレスは、制約付きトランザクションについての即時再試行及びアボート経路の不存在を反映して、命令の後ではなく、直接TBEGINCに戻される。
ネスト化されたトランザクションは、制約付きトランザクション内で許容されないが、TBEGINCが非制約付きトランザクション内で行われた場合には、TBEGINと同様に新しい非制約付きネスト・レベルを開くものとして扱われる。このことは、例えば、非制約付きトランザクションが制約付きトランザクションを内部で使用するサブルーチンを呼び出した場合などに起こり得る。
割り込みフィルタリングは暗黙的にオフにされるので、制約付きトランザクション中の全ての例外は、オペレーティング・システム(OS)への割り込みをもたらす。最終的なトランザクションの終了の成功は、いずれかの制約付きトランザクションによりタッチされたせいぜい4ページをページインするOSの能力に依存する。OSはまた、トランザクションが完了するのを可能にするのに十分に長いタイムスライスも保証しなければならない。
表4は、制約付きトランザクションが他のロック・ベースのコードと対話しないと仮定する、表3のコードの制約付きトランザクション実装を示す。従って、ロック・テストは示されないが、制約付きトランザクションとロック・ベースのコードが混合された場合には、これを付加することができる。
繰り返し障害が発生した場合、ソフトウェア・エミュレーションが、システム・ファームウェアの一部としてミリコードを用いて実施される。有利なことに、プログラマーから負担が取り除かれるので、制約付きトランザクションは所望の特性を有する。
IBM zEnterprise EC12プロセッサは、トランザクション実行ファシリティを導入した。このプロセッサは、クロックサイクルごとに3つの命令をデコードすることができる。即ち、単純な命令は、単一のmicro−op(マイクロ・オペレーション)としてディスパッチされ、より複雑な命令は、複数のmicro−op232bに分割される。micro−op(図3に示されるUops232b)が、統合された発行キュー216に書き込まれ、そこから、それらをアウト・オブ・オーダー式に発行することができる。サイクルごとに、最大2つの固定小数点数命令、1つの浮動小数点数命令、2つのロード/ストア命令、及び2つの分岐命令を実行することができる。グローバル完了テーブル(GCT)232は、あらゆるmicro−op及びトランザクション・ネスト化深さ(transaction nesting depth、TND)232aを保持する。GCT232は、デコード時にイン・オーダー式に書き込まれ、各micro−opの実行ステータスを追跡し、最も古い命令グループの全てのmicro−op232bが成功裏に実行されると、命令を完了する。
レベル1(L1)データ・キャッシュ240(図3)は、256バイトのキャッシュライン及び4サイクルの使用待ち時間を有する96KB(キロバイト)の6ウェイ・アソシアティブ・キャッシュ(6-way associative cache)であり、L1ミスに対して7サイクルの使用待ち時間ペナルティを有して、プライベート1MB(メガバイト)の8ウェイ・アソシアティブ第2レベル(L2)データ・キャッシュ268(図3)に結合される。L1キャッシュ240(図3)は、プロセッサに最も近いキャッシュであり、Lnキャッシュは、第n番目のキャッシュ・レベルのキャッシュである。L1キャッシュ240(図3)及びL2キャッシュ268(図3)の両方とも、ストアスルー(store through)方式である。各々の中央処理装置(CP)チップ上の6つのコアは、48MBの第3レベル・ストアイン(store-in)方式キャッシュを共有し、6つのCPチップは、ガラス・セラミック・マルチチップ・モジュール(MCM)上に一緒にパッケージ化されたオフ・チップの384MBの第4レベル・キャッシュに接続される。最大4つのマルチチップ・モジュール(MCM)を、最大144個のコアを有するコヒーレントな対称マルチプロセッサ(SMP)システムに接続することができる(顧客のワークロードを実行するのに全てのコアが利用可能とは限らない)。
コヒーレンシは、MESIプロトコルの変形により管理される。キャッシュラインは、読み取り専用(shared)又はexclusiveで所有することができ、L1 240(図3)及びL2 268(図3)はストアスルー方式であり、従って、ダーティラインを含まない。L3及びL4のキャッシュはストアイン方式であり、ダーティ状態を追跡する。各キャッシュは接続された全ての下位レベルのキャッシュを含む。
コヒーレンシ要求は「相互問い合わせ」(cross interrogate、XI)と呼ばれ、上位レベルのキャッシュから下位レベルのキャッシュにかつL4間で階層的に送信される。1つのコアがL1 240(図3)及びL2 268(図3)をミスし、ローカルL3からキャッシュラインを要求すると、L3は、L3がこのラインを所有するかどうかをチェックし、必要に応じて、コヒーレンシを保証するために、そのL3下で現在所有しているL2 268(図3)/L1 240(図3)にXIを送信してから、キャッシュラインを要求側に戻す。要求がL3もミスした場合、L3は要求をL4に送信し、L4は、XIをそのL4下の全ての必要なL3及び近隣のL4に送信することによって、コヒーレンシを実施する。次に、L4は要求中のL3に応答し、L3は応答をL2 268(図3)/L1 240(図3)に転送する。
キャッシュ階層の包含の規則のために、要求から他のキャッシュラインへのアソシアティビティ・オーバーフローにより引き起こされた上位レベルのキャッシュに対するエビクション(eviction)が原因で、キャッシュラインが下位レベルのキャッシュから相互問い合わせされる(XI)ことに留意されたい。これらのXIは「LRU XI」と呼ぶことができ、ここでLRUは、最長時間未使用(least recently used)を意味する。
さらに別のタイプのXI要求を参照すると、Demote−XIは、キャッシュ・オーナーシップを、exclusiveからread−only(読み取り専用)状態に遷移させ、Exclusive−XIは、キャッシュ・オーナーシップをexclusiveからinvalid状態に遷移させる。Demote−XI及びExclusive−XIは、元のXI送信者への応答を必要とする。ターゲット・キャッシュは、XIを「受け入れる」ことができ、又は、XIを受け入れる前に最初にダーティ・データをエビクトする必要がある場合には、「拒否」応答を送信することができる。L1キャッシュ240(図3)/L2キャッシュ268(図3)はストアスルー方式であるが、ストア・キュー内に、排他的状態をダウングレードする前にL3に送信する必要があるストアを有する場合には、demote−XI及びexclusive−XIを拒否することができる。拒否されたXIは、送信者により繰り返される。Read−only−XIは、ラインを読み取り専用で所有するキャッシュに送信され、こうしたXIを拒否することができないので、こうしたXIに対して応答は必要ない。SMPプロトコルの詳細は、その全体が引用により本明細書に組み入れられる非特許文献5により、IBM z10に関して説明されるものと類似している。
トランザクション命令の実行
図3は、例示的なCPUの例示的なコンポーネントを示す。命令デコード・ユニット(IDU)208は、現トランザクション・ネスト化深さ(TND)212を常時監視している。IDU208がTBEGIN命令を受信すると、ネスト化深さがインクリメントされ、逆に、TEND命令時にはデクリメントされる。あらゆるディスパッチされた命令について、ネスト化深さがGCT232に書き込まれる。TBEGIN又はTENDが、後でフラッシュされる投機的経路上でデコードされると、IDU208のネスト化深さは、フラッシュされない最も若いGCT232エントリからリフレッシュされる。実行ユニットによる、大部分はロード/ストア・ユニット(LSU)280による消費のために、トランザクション状態も発行キュー216内に書き込まれる。TBEGIN命令は、TEND命令に到達する前にトランザクションがアボートした場合に状態情報を記録するためのトランザクション診断ブロック(TDB)を指定することができる。
ネスト化深さと同様に、IDU208/GCU232は、トランザクション・ネストを通じて、アクセス・レジスタ/浮動小数点数レジスタ(AR/FPR)修正マスクを協調的に追跡する。即ち、AR/FPR修正命令がデコードされ、修正マスクがそれをブロックすると、IDU208は、アボート要求をGCT232内に配置することができる。命令がnext−to−completeになると、完了がブロックされ、トランザクションがアボートする。制約付きトランザクション内にある間にデコードされた場合又は最大ネスト化深さを上回る場合、TBEGINも含む他の制限付き命令が同様に処理される。
最外TBEGINは、GR−Save−Maskに応じて、複数のmicro−opに分割され、各micro−op232bは、2つの固定小数点数ユニット(FXU)220の一方によって実行され、トランザクション・アボートに場合、1対のGR228を、GR228のコンテンツを後で復元するために用いられる特殊トランザクション・バックアップ・レジスタ・ファイル224内に保存する。TBEGINはまた、1が指定されている場合、TDBのアクセシビリティ・テストを実施するためのmicro−op232bも生成し、このアドレスは、アボートの場合に後で使用するために、専用レジスタ内に保存される。最外TBEGINのデコードにおいて、潜在的な後のアボート処理のために、TBEGINの命令アドレス及び命令テキストもまた、専用レジスタ内に保存される。
TEND及びNTSTGは、単純なmicro−op232b命令である。NTSTG(非トランザクション・ストア(non-transactional store))は、発行キューにおいて非トランザクションとしてマーク付けされ、LSU280がそれを適切に処理できるようにする点を除いて、通常のストアのように処理される。TENDは、実行時にノー・オペレーションであり、TENDが完了したときに、トランザクションの終了が行われる。
上述のように、トランザクション内にある命令は、発行キュー216においてそのようにマーク付けされるが、他の点ではほぼ変更されずに実行され、LSU280は、次のセクションで説明されるように、分離追跡(isolation track)を行う。
デコードはイン・オーダー式であり、かつ、IDU208は現在のトランザクション状態を常時監視し、これをトランザクションからの全ての命令と併せて発行キュー216内に書き込むことから、TBEGIN、TEND、並びにトランザクションの前、内部及び後の命令の実行は、アウト・オブ・オーダー式に実行することができる。実効アドレス計算器236が、LSU280内に含められる。TENDを最初に、トランザクション全体を次に実行し、最後にTBEGINを実行することさえ可能である(可能性は低いが)。プログラム順は、完了時にGCT232により復元される。汎用レジスタ(GR)228は、バックアップ・レジスタ・ファイル224から復元することができるので、トランザクションの長さは、GCT232のサイズによって制限されない。
実行中、プログラム・イベント記録(PER)イベントが、イベント抑止制御に基づいてフィルタリングされ、PER TENDイベントは、イネーブルにされた場合に検出される。同様に、トランザクション・モードにある間、トランザクション診断制御によりイネーブルにされたときに、擬似乱数生成器がランダム・アボートを引き起こしていることがある。
トランザクション分離の追跡
ロード/ストア・ユニットは、トランザクション実行中にアクセスされたキャッシュラインを追跡し、別のCPUからのXI(又はLRU−XI)がフットプリントと競合する場合にアボートをトリガする。競合するXIがexclusive又はdemote XIである場合、L3がXIを繰り返す前にトランザクションが終了することを期待して、LSUはXIを拒否してL3に戻す。この「押しのけ(stiff-arming)」は、高競合状態のトランザクションにおいて非常に有効である。2つのCPUが互いに押しのけ合う際のハングアップを防止するために、XI拒否カウンタが実装され、該XI拒否カウンタは、閾値が満たされると、トランザクション・アボートをトリガする。
L1キャッシュ・ディレクトリ240は、従来より、スタティック・ランダム・アクセス・メモリ(SRAM)で実装される。トランザクション・メモリの実装では、ディレクトリの有効ビット244(64行×6ウェイ)は通常の論理ラッチに移動され、キャッシュラインごとにさらに2つのビット、即ちTX−読み取りビット248及びTX−ダーティビット252が補充される。
新しい最外TBEGIN(先のまだ保留中のトランザクションに対してインターロックされる)がデコードされると、TX−読み取り248ビットがリセットされる。TX−読み取り248ビットは、発行キュー内で「トランザクショナル(transactional)」としてマーク付けされた全てのロード命令によって実行時に設定される。これは、投機的ロードが、例えば誤って予測された分岐経路上で実行される場合に、過剰なマーク付けをもたらし得ることに留意されたい。ロード完了時にTX−読み取りビットを設定する代替案は、複数のロードが同時に完了することがあり、ロード・キュー上に多数の読み取りポートを必要とすることから、シリコン面積に対して高価すぎるものであった。
ストアは、非トランザクション・モードと同じ方法で実行されるが、トランザクション・マークが、ストア命令のストア・キュー(STQ)260エントリ内に置かれる。ライトバック時に、STQ260からのデータがL1 240内に書き込まれるとき、書き込まれたキャッシュラインに関して、L1ディレクトリ256内のTX−ダーティ252ビットが設定される。L1 240へのストア・ライトバックは、ストア命令が完了した後にのみ行われ、サイクルごとにせいぜい1つのストアがライトバックされる。完了及びライトバックの前に、ロードは、ストア転送により、STQ260からのデータにアクセスすることができ、ライトバック後は、CPU114(図2)は、L1 240内の投機的に更新されたデータにアクセスすることができる。トランザクションが成功裏に終了した場合、全てのキャッシュラインのTX−ダーティビット252はクリアされ、STQ260において、まだ書き込まれていないストアのTX−マークもクリアされ、有効に保留中のストアを通常のストアに変える。
トランザクションがアボートすると、全ての保留中のトランザクション・ストアは、既に完了したものでさえ、STQ260から無効にされる。L1 240内のトランザクションにより修正された、つまり、TX−ダーティビット252がオンにされ、その有効ビットがオフにされた、全てのキャッシュラインが、有効に、これらをL1 240キャッシュから瞬時に取り除く。
アーキテクチャは、新しい命令を完了する前に、トランザクションの読み取りセット及び書き込みセットの分離が保持されることを必要とする。この分離は、XIが保留中の適切な時点で命令の完了をストールすることにより確実にされる。投機的なアウト・オブ・オーダー式実行が許容され、保留中のXIが異なるアドレスに対するものであり且つ実際にトランザクション競合を引き起こさないと楽観的に仮定する。この設計は、アーキテクチャが必要とする強力なメモリ順序付けを保証するために従来のシステム上に実装されるXI対完了(XI-vs-completion)インターロックに非常に自然に適合する。
L1 240がXIを受信すると、L1 240はディレクトリにアクセスして、相互問い合わせ(XI)されたL1 240内のアドレスの有効性をチェックし、相互問い合わせ(XI)されたライン上でTX−読み取りビット248がアクティブであり、かつ、XIが拒否されない場合、LSU280がアボートをトリガする。アクティブなTX−読み取りビット248を有するキャッシュラインがL1 240から最長時間未使用(LRU)にされると、特別なLRU拡張ベクトルは、L1 240の64行の各々について、その行上にTX−読み取りラインが存在したことを思い出す。LRU拡張に対して正確なアドレス追跡は存在しないので、あらゆる拒否されないXIが有効な拡張行にヒットし、LSU280がアボートをトリガする。正確でないLRU拡張追跡に対する他のCPU114(図2)との競合がアボートを引き起こさなければ、LRU拡張の提供は、L1サイズからL2サイズまでの読み取りフットプリント能力及びアソシアティビティを有効に向上させる。
ストア・フットプリントは、ストア・キャッシュ・サイズ(ストア・キャッシュは、以下により詳細に説明される)によって、従って、L2サイズ及びアソシアティビティによって暗黙的に、制限される。TX−ダーティ・キャッシュラインがL1からLRU処理された場合、LRU拡張アクションを実施する必要はない。
ストア・キャッシュ
従来のシステムにおいて、L1 240及びL2 268はストアスルー・キャッシュであるので、全てのストア命令は、L3ストア・アクセスを引き起こし、今やL3ごとに6つのコアがあり、各コアの性能がさらに改善され、L3に関する(及びより少ない程度ではあるがL2に関する)ストア速度が、特定のワークロードに関して問題になる。ストア・キューイングの遅延を避けるために、ストアをL3に送信する前にストアを近隣のアドレスと組み合わせる、収集ストア・キャッシュを付加する必要がある。
トランザクション・メモリ性能については、L2キャッシュ268は、もう少しでクリーン・ラインを戻すので(7サイクルL1ミス・ペナルティ)、トランザクション・アボート時に、L1 240からのあらゆるTX−ダーティ・キャッシュラインを無効にすることが許容可能である。しかしながら、性能(及び追跡のためのシリコン領域)に関して、トランザクションが終了する前にトランザクション・ストアにL2 268を書き込ませ、次に、アボート時に(又はさらに悪いことには共有L3で)全てのダーティL2キャッシュラインを無効にすることは、許容可能でない。
ストア帯域幅及びトランザクション・メモリ・ストア処理の2つの問題はどちらも、収集ストア・キャッシュ264で対処することができる。キャッシュ264は、64エントリの循環キューであり、各エントリは、バイト精度(byte-precise)の有効ビットを有する128バイトのデータを保持する。非トランザクション操作において、LSU280からストアを受信すると、ストア・キャッシュ264は、同じアドレスのエントリが存在するかどうかをチェックし、存在する場合には、新しいストアを既存のエントリに収集する。エントリが存在しない場合には、新しいエントリがキューに書き込まれ、空きエントリの数が閾値より下になる場合、最も古いエントリがL2キャッシュ268及びL3キャッシュにライトバックされる。
新しい最外トランザクションが開始すると、ストア・キャッシュ264内の全ての既存のエントリは、新しいストアをそこに収集できないように、closedとしてマーク付けされ、L2 268及びL3に対するこれらのエントリのエビクションが開始される。その時点から、LSU280 STQ260から得られるトランザクション・ストアは、新しいエントリを割り当てる、又は既存のトランザクション・エントリに集まる。L2 268及びL3へのこれらのストアのライトバックは、トランザクションが成功裏に終了するまでブロックされ、その時点で、後の(トランザクション後の)ストアは、次のトランザクションがそれらのエントリを再び閉じるまで、引き続き既存のエントリ内に集めることができる。
ストア・キャッシュ264は、あらゆるexclusive XI又はdemote XIのたびに照会され、XIがいずれかのアクティブ・エントリと比較された場合、XIの拒否を引き起こす。継続的にXIを拒否する間、コアがさらなる命令を完了しない場合、トランザクションは、ハングアップを回避するために特定の閾値でアボートされる。
ストア・キャッシュがオーバーフローすると、LSU280は、トランザクション・アボートを要求する。LSU280は、既存のエントリにマージする(merge)ことができない新しいストアを送信しようと試みたときに、この条件を検出し、ストア・キャッシュ264全体が現トランザクションからのストアで満たされる。ストア・キャッシュ264は、L2 268のサブセットとして管理され、ダーティラインをL1 240からトランザクション的にエビクトすることができるが、これらは、トランザクション全体を通じてL2 268内に常駐しなければならない。従って、最大ストア・フットプリントは、64×128バイトのストア・キャッシュ・サイズに制限され、L2 268のアソシアティビティによっても制限される。L2 268は、8ウェイ・アソシアティブであり、512行を有するので、一般的には、十分に大きく、トランザクション・アボートを引き起こさない。
トランザクションがアボートした場合、ストア・キャッシュに通知され、トランザクション・データを保持する全てのエントリが無効にされる。ストア・キャッシュはまた、1ダブルワード(8バイト)ごとに、エントリがNTSTG命令により書き込まれたかどうかのマークを有し−これらのダブルワードは、トランザクション・アボートにわたって有効なままである。
ミリコード実装の機能
従来より、IBMメインフレーム・サーバ・プロセッサは、特定のCISC命令実行、割り込み処理、システム同期、及びRASのような複雑な機能を実施する、ミリコードと呼ばれるファームウェアの層を含む。ミリコードは、マシン依存命令、並びに、アプリケーション・プログラム及びオペレーティング・システム(OS)の命令と同様にメモリからフェッチされ、実行される命令セット・アーキテクチャ(ISA)の命令を含む。ファームウェアは、顧客プログラムがアクセスできないメインメモリの制限区域内に常駐する。ハードウェアが、ミリコードを呼び出す必要がある状況を検出すると、命令フェッチ・ユニット204が「ミリコード・モード」に切り替わり、ミリコード・メモリ領域内の適切な位置でフェッチを開始する。ミリコードは、命令セット・アーキテクチャ(ISA)の命令と同じ手法でフェッチ及び実行することができ、ISA命令を含むことができる。
トランザクション・メモリに関して、ミリコードは、種々の複雑な状況に関与する。あらゆるトランザクション・アボートは、必要なアボート操作を行うために、専用ミリコード・サブルーチンを呼び出す。トランザクション・アボート・ミリコードは、ハードウェア内部のアボート原因、潜在的な例外原因、及びアボートされた命令アドレスを保持する特殊用途レジスタ(SPR)を読み取ることで開始し、次に、ミリコードを用いて、1が指定されている場合には、TDBを格納する。ミリコードがどのGR228を復元するかを知るのに必要とされるGR保存マスクを取得するために、TBEGIN命令テキストがSPRからロードされる。
CPU114(図2)は、バックアップGRを読み出し、それらをメインGRにコピーするための、特殊ミリコード専用命令をサポートする。TBEGIN命令アドレスもSPRからロードされ、ひとたびミリコード・アボート・サブルーチンが終了すると、TBEGIN後の実行を続行するための新しい命令アドレスをPSW内に設定する。このPSWは、アボートがフィルタリングされていないプログラム割り込みにより引き起こされた場合に、プログラム−旧PSWとして後に保存することができる。
TABORT命令は、ミリコード実装することができる、即ち、IDU208がTABORTをデコードすると、TABORT命令は、TABORTのミリコードに分岐するように命令フェッチ・ユニットに指示し、そこからミリコードが共通のアボート・サブルーチンに分岐する。
Extract Transactional Nesting Depth(トランザクション・ネスト化深さ抽出)(ETND)命令も、パフォーマンス・クリティカル(performance critical)ではないので、ミリコード化することができる。即ち、ミリコードは、特殊ハードウェア・レジスタから現在のネスト化深さをロードし、それをGR228に入れる。PPA命令はミリコード化することができる。PPA命令は、PPAへのオペランドとしてソフトウェアにより提供される現在のアボート・カウントと、同じく他のハードウェア内部状態とに基づいて、最適な遅延を実施する。
制約付きトランザクションに関して、ミリコードは、アボートの数を常時監視することができる。TENDが成功裏に完了したとき、又は、OSへの割り込みが生じた場合、カウンタは0にリセットされる(OSがプログラムに戻るかどうか、又はOSがいつプログラムに戻るかは知られていない)。現在のアボート・カウントに依存して、ミリコードは、特定の機構を呼び出して、後のトランザクションの再試行が成功する可能性を高めることができる。この機構は、例えば、再試行の間のランダムな遅延を連続的に増大させることと、投機的実行の量を低減させて、トランザクションが実際には使用していないデータへの投機的アクセスにより引き起こされるアボートに遭遇するのを回避することとを含む。最後の手段として、他のCPUを解放して通常の処理を続行する前に、ミリコードを他のCPUにブロードキャストして、全ての競合する作業を停止させ、ローカル・トランザクションを再試行することができる。デッドロックを引き起こさないように、複数のCPUを連携させる必要があるので、異なるCPU上のミリコード・インスタンス間の何らかのシリアル化が必要とされる。
ここで図4を参照すると、参照符号400は、一般に、データの適応共有のための方法をハードウェア又はソフトウェアで実装することができる、例示的な実施形態を示す。
現在の実装においては、ロックに基づいてデータ・アクセスを同期するための2つの手法を従来通りに実施することができる。ロック(locking)又は真のロック(true locking)とも呼ばれるデータ構造のロックにおいて、プログラムは、コードのクリティカル・セクションの間、共有データとも呼ばれるメモリ領域への排他的アクセスが保証されることを望む場合がある。この場合、プログラムは、この時点で共有データが利用可能でない競合するプログラムへのフラグのように働くロックによって、共有データを保護することができる。しかしながら、ロック機構は、共有データへのアクセスを厳格に制御することができる。低競合状態のメモリ領域では、競合するプログラムが不必要に待機することがあり、性能に悪影響を与える。例えば、以下のコード・サンプルにおいて、2つのスレッドは構造の異なる部分を更新しており、並列に実行するとしても、スレッド1が構造hash_tbl上にロックを保持する間、スレッド2は実行を待つ。
HLEは、前述のように、従来のロック・コードを使用するように書かれたプログラムが、トランザクション実行を実装するハードウェアを利用する機会を可能にする。しかしながら、高競合状態のメモリ領域においては、競合が発生した場合、プロセッサは、トランザクションをアボートし、悲観的ロック挙動を用いてクリティカル・セクションを再び実行することができる。一実施形態においては、キャッシュラインをまたぐいずれのロックも無効化することができず、HLEなしに再実行を自動的にトリガする。従って、クリティカル・セクションが常にトランザクションとして失敗することが分かっている場合、トランザクション実行にデフォルト設定し、その後、ロックを用いて成功裏に再開させることは、性能を低下させることがある。
410において、プロセッサ、即ちCPU114(図2)が、メモリ領域にアクセスするためにコード・シーケンスを開始すると、CPU114(図2)は、ハードウェア又はソフトウェアのいずれかで実装され得る競合予測器(即ち、HLE予測器又はハードウェア・ロック・バーチャライザ)を呼び出して、ロック無効化が成功する可能性があるかどうか、又は代わりにロックを使用すべきかどうかを予測しようと試みる。後述のように、動作において、競合予測器は、種々のハードウェア及びソフトウェア環境で動作することができる。しかしながら、競合予測器がHLE環境内の競合予測の実施形態を指す場合には、競合予測器はHLE予測器と呼ぶこともできる。一実施形態において、成功したトランザクション実行の単純なカウントは、例えば、スレッドごとにハードウェア・レジスタ又はメモリ位置内に保持することができる、又は全てのスレッドについて共有することができる。成功したトランザクション実行のカウントを表す閾値を超えると、410において、干渉の可能性が低いため、競合予測器は、トランザクション実行経路、即ちロック無効化が、455における非トランザクション実行経路、即ちロックよりも有効であり得ると予測することができる。少なくとも1つの実施形態において、カウンタは、最初により有効な実行経路を好むように初期化され、少なくとも1つの実施形態においては、好ましくは、ロック無効化に基づくトランザクション実行に対応する。別の実施形態においては、ハードウェアで又はプログラム・ストリームに挿入された命令により、ロックの取得及び実行に対する、トランザクション実行の推定される相対コストを計算することができる。計算された相対コストに基づき、競合予測器は、例えば予測される経路は実行するコストが低いこと又は干渉に遭遇する可能性が低いことから、トランザクション経路又は非トランザクション経路がより有効であると予測することができる。別の実施形態においては、コンパイラが挙動ヒントを競合予測器に暗黙的に挿入し、410において、420におけるトランザクション実行経路、又は455におけるロック経路のいずれかを選択することができる。CPU114(図2)は、420においてトランザクションとしてクリティカル・セクションの実行を開始し、425においてデータを必要に応じて更新することができる。430におけるトランザクションの終了時に、しかし結果をコミットする前に、CPU114(図2)は、435において、トランザクションのアボートをもたらす干渉(即ち、2つ又はそれ以上のコード・シーケンスが同じデータ上で並列に動作すること)が検出されるかどうかを判断することができる。干渉が検出されない場合、440において、トランザクションは成功裏に結果をコミットすることができ、その後にそれを他のトランザクションにより使用することができる。しかしながら、435においてCPU114(図2)が干渉を検出した場合は、455において、実行はロックを用いて再開される。460において、クリティカル・セクションは、アクセスされるメモリ領域を保護するロックを明示的に取得しなければならない。しかしながら、ロック・リクエスタは、スピン(spinning)と呼ばれるアクションにおいて、ロックが競合プロセスにより解放されるまで、待機させられる場合がある。最終的に460においてロックを取得すると、クリティカル・セクションは処理を続行することができる。470において、ロックにより保護されるデータが更新されると、クリティカル・セクションは完了し、475においてロックを解放することができる。
図5を参照すると、参照符号500は、一般に、HLEサポートが存在する環境において競合予測器(即ち、ハードウェア・ロック・バーチャライザ)が実装されている、例示的な実施形態を示す。上述したように、HLEは、XACQUIRE及びXRELEASEを含む、Intel(登録商標)の従来の互換命令セット拡張であり、これは従来のロック・コードを使用するように書かれたプログラムが、コードを実質的に修正する必要なしにトランザクション実行を実装するハードウェアを利用する機会を可能にする。この実施形態においては、HLE予測器は、Intel(登録商標)HLEの特定の例である。
505において、CPU114(図2)は、Intel(登録商標)XACQUIREプリフィックス命令を実行して、関連したロック取得トランザクションでHLEシーケンスを開始する。一実施形態において、シーケンスは、XACQUIREの後にロック取得トランザクションが続くように表すことができる。幾つかの実装では、XACQUIREプリフィックスを無視することができる。他の実装では、XACQUIREシーケンスを選択的に実施することができる。HLE開始シーケンスの開始に続き、510において、競合予測器、即ちHLE予測器が呼び出される。予測に基づき、ロック無効化を行うことができる、又はロックを取得することができる。ロック無効化とロック取得との間の予測を行うと、処理は、図4の420〜475に説明されたものと実質的に同様に続行することができる。
図6を参照すると、参照符号600は、一般に、付加的なハードウェア・ファシリティが存在しない例示的な実施形態による、ロック無効化とロックとの間の選択を用いたデータの適応共有のための方法のフロー図を示す。この例示的な実施形態においては、例えば、オペレーティング・システムを通じて又はハードウェアにより、アプリケーション・プログラムのコード・ストリーム内に、競合予測器へのヒントを提供することができる。例えば、一実施形態において、プログラマーが1つ又は複数の命令を明示的に挿入してもよく、又は、コンパイラが挙動のヒントを競合予測器に暗黙的に挿入してもよい。競合予測器は、例えば1秒といったある期間にわたって、成功した予測及び成功しなかった予測、即ち予測ミスの両方の数を追跡するために履歴ベクトル又はカウントを保持することができる。次に、610において、競合予測器は、予測ミスのカウントを、時間窓中の失敗の閾値数と比較することができる。予測ミスが時間窓の間の失敗の閾値数を上回ると、競合予測器は、時間窓の残りについて、ロックを用いた実行、即ち非トランザクション・モードにデフォルト設定することができる。時間窓の間、メモリ領域は、例えば複数のトランザクションが競合するデータを同時に更新する際、ワークロード特性に起因して高競合状態になることがある。デフォルトとしてロックを一時的に選択することにより、競合予測器は、失敗したトランザクションを再開しなければならない可能性を回避し、トランザクション・アボートを回避することによりスループットを改善することができる。しかしながら、ひとたび時間窓が期間満了すると、メモリ領域のコンテンションは緩和している可能性があり、競合予測器は、トランザクション実行を再び試みることができる。1つの実施形態において、競合予測器はソフトウェアで実装され、ロックの無効化を実施するか又はロックを実施するかの決定は、ソフトウェア実装のアルゴリズムが、ロック無効化を実装する第1バージョンのコード、又は、ロック取得を実装する第2バージョンのコードに制御を渡すことによって行われる。他の実施形態においては、決定610は、干渉の履歴に基づき、ソフトウェアによる特定のエントリの更新の指示に応答して、更新トランザクションのターゲットであるフィールドに関連した予測される干渉又は不干渉を反映して、代替的なテストを用いて実装される。
655において、クリティカル・セクションは、アクセスされるメモリ領域を保護するロックを明示的に取得しなければならない。しかしながら、ロック・リクエスタは、スピンと呼ばれるアクションにおいて、競合するプロセスによりロックが解放されるまで、待機せざるを得ないことがある。660において最終的にロックを取得すると、クリティカル・セクションは処理を続行することができる。670においてロックにより保護されるデータが更新されると、675においてクリティカル・セクションが完了し、ロックを解放することができる。680において、CPU114(図2)は、時間窓の期間満了をチェックすることができる。時間窓が期間満了していない場合、次に680において、処理は終了する。しかしながら、時間窓が期間満了している場合、次に685において、失敗したトランザクション実行及び成功したトランザクション実行のカウントをリセットし、時間窓を有効にリセットし、競合予測器の再訓練を開始することができる。
予測ミスが、時間窓中の失敗の閾値数を上回らない場合、610において、競合予測器は、ロック無効化、即ち、HLEトランザクション、又は、ロック取得ではなくロック・ワードの明示的な読み取りと併せてロック無効化を実装するトランザクションを選択することができる。HLEトランザクションとして(又は、読み取りセット内のロック・ワードを含むトランザクションを実行することによりロック無効化を行うソフトウェア・トランザクションと併せてロック無効化を実装するトランザクションとして)実行することが選択されると、615において、CPU114(図2)は、成功したトランザクション実行のカウントをインクリメントすることができる。620におけるHLEトランザクションは、625において必要に応じてデータを更新することができる。630におけるトランザクションの終了後、しかし635において結果をコミットする前に、CPU114(図2)は、トランザクションのアボートをもたらす干渉(即ち、2つ又はそれ以上のコード・シーケンスが同じデータ上で並列に動作すること)が検出されるかどうかを判断することができる。干渉が検出されない場合、640において、HLEトランザクション(又はロック無効化を実装する他のトランザクション)は成功裏に結果をコミットすることができ、その後にそれを他のプロセスにより使用することができる。しかしながら、635においてCPU114(図2)が干渉を検出した場合、失敗したトランザクションは予測ミスとしてカウントされ、これを用いて競合予測器を訓練し、競合予測器の将来の予測をより正確にすることができるため、650において、失敗したトランザクション実行のカウントがインクリメントされる。655及び660において、CPU114(図2)はここで、メモリ領域に対するロックを取得し、クリティカル・セクションを非トランザクション的に、即ち、ロックを用いて再開しようと試みることができる。670において、ロックにより保護されるデータが最終的に更新されると、クリティカル・セクションの処理は完了し、675において、ロックを解放することができる。680において、CPU114(図2)は、時間窓の期間満了をチェックすることができる。時間窓が期間満了していない場合、次に680において処理は終了する。しかしながら、時間窓が期間満了している場合、次に685において、失敗したトランザクション実行及び成功したトランザクション実行のカウントをリセットすることができ、競合予測器の再訓練を有効に開始する。
ここで図7を参照すると、参照符号700は、一般に、データの適応共有のための方法が、ロックが実施されたときにハードウェア内に監視ファシリティを含むことができる、例示的な実施形態のフロー図を示す。図7において、HLEトランザクションの処理、即ち710乃至750は、図6の実施形態がHLEを処理する方法、即ち610乃至650と実質的に類似している。しかしながら、図7は、クリティカル・セクションが非トランザクション的に実行される経路について、ハードウェア・ロック監視ファシリティを導入する。この実施形態においては、ハードウェア・ロック監視ファシリティは、クリティカル・セクションが、ロックされたメモリ領域内での実行を可能にする間、クリティカル・セクションが実際にHLEトランザクションとして実行されたかのように結果を予測することによって、予測ミスを最小にしようと試みる。760及び765において成功裏にロックを取得すると、770において、ハードウェア・ロック監視ファシリティは、ロックの状態の監視を開始することができる。775において、クリティカル・セクションは、ロックされたメモリ領域内のデータを更新し、780において、ロックを解放することにより実行を終了する。しかしながら、実行中、785においてハードウェア・ロック監視ファシリティが、別のプロセスがロック・フラグのステータスをチェックし、次いでこのクリティカル・セクションが非トランザクション的ではなくトランザクションとして実行されていたことを検出した場合、他のプロセスにより試行されたアクセスは、干渉及びトランザクションの失敗をもたらした。一実施形態においては、ロックのみが監視される。別の実施形態においては、ロックされた領域の一部として更新されたデータが監視される。結果として、790において、ハードウェア・ロック監視ファシリティは、失敗したトランザクション実行のカウントをインクリメントすることができる。
別の実施形態において、ハードウェア・ロック監視ファシリティは、ロックされたメモリ領域内の全てのデータ・アクセスの試行を監視することができる。別のプロセスがこの領域内のデータにアクセスしようと試みた場合、次に790において、ハードウェア・ロック監視ファシリティは、これを干渉及び潜在的なトランザクション失敗としてカウントすることができる。従って、競合予測器は、トランザクション実行又は非トランザクション実行のどちらが成功する可能性が高いかについて、より正確に予測するよう学習することができる。
別の実施形態において、750において、トランザクション実行失敗のカウントがインクリメントされると、再開(restart)フラグを設定することができる。次に755において、成功したトランザクション実行のカウントがインクリメントされたとき、再開フラグをリセットすることができる。再開フラグは、失敗したトランザクション実行のカウントが2回、即ち、750におけるHLEトランザクションのような失敗時に1回、及び755におけるロックを用いた再開時に1回、インクリメントされることを防止することにより、予測精度を改善することができる。
ここで図8を参照すると、1つの実施形態において、Hardware Lock Elision(HLE)環境において、HLEトランザクションが実際にロックを取得し、非トランザクション的に実行すべきかどうかを予測的に決定すること810は、HLE lock−acquire命令に遭遇することに基づき、HLE予測器に基づいて、ロックを無効化し、HLEトランザクションとして進行させるか、又はロックを取得して非トランザクションとして進行させるかを決定すること820と、HLE予測器が無効化を行うと予測することに基づき、ロックのアドレスを、HLEトランザクションの読み取りセットとして設定し、lock−acquire命令によるロックへのあらゆる書き込みを抑止し、ロックを解放するxrelease命令に遭遇するまで、又はHLEトランザクションがトランザクション競合に遭遇するまで、HLEトランザクション実行モードで進行させること830と、HLE予測器が無効化を行わないと予測することに基づき、HLE lock−acquire命令を非HLE lock−acquire命令として扱い、非トランザクション・モードで進行させること840と、を含む。
ここで図9を参照すると、1つの実施形態において、HLE予測器を更新することは、HLEの予測の成功に基づく910。ロック・アドレスを有するHLEトランザクションに初めて遭遇したことに基づき、ロック・アドレスと関連付けられた成功したHLEトランザクション実行のカウントはゼロに初期化され、ロック・アドレスを有するいずれかの後のHLEトランザクションを完了することに基づき、HLE予測器において、HLEトランザクションのロック・アドレスと関連した失敗したHLEトランザクション実行のカウントをインクリメントし、ここで、高いカウントはアボートの可能性が高いことを示す920。非トランザクション・モードにおいて、別のプロセスによるロックへのアクセスの試行を監視し、他のプロセスによるアクセスの試行が検出された際、失敗したHLEトランザクションのカウントをインクリメントする950。時間窓内の成功したHLEトランザクション実行のカウント及び失敗したHLEトランザクション実行のカウントを追跡し、失敗したHLEトランザクション実行のカウントが失敗の閾値数を上回ることに基づき、時間窓の残りについて非トランザクション・モードにデフォルト設定する970。時間窓の期間満了に基づき、成功したHLEトランザクション実行のカウント及び失敗したHLEトランザクション実行のカウントは、ゼロにリセットされる960。
ここで図10を参照すると、コンピューティング・デバイス1000は、内部コンポーネント800及び外部コンポーネント900のそれぞれのセットを含むことができる。内部コンポーネント800のセットの各々は、1つ又は複数のバス826上の1つ又は複数のプロセッサ820、1つ又は複数のコンピュータ可読RAM822、及び1つ又は複数のコンピュータ可読ROM;1つ又は複数のオペレーティング・システム828;図5〜図7の方法を実行する1つ又は複数のソフトウェア・アプリケーション;及び1つ又は複数のコンピュータ可読有形ストレージ・デバイス830を含む。1つ又は複数のオペレーティング・システムは、それぞれのRAM822(一般的には、キャッシュ・メモリを含む)の1つ又は複数を介して、それぞれのプロセッサ820の1つ又は複数による実行のために、それぞれのコンピュータ可読有形ストレージ・デバイス830の1つ又は複数に格納される。図10に示される実施形態において、コンピュータ可読有形ストレージ・デバイス830の各々は、内蔵ハード・ドライブの磁気ディスク・ストレージ・デバイスである。代替的に、コンピュータ可読有形ストレージ・デバイス830の各々は、ROM824、EPROM、フラッシュ・メモリなどの半導体ストレージ・デバイス、又はコンピュータ・プログラム及びデジタル情報を格納することができるいずれかの他のコンピュータ可読有形ストレージ・デバイスである。
内部コンポーネント800の各セットはまた、シン・プロビジョニング・ストレージ・デバイス、CD−ROM、DVD、SSD、メモリ・スティック、磁気テープ、磁気ディスク、光ディスク、又は半導体ストレージ・デバイスといった、1つ又は複数のコンピュータ可読有形ストレージ・デバイス936との間で読み書きを行うためのR/Wドライブ又はインターフェース832も含む。R/Wドライブ又はインターフェース832は、コンピューティング・デバイス1000のコンポーネントとの通信を容易にするために、デバイス・ドライバ840ファームウェア、ソフトウェア、又はマイクロコードを有形ストレージ・デバイス936にロードするために使用することができる。
内部コンポーネント800の各セットはまた、TCP/IPアダプタ・カード、無線WI−FIインターフェース・カード、又は3G若しくは4G無線インターフェース・カード、又は他の有線若しくは無線通信リンクといったネットワーク・アダプタ(又はスイッチ・ポート・カード)又はインターフェース836も含む。コンピューティング・デバイス1000と関連付けられたオペレーティング・システム828は、ネットワーク(例えば、インターネット、ローカル・エリア・ネットワーク、又は広域ネットワーク)及びそれぞれのネットワーク・アダプタ又はインターフェース836を介して、外部コンピュータ(例えば、サーバ)からコンピューティング・デバイス1000にダウンロードすることができる。ネットワーク・アダプタ(又はスイッチ・ポート・アダプタ)又はインターフェース836から、コンピューティング・デバイス1000と関連付けられたオペレーティング・システム828が、それぞれのハード・ドライブ830及びネットワーク・アダプタ836内にロードされる。ネットワークは、銅線、光ファイバ、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ、及び/又はエッジ・サーバを含むことができる。
外部コンポーネント900のセットの各々は、コンピュータ・ディスプレイ・モニタ920、キーボード930、及びコンピュータ・マウス934を含むことができる。外部コンポーネント900はまた、タッチスクリーン、仮想キーボード、タッチパッド、ポインティング・デバイス、及び他のヒューマン・インターフェース・デバイスを含むこともできる。内部コンポーネント800のセットの各々はまた、コンピュータ・ディスプレイ・モニタ920、キーボード930、及びコンピュータ・マウス934にインターフェース接続するためのデバイス・ドライバ840を含むこともできる。デバイス・ドライバ840、R/Wドライブ又はインターフェース832、及びネットワーク・アダプタ又はインターフェース836は、ハードウェア及びソフトウェア(ストレージ・デバイス830及び/又はROM824内に格納される)を含む。
本開示の種々の実施形態は、システム・バスを通じてメモリ要素に直接又は間接的に結合された少なくとも1つのプロセッサを含むプログラム・コードを格納及び/又は実行するのに適したデータ処理システム内で実装することができる。メモリ要素は、例えば、プログラム・コードの実際の実行中に用いられるローカル・メモリ、大容量記憶装置、及び実行中に大容量記憶装置からコードを取り出さなければならない回数を減らすために少なくとも一部のプログラム・コードを一時的に格納するキャッシュ。メモリを含む。
入力/出力又はI/Oデバイス(これらに限定されるものではないが、キーボード、ディスプレイ、ポインティング・デバイス、DASD、テープ、CD、DVD、サムドライブ及び他のメモリ媒体等を含む)を、直接又は介在するI/Oコントローラを通じてシステムに結合することができる。ネットワーク・アダプタをシステムに結合して、データ処理システムが、介在する私的又は公衆ネットワークを通じて他のデータ処理システム又は遠隔プリンタ又はストレージ・デバイスに結合されるようになるのを可能にもできる。モデム、ケーブル・モデム及びイーサネットは、利用可能なタイプのネットワーク・アダプタのほんのわずかにすぎない。
本発明は、システム、方法、及び/又はコンピュータ・プログラム製品とすることができる。コンピュータ・プログラム製品は、プロセッサに本発明の態様を実施させるためのコンピュータ可読プログラム命令をそこに有するコンピュータ可読ストレージ媒体(単数又は複数)を含むことができる。
コンピュータ可読ストレージ媒体は、命令実行デバイスにより使用される命令を保持し、格納することができる有形デバイスとすることができる。コンピュータ可読ストレージ媒体は、例えば、これらに限定されるものではないが、電子記憶装置、磁気記憶装置、光記憶装置、電磁気記憶装置、半導体記憶装置、又は上記のいずれかの適切な組み合わせとすることができる。コンピュータ可読ストレージ媒体のより具体的な例の非網羅的なリストとして、以下のもの:即ち、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み出し専用メモリ(ROM)、消去可能なプログラム可能読み出し専用メモリ(EPROM又はフラッシュ・メモリ)、スタティック・ランダム・アクセス・メモリ(SRAM)、ポータブル、コンパクト・ディスク読み出し専用メモリ(CD−ROM)、デジタル多用途ディスク(DVD)、メモリ・スティック、フロッピー・ディスク、パンチカード若しくはそこに命令が記録された溝内の***構造などの機械的符号化デバイス、及び上記のいずれかの適切な組み合わせが挙げられる。本明細書で使用される場合、コンピュータ可読ストレージ媒体は、電波又は他の自由に伝搬する電磁波、導波路若しくは他の伝送媒体を通じて伝搬する電磁波(例えば、光ファイバ・ケーブルを通る光パルス)、又は配線を通じて伝送される電気信号のような、一時的信号それ自体として解釈されるべきではない。
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読ストレージ媒体からそれぞれのコンピュータピューティング/処理デバイスに、又は、例えばインターネット、ローカル・エリア・ネットワーク、広域ネットワーク、及び/又は無線ネットワークなどのネットワークを介して外部コンピュータ若しくは外部ストレージ・デバイスにダウンロードすることができる。ネットワークは、銅製伝送ケーブル、光伝送ケーブル、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ、及び/又はエッジ・サーバを含むことができる。各コンピューティング/処理デバイス内のネットワーク・アダプタ・カード又はネットワーク・インターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング/処理デバイス内のコンピュータ可読ストレージ媒体内に格納するためにコンピュータ可読プログラム命令を転送する。
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セット・アーキテクチャ(ISA)命令、マシン命令、マシン依存命令、ミリコード、ファームウェア命令、状態設定データ、又はJava、Smalltalk、C++等などのオブジェクト指向型プログラミング言語、及び、「C」プログラミング言語、若しくは同様のプログラミング言語のような従来の手続き型プログラミング言語を含む1つ又は複数のプログラミング言語のいずれかの組み合わせで書かれたソース・コード若しくはオブジェクト・コードのいずれかとすることができる。コンピュータ可読プログラム命令は、完全にユーザのコンピュータ上で実行される場合もあり、スタンドアロンのソフトウェア・パッケージとして、一部がユーザのコンピュータ上で実行される場合もあり、一部がユーザのコンピュータ上で実行され、一部が遠隔コンピュータ上で実行される場合もあり、又は完全に遠隔コンピュータ若しくはサーバ上で実行される場合もある。最後のシナリオにおいては、遠隔コンピュータは、ローカル・エリア・ネットワーク(LAN)若しくは広域ネットワーク(WAN)を含むいずれかのタイプのネットワークを通じてユーザのコンピュータに接続される場合もあり、又は外部コンピュータへの接続がなされる場合もある(例えば、インターネット・サービス・プロバイダを用いたインターネットを通じて)。幾つかの実施形態において、例えば、プログラム可能論理回路、フィールド・プログラマブル・ゲート・アレイ(FPGA)、又はプログラム可能論理アレイ(PLA)を含む電子回路は、本発明の態様を実施するために、コンピュータ可読プログラム命令の状態情報を用いて電子回路を個人化することにより、コンピュータ可読プログラム命令を実行することができる。
本発明の態様は、本発明の実施形態による方法、装置(システム)及びコンピュータ・プログラム製品のフローチャート図及び/又はブロック図を参照して、本明細書で説明される。フローチャート図及び/又はブロック図の各ブロック、並びにフローチャート図及び/又はブロック図内のブロックの組み合わせは、コンピュータ可読プログラム命令によって実装できることが理解されるであろう。
これらのコンピュータ可読プログラム命令を、汎用コンピュータ、専用コンピュータ、又は他のプログラム可能データ処理装置のプロセッサに与えてマシンを製造し、それにより、コンピュータ又は他のプログラム可能データ処理装置のプロセッサによって実行される命令が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実装するための手段を作り出すようにすることができる。これらのコンピュータ可読プログラム命令を、コンピュータ、プログラム可能データ処理装置、及び/又は他のデバイスを特定の方式で機能させるように指示することができるコンピュータ可読媒体内に格納し、それにより、内部に命令が格納されたコンピュータ可読ストレージ媒体が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実装する命令を含む製品を製造するようにすることもできる。
コンピュータ・プログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上にロードして、一連の動作ステップをコンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上で行わせてコンピュータ実施のプロセスを生成し、それにより、コンピュータ又は他のプログラム可能装置、又は他のデバイス上で実行される命令が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実行するためのプロセスを提供するようにもできる。
図面内のフローチャート及びブロック図は、本発明の種々の実施形態によるシステム、方法及びコンピュータ・プログラム製品の可能な実装のアーキテクチャ、機能及び動作を示す。この点に関して、フローチャート又はブロック図内の各ブロックは、指定された論理機能を実装するための1つ又は複数の実行可能命令を含むモジュール、セグメント、又は命令の部分を表すことができる。幾つかの代替的な実装において、ブロック内に記載された機能は、図面内に記載された順序とは異なる順序で行われ得ることもある。例えば、連続して示された2つのブロックが、関与する機能に応じて、実際には、実質的に同時に実行されることもあり、又は、ときにはブロックが逆順に実行されることもある。また、ブロック図及び/又はフローチャート図の各ブロック、並びにブロック図及び/又はフローチャート図内のブロックの組み合わせは、指定された機能又は動作を行う専用ハードウェア・ベースのシステムによって、又は専用ハードウェアとコンピュータ命令との組み合わせによって実装できることにも留意されたい。
好ましい実施形態が本明細書に詳細に示され、説明されたが、当業者には、本開示の趣旨から逸脱することなく、種々の修正、付加、置換等を行うことができることが明らかであり、従って、これらは以下の特許請求の範囲内に定められるような本開示の趣旨の範囲内にあると考えられる。