(57)【要約】本明細書では、ロック命令の実行を改善するための技術を提供する。ロック命令及びこれより若い命令は、ロック命令のストア部分がその値をメモリにコミットする前に、スペキュレーティブリタイアすることが許可される。したがって、これらの命令は、リタイアする前にロック命令が完了するのを待機する必要がない。プロセッサは、ロック命令の値をコミットする前にロック命令のアトミック特性又はフェンシング特性の違反を検出した場合に、状態をロールバックし、ロック命令のストア済みの値がコミットされるまで若い命令の実行が許可されないスローモードでロック命令を実行する。命令は、ロック命令の実行後にリタイアするのを待機する必要がないことから、これらの命令のスペキュレーティブリタイアは、処理速度の上昇をもたらす。【選択図】図４
2019532420.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサのコアにおいてロック命令よりも若い命令をスペキュレーティブリタイアする方法であって、
前記ロック命令をリタイアすることであって、前記ロック命令は、前記ロック命令のストア部分がメモリにコミットされたとみなされるまで、リタイア後も保留のままである、ことと、
前記ロック命令をリタイアすることに応じて、前記プロセッサのチェックポイント状態を保存することであって、前記チェックポイント状態は、前記ロック命令のアトミック特性又は前記ロック命令のフェンシング特性に違反した場合に、前記プロセッサの状態をロールバックするためのデータを含む、ことと、
前記ロック命令をリタイアした後であるが、前記ロック命令の前記ストア部分がメモリにコミットされる前に、前記ロック命令よりも若い命令をスペキュレーティブリタイアすることと、を含む、
方法。
【請求項２】
前記アトミック特性又は前記フェンシング特性のうち１つの違反を検出することと、
前記違反を検出したことに応じて、前記チェックポイント状態を介して前記プロセッサの状態をロールバックすることと、を含む、
請求項１の方法。
【請求項３】
前記違反を検出することは、
前記ロック命令に関連するメモリアドレスにストアする要求を検出することによって、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に前記アトミック特性の違反を検出することを含む、
請求項２の方法。
【請求項４】
前記違反を検出することは、
前記ロック命令よりも若いロード命令に関連するメモリアドレスにストアする要求を検出することによって、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に前記フェンシング特性の違反を検出することを含む、
請求項２の方法。
【請求項５】
前記チェックポイント状態を介して前記プロセッサの状態をロールバックすることは、
前記チェックポイント状態に基づいてアーキテクチャレジスタ値をリストアすることと、
前記チェックポイント状態に基づいて前記プロセッサのプログラムカウンタをリストアすることと、
前記ロック命令よりも若い保留中の命令をキャンセルすることと、を含む、
請求項２の方法。
【請求項６】
スローモードで前記ロック命令を実行することを含み、
前記スローモードでは、前記ロック命令よりも古いストアがメモリにコミットされた値を有するまで、前記ロック命令が実行されず、
前記スローモードでは、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされるまで、前記ロック命令よりも若い命令の実行が許可されない、
請求項２の方法。
【請求項７】
前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に前記アトミック特性又は前記フェンシング特性の違反を検出しないことと、
前記違反を検出しないことに応じて、前記チェックポイント状態を解放することと、ロードオーダリングキューからリタイア後のエントリを削除することと、を含む、
請求項１の方法。
【請求項８】
前記チェックポイント状態は、前記プロセッサのアーキテクチャレジスタ値及びフラグを含む、
請求項１の方法。
【請求項９】
前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に、前記チェックポイント状態によって保存されないレジスタに書き込む命令のリタイアを抑制することを含む、
請求項１の方法。
【請求項１０】
ロック命令よりも若い命令をスペキュレーティブリタイアするプロセッサであって、
前記ロック命令をリタイアするように構成されたリタイアユニットであって、前記ロック命令は、前記ロック命令のストア部分がメモリにコミットされるまで、リタイア後も保留のままである、リタイアユニットと、
前記ロック命令がリタイアしたことに応じて前記プロセッサのチェックポイント状態を保存するように構成されたチェックポイントユニットであって、前記チェックポイント状態は、前記ロック命令のアトミック特性又は前記ロック命令のフェンシング特性に違反した場合に、前記プロセッサの状態をロールバックするためのデータを含む、チェックポイントユニットと、を備え、
前記リタイアユニットは、前記ロック命令をリタイアした後であるが、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に、前記ロック命令よりも若い命令をスペキュレーティブリタイアするように構成されている、
プロセッサ。
【請求項１１】
前記アトミック特性又は前記フェンシング特性のうち１つの違反を検出し、前記違反を検出したことに応じて、前記プロセッサに対して、前記チェックポイント状態を介して前記プロセッサの状態をロールバックさせるように構成されたロード／ストアユニットを備える、
請求項１０のプロセッサ。
【請求項１２】
前記ロード／ストアユニットは、
前記ロック命令に関連するメモリアドレスにストアする要求を検出することによって、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に前記アトミック特性の違反を検出することによって、前記違反を検出するように構成されている、
請求項１１のプロセッサ。
【請求項１３】
前記ロード／ストアユニットは、
前記ロック命令よりも若いロード命令に関連するメモリアドレスにストアする要求を検出することによって、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に前記フェンシング特性の違反を検出することによって、前記違反を検出するように構成されている、
請求項１１のプロセッサ。
【請求項１４】
前記チェックポイント状態を介して前記プロセッサの状態をロールバックすることは、
前記チェックポイント状態に基づいてアーキテクチャレジスタ値をリストアすることと、
前記チェックポイント状態に基づいて前記プロセッサのプログラムカウンタをリストアすることと、
前記ロック命令よりも若い保留中の命令をキャンセルすることと、を含む、
請求項１１のプロセッサ。
【請求項１５】
前記ロード／ストアユニットは、前記プロセッサの前記ロード／ストアユニット及び機能ユニットのうち少なくとも１つに対して、前記ロック命令をスローモードで実行させるように構成されており、
前記スローモードでは、前記ロック命令よりも古いストアがメモリにコミットされた値を有するまで、前記ロック命令が実行されず、
前記スローモードでは、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされるまで、前記ロック命令よりも若い命令の実行が許可されない、
請求項１１のプロセッサ。
【請求項１６】
前記ロード／ストアユニットは、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に前記アトミック特性又は前記フェンシング特性の違反を検出しないことに応じて、前記チェックポイントユニットに対して、前記チェックポイント状態を解放させ、ロードオーダリングキューからリタイア後のエントリを削除させるように構成されている、
請求項１１のプロセッサ。
【請求項１７】
前記チェックポイント状態は、前記プロセッサのアーキテクチャレジスタ値及びフラグを含む、
請求項１０のプロセッサ。
【請求項１８】
前記リタイアユニットは、
前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に、前記チェックポイント状態によって保存されないレジスタに書き込む命令のリタイアを抑制するように構成されている、
請求項１０のプロセッサ。
【請求項１９】
ロック命令よりも若い命令をスペキュレーティブリタイアするコンピュータシステムであって、
プロセッサと、
前記プロセッサによって実行される命令をストアするメモリと、を備え、
前記プロセッサは、
前記ロック命令をリタイアするように構成されたリタイアユニットであって、前記ロック命令は、前記ロック命令のストア部分がメモリにコミットされるまで、リタイア後も保留のままである、リタイアユニットと、
前記ロック命令がリタイアしたことに応じて、前記プロセッサのチェックポイント状態を保存するように構成されたチェックポイントユニットであって、前記チェックポイント状態は、前記ロック命令のアトミック特性又は前記ロック命令のフェンシング特性に違反した場合に、前記プロセッサの状態をロールバックするためのデータを含む、チェックポイントユニットと、を備え、
前記リタイアユニットは、前記ロック命令をリタイアした後であるが、前記ロック命令の前記ストア部分がメモリにコミットされたとみなされる前に、前記ロック命令よりも若い命令をスペキュレーティブリタイアするように構成されている、
コンピュータシステム。
【請求項２０】
前記プロセッサは、
前記アトミック特性又は前記フェンシング特性のうち１つの違反を検出し、
前記違反を検出したことに応じて、前記プロセッサに対して、前記チェックポイント状態を介して前記プロセッサの状態をロールバックするように構成されたロード／ストアユニットを備える、
請求項１９のコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の相互参照）
本願は、２０１６年９月１５日に出願された米国特許出願第１５／２６７，０９４号、及び、２０１６年１１月２４日に出願された欧州特許出願第１６２００５７６．３号の利益を主張し、その内容は、完全に記載されているかのように、言及したことで本明細書に組み込まれる。
【背景技術】
【０００２】
ロック命令は、メモリからデータを読み出し、当該データを変更し、当該データをメモリに戻してストアする命令の一種である。ロック命令は、アトミック特性（atomic property）及びフェンシング特性（fencing property）を有する。アトミック特性は、ロック命令が開始する時間とロック命令が終了する時間との間に、ロード命令に関連するメモリアドレスに対する変更が行われるのを抑制する。フェンシング特性は、ロック命令の後のメモリアクセスの完了が許可される前に、ロック命令よりも「古い」（プログラム順において前の）全てのメモリアクセスが完了する必要があることをいう。これらの特性を厳密に適用すると、ロック命令及びこれよりも若い命令が古い命令の完了を待機する必要があることに関連する遅延によって、プロセッサの速度が低下する可能性がある。
【０００３】
添付の図面と共に例として与えられる以下の説明から、より詳細な理解が得られるであろう。
【図面の簡単な説明】
【０００４】
【図１】１つ以上の開示された機能を実行することができる例示的なデバイスのブロック図である。
【図２】一例による、図１のプロセッサのコア内に含まれる命令実行パイプラインのブロック図である。
【図３Ａ】一例による、ロック命令のスペキュレーティブ（speculative）リタイアを説明する図である。
【図３Ｂ】一例による、ロック命令のアトミック特性又はフェンシング特性の違反の検出に応じて発生する動作を説明する図である。
【図３Ｃ】ロック命令のストアがコミットされる前にロック命令のアトミック特性及びフェンシング特性が違反していない場合に発生する動作を説明する図である。
【図４】一例による、ロック命令よりも若い命令をスペキュレーティブリタイアする方法のフロー図である。
【発明を実施するための形態】
【０００５】
ロック命令及びこれよりも若い命令は、ロック命令のストア部分がその値をメモリにコミットする前に、スペキュレーティブリタイアすることが許可される。したがって、これらの命令は、リタイアする前にロック命令が完了するのを待機する必要がない。プロセッサは、ロック命令の値をコミットする前にロック命令のアトミック特性又はフェンシング特性の違反を検出した場合に、状態をロールバックして、ロック命令のストア値がコミットされるまで若い命令の実行が許可されないスローモードでロック命令を実行する。命令は、リタイアするために、ロック命令のストア値がコミットされるまで待機する必要がもはや無いので、これらの命令のスペキュレーティブリタイアは、処理速度の向上をもたらす。
【０００６】
図１は、本開示の態様が実施される例示的なデバイス１００のブロック図である。デバイス１００は、例えば、コンピュータ、ゲームデバイス、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話又はタブレットコンピュータを含む。デバイス１００は、プロセッサ１０２と、メモリ１０４と、ストレージデバイス１０６と、１つ以上の入力デバイス１０８と、１つ以上の出力デバイス１１０と、を含む。また、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４をオプションで含むことができる。デバイス１００は、図１に示されていない追加のコンポーネントを含んでもよいことを理解されたい。
【０００７】
プロセッサ１０２は、複数のコア１１６を含む。一例では、各コア１１６は、中央処理装置（ＣＰＵ）である。他の例では、各コア１１６は、中央処理装置（ＣＰＵ）又はグラフィック処理装置（ＧＰＵ）のうちの１つである。複数のコア１１６は、メモリメカニズムを通し及びコヒーレンスメカニズムを通して協調する能力を有し、独立したワークロードを実行する。メモリ１０４は、プロセッサ１０２と同じダイ上に配置されてもよいし、プロセッサ１０２とは別に配置されてもよい。メモリ１０４は、例えば、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックＲＡＭ若しくはキャッシュ等の揮発性又は不揮発性メモリを含む。
【０００８】
ストレージデバイス１０６は、例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク若しくはフラッシュドライブ等の固定又は取り外し可能なストレージデバイスを含むことができる。入力デバイス１０８は、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、バイオメトリックスキャナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号を送信及び／若しくは受信するための無線ローカルエリアネットワークカード）を含むことができる。出力デバイス１１０は、ディスプレイ、スピーカ、プリンタ、触覚フィードバックデバイス、１つ以上のライト、アンテナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号を送信及び／若しくは受信するための無線ローカルエリアネットワークカード）を含むことができる。
【０００９】
入力ドライバ１１２は、プロセッサ１０２及び入力デバイス１０８と通信し、プロセッサ１０２が入力デバイス１０８から入力を受信することを可能にする。出力ドライバ１１４は、プロセッサ１０２及び出力デバイス１１０と通信し、プロセッサ１０２が出力デバイス１１０に出力を送信することを可能にする。入力ドライバ１１２及び出力ドライバ１１４は、オプションのコンポーネントであり、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４が存在しない場合であっても同様に動作することに留意されたい。
【００１０】
図２は、一例による、図１のプロセッサ１０２のコア１１６内に含まれる命令実行パイプライン２００のブロック図である。命令実行パイプライン２００は、メモリから命令を取り出して当該命令を実行し、データをメモリに出力し、命令実行パイプライン２００内の要素（例えば、レジスタファイル２１８内のレジスタ等）の状態を変更する。
【００１１】
命令実行パイプライン２００は、命令キャッシュ２０２を介してシステムメモリ（メモリ１０４等）から命令をフェッチするように構成される命令フェッチユニット２０４と、フェッチされた命令をデコードするように構成されたデコーダ２０８と、命令を処理するために計算を実行するように構成された機能ユニット２１６と、データキャッシュ２２０を介してシステムメモリからデータをロードし、又は、データをシステムメモリにストアするように構成されたロード／ストアユニット２１４と、命令のワーキングデータをストアするレジスタを含むレジスタファイル２１８と、を含む。
【００１２】
リオーダ（reorder）バッファ２１０は、現在インフライト（in-flight）の命令を追跡し、インフライトの間にアウトオブオーダの実行を許容するにも関わらず命令のインオーダリタイアを保証する。「インフライト」命令は、リオーダバッファ２１０によって受信されたが未だ「リタイア」していない命令、すなわち、プロセッサのアーキテクチャの状態にコミットされた結果（例えば、アーキテクチャレジスタに書き込まれた結果等）を未だ有していない命令を指す。予約ステーション２１２は、インフライト命令を維持し、命令オペランドを追跡する。全てのオペランドが特定の命令の実行のために準備されている場合に、予約ステーション２１２は、命令を、実行するために機能ユニット２１６又はロード／ストアユニット２１４に送信する。実行が完了した命令は、「完了済み」又は「完了している」と呼ばれる。したがって、「完了済み」の命令は、当該命令の実行が終了したことを意味する。命令が「実行済み」又は「実行された」ということは、命令が「完了済み」又は「完了している」ということと同義である。リタイアユニット２３０は、命令が完了した後に生じる、リタイアの準備ができている命令をリタイアする。
【００１３】
レジスタリネームユニット２０９は、命令がインフライトである間に、周知のレジスタリネーム技術に従って、命令によって指定されたアーキテクチャレジスタを、レジスタファイル２１８内に存在する物理レジスタにリネームする。一般に知られているように、レジスタリネームは、並行して実行され得る命令を非直列化し、これにより、プロセッサの実行速度を向上させる。リネームされたレジスタは、インフライト中の命令に使用されるが、リネームされていない「アーキテクチャ」レジスタは、特定のアーキテクチャレジスタの「true」値をストアするとみなされる。アーキテクチャレジスタは、命令がリタイアすると書き込まれる。この説明では、「アーキテクチャレジスタへの書き込み」という概念について説明するときはいつでも、この概念を、１つの物理レジスタを特定のアーキテクチャレジスタに単に割り当てる（よって、１つのレジスタのコンテンツを他のレジスタに実際にコピーする必要がない）という概念で置き換えることができることに留意されたい。
【００１４】
命令実行パイプライン２００の様々な要素は、共通データバス２２２を介して通信する。例えば、機能ユニット２１６及びロード／ストアユニット２１４は、結果を共通データバス２２２に書き込み、結果は、依存する命令の実行のために予約ステーション２１２によって、及び、実行が終了したインフライト命令の最終処理結果としてリオーダバッファ２１０によって読み出されてもよい。また、ロード／ストアユニット２１４は、共通データバス２２２からデータを読み出す。例えば、ロード／ストアユニット２１４は、完了済み命令からの結果を共通データバス２２２から読み出し、ストア命令のためにデータキャッシュ２２０を介して結果をメモリに書き込む。
【００１５】
ロード／ストアユニット２１４は、ロードオーダリングキュー２２４と、ストアオーダリングキュー２２６と、コミットキュー２２８と、に接続されている。これらのキューは、ロード命令及びストア命令がインオーダで実行されているとソフトウェアには見えるようにしながら、実際にはこれらの命令をアウトオブオーダで実行することによって、プロセッサ１０２に対して自由度及び関連する処理速度の向上をもたらすために存在する。
【００１６】
より具体的には、ロード又はストア命令がロード／ストアユニット２１４に到来し、そうでなければ実行する準備ができている場合、ロード／ストアユニット２１４は、プログラム順に関わらず、かかる命令を実行する。この実行は、潜在的なアウトオブオーダの実行が、ロード命令が実行されたときから、当該ロード命令がリオーダバッファ２１０内で最も古い命令であることに起因して当該ロード命令のリタイアの準備ができたときまでの間に、特定のロードされた値が古くなる可能性があることを意味している場合であっても、行われる。
【００１７】
より具体的には、実行時に、ロードされた値が取り出され、ロード命令がリタイアするまでレジスタファイル２１８内のリネームされたレジスタに置かれる。ロード命令がリタイアすると、ロードされた値は「標準的な」値となり、アーキテクチャレジスタとみなされるレジスタに置かれる。
【００１８】
ロード命令を実行するために、ロード／ストアユニット２１４は、ストアオーダリングキュー２２６がロード命令と同じメモリアドレスにストアする古いストア命令の指標を含まない限り、特定の値をメモリから取り出す。この場合、ロード命令は、このようなストア命令によってストアされる値を、このストア命令のソースとして示されたレジスタ（すなわち、ストアされるデータを保持するリネームされたレジスタ）から取り出す。
【００１９】
ロード命令よりも古いがロード命令の後に実行する、ロード命令と同じアドレスに対するストア命令は、ロード命令の値を更新する。より具体的には、プロセッサ１０２は、ストア命令の実行後に、ロードオーダリングキュー２２４をチェックして、ストア命令と同じメモリアドレスからロードする若いロード命令を見つける。プロセッサ１０２は、ロード命令をフラッシュし、ロード命令よりも若い全ての命令をフラッシュして、これらの命令を再実行させる。現在更新されているロード命令に依存する命令は、更新された値に基づいて再実行される。ストア命令からの新たな値のために、再実行されたロード命令は、当該ストア命令からの正しい値を「見る」。
【００２０】
ロード命令は、ロードされた値がアーキテクチャレジスタに書き込まれるまで、保留中（未だリタイアしていない）とみなされる。したがって、ロード命令は、リタイアまで保留中である。一方、ストア命令は、ストア命令がリタイアする時点を過ぎても保留中であるとみなされる。より具体的には、ストア命令は、発行され、ロード／ストアユニット２１４によって実行され、そして、ロード／ストアユニット２１４が、ストアされた値を、書き込まれるメモリに発行した場合に、リタイアする。しかしながら、ストアされた値は、メモリアクセスのレイテンシに起因して、その時点ではメモリに未だ書き込まれていない。実際に値をメモリに書き込む動作は、ストア命令を「コミットする」と呼ばれる。
【００２１】
ロード／ストアユニット２１４は、ストア値をプログラム順に確実にコミットするために、ストア命令をプログラム順にコミットキュー２２８に維持する。キューの先頭の値は、コミットする準備ができている最古のストアとみなされ、その時点でメモリにコミットされる。値がコミットキュー２２８の先頭に無い場合、値をメモリにコミットすることができない。ストア命令の値がメモリ（通常、データキャッシュ２２０等のキャッシュ）に書き込まれると、ストア命令は、コミットキュー２２８から削除される。この時点で、ストア命令は、もはや保留中ではないとみなされる。
【００２２】
ロック命令は、ロードコンポーネントと、「ｏｐ」(動作)コンポーネントと、ストアコンポーネントと、を含む命令である。より具体的には、ロック命令は、データをメモリアドレスから読み出し、当該データを指定された動作に従って変更し、変更されたデータをメモリアドレスに書き戻す。ロック命令は、アトミック特性及びフェンシング特性の両方を有する。アトミック特性は、ロック命令がデータを読み出す時間と、命令がデータを書き込む時間との間に、ロック命令によって指定されたメモリアドレスにストアを行うことができないことを意味する。フェンシング特性は、ロック命令が、全てのより古いロードが完了するのを待機し、実行前にロック命令と同じスレッド内でコミットするためにストアし、ロック命令と同じスレッド内のロック命令よりも若いロード及びストアの全てが、実行前にロック命令が完了するのを待機することを意味する。
【００２３】
上記２つの特性を厳密に適用すると、ロック命令に依存している命令又はロック命令よりも若い命令をストールする必要があるため、プロセッサの実行が大幅に遅くなる。プロセッサ１０２は、実行速度を向上させるために、上記特性が維持されているかのようにソフトウェアに見せながら、上記特性を緩和する。より具体的には、プロセッサ１０２は、ロック命令のストア動作がコミットするまでロック命令及びロック命令よりも若い命令のリタイアを抑制するのではなく、ロック命令及びロック命令よりも若い命令のリタイアを発生させることを可能にする。プロセッサ１０２は、発生する特定の動作がロック命令のアトミック特性又はフェンシング特定に違反するかどうかを判別するためにチェックすることを除いて、ロック命令のロード、動作及びストア部分を、通常の、非アトミックで、非フェンシングな動作として扱う。言い換えると、プロセッサ１０２は、ロック命令及びロック命令に依存する命令をストールすることによってロック命令のアトミック特性及びフェンシング特性を「支持する（upholding）」代わりに、このような命令が投機的（スペキュレーティブ）に実行されリタイアされるのを可能にする。ロック命令のアトミック特性及びフェンシング特性は、このような特性に対する違反を検出し、このような違反の場合に、プロセッサ１０２の状態をより以前の時点に巻き戻し、上記特性がより厳密に支持される「セーフ」モード（又は、「スロー」モード）で実行を再開することによって、「支持」される。
【００２４】
プロセッサ１０２は、ロック命令によって指定されたメモリアドレス（アトミック特性の違反）、又は、ロック命令よりも若いロック命令と同じスレッドからの完了済みロード命令によって指定されたメモリアドレス（フェンシング特性の違反）の何れかに対してストアが発生するのを許可する要求を、ロック命令を実行しているスレッド以外のスレッドから検出することによって、何れかの特性の違反を検出する。このような要求の一例は、無効化プローブである。無効化プローブは、特定のキャッシュラインの「所有権」に対する要求として動作する第１コア１１６から第２コア１１６への信号である。所有権は、コア１１６が特定のキャッシュラインにストアすることを可能にする。無効化プローブがロードオーダリングキュー２２４に送信され、これにより、ロック命令の保留中に、ロードがロードオーダリングキュー２２４に保持される（すなわち、ロック命令のストアがコミットされるまで、ロードがロードオーダリングキュー２２４に保持される）。別の例は、コア１１６内の第１スレッドによる、当該コア１１６内の第２スレッドへの、第１スレッドが特定のメモリ位置にストアしたいという通知である。
【００２５】
アトミック特性及びフェンシング特性はスレッド間のメモリ動作に関係するため、ロック命令が実行中のスレッドと同じスレッドからのストアは、アトミック特性又はフェンシング特性に違反しない。特定のスレッド内のロード及びストアのアウトオブオーダの実行は、データハザードを処理するための通常のメカニズムによって処理され、アトミック特性及びフェンシング特性とは無関係である。
【００２６】
図３Ａは、一例による、ロック命令のスペキュレーティブリタイアを説明する図である。コア１１６は、ロック命令のロード部分（ロック−ロード動作）のスペキュレーティブリタイアに関する特定の要素とともに示され、この要素は、リオーダバッファ２１０と、プログラムカウンタ３１０と、レジスタファイル２１８と、ロードオーダリングキュー２２４と、チェックポイントユニット２３２と、を含む。
【００２７】
リオーダバッファ２１０は、命令をプログラム順にストアする。上述したように、命令がリオーダバッファ２１０の先頭にある場合、当該命令は、未だリタイアされていない最古の命令である。この時点で、この命令は、リタイアすることが可能になっている。ロック命令は、３つの動作（ロック−ロード動作、ロードされたデータを変更する動作、ロック−ストア動作）を含み、ロック−ストア動作は、変更されたデータをロック−ロード動作によって指定されたメモリアドレスに戻してストアする。図３Ａには他の命令が示されていないが、リオーダバッファ２１０内に示されているロック−ロード動作は、リオーダバッファ２１０の先頭にあり、したがって、リタイアしようとしている。
【００２８】
このロック−ロード動作がリタイアした時点で、ロードオーダリングキュー２２４は、リタイアしたロード命令のエントリを保存し続けることを開始する。通常、未だリタイアしていないロード命令のエントリは、ロードオーダリングキュー２２４に維持され、リタイアしたロード命令のエントリは、ロードオーダリングキュー２２４に維持されない。しかしながら、ロック命令のフェンシング特性の違反を検出するために、ロック−ロード動作がリタイアした後であってロック−ストア動作がコミットするまでの間、リタイアしたロードのエントリがロードオーダリングキュー２２４に維持される。ロック−ロード動作は、ロードオーダリングキュー２２４、及び／又は、ロック−ストア動作に対応するストアオーダリングキュー２２６内のエントリによって追跡することができる。
【００２９】
リタイアしたロード命令がロードオーダリングキュー２２４に維持される期間を開始することに加えて、ロック−ロード動作をリタイアすることは、チェックポイントユニット２３２に対して、レジスタファイル２１８のコンテンツと、ロック命令のプログラムカウンタと、フラグと、を含むコア１１６の状態のチェックポイントをストアさせる。フラグは、プロセッサの特定のステータス項目を示す小さい値（１ビット等）である。このような状態は、例えば、前の加算動作のキャリー状態を示すキャリーフラグと、前の動作で設定されたビット数が奇数又は偶数の何れかを示すパリティフラグと、二進化十進算に使用される調整フラグと、割り込みを許可するかどうかを制御する割り込み可能フラグ（通常、割り込み処理中に使用される）と、同様のタイプの状態又は実行制御を制御する他のフラグと、を含む。
【００３０】
セグメントレジスタ及び他の更新頻度の低いレジスタ等のいくつかのレジスタは、チェックポイントユニット２３２にストアされない。このようなタイプのレジスタのうちいくつかは、通常、コミットキュー２２８を介して更新され、他のタイプのレジスタは、直接更新される。これらのレジスタを直接更新する命令は、スペキュレーティブリタイアすることができず、リタイアする前にロック−ストア動作のコミットが完了するのを待機することができない。コミットキュー２２８を介してこれらのレジスタを更新する命令は、事実上ストア動作として扱われ、リタイアすることが許される。ストア動作はプログラム順にコミットされるので、ロック命令よりも若いストア動作は、ロック命令自体がコミットしない限りコミットできない。上述したように、ロック命令のストアは、アトミック特性又はフェンシング特性に対する違反が全く発生していない場合に、コミットする。したがって、ストアオーダリングキュー２２６を使用するレジスタへのストアは、ロック命令がアトミック特性又はフェンシング特性に違反することなく実行された場合に、コミットする。レジスタファイル２１８のコンテンツをチェックポイントユニット２３２にストアすることに加えて、コア１１６は、ロック命令に対するプログラムカウンタ３１０の値をチェックポイントユニット２３２にストアする。
【００３１】
ロック命令を実行しているスレッド以外のスレッドが、ロック命令が指定するメモリアドレス（アトミック特性の違反）、又は、ロック命令よりも若いロック命令と同じスレッドのロード命令によって読み出されるメモリアドレス（フェンシング特性の違反）の何れかに対してストアする場合に、違反が発生する。
【００３２】
ロック命令を実行しているコア１１６が、無効化プローブを他のコア１１６から受信すると、異なるコア１１６からのストアが検出される。無効化プローブは、メモリコヒーレンシを保証するために、マルチコアシステム内のコア１１６間で送信されるメッセージである。より具体的には、特定のコア１１６がメモリアドレスにストアしたい場合、コア１１６は、無効化プローブを他のコア１１６に発行する。無効化プローブは、特定のメモリアドレス又はメモリアドレスのセット（例えば、キャッシュライン）の所有権を要求する。メモリアドレスの所有権を有するコア１１６は、当該メモリアドレスへの書き込みが許可され、メモリアドレスの所有権を有していないコア１１６は、コヒーレンシを保証するために、当該メモリアドレスへの書き込みが許可されない。したがって、無効化プローブは、メモリアドレスにストアするという意図の指標である。ストアに対する要求は、ロック命令を実行するコアと同じコア１１６内のスレッドから検出され得るが、ロック命令のスレッドとは異なるスレッドからも検出され得る。このような要求は、無効化プローブとは呼ばれないが、本開示の目的のための無効化プローブと同様の目的を果たす。
【００３３】
アトミック特性の性質上、ロック命令が実行されているスレッドとは異なるスレッドからロック命令のメモリアドレスへのストアが検出されると、アトミック特性が違反となる。より具体的には、アトミック特性は、ロック命令がそのロードされた値を取得する時間と、ロック命令がその変更値をストアする時間との間に、ロック命令に関連するメモリアドレスへの他のストアが発生しないことを要求する。この期間内でのこのようなアドレスへのストアは、アトミック特性の違反である。
【００３４】
異なるスレッドからのストア命令が、（ロックのロードが完了した後であって、ロックのストアがその結果をコミットする前に、ストア命令の書き込みが発生する限り、）ロック命令と同じスレッドにおいて、ロック命令よりも若い完了済みロードのアドレスと同じアドレスに対して書き込まれると、フェンシング特性が違反となる。このシナリオで違反が発生するのは、若いロードがメモリからデータを時期尚早に消費したためにフェンシング特性に違反し、データが後に別のスレッドからのストアによってストールしたことをソフトウェアが検出することができるためである。
【００３５】
図３Ｂは、一例による、ロック命令のアトミック特性又はフェンシング特性の違反の検出に応じて発生する動作を説明する図である。図示するように、ロック命令の上記特性のうち１つの違反が発生すると、プロセッサ１０２は、チェックポイントユニット２３２を使用してプロセッサの状態をロールバックし、保存されたプログラムカウンタをプログラムカウンタ３１０にリストアし、リストアされたプログラムカウンタにおいて実行を再開する。チェックポイントユニット２３２を使用してプロセッサの状態をロールバックすることは、アーキテクチャレジスタの値を、チェックポイントユニット２３２からアーキテクチャレジスタ自体にリストアすることと、フラグと、チェックポイントユニット２３２にストアされた他の状態とをリストアすることと、を意味する。
【００３６】
さらに、コア１１６は、ロック命令よりも若い全てのストア動作をキャンセルして、このような動作をストアオーダリングキュー２２６及びコミットキュー２２８から削除し、ロック命令よりも若いロード動作をキャンセルして、これらのロード動作をロードオーダリングキュー２２４から削除する。次に、コア１１６は、「スロー」モードでロック命令を実行する。また、コア１１６は、ロック命令よりも若い全ての命令をリオーダバッファから削除する。
【００３７】
「スロー」モードでロック命令を実行することは、ロック命令よりも古く、ロック命令と同じスレッドからの全てのストアがこれらの値をコミットするまで、ロック命令の実行を抑制することを含む。ロック命令よりも若い命令は、ロック命令のストア部分がメモリにコミットされるまで、実行することができない。また、ロック命令を実行しているスレッドは、ロック命令のストアがコミットするまで、他のスレッドがメモリアドレスに対して読み書きすることを抑制する。
【００３８】
上述したロールバックは、ロック−ロード動作命令が完了した後（すなわち、ロック−ロード動作がそのロードデータを取得し、そのデータをレジスタファイルに送信したとき）に違反が検出された場合に発生するが、ロック−ロード動作命令が完了する前に違反が検出された場合には、発生しない。
【００３９】
図３Ｃは、ロック命令のストアがコミットされる前に、ロック命令のアトミック特性及びフェンシング特性が違反していない場合に発生する動作を示す図である。より具体的には、ロック−ストア動作がコミットすると、ロック−ストア動作がコミットキュー２２８から削除される。また、ロック命令よりも若いロード命令と、ロック命令自体のロードとは、もはやスペキュレーティブリタイアしたとみなされず、ロードオーダリングキュー２２４から削除される。命令は、リタイアした命令と未だリタイアしていない命令との間の境界をマークする「リタイア境界３３０」まで、このようにしてロードオーダリングキューから削除される。未だリタイアしていない命令は、ロードオーダリングキュー２２４に残っている。
【００４０】
図４は、一例による、ロック命令よりも若い命令をスペキュレーティブリタイアする方法４００のフロー図である。図１〜図２及び図３Ａ〜図３Ｃに示すシステムに関して説明されているが、技術的に実現可能な順序で方法を実行するように構成された任意のシステムが本開示の範囲内にあることを理解されたい。
【００４１】
図示するように、方法４００は、ステップ４０２において開始し、ステップ４０２において、命令実行パイプライン２００は、ロード／ストアユニット２１４及び機能ユニット２１６においてロック命令を実行する。より具体的には、ロード／ストアユニット２１４は、指定されたアドレスの値をロードし、機能ユニット２１６は、ロック命令によって指定された動作を実行し、ロード／ストアユニット２１４は、ストア動作を実行する。ロック命令のロード部分が実行された後、ロード／ストアユニット２１４は、ロック命令のアトミック特性及びフェンシング特性に対する違反の監視を開始する。上述したように、ロック命令又はロック命令よりも若い完了済みロード命令のメモリアドレスへのストア要求を別のスレッドから検出することによって、違反が検出される。
【００４２】
ステップ４０４において、ロック命令がリオーダバッファ２１０の先頭に来ると、リタイアユニット２３０は、ロック命令をリタイアさせる。この時点で、チェックポイントユニット２３２は、パイプライン２００からのチェックポイント状態（レジスタ、フラグ、及び、指定されている場合には他の状態を含む）をストアし、ロード／ストアユニット２１４は、ロック命令、及び、ロードオーダリングキュー２２４内のロック命令と同じスレッドからの若いロードを、リタイアを過ぎて保持することを開始する。
【００４３】
ステップ４０６において、パイプライン２００は、ロック命令よりも若い命令をリタイアさせる。ステップ４０８において、ロード／ストアユニット２１４は、現在リタイアしたロック命令のアトミック特性又はフェンシング特性の違反が発生したかどうかを判別する。ロック命令又はロック命令よりも若い完了済みロードによって指定されたメモリアドレスにストアする要求を、ロック命令を実行しているスレッド以外のスレッドから受信した場合に、違反が発生する。上述したように、このような要求の一例は無効化プローブであり、無効化プローブは、特定のメモリアドレスに書き込むために当該メモリアドレスでデータの「所有者」になる要求を示す、別のコアからのメッセージである。違反が発生した場合、方法４００はステップ４１２に移行し、違反が発生しない場合、方法はステップ４１０に移行する。
【００４４】
ステップ４１２において、違反が発生する。パイプライン２００は、プログラムカウンタをロック命令のプログラムカウンタに置換することによって、チェックポイントユニット２３２にストアされた状態をパイプライン２００にリストアすることによって、ロードオーダリングキュー２２４、ストアオーダリングキュー２２６及びコミットキュー２２８から実行され又はスペキュレーティブリタイアされたストア及びロードをキャンセルすることによって、ロック命令よりも若い全ての命令をリオーダバッファ２１０から削除することによって、実行をロールバックする。スローモードでロック命令を実行することは、全ての古いストアがコミットするまでロック命令の実行を抑制することと、ロック命令のストアがコミットするまで、ロック命令よりも若い命令の実行を抑制することと、を含む。
【００４５】
ステップ４１０において、ロード／ストアユニット２１４は、ロック命令のストア部分がコミットしたかどうかを判別する。ストア部分がコミットしていない場合、方法４００はステップ４０６に戻り、ストア部分がコミットしている場合、方法はステップ４１４に移行する。
【００４６】
ステップ４１４において、ロック命令のストアがコミットしているので、スペキュレーティブな実行期間が終了する。チェックポイントユニット２３２は、チェックポイントデータを解放し、ロードオーダリングキュー２２４は、リタイア後のロード命令をもはや追跡せず、ロード／ストアユニット２１４は、ロック動作のアトミック特性及びフェンシング特性の違反を検出しようとするのを停止する。
【００４７】
プロセッサのコアにおいてロック命令よりも若い命令をスペキュレーティブリタイアする方法が開示されている。方法は、ロック命令をリタイアすることを含み、ロック命令は、ロック命令のストア部分がメモリにコミットされたとみなされるまで、リタイア後も保留のままである。また、この方法は、ロック命令をリタイアすることに応じて、プロセッサのチェックポイント状態を保存することであって、チェックポイント状態は、ロック命令のアトミック特性又はロック命令のフェンシング特性に違反した場合に、プロセッサの状態をロールバックするためのデータを含む、ことを含む。さらに、この方法は、ロック命令をリタイアした後であるが、ロック命令のストア部分がメモリにコミットされたとみなされる前に、ロック命令よりも若い命令をスペキュレーティブリタイアすることを含む。
【００４８】
違反を検出することは、アトミック特性又はフェンシング特性のうち１つの違反を検出することと、違反を検出したことに応じて、チェックポイント状態を介してプロセッサの状態をロールバックすることと、を含んでもよい。違反を検出することは、代替として又は追加的に、ロック命令よりも若いロード命令に関連するメモリアドレスにストアする要求を検出することによって、ロック命令のストア部分がメモリにコミットされたとみなされる前にフェンシング特性の違反を検出することを含んでもよい。
【００４９】
チェックポイント状態を介してプロセッサの状態をロールバックすることは、チェックポイント状態に基づいてアーキテクチャレジスタ値をリストアすることと、チェックポイント状態に基づいてプロセッサのコアのプログラムカウンタをリストアすることと、ロック命令よりも若い保留中の命令をキャンセルすることと、を含んでもよい。
【００５０】
また、方法は、スローモードでロック命令を実行することを含むことができ、スローモードでは、ロック命令よりも古いストアがメモリにコミットされた値を有するまで、ロック命令が実行されず、スローモードでは、ロック命令のストア部分がメモリにコミットされたとみなされるまで、ロック命令よりも若い命令の実行が許可されない。また、この方法は、ロック命令のストア部分がメモリにコミットされたとみなされる前にアトミック特性又はフェンシング特性の違反を検出しないことと、違反を検出しないことに応じて、チェックポイント状態を解放することと、ロードオーダリングキューからリタイア後のエントリを削除することと、を含んでもよい。
【００５１】
チェックポイント状態は、プロセッサのアーキテクチャレジスタ値及びフラグを含んでもよい。また、方法は、ロック命令のストア部分がメモリにコミットされたとみなされる前に、チェックポイント状態によって保存されないレジスタに書き込む命令のリタイアを抑制することを含んでもよい。
【００５２】
ロック命令よりも若い命令をスペキュレーティブリタイアするプロセッサも開示されている。プロセッサは、ロック命令をリタイアするように構成されたリタイアユニットを含み、ロック命令は、ロック命令のストア部分がメモリにコミットされたとみなされるまで、リタイア後も保留のままである。また、プロセッサは、ロック命令がリタイアしたことに応じて、プロセッサのチェックポイント状態を保存するように構成されたチェックポイントユニットを含み、チェックポイント状態は、ロック命令のアトミック特性又はロック命令のフェンシング特性に違反した場合に、プロセッサの状態をロールバックするためのデータを含む。また、リタイアユニットは、ロック命令をリタイアした後であるが、ロック命令のストア部分がメモリにコミットされたとみなされる前に、ロック命令よりも若い命令をスペキュレーティブリタイアするように構成されている。
【００５３】
また、プロセッサは、アトミック特性又はフェンシング特性のうち１つの違反を検出し、違反を検出したことに応じて、プロセッサに対して、チェックポイント状態を介してプロセッサの状態をロールバックさせるように構成されたロード／ストアユニットを含んでもよい。ロード／ストアユニットは、ロック命令に関連するメモリアドレスにストアする要求を検出することによって、ロック命令のストア部分がメモリにコミットされたとみなされる前にアトミック特性の違反を検出することによって、違反を検出するように構成されてもよい。
【００５４】
また、ロード／ストアユニットは、ロック命令よりも若いロード命令に関連するメモリアドレスにストアする要求を検出することによって、ロック命令のストア部分がメモリにコミットされたとみなされる前にフェンシング特性の違反を検出することによって、違反を検出するように構成されてもよい。
【００５５】
チェックポイントユニットは、チェックポイント状態に基づいてアーキテクチャレジスタ値をリストアすることと、チェックポイント状態に基づいてプロセッサのコアのプログラムカウンタをリストアすることと、ロック命令よりも若い保留中の命令をキャンセルすることと、によってプロセッサの状態をロールバックするように構成されてもよい。
【００５６】
ロード／ストアユニットは、プロセッサのロード／ストアユニット及び機能ユニットのうち少なくとも１つに対して、ロック命令をスローモードで実行させるように構成されてもよく、スローモードでは、ロック命令よりも古いストアがメモリにコミットされた値を有するまで、ロック命令が実行されず、スローモードでは、ロック命令のストア部分がメモリにコミットされたとみなされるまで、ロック命令よりも若い命令の実行が許可されない。
【００５７】
また、ロード／ストアユニットは、ロック命令のストア部分がメモリにコミットされたとみなされる前にアトミック特性又はフェンシング特性の違反を検出しないことに応じて、チェックポイントユニットに対して、チェックポイント状態を解放させ、ロードオーダリングキューからリタイア後のエントリを削除させるように構成されてもよい。
【００５８】
チェックポイント状態は、プロセッサのアーキテクチャレジスタ値及びフラグを含んでもよい。リタイアユニットは、ロック命令のストア部分がメモリにコミットされたとみなされる前に、チェックポイント状態によって保存されないレジスタに書き込む命令のリタイアを抑制するように構成されてもよい。
【００５９】
コンピュータシステムも含まれている。コンピュータシステムは、プロセッサと、プロセッサによって実行される命令をストアするメモリと、を含む。プロセッサは、ロック命令をリタイアするように構成されたリタイアユニットを含み、ロック命令は、ロック命令のストア部分がメモリにコミットされたとみなされるまで、リタイア後も保留のままである。また、プロセッサは、ロック命令がリタイアしたことに応じて、プロセッサのチェックポイント状態を保存するように構成されたチェックポイントユニットを含み、チェックポイント状態は、ロック命令のアトミック特性又はロック命令のフェンシング特性に違反した場合に、プロセッサの状態をロールバックするためのデータを含む。さらに、リタイアユニットは、ロック命令をリタイアした後であるが、ロック命令のストア部分がメモリにコミットされたとみなされる前に、ロック命令よりも若い命令をスペキュレーティブリタイアするように構成されている。
【００６０】
また、プロセッサは、アトミック特性又はフェンシング特性のうち１つの違反を検出し、違反を検出したことに応じて、プロセッサに対して、チェックポイント状態を介してプロセッサの状態をロールバックさせるように構成されたロード／ストアユニットを含んでもよい。
【００６１】
本明細書で説明した技術は、ロック命令を含むワークロードの実行速度を向上させる。より具体的には、ロック命令自体及びロック命令よりも若い命令は、ロック命令が完全に実行されるのを待機する代わりに、スペキュレーティブリタイアすることが許可される。ロールバック機能は、ロック命令のアトミック特性及びフェンシング特性が違反した場合に、プロセッサの状態をロールバックする。ロールバック後に、ロック命令は、低速の「セーフ」モードで実行される。ロック命令及び若い命令がスペキュレーティブリタイアするのを可能にすることによって、プロセッサ性能が向上される。そうでなければ、これらの命令は、リタイアするために、ロック命令がリタイアするのを待機しなければならない。これらの命令がリタイアするのを可能にすることによって、全体的な命令スループットが向上する。
【００６２】
本明細書における開示に基づいて多くの変形が可能であることを理解されたい。上記では、特徴及び要素が特定の組み合わせで説明されているが、各特徴又は要素は、他の特徴及び要素無しに単独で使用されてもよいし、他の特徴及び要素を伴って又は伴わずに様々な組み合わせで使用されてもよい。
【００６３】
提供された方法は、汎用コンピュータ、プロセッサ又はプロセッサコアで実施されてもよい。適切なプロセッサには、例として、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、複数のマイクロプロセッサ、ＤＳＰコアに関連する１つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）回路、他のタイプの集積回路（ＩＣ）、及び／又は、ステートマシンが含まれる。このようなプロセッサは、処理されたハードウェア記述言語（ＨＤＬ）命令（このような命令は、コンピュータ可読媒体に記憶することが可能である）の結果及びネットリストを含む他の中間データを用いて製造プロセスを構成することによって製造され得る。このようなプロセスの結果は、上述した開示の機能を実行するプロセッサを製造するために半導体製造プロセスにおいて使用されるマスクワークであってもよい。
【００６４】
本明細書で提供された方法又はフローチャートは、汎用コンピュータ又はプロセッサによる実行のために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア又はファームウェアで実施されてもよい。非一時的なコンピュータ可読記憶媒体の例には、例えば読み出し専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク、リムーバブルディスク等の磁気媒体、光磁気記憶媒体、例えばＣＤ−ＲＯＭディスク及びデジタル多用途ディスク（ＤＶＤ）等の光学媒体が含まれる。
【図１】
2019532420.tif 000003
【図２】
2019532420.tif 000004
【図３Ａ】
2019532420.tif 000005
【図３Ｂ】
2019532420.tif 000006
【図３Ｃ】
2019532420.tif 000007
【図４】
2019532420.tif 000008
【国際調査報告】
2019532420.tif 000009
2019532420.tif 000010