(57)【特許請求の範囲】
【請求項１】
コンピュータに、
キャッシュラインにヒントビットをタグ付けするキャッシュラインマーク命令を実行する段階と、
前記ヒントビットを確認した結果に基づいて、コンペア‐エクスチェンジ・オペレーション、または、ファスト・コンペア‐エクスチェンジ・オペレーションとして結果を格納するストア・オペレーションを実行するファスト・コンペア‐エクスチェンジ命令を実行する段階と、
を備える方法を実行させるためのプログラム。
【請求項２】
前記ファスト・コンペア‐エクスチェンジ命令を実行する段階は、
前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能と判断した場合に、前記ファスト・コンペア‐エクスチェンジ命令の第１マイクロオペレーションで、前記結果の前記格納を実行する請求項１に記載のプログラム。
【請求項３】
前記ファスト・コンペア‐エクスチェンジ命令を実行する段階は、
前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能でないと判断した場合に、コンペア‐エクスチェンジ・オペレーションを実行する請求項１または２に記載のプログラム。
【請求項４】
前記キャッシュラインマーク命令は、メモリアドレス位置パラメータを含む請求項１から３のいずれか一項に記載のプログラム。
【請求項５】
前記キャッシュラインマーク命令を実行する段階は、
前記メモリアドレス位置のメモリから読み出したキャッシュライン格納データのタグＩＤ構造に、前記ヒントビットおよび有効ビットを設定する請求項４に記載のプログラム。
【請求項６】
前記キャッシュラインマーク命令を実行する段階は、
前記タグＩＤ構造にビットマスクを更に設定し、
前記ビットマスクは、前記キャッシュラインのいずれのビットが、前記キャッシュラインマーク命令と関連しているかを示す請求項５に記載のプログラム。
【請求項７】
前記キャッシュラインマーク命令を実行する段階は、
前記タグＩＤ構造にハードウェアコンテキストＩＤ値を前記ヒントビットとして設定し、
前記ハードウェアコンテキストＩＤ値は、前記キャッシュラインマーク命令を実行した特定のハードウェアコンテキストを示す請求項６に記載のプログラム。
【請求項８】
前記ファスト・コンペア‐エクスチェンジ命令を実行する段階は、
前記有効ビットが設定されたことが確認され、前記キャッシュラインマーク命令のビットマスクと前記ファスト・コンペア‐エクスチェンジ命令のビットマスクとの間に前記ビットマスクが正しく設定されたことが確認され、且つ前記キャッシュラインマーク命令のハードウェアＩＤコンテキストが、前記ファスト・コンペア‐エクスチェンジ命令のハードウェアＩＤコンテキストと合致することが確認された場合に、
ファスト・コンペア‐エクスチェンジ・オペレーションを実行する請求項７に記載のプログラム。
【請求項９】
前記実行される方法は、
前記コンピュータが前記キャッシュラインマーク命令をサポートしていないと確認された場合には、前記キャッシュラインマーク命令をノー・オペレーション命令で置き換える段階をさらに備える請求項１から８のいずれか一項に記載のプログラム。
【請求項１０】
前記実行される方法は、
ファスト・コンペア‐エクスチェンジ命令の実行が成功したとき、前記キャッシュラインが追い出しされたとき、他のハードウェアコンテキストからのキャッシュラインマーク命令が前記キャッシュラインについて行われたとき、ハードウェアコンテキストによって前記キャッシュラインに書き込みが行われたとき、割り込みが発生したとき、および、前記キャッシュラインマーク命令のシーケンスの間にハードウェア障害が発生したときの少なくとも１つにおいて、前記有効ビットを消去する段階をさらに含む請求項５から８のいずれか一項に記載のプログラム。
【請求項１１】
キャッシュラインにヒントビットをタグ付けするキャッシュラインマーク命令、および、前記ヒントビットを確認した結果に基づいて、コンペア‐エクスチェンジ・オペレーション、または、ファスト・コンペア‐エクスチェンジ・オペレーションとして結果を格納するストア・オペレーションを実行するファスト・コンペア‐エクスチェンジ命令をデコードするデコード論理と、
前記キャッシュラインマーク命令および前記ファスト・コンペア‐エクスチェンジ命令を実行する実行論理と
を備えるプロセッサ。
【請求項１２】
前記実行論理は、前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能と判断した場合に、前記ファスト・コンペア‐エクスチェンジ命令の第１のマイクロオペレーションとしてストア・マイクロオペレーションを使用して、前記結果を格納する請求項１１に記載のプロセッサ。
【請求項１３】
前記実行論理は、前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能でないと判断した場合に、前記ファスト・コンペア‐エクスチェンジ命令をコンペア‐エクスチェンジ命令として実行する請求項１１または１２に記載のプロセッサ。
【請求項１４】
前記プロセッサは、メモリアドレス位置を格納するレジスタを備える請求項１１から１３のいずれか一項に記載のプロセッサ。
【請求項１５】
前記実行論理は、前記キャッシュラインマーク命令の実行において、前記メモリアドレス位置のメモリから読み出されたキャッシュライン格納データのタグＩＤ構造に、前記ヒントビットおよび有効ビットを設定する請求項１４に記載のプロセッサ。
【請求項１６】
前記実行論理は、前記キャッシュラインマーク命令の実行において、
前記タグＩＤ構造にビットマスクを更に設定し、
前記ビットマスクは、前記キャッシュラインのいずれのビットが、前記キャッシュラインマーク命令と関連しているかを示す請求項１５に記載のプロセッサ。
【請求項１７】
前記実行論理は、前記キャッシュラインマーク命令の実行において、
前記タグＩＤ構造にハードウェアコンテキストＩＤ値を前記ヒントビットとして設定し、
前記ハードウェアコンテキストＩＤ値は、前記キャッシュラインマーク命令を実行した特定のハードウェアコンテキストを示す請求項１６に記載のプロセッサ。
【請求項１８】
前記実行論理は、前記ファスト・コンペア‐エクスチェンジ命令の実行において、
前記有効ビットが設定されたかを判断し、
前記キャッシュラインマーク命令のビットマスクと前記ファスト・コンペア‐エクスチェンジ命令のビットマスクとの間に前記ビットマスクが正しく設定されたかを判断し、
前記キャッシュラインマーク命令のハードウェアＩＤコンテキストが、前記ファスト・コンペア‐エクスチェンジ命令のハードウェアＩＤコンテキストと合致するかを判断し、
全ての前記判断の結果が肯定的であった場合に、ファスト・コンペア‐エクスチェンジ・オペレーションを実行する請求項１７に記載のプロセッサ。
【請求項１９】
前記実行論理は、前記キャッシュラインマーク命令の実行において、
前記プロセッサが、前記キャッシュラインマーク命令をサポートしていないと確認された場合には、前記キャッシュラインマーク命令をノー・オペレーション命令で置き換える請求項１１から１８のいずれか一項に記載のプロセッサ。
【請求項２０】
キャッシュラインにヒントビットをタグ付けするキャッシュラインマーク命令、および、前記ヒントビットを確認した結果に基づいて、コンペア‐エクスチェンジ・オペレーション、または、ファスト・コンペア‐エクスチェンジ・オペレーションとして結果を格納するストア・オペレーションを実行するファスト・コンペア‐エクスチェンジ命令を格納するメモリと、
前記キャッシュラインマーク命令、及び、前記ファスト・コンペア‐エクスチェンジ命令を実行するプロセッサと、
を備え、
前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能と判断した場合に、前記ファスト・コンペア‐エクスチェンジ・オペレーションの実行により、結果が生成されるシステム。
【請求項２１】
前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能と判断した場合に、前記ファスト・コンペア‐エクスチェンジ命令の第１のマイクロオペレーションとしてストア・マイクロオペレーションを使用して、前記結果を格納する請求項２０に記載のシステム。
【請求項２２】
前記ヒントビットを確認した結果、ファスト・コンペア‐エクスチェンジ・オペレーションが実行可能でないと判断した場合に、前記ファスト・コンペア‐エクスチェンジ命令をコンペア‐エクスチェンジ命令として実行する請求項２０または２１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプロセッサによって実行されるコードに実装されるコンペア‐エクスチェンジ（比較／交換）オペレーションに関する。
【背景技術】
【０００２】
CMPXCHG（Compare-Exchange：比較／交換）オペレーションは、コード領域（すなわち、命令、オペレーション等）周辺のクリティカルな部分を形成する命令シーケンスのうちの１つの命令として広く使用されている。このオペレーションでは、コード領域を不可分で実行することが可能である。１つの命令セットは、次のような２つの条件に合った場合に、不可分（アトミック）であると考えることができる。１つ目の条件は、命令セット全体が完了するまで、他のプロセスは、行われた変更について知り得ないことであり、２つ目の条件は、命令セットのうちある命令が失敗した場合に、命令セット全体が失敗するということである。命令セット全体が失敗となった場合、その命令を実行しているコンピュータシステムの状態は、命令が実行される前の状態に戻される。ある実施形態では、CMPXCHG命令は、クリティカルな部分を持ったコード領域のソフトウェアで規定されたラッパー（wrapper）として考えることができる。すなわち、このラッパーは、ソフトウェアコードに組み込むことが可能であるが、ハードウェアによって実行されるという意味では、ラッパーではない。
【０００３】
CMPXCHG命令は、不可分命令セットの開始時にメモリから取得した値が、命令セットの実行中に他のプロセスによって変更されていないことを確認することにより、この命令セットが不可分に実行されるのを補助する役目をする。例えば、不可分命令セットの開始時に、メモリの特定の位置（ロケーション）における値をレジスタに読み込む場合、命令セットが完了した後に、新たな（すなわち、変更された）値を元のメモリ位置に再読み込みする要求が発行される場合がある（ここで、変更された値が、命令セットの実行結果である）。
【０００４】
CMPXCHG命令は、不可分命令セットの終わりに使用され、特定のメモリ位置から元々読み出された値が、依然として、そのメモリ内の位置に存在するかを確認するのに利用される（すなわち、不可分命令セットの実行の間のある時点で、他のプロセス又はスレッドにより変更されていないかを確認する）。元の値が依然として存在している場合には、CMPXCHG命令は、新たな値を、古い値が保存されていた特定のメモリ位置に読み込み、不可分命令セットが無事に完了する。元の値がそこに存在していない場合には、不可分命令セットの実行の間に、他のプロセス又はスレッドによって値が変更されたことを意味し、CMPXCHG命令は、新たな値を特定のメモリ位置に読み込むことはせず、システムにこの事を通知し、通知の結果によっては、コードにおける条件付ジャンプが実行される場合がある、すなわち、命令を無事に完了させることを再度試みるため、不可分命令セットの始めまでジャンプする。
【０００５】
本発明を図面を参照して説明するが、本発明はこれら図面に限定されない。また、添付の図面では、同一の要素には、同一の参照符号を付して説明する。
【図面の簡単な説明】
【０００６】
【図１】CLMARKコマンドに使用されるキャッシュラインタグのセットの実施形態を示した図である。
【図２】全CMPXCHGマイクロオペレーションシーケンスを実行すべきか、又はCMPXCHGオペレーションのSTORE部分のみを実行すべきかを判断するFASTCMPXCHG命令の決定木の実施形態を示したフローチャートである。
【図３】CLMARK及びFASTCMPXCHG命令を実行可能な１つ以上のＣＰＵコアを含むコンピュータシステムの実施形態を示したものである。
【発明を実施するための形態】
【０００７】
適応型の最適化されたコンペア‐エクスチェンジオペレーションを実装する機械可読媒体、プロセッサ及びシステムの実施形態を記載する。
【０００８】
まず、２つの命令、CLMARK（Cache Line Mark：キャッシュラインマーク）及びFASTCMPXCHG（Fast Compare-Exchange：ファスト・コンペア‐エクスチェンジ（高速比較／交換））について説明する。CLMARK命令は、タグＩＤ構造において、特定のキャッシュラインに、マイクロアーキテクチャのヒント（hint）ビットをタグ付けする。ヒントビットは、確認された時に、２つの方法のうちの１つである、FASTCMPXCHGを実行する準備がプロセッサ内で整ったことを、実行論理に知らせる。特に、キャッシュから読み出され、不可分命令シーケンスで使用されるデータが、変更されているか否かを知らせる。不可分命令シーケンスの間に、データが変更（修正）されていた場合、FASTCMPXCHG命令は、マイクロオペレーションのLOAD-COMPARE-STOREシーケンスを含む標準的なCMPXCHG（コンペア‐エクスチェンジ）命令へと戻る。一方、タグＩＤ構造におけるヒントビットを確認することにより、実行論理が、その特定のキャッシュラインにおけるデータが完全に修正されていないと判断可能な場合、唯一使用されるマイクロオペレーションが最後のSTOREである"高速"バージョンのCMPXCHGを実行可能である。したがって、多くの実施形態では、LOAD及びCOMPAREのマイクロオペレーションは、実行を必要とせず、省略することができ、プロセッサにおける実行効率をスピードアップさせることができる場合がある。
【０００９】
以下の記載及び特許請求の範囲において、本開示技術の「一実施形態」又は「ある実施形態」と呼ぶものは、実施形態に関連する特定の特徴、構造及び特性が、少なくとも本開示技術の実施形態の一つに含まれていることを意味する。したがって、本明細書中の様々な箇所で使用されている「一実施形態において」という表現は、必ずしも同一の実施形態を示していない。また、以下の記載及び特許請求の範囲において、"含む（include）"、"〜からなる（comprise）"及びこれらの派生語が使用されるが、これらは、同義語として扱われることを意図している。
【００１０】
今日のマルチスレッド環境では、不可分命令セットは、実行の途中で中断されることがある。この場合、他のスレッドにメモリの制御が引き渡され、格納されている値の幾つか又は多くを変更することが可能である。これは、不可分命令セットによって使用されるメモリ位置における値が、同じメモリ位置に新たな値が書き込まれる前に変更されてしまっている例の１つである。
【００１１】
実際のCMPXCHG命令は、実質的に、"lock CMPXCHG [mem], rdx"という基本的なフォーマットを含む。
【００１２】
特に、CMPXCHGの実行フローは、次のように行われる。
１）[mem]（memアドレスによって指定されたメモリ位置）に格納された値が、第１レジスタに読み込まれる（LOAD命令）（第１レジスタは、CMPXCHG内に組み込まれたLOADマイクロオペレーションのための実行論理によって利用される特定のレジスタを含む）。
２）第１レジスタ内の値が、eax／raxレジスタ（eaxかraxかは、オペランドのサイズによる）と比較される（COMPAREマイクロオペレーション）。
３）比較の結果、２つの値が等しい場合（すなわち、メモリ内の値が変わっていなかった場合）は、rdxレジスタ内の値が書き込まれる（[mem]へのSTOREマイクロオペレーション）。
４）比較の結果、２つの値が異なる場合（すなわち、メモリ内の値が変わっていた場合）は、[mem]に格納されている現在の値が、eax/raxに読み込まれる。
【００１３】
lockは、CMPXCHG命令自身を、不可分命令に変える。CMPXCHG命令は、上述したようなマイクロオペレーションのLOAD、COMPARE及びSTOREの組み合わせに分解できてしまうことから、このように不可分命令にすることが望ましい。
【００１４】
CMPXCHG命令全体が、成功するか失敗するかは、上述の実行フローの２）のCOMPARE命令の結果に依存する。CMPXCHGが成功したか否かを確認する単純な方法としては、成功した場合にはゼロフラグ（ZF）を設定し、失敗したらゼロフラグを解除するということが挙げられる。CMPXCHG命令に先立つある時点で、マイクロオペレーションのセット（LOAD-COMPARE-STORE）を付加的なLOAD命令と共に開始させる。これは、不可分命令の開始時に、CMPXCHG命令は、[mem]における値のeax／raxレジスタへの最初のLOADを必要とするからである。不可分命令セット全体の例として、例えば次のようなコードとして表される。
【００１５】
try_again:
mov rax, [mem]      ；メモリのロケーション[mem]の値をraxに読み込む。
mov rdx, rax       ；raxにおける値をrdxに読み込む。
＊＊rdxを新たな値にする（可能性のある）操作を行うコードを挿入する＊＊
lock cmpxchg [mem], rdx      ；raxにおける値が依然としてメモリの[mem]ロケーションの値と等しい場合、rdxをメモリのロケーション[mem]に読み込む。
jnz try_again      ；cmpxchgが成功した場合は、ZF = 1とし、失敗した場合はZF = 0として、ゼロ命令がもう一度トライを引き起こさない場合には、ジャンプする。
【００１６】
CMPXCHG命令が使用される場合、使用されるLOAD-COMPARE-STOREの組み合わせのマイクロオペレーションは、シリアル的に依存したフローとなる。このシリアルフロー依存性により、CMPXCHG命令を完了させるのに必要なマイクロオペレーションの数は、膨大となり得る。
【００１７】
上述したように、CMPXCHG命令は、一般的に、１つの命令シーケンスのうちの１つの命令として使用され、コード領域周辺でクリティカルな部分を形成し、特に、他のプロセス／スレッドが、対象となるメモリ位置の値を変更していないかを判断するのに使用される。対象のコア内の他のプロセス／スレッドが、不可分命令セットのコードのフローを中断させていない場合、及び別のコードを実行している他のコアが、対象のキャッシュラインをスヌープし終えている場合には、そのメモリ位置おける値に変更がないはずである。したがって、メモリ位置における値を調べることなく、同じコア内又は他のコア内の他のプロセス／スレッドがメモリ位置のメモリ内容を変更していないことを前もって知ることができれば、CMPXCHG命令のLOAD及びCOMPARE部分を実行する必要がないと言える。すなわち、メモリ位置における値に外部からの影響（すなわち、他のプロセス／スレッド／コア）がなかったと判断された場合には、CMPXCHG命令の必要な部分は、そのメモリ位置に新たな値を読み込む最後のSTOREマイクロオペレーションのみであると言える。
【００１８】
したがって、多くの実施形態では、２つの新規の命令を実装して、多くの場合実行する必要のない標準的なCMPXCHG組み合わせのマイクロオペレーションのうちのCOMPARE-STORE部分を実行させる。すなわち、多くの場合、ここに記載する新規の命令により、単に、組み合わせのSTORE部分のみの実行すればよくなる。
【００１９】
多くの実施形態では、この２つの命令は、CLMARK命令及びFASTCMPXCHG命令と呼ばれる。１番目の新規の命令はCLMARKである。CLMARK命令は、CLMARK8B memといった特定のフォーマットを有してもよい。
【００２０】
memフィールドは、１つのキャッシュライン内に収まる基本メモリアドレス情報を含む。8Bフィールドは、memアドレスで始まる何バイトを、FASTCMPXCHGとして考えるべきかを示す。多くの実施形態の場合、ＣＰＵ（Central Processing Unit）のキャッシュラインの大きさに至るまでの全ての２の累乗のバイトサイズをサポートする8Bフィールドを持った様々なCLMARK命令バージョンが存在していてもよい。
【００２１】
CLMARKオペレーションが、必要となる一意的に特定するためのタグを、memロケーションが参照する対象のキャッシュラインに設定し、不可分シーケンスのための意図的オーナーシップを示す。例えば、"有効（valid）"ビットを、一意的に特定するタグで使用して、memロケーションのためのキャッシュラインにおけるデータが、以前として有効であることを示してもよい。また、ＣＰＵが１つのコアにつき複数のハードウェアコンテキストをサポートしている場合には、一意的に特定するタグが、ハードウェアコンテキストＩＤを含んでもよい。また、一意的に特定するタグが、各キャッシュラインに対するビットマスク（又は、ＣＰＵ内に格納される専用スモールテーブルにおけるビットマスク）を含んでもよい。ビットマスクは、キャッシュラインにおける各バイトにつき、１つのビットを使用してもよい。このビットマスクは、共有データ構造において、失敗共有（false sharing）のコンフリクトを最小化するのに使用される。
【００２２】
ＣＰＵが、CLMARK命令をサポートしていない場合、コア内の実行論理は、単に、各CLMARKを"no operation （ノー・オペレーション）"（NOP）命令で置き換えるだけでもよい。このCLMARKからNOPへの置き換えは、CLMARKタグビットが、ヒントビットと見なされる所以である。また、CLMARK／FASTCMPXCHG命令を実装するシステムも、CLMARKからNOPへの置き換えを、いかなる時に行ってもよい。CLMARK/FASTCMPXCHGを利用可能なシステムが、CMPXCHGを利用すると判断する理由として、多くの例を挙げることができる。例えば、内部の共有リソースを使い果たし、特定のイベントが実行され、他の複数のリソースのうち、デバッグ／テストレジスタが設定される場合などが挙げられる。
【００２３】
図１は、CLMARKコマンドのために使用されるキャッシュラインタグのセットの実施形態を示したものである。
【００２４】
上述したように、各タグは、キャッシュラインタグＩＤ、有効ビット１０２、ＨＷコンテキストＩＤ１０４及びビットマスク１０６のような構造的要素を1つ又は複数含んでもよい。図１に示されている全てのタグ情報全体を、タグＩＤ構造と称する場合もある。多くの実施形態において、ビットマスクは、キャッシュラインを各バイトベースでマスクし、各バイトは、マスクのための独自のビットを持つ。したがって、キャッシュラインにＮバイト存在する場合には、バイト０からＮ−１に対するビットマスクにおいて複数のビットが存在する。CLMARK命令が実行されると、memベースアドレス及び8Bフィールドを利用して適切なビットマスク値が設定され、次のFASTCMPXCHGシーケンスに関係するキャッシュラインにおけるこれらのバイトにフラグを付ける。
【００２５】
別の実施形態では、バイト毎のビットマスクフィールドは利用しなくてもよい。バイト毎のビットマスクフィールドが使用されない場合には、キャッシュライン全体に対して１つのビットを使用して、そのキャッシュラインがCLMARK/FASTCMPXCHG命令に関与していることを示すようにしてもよい。
【００２６】
FASTCMPXCHGは、上述した新規の命令の、２番目の命令である。FASTCMPXCHG命令は、lock FASTCMPXCHG8B [mem], testval, newvalのような特定のフォーマットを有してもよい。
【００２７】
FASTCMPXCHG命令は、レガシーコード問題を避けるために、元のCMPXCHG命令とは異なる表現がなされている。すなわち、CMPXCHG命令がFASTCMPXCHG命令のように動作するよう更新されている場合には、CMPXCHGを使用したレガシーコードは、正確なフォーマット又は付随した条件を含んでいなくてもよく、２つの異なる命令が利用される。レガシー命令及び新規の命令は、実行ユニットを共有してもよいし、共有しなくてもよい。２つの命令の間での機能複製の量を考えると、レガシー命令と新規の命令との間で、実行ユニットを共有するのが効率的であると言えるかもしれない。
【００２８】
FASTCMPXCHG [mem]フィールドは、コンペア／エクスチェンジ目的に使用される値を格納するキャッシュラインに対応する、メモリ位置のベースメモリアドレスを示す。8Bフィールドは、上述の目的におけるCLMARK 8Bフィールドの写しであり、[mem]アドレスから始まる何バイトを、FASTCMPXCHGとして考えるべきかを示す。多くの実施形態において、ＣＰＵのキャッシュラインの大きさに至るまでの２の累乗全てのバイトサイズをサポートする8Bフィールドを持った様々なFASTCMPXCHG命令バージョンが存在していてもよい。
【００２９】
FASTCMPXCHG命令は、先に詳述したように、LOAD、COMPARE及びSTOREのマイクロオペレーション（μｏｐ）フェーズに分解できるが、LOADに先立って、分岐が存在する。内部分岐では、全LOAD-COMPARE-STOREマイクロオペレーションシーケンスが、順番に実行された否かを判断する、又はLOAD-COMPARE部分がスキップされ、STORE部分のみが実際には実行されたのかを判断する。FASTCMPXCHG命令内のブランチでは、決定の数に基づいてどのパスを選択するべきかを判断する。したがって、コードを実行するハードウェアにおいて、いずれのケースであっても、FASTCMPXCHGオペレーションを採用可能である。
【００３０】
図２は、全CMPXCHGマイクロオペレーションシーケンスを実行すべきか、又はCMPXCHGオペレーションのSTORE（ストア）部分のみを実行すべきかを判断するFASTCMPXCHG命令の決定木の実施形態を示したものである。
【００３１】
決定木内のいずれの方向に進むべきかを判断する処理論理は、ハードウェア（例えば、実行ユニット回路）、ファームウェア（例えば、一般的なＣＰＵマイクロコード）、又はハードウェア及びファームウェア両方の組み合わせを含んでもよい。図２に示すように、処理論理は、まず初めに、実行パイプラインにおいてFASTCMPXCHGオペレーションを受信する（処理ブロック２００）。次いで処理論理は、FASTCMPXCHG命令に関連付けられたマイクロアーキテクチャヒントビットを含むキャッシュラインタグを探す（処理ブロック２０２）。ハードウェアがFASTCMPXCHGを処理する能力を有する場合には、先行するCLMARKが利用可能なタグが、各キャッシュラインについて提示される。ハードウェアがタグを持っていない場合は、CLMARK及びFASTCMPXCHGは、サポートされない。その場合には、処理論理は、コードのリストに載っているFASTCMPXCHG命令の代わりに、[mem]、testval、及びnewvalパラメータを使用して標準的なCMPXCHG命令を実行する（処理ブロック２１２）。
【００３２】
マイクロアーキテクチャヒントビットを含むタグが存在する場合には、処理論理は、ヒントビットがその[mem]アドレスについて有効であるかを確認する（処理ブロック２０４）。処理論理は、[mem]アドレスに合致するキャッシュラインの"有効"ビット（図１を参照）を確認することにより、ビットが有効かの判断を行うことができる。CLMARK命令は、ビットを"有効"に設定することができる。"有効"ビットが設定されない場合には、そのキャッシュラインのデータは、FASTCMPXCHG命令に対して有効なデータではなく、処理論理は、[mem]、testval、及びnewvalパラメータを使用した通常のCMPXCHG命令を実行する（処理ブロック２１２）。"有効"ビットが、[mem]アドレスにのキャッシュラインにおけるデータが有効であることを示すように設定される場合、処理論理は、現在のハードウェアコンテキストが、キャッシュラインタグ内のマイクロアーキテクチャヒントビット（すなわち、図１のヒントビット１０４）におけるハードウェア（ＨＷ）コンテキストID'dと合致する（処理ブロック２０６）。ハードウェアが、複数のハードウェアコンテキストをサポートしていない場合には、ＨＷコンテキストＩＤ１０４ヒントビットは、常に同じものとなり、プロセスのこの部分は常に成功することになる。複数のハードウェアコンテキストがサポートされている場合には、プロセスのこの部分を成功させるために、ＨＷコンテキストＩＤ１０４が合致する必要がある。
【００３３】
ＨＷコンテキストＩＤが合致しない場合には、処理論理は、[mem]、testval、及びnewvalパラメータを使用した通常のCMPXCHG命令を実行する（処理ブロック２１２）。反対に、ＨＷコンテキストＩＤが合致する、又はハードウェアが複数のコンテキストをサポートしていない場合には、処理論理は、ビットマスクが正しく設定されていると判断する（処理ブロック２０８）。処理論理は、CLMARKビットマスクと、FASTCMPXCHGビットマスクとを比較する。これらのビットマスクが合致しない場合には、処理論理は、[mem]、testval、及びnewvalパラメータを使用した通常のCMPXCHG命令を実行する（処理ブロック２１２）。ビットマスクが合致する場合には、処理論理は次のステップに進み、CMPXCHG命令のLOAD-COMPARE部分を実行することなく直接新たな値を格納（STORE）する新規なFASTCMPXCHG命令を実行する（処理ブロック２１０）。
【００３４】
上述したように、図２の決定木のある分岐点において失敗した場合には、予備として通常のCMPXCHGが常に実行される。このようにすることで、コードの進行を確実にすることができる。
【００３５】
次に示す条件のうち、いずれか１つを満たすキャッシュラインについては、（図１で詳述した）マイクロアーキテクチャヒントビットを消去して、無効を設定してもよい。
１）そのキャッシュラインにおいてFASTCMPXCHG命令の実行が成功した。
２）ヒントビットを持つキャッシュラインが、キャッシュから追い出しされた。
３）他のハードウェアコンテキストによって実行されたCLMARKが、そのキャッシュラインを対象としていた。
４）他のハードウェアコンテキストによってそのキャッシュラインが書き込まれた。
５）割り込みが起きた。
６）CLMARK発生から、FASTCMPXCHG命令の完了までの間に、ハードウェア故障が発生した。
【００３６】
他の実施形態では、マイクロアーキテクチャヒントビットを、FASTCMPXCHG命令の実行に伴って、消去しなくてもよい。次に続くFASTCMPXCHGが、同じデータについてオペレーションを行う場合には、CLMARK命令に関連したオーバーヘッドなしにオペレーションを実行できることから、ヒントビットを消去しない方が効率的であると言える場合もある。
【００３７】
ビットマスクフィールドが使用される多くの実施形態では、上記で列挙したようなキャッシュラインヒントビットを消去及び無効化する規則は、キャッシュラインは影響を受けるかもしれないが、CLMARKによってフラグを付けられたバイトのいずれも特に影響を受けていないといったキャッシュの状況の因子となるものに応じて変更してもよい。
【００３８】
また、lockをFASTCMPXCHG命令にも利用して、FASTCMPXCHG命令を不可分命令としてもよい。これは、FASTCMPXCHG命令が、CMPXCHG命令のLOAD-COMPARE部分を消去したがために成功しなかった場合には、マイクロオペレーションのLOAD-COMPARE-STORE組み合わせの全てが実行されることになるので、元のCMPXCHG命令と同様に、lockが必要となる。
【００３９】
次に、CLMARK-FASTCMPXCHG命令を実行するＣＰＵの実施形態を説明する。この実施形態では、ＣＰＵが、キャッシュに必須のマイクロアーキテクチャヒントビットをタグ付けすることができる１つ以上のコアを含む。サンプルコードの全てを以下に示す。
【００４０】
try_again:
clmark [mem]      ；[mem]のキャッシュラインについてヒントビットを設定する。
mov rax, [mem]      ；[mem]位置のメモリにおける値をraxに読み込む。
mov rdx, rax      ；raxの値をrdxに読み込む。
inc rdx      ；rdxを変更する
lock fastcmpxchg [mem], rdx      ；[mem]のキャッシュラインのヒントビットについて、図２における処理ブロック２０２、２０４、２０６及び２０８が全て真である場合は、rdxが[mem]のメモリに格納される、真でない場合は、標準的cmpxchgが実行される。
jnz try_again      ；fastcmpxchgが成功すれば、ZF = 1とする、成功しなかった場合にはZF = 0とし、ゼロでない命令がもう一度トライを引き起こさなければジャンプする。
【００４１】
図３は、CLMARK及びFASTCMPXCHG命令を実行可能な１つ以上のＣＰＵコアを含むコンピュータシステムの実施形態を示したものである。
【００４２】
図には、コンピュータシステム３００が描かれている。コンピュータシステムは、デスクトップ、サーバー、ラップトップ、ハンドヘルド、テレビのセットトップ、メディアセンター、ゲーム機、（車内に設けられるような）統合システム、又はその他の種類のコンピュータシステムであってもよい。幾つかの実施形態では、コンピュータシステム３００は、１つ以上の中央演算処理装置（ＣＰＵ）を含む。多くの実施形態において、より多くのＣＰＵが設けられる可能性があるが、図示を簡略化するため、図３においては２つのＣＰＵ（３０２及び３０４）のみが示されている。ＣＰＵ３０２及び３０４は、インテル（登録商標）社製のＣＰＵであってもよいし、他社製のＣＰＵであってもよい。各ＣＰＵは、１つ以上のコアを含む。図に示した実施形態では、ＣＰＵ３０２は、コアＡ０（３０６）、コアＡ１（３０８)、コアＡ２(３１０)及びコアＡ３（３１２）を含み、ＣＰＵ３０４は、コアＢ０（３１４）、コアＢ１（３１６)、コアＢ２（３１８)及びコアＢ３（３２０）を含む。
【００４３】
他の実施形態では、ＣＰＵ３０２及び３０４はそれぞれ、図３に示したコアの数４つよりも多い又は少ない数のコアを有していてもよい。多くの実施形態において、各コア（例えば、コアＡ０（３０６）のような）は、１つ以上の実行ユニット、リタイアメントユニット、汎用レジスタ及び特定レジスタの組等を含む。図３に示すコアが、マルチスレッド又はハイパースレッドである場合には、各ハードウェアスレッドを、１つのコアとして見なすこともできる。
【００４４】
また、ＣＰＵ３０２及び３０４はそれぞれ、ラストレベルキャッシュ（ＬＬＣ）３２２及び３２４のような１つ以上のキャッシュを含む。図示しない多くの実施形態において、キャッシュ３２２及び３２４以外に他のキャッシュを実装してもよく、各コア及びメモリにおける実行ユニット間には、複数レベルのキャッシュが存在する。他の実施形態において、複数のキャッシュが、様々な方法で分配されていてもよい。様々な実施形態において、キャッシュ３２２及び３２４はそれぞれ、異なるサイズのキャッシュのうちの１つであってもよい。例えば、キャッシュ３２２及び３２４はそれぞれ、８メガバイト（ＭＢ）キャッシュ、１６ＭＢキャッシュ等であってもよい。また、様々な実施形態において、キャッシュは、ダイレクトマップキャッシュ、フルアソシエイティブキャッシュ、マルチウェイセットアソシエイティブキャッシュ、又は他の種類のマップ方式のキャッシュであってもよい。各キャッシュは、それぞれのＣＰＵにおいて全てのコアが共有する１つの大きな部分を含んでもよいし、又は、別々に機能する複数のスライス（例えば、１つのコアにつき、１つのスライスといったように）に分割されていてもよい。また、各キャッシュは、全てのコアによって共有される１つの部分と、各コアに対応して別々に機能するスライス部分とを含んでもよい。
【００４５】
多くの実施形態において、ＣＰＵ３０２及び３０４はそれぞれ、自身のシステムメモリコントローラ（３２６及び３２８）を含み、それぞれシステムメモリ３３０及び３３２と通信するインターフェースを提供してもよい。図示しない他の実施形態では、コンピュータシステム３００において、メモリコントローラ３３０及び３３２は、個別の素子である又は、他のデバイス内に集積されていてもよい。
【００４６】
システムメモリ３３０及び３３２は、ダブルデータレート（ＤＤＲ）ＤＲＡＭのようなダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）、フラッシュメモリのような不揮発性メモリ、相変化メモリ（ＰＣＭ）、又は他の種類のメモリ技術を含んでもよい。システムメモリ３３０及び３３２は、それぞれＣＰＵ３０２及び３０４によって実行されるべき命令及びデータを格納する実行汎用メモリであってもよい。また、コンピュータシステム３００内に、システムメモリに対して読み込み及び書き込みを行うことが可能な、ダイレクトメモリアクセル（ＤＭＡ）可能な入出力（Ｉ／Ｏ）デバイスのような他のデバイスを設けてもよい。
【００４７】
対応するシステムメモリと各ＣＰＵとを連結するリンク（すなわち、バス、相互接続等）は、データ、アドレス、制御及びクロック情報を転送可能な１つ以上の光学配線、金属配線又は他の配線（すなわち、ライン）を含んでもよい。
【００４８】
また、ＣＰＵ３０２及び３０４は、ポイント・ツー・ポイント（Ｐ２Ｐ）インターフェース回路３３４及び３３６をそれぞれ使用したＰ２Ｐインターフェースを通じて、互いに通信してもよい。Ｐ２Ｐインターフェースは、高速双方向シリアルリンク、別個の一方向シリアルリンクの組、又は他のリンクと平行して実装されるリンクを含んでもよい。相互に通信するのとは別に、ＣＰＵ３０２及び３０４は、同様な種類のＰ２Ｐインターフェースを通じて、構成のインターフェースコンプレックス３３８とインターフェースしてもよい。具体的には、ＣＰＵ３０２は、ＣＰＵ側のＰ２Ｐインターフェース回路３４０及びコンプレックス３３８側のＰ２Ｐインターフェース回路３４２を通じてコンプレックス３３８と通信してもよく、ＣＰＵ３０４は、ＣＰＵ側のＰ２Ｐインターフェース回路３４４及びコンプレックス３３８側のＰ２Ｐインターフェース回路３４６を通じてコンプレックス３３８と通信してもよい。
【００４９】
高性能インターフェースコンプレックス３３８は、高いデータスループットを必要とするサブシステムとのインターフェースを提供してもよい。例えば、高性能グラフィックサブシステム３４８は、Ｉ／Ｏインターフェース３５０を通じてＣＰＵと通信してもよく、高性能通信サブシステム３５２は、Ｉ／Ｏインターフェース３５４を通じて通信を行ってもよい。また、高性能インターフェースコンプレックス３３８は、Ｉ／Ｏインターフェース３６０を使用するＩ／Ｏハブコンプレックス３５８と通信するために、Ｉ／Ｏインターフェース３５６を含んでもよい。コンピュータシステム３００に示されている各Ｉ／Ｏインターフェースの回路は、同じものであってもよいし、異なるものであってもよい。例えば、高性能グラフィックサブシステム３４８をコンプレックス３３８と連結するＩ／Ｏインターフェース３５０は、１６レーン・ペリフェラル・コンポーネント・インターフェース（ＰＣＩ）エクスプレス・プロトコルリンクを含んでもよく、また、高性能インターフェースコンプレックス３３８をＩ／Ｏコンプレックス３５８に連結するＩ／Ｏインターフェース３５６は、異なるプロトコルを使用してもよい。
【００５０】
Ｉ／Ｏハブコンプレックス３５８は、１つ又は複数のＩ／Ｏ相互接続（すなわち、バス）及びＣＰＵ３０２、３０４と連結されているデバイス間の通常の通信インターフェースを提供してもよい。例えば、Ｉ／Ｏハブコンプレックス３５８は、ホストコントローラ３６２及び３６４を含んでもよい。各ホストコントローラは、コンピュータシステム３００の残りの構成とＩ／Ｏデバイスとを通信可能に連結するインターフェースを提供してもよい。例えば、１つのＩ／Ｏハブコンプレックスが、ユニバーサル・シリアル・バス（ＵＳＢ）ハブコンプレックスであって、他のＩ／Ｏハブコンプレックスが、レガシーＰＣＩハブコンプレックスであってもよい。また、Ｉ／Ｏデバイス３６６及び３７０が、それぞれＩ／Ｏホストコントローラ３６２及び３６４と連結されている。多くの実施形態において、Ｉ／Ｏホストコントローラ３６２のようなＩ／Ｏホストコントローラに連結される大容量記憶デバイス３６８が配置されていてもよい。大容量記憶デバイス３６８は、ハードディスクドライブ、ソリッドステートドライブ、相変化メモリアレイ、又は他の種類の大容量記憶装置であってもよい。また、他のレガシーバスとインターフェースする１つ又は複数のブリッジが存在してもよい。例えば、ブリッジ３７２は、Ｉ／Ｏホストコントローラインターフェースと連結されていてもよく、このブリッジが、Ｉ／Ｏデバイス３７４と連結される相互接続／バスのプロトコルを翻訳するプロトコルを提供してもよい。
【００５１】
コンピュータシステム３００のコアそれぞれにおいて、CLMARK及びFASTCMPXCHG命令を実行可能な処理論理の少なくとも１つの実施形態が設けられる。この論理は、コアＡ０（３０６）、Ａ１（３０８）、Ａ２（３１０）及びＡ３（３１２）ではそれぞれ、処理論理４００、４０２、４０４及び４０６として表されており、コアＢ０（３１４）、Ｂ１（３１６）、Ｂ２（３１８）及びＢ３（３２０）ではそれぞれ、処理論理４０８、４１０、４１２及び４１４として表されている。また、他の実施形態では、CLMARK及びFASTCMPXCHG命令を実行可能な処理論理は、複数の回路、論理ユニット又は図３に示すようなデバイス全体に分配されていてもよい。
【００５２】
図示していないが、ＣＰＵ、バス、メモリ等の異なるレイアウトを利用したコンピュータシステムの他の実装形態も、本発明を実装するのに適用可能である。
【００５３】
また、CLMARK及びFASTCMPXCHG命令を含むコードが、オペレーションの間、異なる時間にコンピュータシステム３００の１つ又は複数の場所に存在してもよい。例えば、新規の命令を実装するコード４１６は、システムメモリ３３０若しくは３３２（コード４１６Ａ若しくはコード４１６Ｂ）、キャッシュ３２２若しくは３２４（コード４１６Ｃ若しくはコード４１６Ｄ）、大容量記憶デバイス３６８（コード４１６Ｅ)、又はコンピュータシステム３００内部のその他の場所若しくは外部に存在して（すなわち、格納されて）いてもよい。
【００５４】
以上、適応型の最適化されたコンペア‐エクスチェンジオペレーションを実装する機械可読媒体、プロセッサ及びシステムの実施形態を説明した。特定の例を示す実施形態を参照して、実施形態が説明されたが、ここに記載された実施形態の範囲内において、様々な改良及び変更が可能であることは、当業者にとって明らかである。したがって、本明細書及び添付の図面は、発明を限定するためのものではなく、例示するためのものと見なすべきである。
【図１】
0005451579.tif 000002
【図２】
0005451579.tif 000003
【図３】
0005451579.tif 000004