マルチプロセッサ・システムは、分散共有メモリのシステムにおける全てのキャッシュ間の一貫性を維持するために、コヒーレンス・プロトコルを使用する。特定のキャッシュのデータに対して要求がなされると、キャッシュはデータを発行し、データをそれ以上有していない又はデータは排他的に保持されていないというその状態を更新する。プロセッサがトランザクション実行にあり、トランザクションの部分であるそのキャッシュからのデータが要求された場合、プロセッサはトランザクションをアボートし、データを送る。
要求が別のトランザクションのアボートを引き起こしたかどうかの情報は与えられない。幾つかの例では、オリジナルのリクエスタ(要求側)に、要求が別のトランザクションに影響を与えたかどうかを通知してフィードバックを与え、リクエスタのオリジネータが、その実行に適合すること、例えば、ライブロック・シナリオを検出し、そのシナリオに対処することを可能にすることが望ましい。
実施形態によると、コヒーレンス・プロトコルが、トランザクション・ステータスについての付加的な情報を含むように拡張される。プロセッサがトランザクション実行にあり、例えば、データがトランザクション読み出し又は書き込みセットの部分であり、競合が検出されるために、コヒーレンス要求がその実行のアボートを引き起こすことがある。コヒーレンス・プロトコル要求は、実施形態によるトランザクション実行の際にそれ(コヒーレンス要求を受け取るプロセッサ)がトランザクションをアボートした付加的な情報を有するように拡張される。
その全体が引用により本明細書に組み入れられる非特許文献1は、例示的な縮小命令セット・コンピュータ(reduced instruction set computer、RISC)命令セット・アーキテクチャ(ISA)を教示する。また、その全体が引用により本明細書に組み入れられる非特許文献2は、例示的なCISC(complex instruction set computer)命令セット・アーキテクチャを開示する。
従来、コンピュータ・システム又はプロセッサは、シングル・プロセッサ(別名、処理ユニット又は中央処理ユニット)しか有していなかった。プロセッサは、命令処理ユニット(IPU)、分岐ユニット、メモリ制御ユニット等を含んでいた。こうしたプロセッサは、一度に単一のプログラム・スレッドを実行することができた。一定の期間プロセッサ上で実行されるようにプログラムをディスパッチし、次に、別の期間プロセッサ上で実行されるように別のプログラムをディスパッチすることによって、プロセッサを時分割する(time-share)ことが可能なオペレーティング・システムが開発された。技術が発展すると、メモリ・サブシステム・キャッシュ、並びに変換ルックアサイド・バッファ(TLB)を含む複雑な動的アドレス変換が、プロセッサに付加されることが多くなった。IPU自体が、多くの場合、プロセッサと呼ばれた。技術が発展し続けると、プロセッサ全体を単一の半導体チップ又はダイとしてパッケージ化できるようになり、こうしたプロセッサは、マイクロプロセッサと呼ばれた。その後、複数のIPUを組み入れたプロセッサが開発され、こうしたプロセッサは、多くの場合、マルチプロセッサと呼ばれた。マルチプロセッサ・コンピュータ・システム(プロセッサ)のこうしたプロセッサの各々は、個々の又は共有のキャッシュ、メモリ・インターフェース、システム・バス、アドレス変換機構等を含むことができる。仮想マシン及び命令セット・アーキテクチャ(instruction set architecture、ISA)エミュレータは、ソフトウェアの層をプロセッサに付加し、シングル・ハードウェア・プロセッサ内にシングルIPUのタイムスライスを使用することにより、複数の「仮想プロセッサ」(別名、プロセッサ)を有する仮想マシンを提供した。技術がさらに発展すると、マルチスレッド・プロセッサが開発され、シングル・マルチスレッドIPUを有するシングル・ハードウェア・プロセッサが異なるプログラムのスレッドを同時に実行する能力を提供することを可能にし、従って、コンピュータ・システムには、マルチスレッド・プロセッサの各スレッドが1つのプロセッサとして見えるようになった。技術がさらに発展すると、単一の半導体チップ又はダイ上に複数のプロセッサ(各々がIPUを有する)をのせることが可能になった。これらのプロセッサは、プロセッサ・コア、又は単にコアと呼ばれた。従って、例えば、プロセッサ、中央処理ユニット、処理ユニット、マイクロプロセッサ、コア、プロセッサ・コア、プロセッサ・スレッド及びスレッドといった用語は、交換可能に使用されることが多い。本明細書における実施形態の態様は、本明細書での教示から逸脱することなく、上に示されるものを含むいずれかの又は全てのプロセッサによって実施することができる。「スレッド」又は「プロセッサ・スレッド」という用語が本明細書で用いられる場合、実施形態の特定の利点は、プロセッサ・スレッドの実装において有することができたと考えられる。
Intel(登録商標)ベースの実施形態におけるトランザクション実行
その全体が引用により組み入れられる非特許文献3において、第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がアボートするかを決定するための競合解消ポリシーは、実装固有である。
一般的なトランザクション実行の実施形態:
その全体が引用により組み入れられる非特許文献4によれば、基本的に、アトミックな及び分離された(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(図1においては、各々のCPU114a、114b及びその関連したキャッシュは、112a、112bと呼ばれる)によって動作されるメモリ位置のデータ(オペランド)をキャッシュするためのTMをサポートするデータ・キャッシュ118a、118bとから成る分割キャッシュ(split cache)を有することができる。1つの実装において、複数のダイ100のキャッシュが相互接続され、複数のダイ100のキャッシュ間のキャッシュ・コヒーレンシをサポートする。1つの実装においては、分割キャッシュではなく単一のキャッシュが使用され、命令及びデータの両方を保持する。1つの実装においては、CPUキャッシュは、階層キャッシュ構造におけるキャッシュ・レベル1である。例えば、各ダイ100は、共有キャッシュ124を、ダイ100上の全てのCPU間で共有されるように使用することができる。別の実装においては、各ダイは、全てのダイ100の全てのプロセッサの間で共有される共有キャッシュ124へのアクセスを有することができる。
図2は、TMをサポートするための追加物を含む、例示的なトランザクションCPU114の詳細を示す。トランザクションCPU(プロセッサ)114は、レジスタ・チェックポイント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)を含むように修正する必要があり、性能を損なう可能性がある。多くの不要なバリアを取り除くために多大な努力が費やされてきたが、こうした技術は複雑であることが多く、性能は、通常、ハードウェアTMのものに比べてはるかに低い。
表2は、トランザクション・メモリの基本的な設計空間を示す(バーショニング及び競合検出)。
Eager−悲観的(EP)
後述するこの最初のTM設計は、Eager−悲観的として知られる。EPシステムは、その書き込みセットを「イン・プレースに」格納し(従って、「eager」の名がある)、かつ、ロールバックをサポートするために、上書きされたラインの古い値を「undoログ」に格納する。プロセッサは、W138キャッシュ・ビット及びR132キャッシュ・ビットを用いて、読み取り及び書き込みセットを追跡し、スヌープした(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))、必要に応じてロード・ミスを発行するが、R132ビットも設定される。同様に、ラインの書き込みに、標準的遷移が適用され(S→M、E→I、I→M)、必要に応じてミスを発行するが、加えてW(書き込み)138ビットも設定する。現トランザクションがアボートした場合には、ラインが初めて書き込まれる際、ライン全体の古いバージョンをロードし、次に、undoログに書き込んで保存する。次に、新しく書き込まれたデータが、古いデータの上に「イン・プレースに」格納される。
競合検出:悲観的競合検出は、ミス、又はアップグレード時に交換されるコヒーレンス・メッセージを用いて、トランザクション間の競合を探す。トランザクション内で読み取りミスが発生すると、他のプロセッサはロード要求を受信するが、それらが必要とされるラインを有していない場合には、この要求を無視する。他のプロセッサが、必要とされるラインを非投機的に有する又はラインR132(読み取り)を有する場合、このラインをSにダウングレードし、ある場合には、それらがMESI 130のM又はE状態でラインを有する場合、キャッシュ間転送(cash-to-cash transfer)を発行する。しかしながら、キャッシュがラインW138を有する場合には、2つのトランザクション間に競合が検出され、追加のアクションを取らなければならない。
同様に、(最初の書き込み時に)トランザクションがラインをsharedからmodifiedにアップグレードしようとした際、トランザクションは、競合の検出にも使用される排他的ロード要求を発行する。受信しているキャッシュがラインを非投機的に有する場合、次に、そのラインは無効にされ、特定の場合には、キャッシュ間転送(M又はE状態)が発行される。しかしながら、このラインがR132又はW138である場合には、競合が検出される。
妥当性検査:競合検出はあらゆるロードで実施されるので、トランザクションは常に、それぞれの書き込みセットに対する排他的アクセスを有する。従って、妥当性検査は、いずれの付加的な作業も必要としない。
コミット:eagerバージョニングはデータ項目の新たなバージョンをイン・プレースに格納するので、コミット・プロセスは、単にW138ビット及びR132ビットをクリアし、undoログを廃棄する。
アボート:トランザクションがロールバックすると、undoログ内の各キャッシュラインのオリジナルのバージョンを復元しなければならず、プロセスは、ログの「アンロール(unrolling)」又は「適用」と呼ばれる。これは、tm_discard()の間に行われ、他のトランザクションに関してアトミックでなければならない。具体的には、競合を検出するために、書き込みセットを依然として使用しなければならない:このトランザクションは、そのundoログ内にラインの正しいバージョンのみを有し、要求トランザクションは、そのログから正しいバージョンを復元するのを待たなくてはならない。こうしたログは、ハードウェア状態マシン又はソフトウェア・アボート・ハンドラを用いて適用することができる。
Eager−悲観的は、以下の特徴を有する:コミットは単純であり、イン・プレースにあるため非常に高速である。同様に、妥当性検査はノー・オペレーション(no−op)である。悲観的競合検出は、競合を早期に検出し、それにより、「失敗させられた(doomed)」トランザクションの数が減少する。例えば、2つのトランザクションが、Write−After−Read依存関係に関与する場合、その依存関係は、悲観的競合検出において瞬時に検出される。しかしながら、楽観的競合検出においては、ライタ(writer)がコミットするまで、そうした競合は検出されない。
Eager−悲観的はまた、以下の特徴も有する:上述したように、初めてキャッシュラインに書き込まれる際、古い値をログに書き込む必要があり、余分なキャッシュ・アクセスを招く。アボートはログの取り消し(undo)を必要とするため、費用がかかる。ロードは、ログ内のキャッシュラインごとに発行しなければならず、恐らく、次のラインに進む前にメインメモリまで前進する。悲観的競合検出はまた、特定のシリアル化可能なスケジュールの存在を防止する。
さらに、競合は、それらが発生した時に処理されるので、ライブロック(livelock)の可能性があり、前方進行を保証するために、慎重なコンテンション管理機構を利用しなければならない。
Lazy−楽観的(LO)
別の一般的なTM設計は、Lazy−楽観的(LO)であり、これは、その書き込みセットを「書き込みバッファ」又は「redoログ」に格納し、コミット時に競合を検出する(依然として、R132及びW138ビットを使用する)。
バージョニング:EPシステムと同様に、LO設計のMESIプロトコルが、トランザクションの外側で実施される。トランザクションの内部に入ると、ラインの読み取りは標準的MESI遷移を招くが、同様にR132ビットも設定する。同様に、ラインの書き込みは、ラインのW138ビットを設定するが、LO設計のMESI遷移の処理は、EP設計のものとは異なる。第1に、lazyバージョニングにおいては、書き込まれたデータの新しいバージョンは、コミットまでキャッシュ階層に格納されるが、他のトランザクションは、メモリ又は他のキャッシュにおいて利用可能な古いバージョンにアクセスすることができる。古いバージョンを利用可能にするために、トランザクションによる最初の書き込み時に、ダーティ・ライン(Mライン)を無効化しなければならない。第2に、楽観的競合検出の特徴のため、アップグレード・ミスは必要とされない:競合検出はコミット時に行われるので、トランザクションがS状態のラインを有する場合、トランザクションは単にラインに書き込み、変更を他のトランザクションと通信することなく、そのラインをM状態にアップグレードするだけでよい。
競合検出及び妥当性検査:トランザクションを検証し、競合を検出するために、LOは、コミットの準備をしているときのみ、投機的に修正されたラインのアドレスを他のトランザクションに通信する。妥当性検査において、プロセッサは、書き込みセット内の全てのアドレスを含む、1つの、恐らくは大容量の、ネットワーク・パケットを送信する。データは送信されないが、コミッタ(committer)のキャッシュ内に残され、ダーティ(M)とマーク付けされる。Wとマーク付けされたラインを求めてキャッシュを検索することなくこのパケットを構築するために、これらの投機的に修正されたラインを追跡するために、キャッシュラインごとに1ビットを有する、「ストア・バッファ」と呼ばれる簡潔ビットベクトル(simple bit vector)を使用する。他のトランザクションは、このアドレス・パケットを使用して競合を検出する:アドレスがキャッシュ内に見つかり、R132ビット及び/又はW138ビットが設定された場合、競合が開始される。ラインは見つかったが、R132もW138も設定されない場合には、ラインは単に無効にされ、これは排他的ロードの処理に類似している。
トランザクションのアトミック性をサポートするために、これらのアドレス・パケットをアトミックに処理しなければならない、即ち、同じアドレスに対して2つのアドレス・パケットが同時に存在することはできない。LOシステムにおいては、これは、アドレス・パケットを送信する前に、単にグローバル・コミット・トークンを獲得することにより達成することができる。しかしながら、最初にアドレス・パケットを送信し、応答を収集し、順序付けプロトコルを実施し(恐らく最も古いトランザクションを先頭に)、そして、全ての応答が満たされた場合にコミットすることによって、2段階コミット・スキームを用いることもできる。
コミット:ひとたび妥当性検査が行われると、コミットは、いかなる特別な処理も必要とせず、単にW138ビット及びR132ビット、並びにストア・バッファをクリアするだけである。トランザクションの書き込みは既にキャッシュ内でダーティとしてマーク付けされており、これらのラインの他のキャッシュのコピーは、アドレス・パケットにより無効にされる。次に、他のプロセッサは、通常のコヒーレンス・プロトコルを通じてコミットされたデータにアクセスすることができる。
アボート:ロールバックは等しく容易である:書き込みセットがローカル・キャッシュ内に含まれているので、これらのラインを無効にすることができ、次に、W138ビット及びR132ビット、並びにストア・バッファをクリアする。ストア・バッファは、キャッシュを検索する必要なしに、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におけるように、コミットは、特別な処理を必要としない:単にW138ビット及びR132ビット、並びにストア・バッファをクリアするだけである。
アボート:ロールバックもまた、LOのものに類似している:単にストア・バッファを用いて書き込みセットを無効にし、Wビット及びRビット、並びにストア・バッファをクリアするだけである。
LPは、以下の特徴を有する:LOと同様に、アボートは非常に高速である。EPと同様に、悲観的競合検出の使用により、「失敗させられた」トランザクションの数が低減する。EPと同様に、一部のシリアル化可能なスケジュールは許容されず、キャッシュ・ミスごとに競合検出を実施しなければならない。
Eager−楽観的(EO)
バージョニングと競合検出の最終的な組み合わせは、Eager−楽観的(EO)である。EOはHTMシステムにとって最適とはいえない選択肢であり得る:新しいトランザクション・バージョンはイン・プレースに書き込まれるので、競合の発生時に(即ち、キャッシュ・ミスの発生時に)競合に気付かざるを得ない。しかしながら、EOはコミット時まで競合の検出を待つので、これらのトランザクションは「ゾンビー(zombie)」になり、実行を続行し、リソースを浪費し、しかもアボートする「運命にある」。
EOは、STMにおいて有用であることが分かっており、Bartok−STM及びMcRTにより実装される。lazyバージョニングSTMは、読み取りごとに書き込みバッファをチェックし、最新の値を読み取っていることを保証する必要がある。書き込みバッファはハードウェア構造ではないので、高価であり、従って、write−in−placeを好む。付加的に、競合のチェックもまた、ソフトウェアTMにおいて高価であるので、楽観的競合検出は、この操作をまとめて実行する利点をもたらす。
コンテンション管理
ひとたびシステムがそのトランザクションのアボートを決定すると、トランザクションがどのようにロールバックするかについて上述したが、競合には2つのトランザクションが関与するので、どのトランザクションをアボートすべきか、そのアボートをどのように開始すべきか、及びアボートされたトランザクションをいつ再試行すべきかのトピックを検討する必要がある。これらは、トランザクション・メモリの重要なコンポーネントである、コンテンション管理(CM)により対処されるトピックである。システムがどのようにアボートを開始するか、及び、競合においてどのトランザクションをアボートすべきかを管理する種々の確立された方法が後述される。
コンテンション管理ポリシー
コンテンション管理(CM)ポリシーは、競合に関与するどのトランザクションをアボートすべきか、及び、アボートされたトランザクションをいつ再試行すべきかを決定する機構である。例えば、アボートされたトランザクションを瞬時に再試行することが最良の性能につながらない場合が多い。逆に、アボートされたトランザクションの再試行を遅延させるバックオフ機構を用いるが、より良い性能をもたらすことがある。STMは最初に最良のコンテンション管理ポリシーを見出すことに取り組んでおり、以下に概説したポリシーの多くは、もともとソフトウェアTM向けに開発されたものである。
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」という名称の特許文献1は、少なくとも第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)を導入し、その全体が引用により本明細書に組み入れられる非特許文献5に部分的に説明される。
表3は、例示的なトランザクションを示す。例えば他のCPUとの競合の繰り返しが原因で、あらゆる実行の試行においてアボート条件に遭遇し得るので、TBEGINで開始されたトランザクションが、TENDで常に成功裏に完了することは保証されない。このことは、プログラムが、例えば従来のロック・スキームを用いることにより、同じ操作を非トランザクション的に実行するためにフォールバック経路をサポートすることを必要とする。このことは、特にフォールバック経路が信頼できるコンパイラによって自動的に生成されない場合、プログラミング及びソフトウェア検証チームに著しい負担をかける。
アボートされたトランザクション実行(TX)のトランザクションに対してフォールバック経路を提供する要件は、負担になり得る。共有データ構造で動作する多くのトランザクションは短いものであり、ぼんの数個の個別メモリ位置にタッチし、単純な命令しか使用しないと考えられる。これらのトランザクションに対して、IBM zEnterprise EC12は、制約付き(constrained)トランザクションの概念を導入する。通常の条件下で、CPU114は、制約付きトランザクションが、たとえ必要な再試行の数に厳密な制限を与えなくても最終的に成功裏に終了することを保証する。制約付きトランザクションは、TBEGINC命令で開始し、通常のTENDで終了する。制約付きトランザクション又は制約なしトランザクションとしてのタスクの実装は、一般的に、極めて匹敵する機能をもたらすが、制約付きトランザクションは、フォールバック経路に対する必要性を取り除くことにより、ソフトウェア開発を簡単化する。IBMのトランザクション実行アーキテクチャは、その全体が引用により本明細書に組み入れられる非特許文献2にさらに説明される。
制約付きトランザクションは、TBEGINC命令で開始する。TBEGINCで開始されたトランザクションは、プログラミング上の制約のリストに従わなければならない。そうでない場合には、プログラムはフィルタリング可能でない制約違反割り込み(non-filterable constraint-violation interruption)を利用する。例示的な制約として、これらに限定されるものではないが、トランザクションは最大32個の命令を実行することができる、全ての命令テキストはメモリの連続した256バイトの範囲内になければならない、トランザクションは前方を指示する相対分岐のみを含む(即ち、ループ又はサブルーチン呼び出しはない)、トランザクションはメモリの最大4つの位置合わせされたオクトワード(オクトワードは32バイトである)にアクセスすることができる、及び10進演算又は浮動小数点数演算のような複雑な命令を除外するための命令セットの制限を挙げることができる。最大4つの位置合わせされたオクトワードをターゲットにするアトミックcompare−and−swapの非常に強力な概念を含む、二重連結リスト(doubly linked list)−挿入/削除演算のような多くの一般的な演算を実行できるように、制約が選択される。同時に、制約は、将来のCPU実装が、制約の調整を必要とせずにトランザクションの成功を保証できるように保守的に選択されるが、それは、そうでない場合にソフトウェアの非互換性を招くためである。
TBEGINCは、浮動小数点数レジスタ(FPR)制御及びプログラム割り込みフィルタリング・フィールドが存在せず、制御はゼロであると見なされる点を除いて、大部分は、TSXにおけるXBEGIN又はIBM(登録商標)のzEC12サーバ上のXBEGINのように挙動する。トランザクションがアボートすると、命令アドレスは、制約付きトランザクションについての即時再試行及びアボート経路の不存在を反映して、命令の後ではなく、直接TBEGINCに戻される。
ネスト化されたトランザクションは、制約付きトランザクション内で許容されないが、TBEGINCが非制約付きトランザクション内で行われた場合には、TBEGINと同様に新しい非制約付きネスト・レベルを開くものとして扱われる。このことは、例えば、非制約付きトランザクションが制約付きトランザクションを内部で使用するサブルーチンを呼び出した場合などに起こり得る。
割り込みフィルタリングは暗黙的にオフにされるので、制約付きトランザクション中の全ての例外は、オペレーティング・システム(OS)への割り込みをもたらす。最終的なトランザクションの終了の成功は、いずれかの制約付きトランザクションによりタッチされたせいぜい4ページをページインするOSの能力に依存する。OSはまた、トランザクションが完了するのを可能にするのに十分に長いタイムスライスも保証しなければならない。
表4は、制約付きトランザクションが他のロック・ベースのコードと対話しないと仮定する、表3のコードの制約付きトランザクション実装を示す。従って、ロック・テストは示されないが、制約付きトランザクションとロック・ベースのコードが混合された場合には、これを付加することができる。
失敗が繰り返し起こった場合、ソフトウェア・エミュレーションが、システム・ファームウェアの一部としてミリコードを用いて実施される。有利なことに、プログラマーから負担が取り除かれるので、制約付きトランザクションは所望の特性を有する。
図3を参照すると、IBM zEnterprise EC12プロセッサは、トランザクション実行ファシリティを導入した。このプロセッサは、クロックサイクルごとに3つの命令をデコードすることができる。即ち、単純な命令は、単一のmicro−op(マイクロ・オペレーション)としてディスパッチされ、より複雑な命令は、複数のmicro−opに分割される。micro−op(Uops232b)が、統合された発行キュー216に書き込まれ、そこから、それらをアウト・オブ・オーダー式に発行することができる。サイクルごとに、最大2つの固定小数点数命令、1つの浮動小数点数命令、2つのロード/ストア命令、及び2つの分岐命令を実行することができる。グローバル完了テーブル(GCT)232は、あらゆるmicro−op及びトランザクション・ネスト化深さ(transaction nesting depth、TND)232aを保持する。GCT232は、デコード時にイン・オーダー式に書き込まれ、各micro−op232bの実行ステータスを追跡し、最も古い命令グループの全てのmicro−op232bが成功裏に実行されると、命令を完了する。
レベル1(L1)データ・キャッシュ240は、256バイトのキャッシュライン及び4サイクルの使用待ち時間を有する96KB(キロバイト)の6ウェイ・アソシアティブ・キャッシュ(6-way associative cache)であり、L1 240ミスに対して7サイクルの使用待ち時間ペナルティを有して、プライベート1MB(メガバイト)の8ウェイ・アソシアティブ第2レベル(L2)データ・キャッシュ268に結合される。L1 240キャッシュは、プロセッサに最も近いキャッシュであり、Lnキャッシュは、第n番目のキャッシュ・レベルのキャッシュである。L1 240キャッシュ及びL2 268キャッシュの両方とも、ストアスルー(store through)方式である。各々の中央処理装置(CP)チップ上の6つのコアは、48MBの第3レベル・ストアイン(store-in)方式キャッシュを共有し、6つのCPチップは、ガラス・セラミック・マルチチップ・モジュール(MCM)上に一緒にパッケージ化されたオフ・チップの384MBの第4レベル・キャッシュに接続される。最大4つのマルチチップ・モジュール(MCM)を、最大144個のコアを有するコヒーレントな対称マルチプロセッサ(SMP)システムに接続することができる(顧客のワークロードを実行するのに全てのコアが利用可能とは限らない)。
コヒーレンシは、MESIプロトコルの変形により管理される。キャッシュラインは、読み取り専用(shared)又はexclusiveで所有することができ、L1 240及びL2 268はストアスルー方式であり、従って、ダーティラインを含まない。L3 272及びL4のキャッシュ(図示せず)はストアイン方式であり、ダーティ状態を追跡する。各キャッシュは接続された全ての下位レベルのキャッシュを含む。
コヒーレンシ要求は「相互問い合わせ」(cross interrogate、XI)と呼ばれ、上位レベルのキャッシュから下位レベルのキャッシュにかつL4間で階層的に送信される。1つのコアがL1 240及びL2 268をミスし、ローカルL3 272からキャッシュラインを要求すると、L3 272は、L3がこのラインを所有するかどうかをチェックし、必要に応じて、コヒーレンシを保証するために、そのL3 272下で現在所有しているL2 268/L1 240にXIを送信してから、キャッシュラインを要求側に戻す。要求がL3 272もミスした場合、L3 272は要求をL4(図示せず)に送信し、L4は、XIをそのL4下の全ての必要なL3及び近隣のL4に送信することによって、コヒーレンシを実施する。次に、L4は要求中のL3に応答し、L3は応答をL2 268/L1 240に転送する。
キャッシュ階層の包含の規則のために、要求から他のキャッシュラインへのアソシアティビティ・オーバーフローにより引き起こされた上位レベルのキャッシュに対するエビクション(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/L2 268はストアスルー方式であるが、ストア・キュー内に、排他的状態をダウングレードする前にL3に送信する必要があるストアを有する場合には、demote−XI及びexclusive−XIを拒否することができる。拒否されたXIは、送信者により繰り返される。Read−only−XIは、ラインを読み取り専用で所有するキャッシュに送信され、こうしたXIを拒否することができないので、こうしたXIに対して応答は必要ない。SMPプロトコルの詳細は、その全体が引用により本明細書に組み入れられる非特許文献6により、IBM z10に関して説明されるものと類似している。
トランザクション命令の実行
図3は、CPU114及びこれが対話するキャッシュ/コンポーネント(図1及び図2に示されるもののような)を含む、例示的なCPU環境112の例示的なコンポーネントを示す。命令デコード・ユニット(IDU)208は、現トランザクション・ネスト化深さ212(TND)を常時監視している。IDU208がTBEGIN命令を受信すると、ネスト化深さ212がインクリメントされ、逆に、TEND命令時にはデクリメントされる。あらゆるディスパッチされた命令について、ネスト化深さ212がGCT232に書き込まれる。TBEGIN又はTENDが、後でフラッシュされる投機的経路上でデコードされると、IDU208のネスト化深さ212は、フラッシュされない最も若いGCT232エントリからリフレッシュされる。実行ユニットによる、大部分はロード/ストア・ユニット(LSU)280による消費のために、トランザクション状態も発行キュー216内に書き込まれ、実効アドレス計算器236もLSU280内に含まれる。TBEGIN命令は、TEND命令に到達する前にトランザクションがアボートした場合にステータス情報を記録するためのトランザクション診断ブロック(TDB)を指定することができる。
ネスト化深さと同様に、IDU208/GCU232は、トランザクション・ネストを通じて、アクセス・レジスタ/浮動小数点数レジスタ(AR/FPR)修正マスクを協調的に追跡する。即ち、AR/FPR修正命令がデコードされ、修正マスクがそれをブロックすると、IDU208は、アボート要求をGCT232内に配置することができる。命令がnext−to−completeになると、完了がブロックされ、トランザクションがアボートする。制約付きトランザクション内にある間にデコードされた場合又は最大ネスト化深さを上回る場合、TBEGINも含む他の制限付き命令が同様に処理される。
最外TBEGINは、GR−Save−Maskに応じて、複数のmicro−opに分割され、各micro−op232b(例えば、uop0、uop1及びuop2を含む)は、2つの固定小数点数ユニット(FXU)220の一方によって実行され、トランザクション・アボートの場合、1対のGR228を、GR228のコンテンツを後で復元するために用いられる特殊トランザクション・バックアップ・レジスタ・ファイル224内に保存する。TBEGINはまた、1が指定されている場合、TDBのアクセシビリティ・テストを実施するためのmicro−op232bも生成し、このアドレスは、アボートの場合に後で使用するために、専用レジスタ内に保存される。最外TBEGINのデコードにおいて、潜在的な後のアボート処理のために、TBEGINの命令アドレス及び命令テキストもまた、専用レジスタ内に保存される。
TEND及びNTSTGは、単純なmicro−op232b命令である。NTSTG(非トランザクション・ストア(non-transactional store))は、発行キュー216において非トランザクションとしてマーク付けされ、LSU280がそれを適切に処理できるようにする点を除いて、通常のストアのように処理される。TENDは、実行時にノー・オペレーションであり、TENDが完了したときに、トランザクションの終了が行われる。
上述のように、トランザクション内にある命令は、発行キュー216においてそのようにマーク付けされるが、他の点ではほぼ変更されずに実行され、LSU280は、次のセクションで説明されるように、分離追跡(isolation track)を行う。
デコードはイン・オーダー式であり、かつ、IDU208は現在のトランザクション・ステータスを常時監視し、これをトランザクションからの全ての命令と併せて発行キュー216内に書き込むことから、TBEGIN、TEND、並びにトランザクションの前、内部及び後の命令の実行は、アウト・オブ・オーダー式に実行することができる。TENDを最初に、トランザクション全体を次に実行し、最後にTBEGINを実行することさえ可能である(可能性は低いが)。プログラム順は、完了時にGCT232により復元される。汎用レジスタ(GR)228は、バックアップ・レジスタ・ファイル224から復元することができるので、トランザクションの長さは、GCT232のサイズによって制限されない。
実行中、プログラム・イベント記録(PER)イベントが、イベント抑止制御に基づいてフィルタリングされ、PER TENDイベントは、イネーブルにされた場合に検出される。同様に、トランザクション・モードにある間、トランザクション診断制御によりイネーブルにされたときに、擬似乱数生成器がランダム・アボートを引き起こしていることがある。
トランザクション分離の追跡
ロード/ストア・ユニット280は、トランザクション実行中にアクセスされたキャッシュラインを追跡し、別のCPUからのXI(又はLRU−XI)がフットプリントと競合する場合にアボートをトリガする。競合するXIがexclusive又はdemote XIである場合、L3 272がXIを繰り返す前にトランザクションが終了することを期待して、LSU 280はXIを拒否してL3 272に戻す。この「押しのけ(stiff-arming)」は、高競合状態のトランザクションにおいて非常に有効である。2つのCPUが互いに押しのけ合う際のハングアップを防止するために、XI拒否カウンタが実装され、該XI拒否カウンタは、閾値が満たされると、トランザクション・アボートをトリガする。
L1キャッシュ・ディレクトリ240は、従来より、スタティック・ランダム・アクセス・メモリ(SRAM)で実装される。トランザクション・メモリの実装では、ディレクトリの有効ビット244(64行×6ウェイ)は通常の論理ラッチに移動され、キャッシュラインごとにさらに2つのビット、即ちTX−読み取りビット248及びTX−ダーティビット252が補充される。
新しい最外TBEGIN(先のまだ保留中のトランザクションに対してインターロックされる)がデコードされると、TX−読み取り248ビットがリセットされる。TX−読み取り248ビットは、発行キュー内で「トランザクショナル(transactional)」としてマーク付けされた全てのロード命令によって実行時に設定される。これは、投機的ロードが、例えば誤って予測された分岐経路上で実行される場合に、過剰なマーク付けをもたらし得ることに留意されたい。ロード完了時にTX−読み取り248ビットを設定する代替案は、複数のロードが同時に完了することがあり、ロード・キュー上に多数の読み取りポートを必要とすることから、シリコン面積に対して高価すぎるものであった。
ストアは、非トランザクション・モードと同じ方法で実行されるが、トランザクション・マークが、ストア命令のストア・キュー(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(図1)との競合がアボートを引き起こさなければ、LRU拡張の提供は、L1サイズからL2サイズまでの読み取りフットプリント能力及びアソシアティビティを有効に向上させる。
ストア・フットプリントは、ストア・キャッシュ・サイズ(ストア・キャッシュは、以下により詳細に説明される)によって、従って、L2 268サイズ及びアソシアティビティによって暗黙的に、制限される。TX−ダーティ252キャッシュラインがL1 240からLRU処理された場合、LRU拡張アクションを実施する必要はない。
ストア・キャッシュ
従来のシステムにおいて、L1 240及びL2 268はストアスルー・キャッシュであるので、全てのストア命令は、L3 272ストア・アクセスを引き起こし、今やL3 272ごとに6つのコアがあり、各コアの性能がさらに改善され、L3 272に関する(及びより少ない程度ではあるがL2 268に関する)ストア速度が、特定のワークロードに関して問題になる。ストア・キューイングの遅延を避けるために、ストアをL3 272に送信する前にストアを近隣のアドレスと組み合わせる、収集ストア・キャッシュ264を付加する必要がある。
トランザクション・メモリ性能については、L2キャッシュ268は、もう少しでクリーン・ラインを戻すので(7サイクルL1 240ミス・ペナルティ)、トランザクション・アボート時に、L1 240からのあらゆるTX−ダーティ252キャッシュラインを無効にすることが許容可能である。しかしながら、性能(及び追跡のためのシリコン領域)に関して、トランザクションが終了する前にトランザクション・ストアにL2 268を書き込ませ、次に、アボート時に(又はさらに悪いことには共有L3 272で)全てのダーティL2 268キャッシュラインを無効にすることは、許容可能でない。
ストア帯域幅及びトランザクション・メモリ・ストア処理の2つの問題はどちらも、収集ストア・キャッシュ264で対処することができる。キャッシュ232は、64エントリの循環キューであり、各エントリは、バイト精度(byte-precise)の有効ビットを有する128バイトのデータを保持する。非トランザクション操作において、LSU280からストアを受信すると、ストア・キャッシュ264は、同じアドレスのエントリが存在するかどうかをチェックし、存在する場合には、新しいストアを既存のエントリに収集する。エントリが存在しない場合には、新しいエントリがキューに書き込まれ、空きエントリの数が閾値より下になる場合、最も古いエントリがL2 268キャッシュ及びL3 272キャッシュにライトバックされる。
新しい最外トランザクションが開始すると、ストア・キャッシュ264内の全ての既存のエントリは、新しいストアをそこに収集できないように、closedとしてマーク付けされ、L2 268及びL3 272に対するこれらのエントリのエビクションが開始される。その時点から、LSU280 STQ260から得られるトランザクション・ストアは、新しいエントリを割り当てる、又は既存のトランザクション・エントリに集まる。L2 268及びL3 272へのこれらのストアのライトバックは、トランザクションが成功裏に終了するまでブロックされ、その時点で、後の(トランザクション後の)ストアは、次のトランザクションがそれらのエントリを再び閉じるまで、引き続き既存のエントリ内に集めることができる。
ストア・キャッシュは、あらゆるexclusive XI又はdemote XIのたびに照会され、XIがいずれかのアクティブ・エントリと比較された場合、XIの拒否を引き起こす。継続的にXIを拒否する間、コアがさらなる命令を完了しない場合、トランザクションは、ハングアップを回避するために特定の閾値でアボートされる。
ストア・キャッシュがオーバーフローすると、LSU280は、トランザクション・アボートを要求する。LSU280は、既存のエントリにマージする(merge)ことができない新しいストアを送信しようと試みたときに、この条件を検出し、ストア・キャッシュ全体が現トランザクションからのストアで満たされる。ストア・キャッシュは、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を格納する。ミリコードがどのGR238を復元するかを知るのに必要とされるGR保存マスクを取得するために、TBEGIN命令テキストがSPRからロードされる。
CPU114(図2)は、バックアップGR224を読み出し、それらをメインGR228にコピーするための、特殊ミリコード専用命令をサポートする。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がいつプログラムに戻るかは知られていない)。現在のアボート・カウントに依存して、ミリコードは、特定の機構を呼び出して、後のトランザクションの再試行が成功する可能性を高めることができる。この機構は、例えば、再試行の間のランダムな遅延を連続的に増大させることと、投機的実行の量を低減させて、トランザクションが実際には使用していないデータへの投機的アクセスにより引き起こされるアボートに遭遇するのを回避することとを含む。最後の手段として、他のCPU114を解放して通常の処理を続行する前に、ミリコードを他のCPU114(図2)にブロードキャストして、全ての競合する作業を停止させ、ローカル・トランザクションを再試行することができる。デッドロックを引き起こさないように、複数のCPU114を連携させる必要があるので、異なるCPU114上のミリコード・インスタンス間の何らかのシリアル化が必要とされる。
図4は、1つの実施形態によるコンピュータ・システム300を示す。図4は、図1−図3及び図5−図18において述べられる特徴部を実装するように構成される。コンピュータ300は、階層キャッシュ・サブシステムを介してメモリ310と通信する、プロセッサ112a(CPU1)及び112b(CPU2)として示される複数のプロセッサを含み(図示されない付加的なプロセッサと共に)、階層キャッシュ・サブシステムのキャッシュにおいて、プロセッサにより、トランザクション・ロードが監視される。図4に示されるコンピュータ・システム300は、図1に示されるコンピュータ・システム100と同じ要素及び同じ参照番号を有するが、図4には、図1の全ての要素は示されない。
コンピュータ・システム300は、例えば、トランザクションに利用可能な又はトランザクションを現在処理している1つ又は複数のプロセッサに与えられる割り込みなどの要求を管理することができる。一例において、要求(requesting)プロセッサ(例えば、CPU1(112a))は、受信(receiving)/遠隔プロセッサ(例えば、CPU2(112b))を選択し、要求を選択された遠隔プロセッサに送ることができる。一例において、コンピュータ・システムは、例えばトランザクションを実行することができるCPU又はプロセッサを含む、トランザクション実行(TX)システム又は環境である。各々のトランザクションは、それぞれ、プロセッサ112a及び112b内でそれぞれ実行されるトランザクション命令320a及び320bとして示される。各々のプロセッサ112a及び112bは、それぞれのレジスタ334a及び334bを有する。
各々のデータ・キャッシュ118a及び118bは、それぞれ、それぞれのL1及びL2キャッシュを含むことができる。コンピュータ・メモリは、一般的にメモリ310で表され、このメモリ310は、TX CPU、つまりプロセッサ112a及び112bとして示されるCPU内の上位レベル・キャッシュ・メモリを含むことができる。各プロセッサ112a及び112bは、それぞれ、テーブル1350a及び1350bとして示される、それぞれのローカル・トランザクション干渉追跡テーブル(local transaction interference tracking table)を有する。テーブル1350a及び1350bは、それぞれ、データ・キャッシュ118a、118b、レジスタ334a、334b、及び/又はメモリ310内に格納することができる。本明細書でさらに説明されるように、メモリ310はまた、テーブル1350a及び1350b内に格納されたトランザクション干渉情報を含むことができる(統計値と共に)、トランザクションの診断情報を格納するためのトランザクション診断ブロック350を含むこともできる。
コンピュータ・システム300は、実施形態による要求及び応答の両方を送信、受信及び処理するトランザクション(TX)環境の表示である。種々の例が与えられ、プロセッサ112a(CPU1)は、要求を作成し、要求を、受信する受信/遠隔プロセッサとして示されるプロセッサ112b(CPU2)に送る要求プロセッサとして示されることに留意されたい。当業者により理解されるように、いずれのプロセッサもデータに対する要求を受送信できるので、この表示は説明目的のためであることが理解される。
図5は、プロトコル要求及び応答の例を示す。プロトコル要求は、メインフレーム・マルチプロセッサ・プロトコルと呼ばれることがあり、プロトコルは、バス・ベース又はスイッチベースの相互接続を介することができる。プロトコルは全て、パラレル・シグナリング(バス・スヌーピング)、シリアル・パケット、又はその組み合わせとすることができる。
一例として、データ要求505を、CPU1(112a)からCPU2(112b)に送信することができる。要求505は、どのタイプの要求が送られているか(例えば、周知のMESIコヒーレンス・プロトコルに従った、read−shared若しくはread exclusive、又はread for ownership要求、又は他のそうしたプロトコルに従ったプロトコル要求)を示すタイプ・フィールド506と、要求を送った特定のプロセッサ(例えば、CPU1)及び随意的に要求が送られる、例えばCPUなどの受信プロセッサ、及び随意的に、複数の要求を同時に処理できる場合、各要求を一意に識別するための特有の要求IDを識別するタグ・フィールド507とを含む。要求505はまた、要求プロセッサ(CPU1)により要求されるアクセスのタイプを識別するアクセス・フィールド508と、アドレス・フィールド509とを含む。アドレス・フィールド509は、要求されているキャッシュライン又はメモリ・ワードのメモリ・アドレスを識別する。要求505のプロトコルは、例えば、巡回冗長検査(CRC)、パリティ・ビット、又はECCなど、使用されるエラー検出及び/又は訂正コードを含むエラー訂正フィールド510を含むことができる。
応答515は、受信プロセッサ(CPU2)から要求プロセッサ(CPU1)に送り返すことができる。応答515は、読み取り応答(READRESPONSE)のような応答のタイプを示すタイプ・フィールド516と、タグ・フィールド517とを含む。タグ・フィールド517は、オリジナルの要求505のタグ・フィールド507と同じタグとすることができ、及び/又は、タグ・フィールド517は、キャッシュラインの要求されたメモリ・アドレスを含むことができる。応答515は、要求プロセッサ(CPU1)により要求される要求データであるデータ・フィールド518を含む。幾つかのプロトコル応答は、データ転送を含むことができず(例えば、ラインに関してshardからexclusive ownershipに所有権をエスカレートさせるためのプロトコル要求)、処理が実施された確認応答(acknowledgement)のみを含むことができる。エラー訂正フィールド519は、応答515内に含められる。
幾つかの実施形態において、プロトコル要求のためのシグナリングは、複数のビット・ラインにわたって並行して行うことができ、いずれの未使用フィールドも、プロトコル定義値をもたないラインに対応することができ、デフォルト値に設定され、又はさもなければプロトコル・メッセージの部分と考えられない。幾つかの実施形態において、プロトコル要求は、複数の「ビート(beat)」で、例えば、その全体がプロトコル・メッセージを表す連続するビットのグループで伝送することができる。さらに他の実施形態において、プロトコル要求は、ビットシリアルに(bit-serially)伝送することができる。複数のビートで又はシリアルに伝送されるプロトコルにおいて、幾つかのメッセージは、他のプロトコル要求よりもより多いバス・シグナリング・サイクルから成る。
図6は、別のプロトコル要求の例を示す。多くのプロトコルは、書き込み操作のためにRFO(read for ownership)又はread−exclusive要求を介して、排他的アクセスを獲得し、一方で、幾つかの他のプロトコルは、直接書き込み(制限された)を行うことができる。一例として、データを書き込むための例示的な要求605を、CPU1(112a)からCPU2(112b)に送ることができる。要求605は、送られる要求のタイプ(例えば、書き込み)を識別するタイプ・フィールド506と、書き込み要求を送った特定のプロセッサ(例えば、CPU1)及び随意的に、要求が送られる、例えばCPU2などの受信プロセッサ、及び特定の要求を識別するタグ・フィールド507とを含む。要求605はまた、要求プロセッサ(CPU1)により書き込まれるデータを伝送するデータ・フィールド504と、アドレス・フィールド509とを含む。アドレス・フィールド509は、書き込まれるキャッシュライン又はアドレスラインのメモリ・アドレスを識別する。要求605のプロトコルは、例えば、巡回冗長検査(CRC)、パリティ・ビット、又はECCなど、使用されるエラー検出及び/又は訂正コードを含むエラー訂正フィールド510を含むことができる。
書き込み要求に応答して、書き込みを行う前に排他的アクセスのためのデータを取得する必要がないので、一般的には応答がない。
図7は、1つの実施形態によるデータ要求を行っているプロセッサ(例えば、CPU1(112a))によるプロトコル要求生成のフロー図700である。ブロック705において、プロセッサ(例えば、CPU1)は、メモリ・データに対する要求を有する。ブロック710において、プロセッサ(例えば、CPU1(112a))は、要求されたデータがプロセッサ自身のローカル・キャッシュ(例えば、データ・キャッシュ118a内のL1キャッシュ)内にあるかどうかをチェックする。データがプロセッサ自身のローカル・キャッシュ内で利用可能な場合、フローはブロック735に進む。データがプロセッサ(CPU1)のローカル・キャッシュ内で利用可能でない場合、ブロック715において、プロセッサは、XI要求(相互問い合わせ)を生成し、他のプロセッサ(CPU2(112b)など)から所望のデータを要求する。ブロック720において、要求プロセッサ(CPU1)は、相互接続122を介して、データに対するXI要求を受信プロセッサ(CPU2)に送り、ブロック725において、要求プロセッサ(CPU1)は、受信プロセッサ(CPU2)から、(要求されたデータ)と共にXI応答を受け取る。ブロック730において、要求プロセッサ(CPU1)は、データを、データ・キャッシュ118aのローカル・キャッシュ(例えば、L1、L2キャッシュ)内に入れる。ブロック735において、要求プロセッサ(CPU1)は、命令キャッシュ116aを介して、そのローカル・キャッシュ118aからデータを取得する。ブロック740において、要求プロセッサの命令キャッシュ116aは、処理のためにデータをCPU1の回路に与える。
一実施形態において、一般的なキャッシュ・プロトコル(例えば、周知のMESIプロトコル)によると、プロセッサが読み取りのためにデータにアクセスし、データが利用可能でない場合、データが共有方式で取得されるread−sharedのためにXIが生成されるので、複数のCPU112a、112bは、キャッシュ内のデータのコピーを有することができ、各CPUは、データに対応するメモリ読み取りアクセスを処理することができる。受け取ったデータは、キャッシュに入れられ、共有アクセスのためにマーク付けされ、プロセッサは、メモリ読み取り操作に応答して、コピーから読み取りアクセスを実施することができる。プロセッサが、書き込みのためにデータにアクセスし、データが、exclusive状態で利用可能でない場合、データが排他的方式で取得されるread−exclusiveのためにXIが生成されるので、単一のCPU(例えば、CPU112a)だけがキャッシュ内のデータのコピーを有することができる。受け取ったデータはキャッシュに入れられ、排他的アクセスのためにマーク付けされ、プロセッサは、メモリ書き込み操作に応答して、コピーを更新することができる。一実施形態において、データが共有モードで存在し、書き込みアクセスを受け取った場合、read−exclusive XIが生成される。少なくとも1つの実施形態においては、これは、データが応答の部分として受信されない別個のread−exclusive要求として示される。一実施形態において、応答を受信すると、キャッシュ・データは、排他的アクセスのためにマーク付けされる。
図8は、1つの実施形態による、要求を受け取り、応答を送る受信/遠隔プロセッサ(例えば、CPU2(112b))による要求処理の例示的なフロー図800を示す。
ブロック805において、遠隔プロセッサ(CPU2)は、要求プロセッサ(CPU1)からデータに対するXI要求を受け取る。ブロック810において、遠隔プロセッサ(CPU2)は、遠隔プロセッサが要求されたデータ(遠隔プロセッサのローカル・キャッシュ内の)を現在必要とするトランザクションを処理しているかどうかをチェックすることにより、干渉が検出されるかどうかをチェックする。ブロック810において、遠隔プロセッサ(CPU2(112b)が、遠隔プロセッサは、要求プロセッサ(CPU1(112a))が要求するデータを現在使用していると判断した場合、ブロック815において、遠隔プロセッサは、干渉が検出される(肯定)と判断し、遠隔プロセッサ(CPU2)は、該遠隔プロセッサ(CPU2)において発生しているローカル・トランザクションをアボートする。ひとたび遠隔プロセッサ(CPU2)においてローカル・トランザクションがアボートされると、ブロック820において、遠隔プロセッサは、読み取り応答(READ RESPONSE)と共にデータを要求プロセッサ(CPU1)に伝送する。ブロック825において、遠隔プロセッサ(CPU2)は、データ・ステータスを変更し、随意的に、必要に応じてそのローカル・キャッシュからデータをパージする。一実施形態において、キャッシュ・ステータスの変更は、トランザクションがアボートされたときに、データを読み取り又は書き込みセットのうちの少なくとも一方から解放することを含むことができる。一実施形態において、キャッシュ・ステータスの変更は、キャッシュ・ディレクトリ内のキャッシュラインのステータスを変更すること、例えば、周知のMESIプロセッサなどのキャッシュ・プロセッサに従って、ステータスをshared、exclusive、invalid等のうちの1つに設定することを含むことができる。ブロック830において、遠隔プロセッサ(CPU2)は、トランザクション失敗処理を開始し、フローは終了する。ブロック810において、遠隔プロセッサ(CPU2(112b)が、遠隔プロセッサは要求プロセッサ(CPU1(112a))が要求するデータを現在使用していないと判断した場合、ブロック835において、遠隔プロセッサは、干渉は検出されないと判断し、ブロック835において、遠隔プロセッサは、読み取り応答(READ RESPONSE)と共にデータを伝送する。ブロック840において、遠隔プロセッサ(CPU2)はデータ・ステータスを変更し、ブロック840において、随意的に、必要に応じてローカル・キャッシュからデータをパージし、フローは終了する。
図9は、1つの実施形態によるプロセッサによるトランザクション処理を示すフロー図900である。ブロック905において、トランザクションは、プロセッサ(例えば、CPU1又はCPU2)上での実行を開始する。図9において、各プロセッサ(CPU1及びCPU2)がこれらのアクションを実行できること、即ち、両方の112a、112b等によりトランザクションを処理できることに留意されたい。ブロック910において(例えば、図7に述べられるように)、プロセッサは、トランザクション内の命令を実施する。ブロック915において、プロセッサは、トランザクション命令に応答して、プロトコル・アクションを実施する。ブロック920において、プロセッサに、そのトランザクションをアボートすることを求める干渉(データを用いた)が存在するかどうかをチェックする。プロセッサが、干渉が検出される(肯定)と判断すると、ブロック925において、プロセッサは、それ自身のトランザクション(データ上での)をアボートし、流れはブロック935に進む。プロセッサが、干渉が検出されないと判断すると、ブロック930において、プロセッサは、そのトランザクション(の命令)を完了する。ブロック935において、プロセッサは、(トランザクション診断ブロック(TDB)などの)トランザクション情報をレジスタに書き込む。
実施形態によると、コヒーレンス・プロトコルが、トランザクション・ステータスについての付加的な情報を含むように拡張される。図10は、実施形態によるプロトコル要求505及び新しいプロトコル応答1005を示す。図10に示されるように、要求505の幾つかのフィールドは、図5に述べられるフィールドと同一である。上述のように、要求505は、どのタイプの要求が送られるか(例えば、READ)を識別するタイプ・フィールド506と、要求を送った特定のプロセッサ(例えば、CPU1)(及び随意的に、要求が送られる、例えばCPU2などの受信/遠隔プロセッサ、並びに要求番号)を識別するタグ・フィールド507とを含む。要求505はまた、要求プロセッサ(CPU1)により要求されるアクセスのタイプを示すアクセス・フィールド508と、要求されるキャッシュライン又はアドレスラインのメモリ・アドレスを示すアドレス・フィールド509とを含む。要求505のプロトコルは、巡回冗長検査(CRC)のような、使用されるエラー・コードのタイプを示すエラー訂正フィールド510を含む。
新しい応答1005は、付加的なトランザクション・アボート・ステータス・フィールド1010と共に、(図5の)応答515のフィールドを含む。応答1005は、受信/遠隔プロセッサ(CPU2)から要求プロセッサ(CPU1)に送り返すことができる。応答515は、読み取り応答(READRESPONSE)などの応答のタイプを示すタイプ・フィールド516と、要求されたキャッシュラインのメモリ・アドレスを示すタグ・フィールド517(オリジナルの要求505のタグ・フィールド507と同じタグとすることができる)とを含む。応答515は、要求プロセッサ(CPU1)により要求された要求データであるデータ・フィールド518を含む。データがプロトコル応答と共に伝送されない場合、データ・フィールド518は空であるか又は存在しない。エラー検出/訂正フィールド519は、応答1005内に含められる。
付加的に、新しいプロトコル応答1005(遠隔プロトコルCPU2により要求プロセッサ(CPU1)に送られた)は、トランザクション・アボート・ステータス・フィールド1010を有する。トランザクション・アボート・ステータス・フィールド1010は、アボートされる前に、遠隔/受信プロセッサ(CPU2)上で既に実行されているトランザクションについての以下の情報の1つ又は複数を含む。:
1)要求505(要求プロセッサ(CPU1)からの))がロールバック(即ち、アボート)を引き起こしたか、及び/又は引き起こさなかったか、
2)アボートされる前に、遠隔/受信プロセッサ(CPU2)上で実行されていたこのトランザクションの優先順位、
3)トランザクションがアボートされる前、遠隔/受信プロセッサ(CPU2)上で既に実行されているトランザクションにより、幾つの命令、メモリ操作、及び/又は作業の他の尺度が実施されたか、
4)遠隔プロセッサ(CPU2)上で既に実行されているトランザクション(トークン、TBEGINのアドレス、及び/又はアボートされたトランザクションを識別する他の手段)の識別。
さらに、トランザクション・アボート・ステータス・フィールド1010は、アボートする必要があったトランザクション(遠隔/受信プロセッサ(CPU2)上で既に実行されている)により、どのデータが取得されたか、トランザクションのアドレス、及びトランザクションをアボートするコスト(作業の3クロック周期又は20,000クロック周期とすることができる)を示す。
プロセッサ(例えば、例示的なシナリオにおける受信プロセッサCPU2)がトランザクション実行にあるとき、例えば、データはトランザクション読み出し又は書き込みセットの部分であり、競合(即ち、干渉)が検出されるという理由で、コヒーレンス要求が、トランザクション実行をアボートさせることがある。
1つの実施形態によると、図11は、データ(要求プロセッサCPU1(112a)から受信/遠隔プロセッサCPU2(112b)に送られた)を書き込むための、図6の(書き込み)要求605を示し、新しい応答1105が、遠隔プロセッサCPU2(112b)から要求プロセッサCPU1(112a)に送り返される。図11は、トランザクションの干渉/アボート情報を要求発信元(originator)に伝送するために、これまでプロトコル応答を必要としなかったトランザクションに新しいプロトコル応答を導入することにより、トランザクション情報を実施形態による応答に付加する、プロトコル要求及び応答の例である。少なくとも1つの実施形態において、トランザクション・アボート・ステータスを提供する目的のためだけに伝送されるプロトコル応答は、オプションであり、幾つかのモードにおいて、構成ビットに応答して、バス輻輳に応答して、及び/又は他の理由で抑止されることがある。応答を受け取らないこうしたシナリオにおいて、応答を受け取らなかった要求に対応して、トランザクション・アボート・ステータスは報告されない。少なくとも1つの実施形態において、1つ又は複数の応答の不存在を報告することができる。上述のように、要求605は、どのタイプの要求が送られるか(例えば、書き込み)を示すタイプ・フィールド506と、書き込み要求を送った特定のプロセッサ(例えば、CPU1)(及び要求が送られる、例えばCPU2などの受信プロセッサ)を識別するタグ・フィールド507とを含む。要求605はまた、要求プロセッサ(CPU1)により要求されるアクセスのタイプを示すアクセス・フィールド508と、アドレス・フィールド509とを含む。アドレス・フィールド509は、書き込むために要求されるキャッシュライン又はアドレスラインのメモリ・アドレスを示す。要求605のプロトコルは、パリティ・ビット、ECC、又は巡回冗長検査(CRC)のようなエラー訂正/検出コードを有するエラー検出及び/又は訂正フィールド510を含むことができる。
書き込み要求605に応答して、新しい応答1105(書き込み要求に対する)が今や、本明細書で述べられるトランザクション・アボート・ステータス・フィールド1010を含む。新しい応答1105は、応答1005(図10における)のフィールドを含む。応答1105は、受信/遠隔プロセッサ(CPU2)から要求プロセッサ(CPU1)に送り返すことができる。応答1105は、書き込み応答(WRITERESPONSE)のような応答のタイプを示すタイプ・フィールド516と、キャッシュラインの要求されたメモリ・アドレスを示すタグ・フィールド517(応答が対応する要求を識別するための、オリジナルの要求505のタグ・フィールド507と同じタグとすることができる)とを含む。応答515は、要求プロセッサ(CPU1)により要求された要求データであるデータ・フィールド518を含むことができる。受信/遠隔プロセッサ(CPU2)の(ローカル)キャッシュからのデータはないので、データ・フィールド518は空である。エラー訂正フィールド519は、応答1005内に含められる。
本明細書で述べられるように、トランザクション・アボート・ステータス・フィールド1010は、(要求プロセッサ(CPU1)からの)書き込み要求のためにアボートする必要があった(受信/遠隔プロセッサ(CPU2)上でこれまで実行されている)トランザクションのステータスを提供する。
本開示によるプロトコルの性能向上は、1つの例示的な実施形態においては、トランザクション・アボート・ステータス及び関連した情報に対応するプロトコル・フィールドを、読み取り要求に対する既存の読み取り応答に付加することと併せて、及び、別の例示的な実施形態においては、トランザクション・アボート・ステータス及び関連した情報に対応する少なくとも1つのプロトコル・フィールドを伝送するために、最新のプロトコル応答を有していないプロトコル書き込み要求に対応するプロトコル応答を付加し、対応する書き込み要求を識別することと併せて、説明されるが、当業者であれば、本明細書に含まれる教示は、他のXI形式、プロトコル形式、要求のタイプ、コヒーレンス・プロトコル等に適用することができる。
1つの実施形態によると、図12は、例えば、要求プロセッサCPU1(112a)から要求を受け取る受信/遠隔プロセッサCPU2(112b)による、コヒーレンス要求処理を示すフローチャート1200である。図12は、プロトコル応答の部分として(トランザクション・アボート・ステータス・フィールド1010における)トランザクション・アボート・ステータスを伝送することを含む、新しい(修正された)ブロック1205及び1210と併せて、図8のブロックを含む。
図12において、受信/遠隔プロセッサ(例えば、CPU2(112b))による要求処理は、1つの実施形態による要求を受け取る。ブロック805において、遠隔プロセッサ(CPU2)は、要求プロセッサ(CPU1)からデータに対するXI要求(例えば、要求505及び/又は要求605)を受け取る。ブロック810において、遠隔プロセッサ(CPU2)は、遠隔プロセッサが、例えば要求505及び605などの受信した要求と両立しない方法でデータを参照するトランザクションを処理しているかどうかをチェックすることにより、干渉が検出されるかどうかをチェックする。例えば、1つの例示的な実施形態において、read shared要求は、トランザクション読み取りセットにおけるデータへの参照と両立するが、書き込み要求は両立しない。さらに、read−exclusive、読み取りエスカレーション(read escalation)(即ち、sharedからexclusiveへの変更)、又は書き込み要求は、トランザクションの読み取り又は書き込みセットのいずれかにおいて参照される同じデータと両立しない。ブロック810において、遠隔プロセッサ(自身)が、現在、要求プロセッサ(CPU1(112a))により要求されたデータを使用していると判断すると、ブロック815において、遠隔プロセッサは、干渉が検出され(肯定)、遠隔プロセッサ(CPU2)は、該遠隔プロセッサ(CPU2)で行われているローカル・トランザクションをアボートすると決定する。遠隔プロセッサ(CPU2)においてローカル・トランザクションがアボートされると、ブロック1205において、遠隔プロセッサは、トランザクション・アボート・ステータス・フィールド1010(要求を満たすために、遠隔/受信プロセッサ(CPU2)において、要求により(これまで実行されている)トランザクションがアボートしたことを通知する)と共に、読み取り応答(READ RESPONSE)と共にデータを要求プロセッサ(CPU1)へ伝送する。別の実施形態において、遠隔プロセッサは、書き込み応答1105により受信した書き込み要求に確認応答することができる。最新のシステムにおいて、トランザクション・アボート・ステータス・フィールド1010は、(今はアボートされたそのトランザクションをこれまで実行している)遠隔CPU2から、元の(要求505及び/又は605を送った)要求プロセッサCPU1に送られた応答(RESPONSE)内に含められない。遠隔プロセッサ(CPU2)は、データ・ステータスを変更し、ブロック825において、随意的に、必要に応じてデータをそのローカル・キャッシュからパージする。ブロック830において、遠隔プロセッサ(CPU2)はトランザクション失敗処理を開始し、フローは終了する。ブロック810において、遠隔プロセッサ(CPU2(112b))が、該遠隔プロセッサは、現在、要求プロセッサ(CPU1(112a))により要求されるデータを使用していないと判断すると、ブロック1210において、遠隔プロセッサは、干渉が検出されず、遠隔プロセッサ(CPU2)は、トランザクション・アボート・ステータス・フィールド1010(要求によりトランザクションがアボートされなかったことを示す)と共に、読み取り応答(READ RESPONSE)によりデータを伝送する。遠隔プロセッサ(CPU2)は、データ・ステータスを変更し、ブロック840において、随意的に、必要に応じてデータをそのローカル・キャッシュからパージし、フローは終了する。
図13は、1つの実施形態による、要求プロセッサ(CPU1(112a))によるプロトコル要求の発信及び処理を示すフロー図1300である。図13は、図7に上述されたブロックを含み、図7の説明は繰り返さない。さらに、フロー図1300は、新しいブロック1305及び1310を含む。例えば、要求プロセッサ(CPU1)は、新しいトランザクション・アボート・ステータス・フィールド1010と共に、遠隔プロセッサ(CPU2)からのデータと共にXI応答を受け取る(ブロック725)。ブロック735において、要求プロセッサ(CPU1)は、データをローカル・キャッシュ(L1及び/又はL2キャッシュなど)に入れる。ブロック1310において、要求プロセッサ(CPU1)は、受け取ったステータス(例えば、トランザクション・アボート・ステータス・フィールド1010内の情報)を、データ・キャッシュ118a(及び/又はメモリ310)内のローカル・トランザクション干渉追跡テーブル1350aに付加する。ローカル・トランザクション干渉追跡テーブル1350aは、要求プロセッサ(CPU1)が、干渉(遠隔プロセッサ(CPU2)においてトランザクション・アボートをもたらす)を引き起こすとき、干渉を常時監視するストレージ位置とすることができ、このローカル・トランザクション干渉追跡テーブル1350aは、この情報のログを含むことができる。ローカル・トランザクション干渉追跡(ストレージ)テーブル1350aは、インクリメント統計値及び現在のトランザクション・ステータスを含む。インクリメント統計値は、(元の要求プロセッサ(CPU1)に報告された)トランザクション・アボートごとに増大し、かつ、shared/exclusive(R/W)要求及び集約要求に分離することができる。ローカル・トランザクション干渉追跡ストレージ・テーブル1350aは、要求プロセッサ(CPU1)により引き起こされた各々のトランザクション・アボートについての、及び、要求プロセッサ(CPU1)においてトランザクションがアボートされる度にインクリメントするカウンタを含むことができる。幾つかの実施形態において、ブロック1310と共に受け取ったトランザクション・アボート・ステータスは、性能監視ユニット、ランタイム計装(instrumentation)ユニット、及び/又は別の性能追跡論理内で集約し、情報を動的オプティマイザ、just in time(JIT)コンパイラに利用可能にし、又はプログラマーにより性能調整することもできる。ストレージ内、性能監視に向けられた構造体内にログ記録することにより、及び/又は、例えば、PowerISA(商標)に従ったPMUイベント・ベースの分岐又は例外などの通知を出すことにより、情報を記録することができる。報告は、干渉の性質、干渉の識別及び/又は干渉されたトランザクション、プロセッサID、そうした干渉を受けるアドレス等を含むことができる。
本明細書で述べられるように、コヒーレンス・プロトコルは、多数のビット(アドレス、データ)及びステータス、並びに制御ビットを使用する。これらのデータは、データ要求を発行し、その所有権(例えば、shared、exclusive)及びステータス(例えば、ダーティ、クリーン)を示すために使用される。付加的な1つ又は複数のビット(トランザクション・アボート・ステータス・フィールド1010に関する)を付加して、要求がトランザクションのアボートを引き起こしたこと及び/又は要求がトランザクションのアボートを引き起こし得ることを示す。例えば、ステータス・ビット(トランザクション・アボート・ステータス・フィールド1010)は、遠隔プロセッサ(CPU1)がデータを放棄したときに、要求されたデータがトランザクションについての競合を引き起こしたことを示す。既述のように、要求への応答は、トランザクションが進行中であり、要求はトランザクションのアボートを引き起こしたという表示と共に戻り得る。
一実施形態において、アボートされたトランザクションにおける命令の数などの付加的なメトリックが、トランザクション・アボート・ステータス・フィールド1010に伝送される。一実施形態において、表示は、例えば、ライブロック・シナリオを回避するために、成功しているトランザクションが後でアボートになって再開される場合のトランザクションの再開に対する、ホールドオフを決定するために用いられる。要求プロセッサ(CPU1)はまた、ローカル・トランザクション・アボート・ステータス・フィールド1010をチェックすることにより、要求プロセッサ(CPU1)が、遠隔/受信プロセッサ(CPU2)において多過ぎる(例えば、所定量の)トランザクション・アボートを引き起こしたと判断したとき、システム全体の処理量を増大させるために多過ぎる遠隔トランザクションをアボートすることに応答して、その要求速度を減速させる(低減させる)こともできる。
さらに別の実施形態において、こうした通知(トランザクション・アボート・ステータス・フィールド1010における)は、ログ内に集められ、及び/又は、通知機構(例えば、例外)を介して、動的再最適化コンポーネントに通知され、動的再最適化コンポーネントは、コードを動的に再最適化して、干渉を減らし、及び/又は、代替的なコードを生成し、トランザクションの代わりにロックを使用することができる。
ここで、図9のブロックは、図14内に含まれるが、その記述は繰り返さない。図14はまた、図9への修正も含む。図14は、1つの実施形態による、プロセッサによるトランザクション処理を示すフロー図1400である。プロセッサは要求プロセッサ(CPU1)であると仮定することができる。図14は、ブロック1405と共に、図9のブロックを含む。ブロック1405において、要求プロセッサ(CPU1)は、レジスタ334、キャッシュ118a及び/又はメモリ310内に、(ローカル・トランザクション・アボート・ステータス・フィールド1010から取得され、ローカル・トランザクション干渉追跡ストレージ・テーブル1350a内に格納された)トランザクション干渉統計値を含む(トランザクション診断ブロック(TDB)のような)トランザクション情報を書き込む。一実施形態において、トランザクションが完了すると、該トランザクションは、トランザクションが、例えば、結果レジスタ、結果条件レジスタ等(例えば、レジスタ334a、334bにおける)などの結果コードの部分として、1つ又は複数のトランザクションのアボートを引き起こしたかどうかの表示を含むことができる。一実施形態において、トランザクションが、結果ステータスを、1つ又は複数のレジスタ(例えば、レジスタ334a、334b)及び/又はメモリ位置内に設定すると、1つ又は複数のレジスタ(例えば、レジスタ334a、334bにおける)及び/又はメモリ位置(例えば、メモリ310、キャッシュ118a、118bにおける)は、データをトランザクションに提供するためにアボートされた、干渉するトランザクションの数、干渉の性質(書き込みセットを伴う読み取り要求、又は読み取り若しくは書き込みのいずれかを伴う書き込み要求等)を含むことができる。一実施形態において、そのように格納された情報は、干渉が生じたプロセッサを識別する方法、(例えば、トランザクション開始XBEGIN又はTBEGINのアドレス、トークン、トランザクションID等を識別することにより)アボートされたトランザクション、アボートされる前にそのトランザクションにより実施された作業の尺度等を含む、トランザクションの各々についての特別な情報を含むことができる。一実施形態において、最新のトランザクション診断ブロックが、本開示に従って、干渉及びトランザクション・アボート・ステータスに対応する付加的なフィールドを有するように拡張されると、1つ又は複数のメモリ位置に格納された情報は、例えば、z/Architecture(引用により本明細書に含められる)によるトランザクション診断ブロック(TDB)のメモリ位置、並びに、本開示によるトランザクション診断ブロックのフィールドに対応し、このフィールドは、新しく導入されたプロトコル・フィールドにより、及び/又は、複数のそうしたフィールドからの集約情報により個々に伝送された情報に対応する。別の実施形態において、レジスタ及び/又はメモリ位置内に格納された情報は、別個の、分離し、独立した最新のTDBとして与えられる。
ブロック1405において、要求プロセッサ(CPU1)は、性能監視ユニット及び/又はランタイム計装ユニットを介して、干渉統計値をプログラマーに提供し、干渉情報をファームウェア、ミリコード等に与えるように構成される。ミリコードにおいて、ミリコード・コードは、干渉統計情報を用いて、ライブロックを回避すること、及び/又は、干渉統計情報を用いて、トランザクション再開を最適化することができる。アプリケーションにおいて、アプリケーションは、干渉統計情報を用いて、ライブロックを回避し、トランザクション再開を最適化することができる。
1つの実施形態によると、例示的なコードが、説明目的のために以下に与えられる。
以下の疑似コード(プロセッサ112a、112b上で実行される)は、トランザクションがアボートされ、特に、ライブロック・シナリオを回避するように最適化された際、トランザクションを再開するために、(ミリコードにおいてトランスペアレントに、及び/又はプロセッサ上で実行されているアプリケーション内に統合されたコードにより)トランザクション再開の最適化を実施する1つの形態を提供する。例示的なコードは、例示的な方法でTDB内に格納された情報を使用するが、当業者であれば、これらに限定されるものではないが、メモリ位置(例えば、メモリ310)、レジスタ334a、334b、ステータス・コード、及び/又は性能監視ユニット、ランタイム計装ユニット等などから取得された情報を使用できるであろう。
例示的なコードによると、トランザクション再開コードは、トランザクションがそれ自体アボートされたか、そして、別のトランザクションをアボートしたかをチェックすることを含む。一実施形態において、可能なライブロックが即座に診断される。別の実施形態において、本トランザクション及び干渉されたトランザクションが循環干渉グラフの部分であるかどうか(即ち、各トランザクションは、他のトランザクションを直接又は間接的にアボートしている)のテストが行われる(図示せず)。一実施形態において、相互シュートダウン(mutual shootdown)が診断されると、干渉回避アクションがとられる。一実施形態において、相互シュートダウンが診断されると、ライブロック回避アクションがとられる。一実施形態において、干渉回避アクションは、関数avoid_livelock()を呼び出すことにより、呼び出される。幾つかの実施形態において、これらのアクションは、これらに限定されるものではないが、本トランザクションの低い優先順位、バックオフ期間の待機、ロックを用いた同期等のうちの1つ又は複数を含むことができる。
別の例示的な実施形態において、以下の疑似コードは、トランザクションがアボートされ、特に、ライブロックを回避するように最適化された際、トランザクションを再開するために、(ミリコードにおいてトランスペアレントに、又はプロセッサ上で実行されているアプリケーション内に統合されたコードにより)トランザクション再開の最適化を実施する1つの形態を提供する。例示的なコードは、例示的な方法でTDB内に格納された情報を使用するが、当業者であれば、これらに限定されるものではないが、メモリ位置、レジスタ、ステータス・コード、又は性能監視ユニット、ランタイム計装ユニット等などから取得された情報を使用できるであろう。例示的なコードにおいて、トランザクションは、これが(潜在的に)相互シュートダウンの閾値を超えたトランザクションに対応するとき、ライブロック防止操作をとる。
例示的なコードによると、トランザクション再開コードは、トランザクションがそれ自体アボートされたか、そして、別のトランザクションをアボートしたかをチェックすることを含む。一実施形態において、可能なライブロックが即座に診断される。別の実施形態において、本トランザクション及び干渉されたトランザクションが循環干渉グラフの部分であるかどうか(即ち、各トランザクションは、他のトランザクションを直接又は間接的にアボートしている)のテストが行われる(図示せず)。一実施形態において、相互シュートダウンの閾値数より多くが診断された場合(mutual_shootdown > threshold)、干渉回避アクションがとられる。一実施形態において、相互シュートダウンの閾値数より多くが診断された場合(mutual_shootdown > threshold)、ライブロック回避アクションがとられる。一実施形態において、干渉回避アクションは、関数avoid_livelock()を呼び出すことにより、呼び出される。幾つかの実施形態において、これらのアクションは、これらに限定されるものではないが、本トランザクションの低い優先順位、バックオフ期間の待機、ロックを用いた同期等のうちの1つ又は複数を含むことができる。
再開の最適化(ミリコード又はアプリケーションにおいてトランスペアレントに):
例示的なコードによると、トランザクション再開コードは、トランザクションがそれ自体アボートされたか、そして、別のトランザクションをアボートしたかをチェックすることを含む。一実施形態において、可能なライブロックが即座に診断される。一実施形態において、相互シュートダウンの閾値数より多くが診断された場合(mutual_shootdown > threshold)、テストが実施されlive_lock_loop_detedted()、このテストは、本トランザクション及び干渉されたトランザクションが、循環干渉グラフの部分であるか、又は、別の実施形態においては、循環干渉グラフの部分とすることができる(即ち、各トランザクションは、他のトランザクションを直接又は間接的にアボートしている)場合、応答アボート・ステータス・メッセージを介して及び随意的に他の手段と共に受け取った付加的な情報にアクセスすることができる。循環干渉グラフの部分である場合、ライブロック回避アクションがとられる。一実施形態において、ライブロック回避アクションは、関数avoid_livelock()を呼び出すことにより、呼び出される。幾つかの実施形態において、これらのアクションは、これらに限定されるものではないが、本トランザクションの低い優先順位、バックオフ期間の待機、ロックを用いた同期等のうちの1つ又は複数を含むことができる。
1つの実施形態によると、図15は、プロセッサ(例えば、要求プロセッサCPU1)が、例えば、トランザクション・アボート・ステータス・フィールド1010内の情報から、ローカル・トランザクション干渉追跡ストレージ・テーブル1350a内に格納された(そして、インクリメントされ、追跡された)干渉表示にどのように応答するかを示すフロー図1500である。ブロック1505において、要求プロセッサCPU1は、干渉統計値を報告する。干渉統計値を報告することは、ブロック1405に述べられるように、トランザクション情報を書き込むことを含むことができる。ブロック1510において、要求プロセッサ(CPU1)は、干渉コストが高過ぎると判断することにより、干渉の繰り返しを回避するために、付加的な同期化が可能であるかどうかを判断する。要求プロセッサ(CPU1)が、受信/遠隔プロセッサ(CPU2)上で実行されている(同じ)トランザクションを繰り返し、所定の回数(例えば、4回)だけアボートしたとき、及び/又は、トランザクションが、アボートされる前に命令のクロック周期の所定数(例えば、10,000クロック周期)を完了したとき、干渉コストは高過ぎる。
ブロック1510において、要求プロセッサ(CPU1)が、該要求プロセッサ(CPU1)からのデータに対する要求が引き起こす干渉の繰り返し(遠隔プロセッサ(CPU2)上のトランザクション・アボートの繰り返し)を回避するため、付加的な同期は可能でないと判断すると、ブロック1515において、要求プロセッサ(CPU1)は、コードの再最適化が可能であるかどうかを判断する。要求プロセッサ(CPU1)が、再最適化が可能であると判断すると、ブロック1520において、要求プロセッサは、コードを再最適化する。要求プロセッサ(CPU1)が再最適化は可能でないと判断すると、ブロック1525において、要求プロセッサは、現在のコード(バックオフのような寛容(toleration)尺度を含む)を進行する。バックオフとは、受信/遠隔プロセッサ(CPU2)が、(アボートする必要なしに)実行を完了させるために、受信/遠隔プロセッサのトランザクションのための時間を有するために、データ要求を作成する前に所定量の時間待つと決定する場合である。
要求プロセッサ(CPU1)は、ブロック1510において、要求プロセッサ(CPU1)が、該要求プロセッサ(CPU1)からのデータ要求が引き起こす干渉の繰り返し(遠隔プロセッサ(CPU2)上のトランザクション・アボートの繰り返し)を回避するために、付加的な同期が可能であると判断すると、ブロック1530において、要求プロセッサ(CPU1)は、代替的な同期化を利用する。ブロック1535において、(遠隔/受信プロセッサ(CPU2)上の同じトランザクション(即ち、同じキャッシュ/メモリ・アドレスを有する)の)干渉の繰り返しがいつ発生するかを判断するために、例えば、ローカル・トランザクション干渉追跡ストレージ・テーブル1350a内のログをチェックする。干渉の繰り返しがない場合、流れはブロック1525に進む。要求プロセッサ(CPU1)が、(遠隔/受信プロセッサ(CPU2)上の同じアボートされたトランザクションについての)干渉の繰り返しがあると判断すると、ブロック1540において、要求プロセッサは、コードの再最適化が可能であるかどうかをチェックする。再最適化が可能である場合、ブロック1545において、要求プロセッサ(CPU1)は、コードを再最適化する。
要求プロセッサ(CPU1)が、コードの再最適化が可能でないと判断すると、ブロック1550において、要求プロセッサ(CPU1)は、受信/遠隔プロセッサ(CPU2)からのデータを要求している(要求プロセッサ(CPU1)上で実行されている)この特定のトランザクションのための代替的な同期方法を恒久的に(及び/又は所定の期間)選択するように構成される。
1つの実施形態によると、図16は、プロセッサ(例えば、要求プロセッサCPU1)が、トランザクション・アボート・ステータス・フィールド1010内の情報から、例えば、ローカル・トランザクション干渉追跡ストレージ・テーブル1350a内に格納された(そして、インクリメント/追跡された)干渉の表示にどのように応答するかを示すフロー図1600である。図16は、ブロック1605がブロック1540に置き換わった以外、図15のブロックを含む。図15のブロックは、繰り返さない。
ブロック1535が肯定(YES)であるとき、フローは、図16のブロック1605に進む。ブロック1605において、要求プロセッサ(CPU1)は、再最適化又は代替的な同期が好ましいかどうかをチェックする。ブロック1605における判断が肯定であるとき、フローはブロック1545に進む。ブロック1605における判断が否定(NO)であるとき、フローはブロック1550に進む。図15のブロック1540において、コードの再最適化が可能であるとき、コードの再最適化は常に実施される。1605において、メトリックを計算して、コードの再最適化又は代替的な同期方法(例えば、ロック)が望ましいかどうかを判断し、一方又は他方を選択する。これは、例えば、代替的な同期方法の総コストを、再最適化コストを用いるコストに再最適化を実施するコストを加えたものと比較し、どちらが望ましいかを判断するテストに基づくことができる。例えば、再最適化コストを閾値と比較することにより、再最適化のオーバーヘッドのコストを最小化するなど、他のコスト・メトリックが可能であり、本開示により考えられる。
図17は、1つの実施形態による、コヒーレンス・プロトコルを実施するための(プロセッサ112a、112bにより実行される)方法のフローチャート1700である。
ブロック1705において、要求プロセッサ112a(CPU1)は、相互接続122を介して、データに対する要求(要求505、605など)を遠隔プロセッサ112b(CPU2)に送る。ブロック1710において、要求プロセッサ112a(CPU1)は、遠隔プロセッサ112bから応答(応答1005、1105)を受け取り、この応答は、遠隔プロセッサ112b上の遠隔トランザクション(例えば、トランザクション320b)のトランザクション・ステータス(例えば、トランザクション・アボート・ステータス1010)を含む。ブロック1715において、要求プロセッサ112aは、遠隔プロセッサ上の遠隔トランザクションのトランザクション・ステータス(例えば、フィールド1010からの情報)をローカル・トランザクション干渉追跡テーブル(例えば、テーブル1350a)に付加する。
上述した特徴の1つ又は複数に加えて、又は代案として、更に別の実施形態は、遠隔トランザクションのトランザクション・ステータスが、(要求プロセッサ112aにより)トランザクション診断ブロック(TDB)に付加されることを含むことができる。遠隔トランザクションは、遠隔プロセッサ112b上で実行され、要求プロセッサがデータ要求を遠隔プロセッサに送ることに基づいて実行をアボートする。要求は、要求を送る要求プロセッサ112a上で実行される要求トランザクション(例えば、トランザクション320a)によるものである。
上述した特徴の1つ又は複数に加えて、又は代案として、更に別の実施形態は、要求が、要求トランザクションにより、遠隔プロセッサ112bにおける遠隔トランザクション(例えば、トランザクション320b)のアボートを引き起こすことに基づいて、要求プロセッサ112aが、(フィールド1010から取得された)遠隔トランザクションのトランザクション・ステータスをローカル・トランザクション干渉追跡テーブル1350aに付加し、遠隔トランザクション(アボートする各特定のトランザクション320b)に関して生じたトランザクション・アボートのカウントをインクリメントすることを含むことができる。
上述した特徴の1つ又は複数に加えて、又は代案として、更に別の実施形態は、遠隔プロセッサ112bからの応答1005、1105における、要求プロセッサ112aが受け取った遠隔トランザクションのトランザクション・ステータスが、要求プロセッサ112aからの要求505、605を受け取ることに基づき、遠隔トランザクション(トランザクション320b)をアボートする必要があったことを示すことを含むことができる。
上述した特徴の1つ又は複数に加えて、又は代案として、更に別の実施形態は、ローカル・トランザクション干渉追跡テーブル1350aが、要求プロセッサ112a上で実行されている要求トランザクション320aと干渉し、これによりアボートされたトランザクションの数を保持することを含むことができる。ローカル・トランザクション干渉追跡テーブル1350aは、遠隔プロセッサ112b(及び他のプロセッサ)上の遠隔トランザクション320bについて説明する情報を保持する。遠隔プロセッサ112a上の遠隔トランザクション320bについて説明する情報は、プロセッサ上で実行されている要求トランザクションにより引き起こされた干渉のタイプ、要求トランザクションによりアボートされた遠隔トランザクションの各々の識別又はアドレス、干渉が生じた遠隔プロセッサの各々の識別、アボートされた遠隔トランザクションの各々のアドレス、及び/又はアボートされる前に遠隔トランザクションの各々により実施された作業の尺度のうちの少なくとも1つを含む。
技術的効果及び利点として、コヒーレンス・プロトコルが、トランザクション・ステータスについての付加的な情報を含むように拡張されることが挙げられる。プロセッサがトランザクション実行にあるとき、競合が検出されるため、コヒーレンス要求は、受信プロセッサのトランザクション実行のアボートを引き起こすことがある。コヒーレンス・プロトコル要求は、受信プロセッサが、実施形態によるトランザクション実行をアボートしたという付加的な情報により拡張される。
本明細書において用いられる用語は、特定の実施形態を説明する目的のためのものにすぎず、本発明を限定することを意図するものではない。本明細書で用いられるとき、単数形「1つの(a)」、「1つの(an)」及び「その(the)」は、文脈が明らかにそうでないことを示していない限り、複数形も含むことが意図されている。本明細書で用いられるとき、「含む(comprise)」及び/又は「含んでいる(comprising)」という用語は、提示された特徴、整数、ステップ、動作、要素、及び/又はコンポーネントが存在することを特定するものであるが、1つ又は複数の他の特徴、整数、ステップ、動作、要素、コンポーネント、及び/又はそれらのグループの存在又は追加を排除するものではないことがさらに理解されるであろう。
以下の特許請求の範囲における全ての「手段又はステップと機能との組み合わせ(ミーンズ又はステップ・プラス・ファンクション)」要素の対応する構造、材料、行為及び均等物は、その機能を、明確に特許請求されているように他の特許請求された要素と組み合わせて実行するための、いかなる構造、材料又は行為をも含むことが意図される。本発明の説明は、例示及び説明の目的で提示されたものであるが、網羅的であることを意図するものではなく、本発明を開示された形態に限定することを意図するものでもない。本発明の範囲及び精神から逸脱することのない多くの変更及び変形が、当業者には明らかであろう。実施形態は、本発明の原理及び実際の用途を最も良く説明するため、及び、当業者が本発明を種々の変更を有する種々の実施形態について企図される特定の使用に適したものとして理解することを可能にするために、選択及び記載された。
本発明の種々の実施形態の説明は、例示の目的で提示されたものであるが、網羅的であることを意図するものではなく、開示された実施形態に限定することを意図するものでもない。説明された実施形態の範囲及び精神から逸脱することのない多くの変更及び変形が、当業者には明らかであろう。本明細書において用いられる用語は、本実施形態の原理、実際の用途若しくは市場で見出される技術に対する技術的改良を最も良く説明するため、又は当業者が本明細書に開示される実施形態を理解することを可能にするために選択された。
ここで図18を参照すると、コンピュータ可読ストレージ媒体1802及びプログラム命令1804を含む一実施形態によるコンピュータ・プログラム製品1800が全体的に示される。
本発明は、システム、方法、及び/又はコンピュータ・プログラム製品とすることができる。コンピュータ・プログラム製品は、プロセッサに、本発明の態様を実施させるためのコンピュータ可読プログラム命令をそこに有するコンピュータ可読ストレージ媒体(単数又は複数)を含むことができる。
コンピュータ可読ストレージ媒体は、命令実行デバイスにより使用される命令を保持し、格納することができる有形デバイスとすることができる。コンピュータ可読ストレージ媒体は、例えば、これらに限定されるものではないが、電子記憶装置、磁気記憶装置、光記憶装置、電磁気記憶装置、半導体記憶装置、又は上記のいずれかの適切な組み合わせとすることができる。コンピュータ可読ストレージ媒体のより具体的な例の非網羅的なリストとして、以下のもの:即ち、ポータブル・コンピュータ・ディスケット、ハード・ディスク、ランダム・アクセス・メモリ(RAM)、読み出し専用メモリ(ROM)、消去可能なプログラム可能読み出し専用メモリ(EPROM又はフラッシュ・メモリ)、スタティック・ランダム・アクセス・メモリ(SRAM)、ポータブル、コンパクト・ディスク読み出し専用メモリ(CD−ROM)、デジタル多用途ディスク(DVD)、メモリ・スティック、フロッピー・ディスク、パンチカード若しくはそこに命令が記録された溝内の隆起構造などの機械的符号化デバイス、及び上記のいずれかの適切な組み合わせが挙げられる。本明細書で使用される場合、コンピュータ可読ストレージ媒体は、電波又は他の自由に伝搬する電磁波、導波路若しくは他の伝送媒体を通じて伝搬する電磁波(例えば、光ファイバ・ケーブルを通る光パルス)、又は配線を通じて伝送される電気信号のような、一時的信号それ自体として解釈されるべきではない。
本明細書で説明されるコンピュータ可読プログラム命令は、コンピュータ可読ストレージ媒体からそれぞれのコンピュータピューティング/処理デバイスに、又は、例えばインターネット、ローカル・エリア・ネットワーク、広域ネットワーク、及び/又は無線ネットワークなどのネットワークを介して外部コンピュータ若しくは外部ストレージ・デバイスに、ダウンロードすることができる。ネットワークは、銅製伝送ケーブル、光伝送ケーブル、無線伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイ・コンピュータ、及び/又はエッジ・サーバを含むことができる。各コンピューティング/処理デバイス内のネットワーク・アダプタ・カード又はネットワーク・インターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング/処理デバイス内のコンピュータ可読ストレージ媒体内に格納するためにコンピュータ可読プログラム命令を転送する。
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セット・アーキテクチャ(ISA)命令、マシン命令、マシン依存命令、ミリコード、ファームウェア命令、状態設定データ、又はSmalltalk、C++等などのオブジェクト指向型プログラミング言語、及び、「C」プログラミング言語、若しくは同様のプログラミング言語のような従来の手続き型プログラミング言語を含む1つ又は複数のプログラミング言語のいずれかの組み合わせで書かれたソース・コード若しくはオブジェクト・コードのいずれかとすることができる。コンピュータ可読プログラム命令は、完全にユーザのコンピュータ上で実行される場合もあり、スタンドアロンのソフトウェア・パッケージとして、一部がユーザのコンピュータ上で実行される場合もあり、一部がユーザのコンピュータ上で実行され、一部が遠隔コンピュータ上で実行される場合もあり、又は完全に遠隔コンピュータ若しくはサーバ上で実行される場合もある。最後のシナリオにおいては、遠隔コンピュータは、ローカル・エリア・ネットワーク(LAN)若しくは広域ネットワーク(WAN)を含むいずれかのタイプのネットワークを通じてユーザのコンピュータに接続される場合もあり、又は外部コンピュータへの接続がなされる場合もある(例えば、インターネット・サービス・プロバイダを用いたインターネットを通じて)。幾つかの実施形態において、例えば、プログラム可能論理回路、フィールド・プログラマブル・ゲート・アレイ(FPGA)、又はプログラム可能論理アレイ(PLA)を含む電子回路は、本発明の態様を実施するために、コンピュータ可読プログラム命令の状態情報を用いて電子回路を個人化することにより、コンピュータ可読プログラム命令を実行することができる。
本発明の態様は、本発明の実施形態による方法、装置(システム)及びコンピュータ・プログラム製品のフローチャート図及び/又はブロック図を参照して、本明細書で説明される。フローチャート図及び/又はブロック図の各ブロック、並びにフローチャート図及び/又はブロック図内のブロックの組み合わせは、コンピュータ可読プログラム命令によって実装できることが理解されるであろう。
これらのコンピュータ可読プログラム命令を、汎用コンピュータ、専用コンピュータ、又は他のプログラム可能データ処理装置のプロセッサに与えてマシンを製造し、それにより、コンピュータ又は他のプログラム可能データ処理装置のプロセッサによって実行される命令が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実装するための手段を作り出すようにすることができる。これらのコンピュータ可読プログラム命令を、コンピュータ、プログラム可能データ処理装置、及び/又は他のデバイスを特定の方式で機能させるように指示することができるコンピュータ可読ストレージ媒体内に格納し、それにより、内部に命令が格納されたコンピュータ可読ストレージ媒体が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作の態様を実装する命令を含む製品を含むようにすることもできる。
コンピュータ可読プログラム命令を、コンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上にロードして、一連の動作ステップをコンピュータ、他のプログラム可能データ処理装置、又は他のデバイス上で行わせてコンピュータ実施のプロセスを生成し、それにより、コンピュータ又は他のプログラム可能装置、又は他のデバイス上で実行される命令が、フローチャート及び/又はブロック図の1つ又は複数のブロックにおいて指定された機能/動作を実行するためのプロセスを提供するようにもできる。
図面内のフローチャート及びブロック図は、本発明の種々の実施形態によるシステム、方法及びコンピュータ・プログラム製品の可能な実装のアーキテクチャ、機能及び動作を示す。この点に関して、フローチャート又はブロック図内の各ブロックは、指定された論理機能を実装するための1つ又は複数の実行可能命令を含むモジュール、セグメント、又は命令の部分を表すことができる。幾つかの代替的な実装において、ブロック内に記載された機能は、図面内に記載された順序とは異なる順序で行われ得ることもある。例えば、連続して示された2つのブロックが、関与する機能に応じて、実際には、実質的に同時に実行されることもあり、又は、ときにはブロックが逆順に実行されることもある。また、ブロック図及び/又はフローチャート図の各ブロック、並びにブロック図及び/又はフローチャート図内のブロックの組み合わせは、指定された機能又は動作を行う専用ハードウェア・ベースのシステムによって、又は専用ハードウェアとコンピュータ命令との組み合わせによって実装できることにも留意されたい。