(57)【要約】ロックアドレス予測及び／又は時間的ロック予測に基づいてロック命令を投機的又は非投機的に選択的に実行する技術は、メモリデバイス内のエントリをロックする方法及びデバイスを含む。いくつかの技術では、メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令が検出される。ロック命令が投機的ロック命令を含むことを条件に、以前の投機的ロック中に特定のメモリエントリについて競合が発生したかどうかが検出される。以前の投機的ロック中に特定のメモリエントリについて競合が発生した場合、ロックが非投機的に実行される。以前の投機的ロック中に特定のメモリエントリについて競合が発生しなかった場合、ロックが投機的に実行される。【選択図】図４
2019530120.tif 000002
【特許請求の範囲】
【請求項１】
メモリデバイス内のエントリをロックする方法であって、
前記メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出することと、
前記ロック命令が検出されたことを条件に、以前の投機的ロック中に前記特定のメモリエントリについて競合が発生したかどうかを検出することと、
前記以前の投機的ロック中に前記特定のメモリエントリについて競合が発生したことを条件に、前記ロック命令を非投機的に実行することと、
前記以前の投機的ロック中に前記特定のメモリエントリについて競合が発生しなかったことを条件に、前記ロック命令を投機的に実行することと、を含む、
方法。
【請求項２】
前記ロック命令が投機的に実行されることを条件に、前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することを含む、
請求項１の方法。
【請求項３】
前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したことを条件に、前記スレッドが実行している実行パイプラインをフラッシュし、前記スレッドを前記ロック命令から開始して非投機的に再実行することを含む、
請求項２の方法。
【請求項４】
前記投機的中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することは、前記特定のメモリエントリが無効なデータを含むかどうかを検出することを含む、
請求項２の方法。
【請求項５】
競合は、メモリエントリのロック中の別のスレッドによる前記メモリエントリへのアクセス、前記メモリエントリの変更、前記メモリエントリへのアクセス要求、又は、前記メモリエントリの変更要求のうち何れかを含む、
請求項１の方法。
【請求項６】
以前の投機的ロック中に前記特定のメモリエントリについて競合が発生したかどうかを検出することは、前記以前の投機的ロック中に、別のスレッドが前記特定のメモリエントリへのアクセスを要求したかどうか、前記特定のメモリエントリにアクセスしたかどうか、前記特定のメモリエントリの変更を要求したかどうか、又は、前記特定のメモリエントリを変更したかどうかを検出することを含む、
請求項１の方法。
【請求項７】
前記ロックを投機的に実行することは、前記ロックの制約を緩和することを含む、
請求項１の方法。
【請求項８】
前記ロックを投機的に実行することは、前記ロックのアトミックアクセス性又はフェンシング性を緩和することを含む、
請求項１の方法。
【請求項９】
メモリデバイス内のエントリをロックする方法であって、
メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出することと、
前記ロック命令が検出されたことを条件に、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することと、
前記数が前記閾値を超えたことを条件に、前記ロック命令を非投機的に実行することと、
前記数が前記閾値を超えないことを条件に、前記ロック命令を投機的に実行することと、を含む、
方法。
【請求項１０】
前記特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、
前記特定の期間中に、競合が発生した前記特定のメモリエントリの以前の投機的ロックの数が前記閾値数を超えたかどうかを検出することを含む、
請求項９の方法。
【請求項１１】
前記特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、
前記特定の期間中に、競合が発生した前記メモリデバイス内の何れかのメモリエントリの以前の投機的ロックの数が前記閾値を超えたかどうかを検出することを含む、
請求項９の方法。
【請求項１２】
前記ロック命令が投機的に実行されることを条件に、前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することを含む、
請求項９の方法。
【請求項１３】
前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したことを条件に、前記スレッドが実行している実行パイプラインをフラッシュし、前記スレッドを前記ロック命令から開始して非投機的に再実行することを含む、
請求項１２の方法。
【請求項１４】
前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することは、前記特定のメモリエントリが無効なデータを含むかどうかを検出することを含む、
請求項１２の方法。
【請求項１５】
競合は、メモリエントリのロック中のスレッドによる前記メモリエントリへのアクセス、前記メモリエントリの変更、前記メモリエントリへのアクセス要求、又は、前記メモリエントリの変更要求のうち何れかを含む、
請求項９の方法。
【請求項１６】
特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、前記以前の投機的ロック中に、別のスレッドが前記メモリへのアクセスを要求したかどうか、前記メモリにアクセスしたかどうか、前記メモリの変更を要求したかどうか、又は、前記メモリを変更したかどうかを検出することを含む、
請求項９の方法。
【請求項１７】
前記ロックを投機的に実行することは、前記ロックの制約を緩和することを含む、
請求項９の方法。
【請求項１８】
前記ロックを投機的に実行することは、前記ロックのアトミックアクセス性又はフェンシング性を緩和することを含む、
請求項９の方法。
【請求項１９】
投機的ロック用に構成された処理デバイスであって、
実行パイプライン含むプロセッサコアと、
メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出するように構成されたロック命令検出回路と、
前記ロック命令が検出されたことを条件に、以前の投機的ロック中に前記特定のメモリエントリについて競合が発生したかどうかを検出するように構成された競合検出回路と、
以前の投機的ロック中に前記特定のメモリエントリについて競合が発生したことを条件に、前記ロック命令を非投機的に実行するように構成されたロック回路であって、以前の投機的ロック中に前記特定のメモリエントリについて競合が発生しなかったことを条件に、前記ロック命令を投機的に実行するように構成されたロック回路と、を備える、
処理デバイス。
【請求項２０】
前記競合検出回路は、前記ロック命令が投機的に実行されたことを条件に、前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出するように構成されている、
請求項１９の処理デバイス。
【請求項２１】
前記投機的中に前記特定のメモリエントリについて競合が発生したことを条件に、前記スレッドが実行している実行パイプラインをフラッシュし、前記スレッドを前記ロック命令から開始して非投機的に再実行するように構成された再実行回路を備える、
請求項２０の処理デバイス。
【請求項２２】
前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することは、前記特定のメモリエントリが無効なデータを含むかどうかを検出することを含む、
請求項２０の処理デバイス。
【請求項２３】
競合は、メモリエントリのロック中の別のスレッドによる前記メモリエントリへのアクセス、前記メモリエントリの変更、前記メモリエントリへのアクセス要求、又は、前記メモリエントリの変更要求のうち何れかを含む、
請求項１９の処理デバイス。
【請求項２４】
以前の投機的ロック中に前記特定のメモリエントリについて競合が発生したかどうかを検出することは、前記以前の投機的ロック中に、別のスレッドが前記特定のメモリエントリへのアクセスを要求したかどうか、前記特定のメモリエントリにアクセスしたかどうか、前記特定のメモリエントリの変更を要求したかどうか、又は、前記特定のメモリエントリを変更したかどうかを検出することを含む、
請求項１９の処理デバイス。
【請求項２５】
前記ロックを投機的に実行することは、前記ロックの制約を緩和することを含む、
請求項１９の処理デバイス。
【請求項２６】
前記ロックを投機的に実行することは、前記ロックのアトミックアクセス性又はフェンシング性を緩和することを含む、
請求項１９の処理デバイス。
【請求項２７】
投機的ロック用に構成された処理デバイスであって、
実行パイプラインを含むプロセッサコアと、
メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出するように構成されたロック命令検出回路と、
前記ロック命令が検出されたことを条件に、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出するように構成された競合検出回路と、
前記数が前記閾値を超えたことを条件に、前記ロック命令を非投機的に実行するように構成されたロック回路であって、前記数が前記閾値を超えていないことを条件に、前記ロック命令を投機的に実行するように構成されたロック回路と、を備える、
処理デバイス。
【請求項２８】
前記特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、
前記特定の期間中に、競合が発生した前記特定のメモリエントリの以前の投機的ロックの数が閾値を超えたかどうかを検出することを含む、
請求項２７の処理デバイス。
【請求項２９】
前記特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、
前記特定の期間中に、競合が発生した前記メモリデバイス内の何れかのメモリエントリの以前の投機的ロックの数が閾値を超えたかどうかを検出することを含む、
請求項２７の処理デバイス。
【請求項３０】
前記競合検出回路は、前記ロック命令が投機的に実行されたことを条件に、前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出するように構成されている、
請求項２７の処理デバイス。
【請求項３１】
前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したことを条件に、前記スレッドが実行している実行パイプラインをフラッシュし、前記スレッドを前記ロック命令から開始して非投機的に再実行するように構成された再実行回路を備える、
請求項２８の処理デバイス。
【請求項３２】
前記投機的ロック中に前記特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することは、前記特定のメモリエントリが無効なデータを包むかどうかを検出することを含む、
請求項２８の処理デバイス。
【請求項３３】
競合は、メモリエントリのロック中のスレッドによる、前記メモリエントリへのアクセス、前記メモリエントリの変更、前記メモリエントリへのアクセス要求、又は、前記メモリエントリの変更要求のうち何れかを含む、
請求項２７の処理デバイス。
【請求項３４】
特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、前記以前の投機的ロック中に、別のスレッドが前記メモリへのアクセスを要求したかどうか、前記メモリにアクセスしたかどうか、前記メモリの変更を要求したかどうか、又は、前記メモリを変更したかどうかを検出することを含む、
請求項２７の処理デバイス。
【請求項３５】
前記ロックを投機的に実行することは、前記ロックの制約を緩和することを含む、
請求項２７の処理デバイス。
【請求項３６】
前記ロックを投機的に実行することは、前記ロックのアトミックアクセス性又はフェンシング性を緩和することを含む、
請求項２７の処理デバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
（関連出願の相互参照）
本願は、２０１６年９月２２日に出願された米国特許出願第１５／２７３，３０４号の利益を主張し、その内容は、完全に記載されているかのように、言及したことによって本明細書に組み込まれる。
【背景技術】
【０００２】
共有メモリコンピューティングアーキテクチャでは、複数のスレッドが、例えばキャッシュメモリ又は他のレベルのメモリ階層等の同じメモリにアクセスするのを可能にする。例えば、単一のプロセッサ又はプロセッサコアは、複数のスレッド又はプロセスを実行することができ、各スレッド又はプロセスは、スレッド及び／又はプロセスによって共有される例えばキャッシュ等の共有メモリにアクセスすることができる。同様に、複数のプロセッサ又はマルチプロセッサのコアは、複数のスレッド又はプロセスを実行することができ、各スレッド及び／又はプロセスは、プロセッサ又はコア並びにスレッド及び／又はプロセスによって共有される例えばキャッシュ等のメモリにアクセスすることができる。
【０００３】
添付の図面と共に例として与えられる以下の説明から、より詳細な理解を得ることができるであろう。
【図面の簡単な説明】
【０００４】
【図１】１つ以上の開示された実施形態を実施することができる例示的なデバイスのブロック図である。
【図２】図１のデバイスと共に使用可能であり、これを用いて１つ以上の開示された実施形態を実施することができる例示的なマルチコアプロセッサを示すブロック図である。
【図３】投機的ロックを実行する例示的な方法を示すフローチャートである。
【図４】ロックアドレス競合予測を使用して投機的ロックを実行する例示的な方法を示すフローチャートである。
【図５】例示的なロックアドレス競合予測書き込み要求監視回路の機能を示すブロック図である。
【図６】例示的なロックアドレス競合予測メカニズムを示すブロック図である。
【図７】時間的ロック競合予測を使用して投機的ロックを実行する例示的な方法を示すフローチャートである。
【図８】時間的ロック競合予測を使用して投機的ロックを実行する例示的な方法を示すフローチャートである。
【発明を実施するための形態】
【０００５】
いくつかの実施形態は、メモリデバイス内のエントリをロックする方法を提供する。メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令が検出される。以前の投機的ロックの間に特定のメモリエントリについて競合が発生したかどうかは、ロック命令が投機的ロック命令を含むことを条件に検出される。以前の投機的ロックの間に特定のメモリエントリについて競合が発生した場合、ロックが非投機的に実行される。以前の投機的ロックの間に特定のメモリエントリについて競合が発生しなかった場合、ロックが投機的に実行される。
【０００６】
いくつかの実施形態は、メモリデバイス内のエントリをロックする方法を提供する。メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令が検出される。特定の期間中に競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかは、ロック命令が投機的ロック命令を含むことを条件に検出される。この数が閾値を超えると、ロックが非投機的に実行される。この数が閾値を超えない場合、ロックが投機的に実行される。
【０００７】
いくつかの実施形態は、投機的ロック用に構成された処理デバイスを提供する。このデバイスは、実行パイプラインを有するプロセッサコアと、メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出するように構成されたロック命令検出回路と、ロック命令が投機的ロック命令を含むことを条件に、以前の投機的ロックの間に特定のメモリエントリについて競合が発生したかどうかを検出するように構成された競合検出回路と、以前の投機的ロックの間に特定のメモリエントリについて競合が発生した場合に、ロックを非投機的に実行するように構成されたロック回路と、以前の投機的ロックの間に特定のメモリエントリについて競合が発生しなかった場合に、ロックを投機的に実行するようにさらに構成されたロック回路と、を含む。
【０００８】
いくつかの実施形態は、投機的ロック用に構成された処理デバイスを提供する。このデバイスは、実行パイプラインを有するプロセッサコアと、メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出するように構成されたロック命令検出回路と、ロック命令が投機的ロック命令を含むことを条件に、特定の期間中に競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出するように構成された競合検出回路と、この数が閾値を超えた場合に、ロックを非投機的に実行するように構成されたロック回路と、この数が閾値を超えない場合に、ロックを投機的に実行するようにさらに構成されたロック回路と、を含む。
【０００９】
図１は、１つ以上の開示された実施形態を実施することができる例示的なデバイス１００のブロック図である。デバイス１００は、例えば、コンピュータ、ゲームデバイス、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話又はタブレットコンピュータを含む。デバイス１００は、プロセッサ１０２と、メモリ１０４と、ストレージ１０６と、１つ以上の入力デバイス１０８と、１つ以上の出力デバイス１１０と、を含む。また、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４をオプションで含むことができる。デバイス１００は、図１に示されていない追加のコンポーネントを含んでもよいことを理解されたい。
【００１０】
プロセッサ１０２は、中央処理装置（ＣＰＵ）、グラフィックス処理装置（ＧＰＵ）、同じダイ上に配置されたＣＰＵ及びＧＰＵ、又は、１つ以上のプロセッサを含むことができ、各プロセッサコアはＣＰＵ又はＧＰＵとすることができる。メモリ１０４は、プロセッサ１０２と同じダイ上に配置されてもよいし、プロセッサ１０２とは別に配置されてもよい。メモリ１０４は、例えば、ランダムアクセスメモリ（ＲＡＭ）、ダイナミックＲＡＭ若しくはキャッシュ等の揮発性又は不揮発性メモリを含むことができる。
【００１１】
ストレージ１０６は、例えば、ハードディスクドライブ、ソリッドステートドライブ、光ディスク若しくはフラッシュドライブ等の固定又は取り外し可能なストレージデバイスを含むことができる。入力デバイス１０８は、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、バイオメトリックスキャナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号を送信及び／若しくは受信するための無線ローカルエリアネットワークカード）を含むことができる。出力デバイス１１０は、ディスプレイ、スピーカ、プリンタ、触覚フィードバック装置、１つ以上のライト、アンテナ又はネットワーク接続（例えば、無線ＩＥＥＥ８０２信号を送信及び／若しくは受信するための無線ローカルエリアネットワークカード）を含むことができる。
【００１２】
入力ドライバ１１２は、プロセッサ１０２及び入力デバイス１０８と通信し、プロセッサ１０２が入力デバイス１０８から入力を受信することを可能にする。出力ドライバ１１４は、プロセッサ１０２及び出力デバイス１１０と通信し、プロセッサ１０２が出力デバイス１１０に出力を送信することを可能にする。入力ドライバ１１２及び出力ドライバ１１４は、オプションのコンポーネントであり、デバイス１００は、入力ドライバ１１２及び出力ドライバ１１４が存在しない場合であっても同様に動作することに留意されたい。
【００１３】
図２は、２つの処理コア２１０，２２０を含む例示的なマルチコアプロセッサ２００を示す概略図である。プロセッサ２００は、例えばプロセッサ１０２として、デバイス１００と共に使用することができる。コア２１０，２２０は、ＣＰＵコア、ＧＰＵコア、又は、１つずつのＣＰＵコア及びＧＰＵコア等のように、任意の適切なコンピューティングコアとすることができる。コア２１０，２２０は、キャッシュメモリ２３０へのアクセスを共有する。コア２１０，２２０の各々は、キャッシュ２３０内の同じキャッシュエントリ２４０の少なくともいくつかにアクセスすることの可能なスレッドを実行することができる。いくつかの実装形態では、コア２１０，２２０の何れか又は両方は、キャッシュメモリ２３０内の同じキャッシュエントリ２４０の少なくともいくつかにアクセスする複数のスレッドを実行することができる。本明細書で説明する例は、キャッシュメモリに関するものであるが、本明細書で説明する原理は、図１に関して示し及び説明した別のキャッシュ層（図示省略）又はメモリ１０４等の任意の適切なメモリ又はメモリ階層の一部に適用可能である。プロセッサ２００は例示的なものであり、本明細書で説明する原理は、単一のコアプロセッサ又は３つ以上のコアを有するプロセッサにも適用可能である。
【００１４】
共有メモリアーキテクチャで発生する可能性がある１つの問題は、アトミックアクセスに関連する。例えば、第１スレッドが共有メモリ内の特定のメモリ位置（例えば、図２のキャッシュエントリ２５０）内のデータに関して動作している場合（例えば、当該データの読み書きを行っている場合）であって、第２スレッドが同じメモリ位置で同時に動作する場合に、データが破損する可能性がある。
【００１５】
この問題は、ロックを使用して解決することができる。ロックは、ロックが解除されるまで、１つのスレッドのみが特定のメモリ位置にアクセスするのを可能にする相互排除（mutex）メカニズムである。ロックを取得したスレッドは、通常、ロックを解除するまで、ロックされたメモリ位置へのアトミックアクセスが保証されている。
【００１６】
スレッドは、例えばストア命令等のようにメモリ位置に記憶されたデータに影響を及ぼす他の命令を実行する前にロック命令を実行することによって、特定のメモリ位置に対するロックを取得することができる。ここでの例示目的のために、ロックは、スレッドによって実行されたロック命令によって取得され、スレッドによって実行された命令によって解除される。しかしながら、いくつかの実施形態では、スレッドによって実行された命令へのプレフィックスによって、特定のタイプ若しくはバージョンの命令によって、又は、他の適切な方法で、ロックを取得及び／又は解除することができる。これらの何れも、これらが個別のロック命令を含むかどうか、又は、ロック命令が、例えば、フラグ、ビット若しくはプレフィックスとして別の命令若しくは動作と組み合わされるかどうかに関わらず、ロック命令と呼ばれ得る。概して、特定のメモリ位置がスレッド又はプロセスによってロックされている場合には、当該メモリ位置にアクセスしようとする異なるスレッド又はプロセスは、当該メモリ位置にアクセスすることを許可されず、通常、否定応答（ＮＡＫ）信号又は他の適切な信号を受信する。しかしながら、本明細書で説明する様々な技術及びデバイスは、ロックの特定の実施形態に限定されない。
【００１７】
ロックは、ロックを保持するスレッド又はプロセスを遅延させる可能性があり、処理時間の観点でコストがかかる可能性がある。プロセッサキャッシュ内のメモリ位置をロックすることによってアトミック性を保証するロック命令は、当該キャッシュ内のラインをロックする前に、スレッド内の全ての古い命令が完了するのを待機するロック命令を必要とする。古い命令が完了するのをロック命令が待機する間、プロセッサ内のバッファをバックアップすることが可能になり（すなわち、フルになるかフルに近づく）、プロセッサをストールさせる。
【００１８】
これらの考えられる不利益を軽減又は回避する１つの方法は、アトミック性やフェンシング性等のロックの１つ以上の特性を緩和することである。例えば、アトミックアクセスを強制又は厳密に強制しないことによって、ロックを緩和することができる。このような場合、第２スレッドは、第１スレッドによってロックされたメモリ位置にアクセスすることが許可される。しかしながら、緩和されたアトミックアクセスが機能するためには、ロックが第１スレッドによって保持されている間に、第２スレッドがメモリ位置にアクセスしなかったこと、又は、ロックの間に、第２スレッドによるアクセスが第１スレッドの実行に悪影響を及ぼさなかったこと（例えば、緩和されたロックの下で第２スレッドによって行われた計算が、厳密なロックの下で行われた場合と同じ結果を生じさせる）の何れかが確立される必要がある。ロック特性を緩和すると、ロックされたメモリ位置に有効なデータが生成されるかどうかが必ずしも事前にわかっているわけではないので、緩和されたロックを保持するスレッドは、投機的に実行されている、又は、投機的ロックの下で実行されていると言える。
【００１９】
アトミック性が緩和された投機的ロックの単純な例では、第２スレッドは、データを変更しない、ロックされたメモリ位置への読み出しアクセスのみが許可される。この場合、ロックは、読み出しに関して緩和され、第１スレッドがロックを解除するのを待機する代わりに、第２スレッドがかかる読み出しを実行できるようになる。
【００２０】
アトミック性が緩和された投機的ロックのより複雑な例では、第２スレッドは、ロックされたメモリ位置に書き込むこと、又は、ロックされたメモリ位置を変更することが許可される。これは、例えば、ロックが第１スレッドによって保持されている間に、第２スレッドがロックされたメモリ位置に実際にアクセスしない場合において、第１スレッドの実行に悪影響を及ぼさない。しかしながら、このタイプの投機的ロックは、第２スレッドによって変更される前にロックされたメモリから第１スレッドが読み出し、第２スレッドによって変更された後にロックされたメモリに第１スレッドが書き込む場合に、第１スレッドの実行に悪影響を及ぼすことがある。
【００２１】
別の例では、フェンシング性を厳密に適用しないことによって、ロックを緩和することができる。このような場合、第１スレッドは、特定のメモリ位置に対してロックを保持しながら順不同で実行することが許可される。これは、状況によっては、フェンシング性の違反につながる可能性がある。例えば、ロック命令よりも「若い」（すなわち、遅い）第１スレッドからの読み出し命令が、投機的ロックが完了する前に実行される場合に、当該読み出し命令が、古いデータを読み出すことがある。これは、投機的ロックが完了する前に、第２スレッドからの書き込み命令が、読み出し命令のメモリ位置に書き込む場合に発生することがある。ロックされた位置のデータの有効性は、緩和されたロック特性によって危険に晒される可能性があるので、読み出し命令のデータの有効性を検査する必要がある。
【００２２】
データが有効であるかどうかを判別するための１つの考えられる検査は、投機的ロックが第１スレッドによって保持されている間に、第２スレッドがロックされた位置にアクセスしたか否かを判別することである。他のスレッドによる読み出しは、ロック特性に違反しない。しかしながら、他のスレッドによって書き込まれる投機的ロックの露出のウィンドウが存在する。このウィンドウは、投機的ロックがそのメモリ位置を読み出す場合に開始し、投機的ロックが完了する場合に終了する。スレッドが投機的ロックの露出のウィンドウにある間、スレッドは、他のスレッドによる書き込みを監視する必要があり、これにより、投機的ロックのロック特性の違反を引き起こす。投機的ロックされたメモリ位置、及び、投機的ロックされたメモリ位置が書き込まれる前に完了した投機的ロックよりも若い全ての読み出しを、検査又は監視することができる。ロックされた位置に他のスレッドが書き込んでいない場合、データが有効であると推定することができる。
【００２３】
ロックされた位置に記憶されたデータが有効であると判別した場合、実行を通常通り継続することができ、厳密なロックに関連する時間的なペナルティを回避することができる。しかしながら、ロックされた位置に記憶されたデータが無効であると判別した（又は、推定した）場合、実行パイプライン（例えば、スレッドを実行するコア及び／又はプロセッサ）をフラッシュする必要があり、投機的ロックを保持したスレッドは、有効な結果が得られるように再実行する必要がある。よって、投機的ロックのロック特性の違反によって、プロセッサキャッシュ内のロックされた位置に記憶された（又は、ロックが解除された後の）データが無効であると判別した例では、実行パイプラインがフラッシュされ、無効なデータをもたらす緩和状況を回避するために、第１スレッドが、厳密なロックを使用して（すなわち、非投機的ロックを使用して）再実行される。非投機的ロックの下でスレッドを再実行した後、ロックされた位置内のデータは、別のスレッドによって上書きされていないと推定することができる。
【００２４】
図３は、投機的ロックを実行する例示的な方法３００を示すフローチャートである。第１スレッドがロック命令を実行することを条件に（３１０）、ステップ３２０において、スレッドは、特定のメモリ位置で投機的ロックを実行する。ステップ３２０における投機的ロックの実行の間に、メモリ位置のデータは、上述したように有効性について検査される。ロック特性に違反していないことを条件に（３４０）、条件３３０において投機的ロックが完了していない限り、ロックが投機的に実行され続ける。条件３４０においてロック特性に違反していることを判別した場合、ステップ３５０において、実行パイプラインがフラッシュされ、ステップ３６０において、スレッドが再開し、ステップ３７０において、ロックが完了するために非投機的に実行される。
【００２５】
しかしながら、実行パイプラインをフラッシュしてスレッドを再実行すると、関連する時間的なペナルティが発生する。これは、ロック特性を緩和することによって実現される時間的な利得を相殺する可能性がある。よって、ロック特性を緩和すると、特定の状況において利益が減少する可能性がある。言い換えると、特定の状況下では、失敗した投機的ロックによって実行パイプラインをフラッシュしスレッドを再実行することは、最初の時点で非投機的ロックを単に実行するよりも時間（及び、回路面積）の観点でよりコストがかかる可能性がある。したがって、関連する時間的なペナルティを回避するために、緩和されたロック特性が、メモリをフラッシュし、実行を再開することをもたらす可能性のある状況を予測することが望ましい場合がある。
【００２６】
緩和されたロック特性が、無効なデータをもたらす可能性のある状況を予測する１つのアプローチは、ロックアドレス競合を追跡することである。このような予測は、特定のアドレスに対する投機的ロックが過去にフラッシュ及び再開をもたらした場合、又は、他のスレッドが、当該アドレスが過去にロックされていた間に、当該アドレスにアクセスしようとしていた（すなわち、当該アドレスについて競合していた）場合に、当該アドレスに対する投機的ロックがフラッシュ及び再開をもたらす可能性がある（又は、一定の確率で生じる）という考えに基づいている。このような予測は、ロックアドレス競合予測と呼ぶことができる。例えば、特定のメモリアドレスに対する投機的ロックによってフラッシュ及び再開が発生した場合、この発生を追跡することができる。その結果、このメモリアドレスに対する将来のロックは、非投機的に実行させられる可能性がある。このストラテジーを変更することが可能である。
【００２７】
１つの例では、ロックアドレス競合予測器（ＬＡＣＰ）は、フラッシュ及び再開を引き起こした投機的ロックによってアクセスされたプロセッサキャッシュラインを追跡する。
【００２８】
図４は、ロックアドレス競合予測を使用して投機的ロックを実行する例示的な方法４００を示すフローチャートである。ＬＡＣＰ回路は、第１スレッドがロック命令を実行することを条件に（４０５）、過去に、投機的ロックの後にターゲットアドレスにおいてロック特性に違反したかどうか、及び、ロックされたアドレスがプロセッサのローカルキャッシュに存在しないかどうかを検査する。過去にロック特性に違反しており、ロックされたアドレスがプロセッサのローカルキャッシュに存在しことを条件に（４１０）、ステップ４１５において、ロックが非投機的に実行される。そうでない場合、ステップ４２０において、ロックが投機的に実行される。
【００２９】
ステップ４２０での投機的実行の間に、ＬＡＣＰ回路は、ロックされたアドレスについてロック特性に違反したかどうかを検査する。いくつかの実施形態では、投機的実行の間に別のスレッドがメモリ位置にアクセスした場合、ロック特性に違反したと推定される。ロック特性に違反してないことを条件に（４２５）、条件４２７において投機的ロックが完了していない限り、ロックが投機的に実行され続ける。
【００３０】
ロック特性に違反したことを条件に（４２５）、ステップ４３０において、ＬＡＣＰが更新される。ＬＡＣＰを更新することは、ロックされたアドレスをＬＡＣＰに追加すること、又は、ロックされたアドレスが既にＬＡＣＰに記録されている場合に、ＬＡＣＰエントリエイジ（entry age）を更新すること（本実施形態におけるＬＡＣＰは、ロックされたアドレスがＬＡＣＰに記録された「期間」又は時間長を追跡する回路を含む）及びそのヒットビットをクリアすることを伴う。何れの場合も、ＬＡＣＰエントリに関連するヒットビット（又は、他のインジケータ）は、そのアドレスでのロックの投機的実行を抑制するためにクリアされる（又は、他の方法で構成される）。ステップ４３５において、実行パイプラインがフラッシュされ、ステップ４４０，４１５において、スレッドが再開され、非投機的に実行される。
【００３１】
必要に応じて、特定のアドレスを投機的にロックすることの禁止が満了してもよいことに留意されたい。いくつかの実施形態では、満了は、所望の期間、いくつかの命令、いくつかのロック、又は、その他の後に明示的に発生してもよい。いくつかの実施形態では、満了は、別のアドレスのための場所を開けるためにアドレスがＬＡＣＰからエビクトされることによって発生してもよい。
【００３２】
図５は、例示的なＬＡＣＰ書き込み要求監視回路５００の機能を示すブロック図である。いくつかの実施形態では、回路５００は、図４に関して示され説明された方法４００、及び／又は、本明細書で論じられる他の実施形態と共に使用可能であり、図６に関して示され説明されるように、ＬＡＣＰデバイス６００に組み込まれてもよいし、ＬＡＣＰデバイス６００と共に使用されてもよい。
【００３３】
回路５００は、ＬＡＣＰエントリへの書き込み要求を監視するように構成されている。ステップ５１０において、回路５００は、何れかのＬＡＣＰエントリについて、別のスレッドがＬＡＣＰエントリに記憶されたアドレスに書き込もうとしているかどうかを検出する。このように書き込もうとしていることが検出されたことを条件に（５２０）、回路５００は、ステップ５３０において、対応するＬＡＣＰエントリのエイジフィールド及びヒットビット（又は、他のインジケータ）を更新する。そうでない場合、回路５００は、ステップ５１０において、他のスレッドによる書き込み要求を監視し続ける。
【００３４】
図５に示すステップは、本明細書で論じられる他の実施形態（図４等）と組み合わされると、これらのメカニズムと非同期的に実行されることに留意されたい。よって、この例では、ＬＡＣＰ書き込み要求監視回路５００は、ＬＡＣＰエントリのエイジフィールド及びヒットビットを更新する前に投機的ロック又は非投機的ロックが完了することを待機せず、プロセッサキャッシュエントリへの書き込み要求を検査する前に投機的ロック又は非投機的ロックが開始することを待機しない。他の実施形態では、図５に示すステップが同期して実行可能であることに留意されたい。
【００３５】
この例示的な実施形態では、ＬＡＣＰエントリのアドレスは、そのアドレスに関連するキャッシュラインがプロセッサのローカルキャッシュにある間に追跡される。他の実施形態では、ＬＡＣＰエントリのアドレスが常に追跡されてもよいことに留意されたい。そのような実施形態では、ＬＡＣＰは、ラインが競合を検出していないことを示す。本実施形態では、ヒットビットは、ＬＡＣＰが追跡したアドレスが依然としてプロセッサのローカルキャッシュにキャッシュされているか否かを示す。
【００３６】
図６は、本明細書で説明する様々な実施形態による例示的なＬＡＣＰメカニズム６００を示すブロック図である。例示的なＬＡＣＰメカニズム６００は、いくつかのメモリエントリ６１０を含むが、任意の適切な数のエントリを使用できることに留意されたい。これらのメモリエントリ６１０は、過去に投機的にロックされている間にロック特性に違反したプロセッサキャッシュ６７０のメモリ位置のアドレスを記憶するように構成されている。いくつかの実施形態では、メモリエントリ６１０は、さらに又は代わりに、ロック中に他のスレッドがアクセスを競合しているプロセッサキャッシュ６７０のメモリ位置のアドレスを記憶するように構成されてもよい。
【００３７】
ＬＡＣＰメモリエントリの数は、所望の置換ストラテジーに基づくことができる（例えば、エントリを実装するのに必要とされる論理回路の数と、後に有用な情報を提供する可能性があるエントリを置換することと、のトレードオフに基づく）。この例では、ＬＡＣＰメモリエントリ６１０は、ＬＡＣＰのキャッシュ内のエントリである。各エントリ６１０を使用して、投機的ロックのロック特性に違反したプロセッサキャッシュ６７０のキャッシュラインを追跡することができる。各エントリ６１０は、ヒットビット６５０と、エイジフィールド６６０と、を含む。
【００３８】
スレッドの実行中に、プロセッサキャッシュ６７０のキャッシュエントリ６３０に対してロック命令が実行される場合であって、キャッシュエントリ６３０のアドレスが１つのＬＡＣＰエントリ６１０に記憶されたアドレスと一致しない場合、ロックを投機的に実行することができる。キャッシュエントリ６３０のアドレスが１つのＬＡＣＰエントリ６１０に記憶されたアドレスと一致する場合には、特定のＬＡＣＰエントリ６１０に対するキャッシュヒットビット６５０がアサートされる場合に、ロックを投機的に実行することができる。しかしながら、特定のＬＡＣＰエントリ６１０に対するキャッシュヒットビット６５０がアサートされない場合、ロックを非投機的に実行する必要がある。アサーション／非アサーションは、ビット、フラグ又はフィールド等の任意の適切な方法で表現できることに留意されたい。
【００３９】
投機的ロックのロック特性に違反していることによって新たなＬＡＣＰエントリ６１０が生成された場合に、ヒットビット６５０がクリアされ、投機的にロックされたプロセッサキャッシュアドレスは、ＬＡＣＰに未だ記憶されていない。既存のＬＡＣＰエントリ６１０のヒットビット６５０は、別のスレッド（すなわち、ＬＡＣＰエントリを生成したスレッド以外のスレッド）からの書き込みアクセスがＬＡＣＰエントリ６１０と一致する場合に、クリアされる。ＬＡＣＰエントリを生成したスレッドの非投機的ロックが完了すると（非投機的ロックが完了することは、キャッシュラインがローカルキャッシュにあることを保証する）、ヒットビットがアサートされる。
【００４０】
例えば、プロセッサキャッシュ６７０のキャッシュエントリ６３０に対してロックが投機的に実行される場合であって、キャッシュエントリ６３０上の投機的ロックのロック特性に違反した場合（例えば、投機的ロックを保持するスレッド以外のスレッドからの書き込みアクセスによって）、キャッシュエントリ６３０のアドレスは、コンパレータ６２０を使用して各エントリ６１０と比較される。
【００４１】
キャッシュエントリ６３０が既存のＬＡＣＰエントリ６１０と一致しない場合、１つのＬＡＣＰエントリ６１０が、投機的ロックのキャッシュライン６３０を追跡するために選択され、キャッシュエントリ６３０のアドレスは、所望の置換ストラテジーに従って１つのＬＡＣＰエントリ６１０に記憶される。ＬＡＣＰエントリは、任意の適切なキャッシュ置換アルゴリズムを使用して（例えば、必要な論理回路の数及び／又は発生する遅延の量と、後に有用な情報を提供する可能性があるエントリを置換することと、のトレードオフに基づいて）、エビクト及び置換することができる。例えば、空のＬＡＣＰエントリを使用することができ、又は、空のＬＡＣＰエントリが存在しない場合には、（例えば、エイジフィールド６６０に従って決定されるように）最も直近に使用されたＬＡＣＰエントリを置換することができる。
【００４２】
投機的ロックのロック特性に違反した場合、ＬＡＣＰエントリ６１０のヒットビット６５０は、このアドレスに対してロックが投機的に実行されるのを抑制することを示すためにクリアされ、ＬＡＣＰエントリ６１０のエイジフィールド６６０がリセットされる。ＬＡＣＰエントリ６１０が生成された後に、スレッドが再開され、ロックが非投機的に実行される。
【００４３】
プロセッサキャッシュエントリ６３０への別のスレッドの書き込みアクセスが既存のＬＡＣＰエントリ６１０と一致する場合、このアドレスに対してロックが投機的に実行されるのを抑制することを示すようにヒットビット６５０がクリアされ、ＬＡＣＰエントリ６１０のエイジフィールド６６０がリセットされる。
【００４４】
非投機的ロックがプロセッサキャッシュエントリ６３０でアサートされた場合、エントリ６３０のアドレスは、コンパレータ６２０を使用してＬＡＣＰエントリ６１０と比較される。プロセッサキャッシュエントリ６３０が既存のＬＡＣＰエントリ６１０と一致する場合、エントリのヒットビットは、ロックが完了したとき又はロックが完了した後にアサートされ、ＬＡＣＰエントリのアドレスが、プロセッサのローカルキャッシュに現在存在するメモリ位置に関連付けられていることを示す。アサートされたヒットビットは、ＬＡＣＰエントリと一致する後続のロック命令が投機的に実行され得ることを示す。しかしながら、後のロック命令が実行される前に別のスレッドがメモリアクセスについてエントリ６３０をプローブする場合、エントリ６３０のアドレスは、コンパレータ６２０を使用してエントリ６１０と比較される。キャッシュエントリ６３０が既存のＬＡＣＰエントリ６１０と一致する場合、エントリのヒットビットは、キャッシュエントリ６３０に対してロックが投機的に実行されなくてもよいことを示すために、クリアされる。
【００４５】
上述したことから理解できるように、ＬＡＣＰキャッシュヒットビット６５０は、動作の２つのケースを区別することができる。第１ケースでは、ＬＡＣＰエントリ６１０は、プロセッサローカルキャッシュ６７０の非投機的ロックについて記録される。このケースでは、ＬＡＣＰキャッシュヒットビット６５０は、キャッシュエントリ６３０についてロックが投機的に実行され続けてもよいことを示すために、アサートされる。このケースでは、投機的ロックは、キャッシュエントリ６３０のアドレスがＬＡＣＰエントリ６１０にヒットしたとしても許可される。第２ケースでは、別のスレッドによるアクセスは、プロセッサローカルキャッシュ６７０からキャッシュエントリ６３０を削除する。したがって、このケースでは、ＬＡＣＰエントリ６１０のヒットビットは、キャッシュエントリ６３０についてロック命令が投機的に実行されるのを抑制するために、クリアされる。これは、第２スレッドがキャッシュエントリ６３０のロック特性に違反する機会に対処する。
【００４６】
緩和されたロック特性が実行パイプラインをフラッシュし、非投機的ロックを使用して実行を再開することになる可能性がある状況を予測する別のアプローチは、時間的ロック競合を追跡することである。このような予測は、任意のアドレスに対する所定数の投機的ロックが過去にフラッシュ及び再開をもたらした場合、又は、所定数の他のスレッドが、任意のアドレスが過去にロックされていた間に当該アドレスへのアクセスを競合した場合に、任意のアドレスに対する投機的ロックがフラッシュ及び再開をもたらす可能性があるという考えに基づいている。所定の期間内に、ある割合で、又は、時間に基づいて、所定数のフラッシュ及び再開又は競合イベントが任意のアドレスに対して行われた場合、何れかのアドレスに対する投機的ロックの可能性があると考えられる。このような予測は、時間的ロック競合予測と呼ばれることがある。
【００４７】
１つの例では、時間的ロック競合予測器は、最後のＸ個のキャッシュ可能ロック命令の競合履歴を追跡する。ここで、Ｘは、任意の適切な数であってもよい。例えば、Ｘは、必要なロジックの数と、後に有用な情報を提供する可能性があるエントリを置換することと、のトレードオフに基づいて選択することができる。キャッシュ可能ロックが投機的であり、フラッシュ及び再開を引き起こした場合、それは、時間的ロック競合予測器によってロック競合イベントとして記録される。ロック競合イベントの数が所望の閾値Ｙを超えると、後続のロック命令が投機的に実行されるのが抑制される。この例では、投機的ロックの頻繁な失敗は、後の投機的ロックの失敗の予測因子とみなされる。
【００４８】
図７は、時間的ロック競合予測（ＴＬＣＰ）を使用して投機的ロックを実行する例示的な方法７００を示すフローチャートである。第１スレッドがロック命令を実行することを条件に（７０５）、ＴＬＣＰ回路は、過去のＸ個のキャッシュ可能ロック命令において投機的ロックの間にロック特性がＹ回以上違反したかどうかを検査する。この例では、ＴＬＣＰ回路は、過去のＸ個のキャッシュ可能ロック命令において発生したロック特性の違反の数を追跡するカウンタを含むが、ＴＬＣＰ回路は、この実施形態に限定されない。例えば、ＴＬＣＰ回路は、代わりに、過去のキャッシュ可能ロック命令の絶対数を追跡してもよい（過去のＸ個のキャッシュ可能ロック命令内だけではない）。様々な実施形態では、ＴＬＣＰは、特定のロックされたアドレスに対するロックの違反の数、又は、任意のアドレスに対する全てのロックの違反の数を追跡してもよいことに留意されたい。
【００４９】
ロック特性が過去のＸ個のキャッシュ可能ロック命令においてＹ回以上違反したことを条件に（７１０）、ステップ７１５において、ロックが非投機的に実行され、ステップ７５０において、ＴＬＣＰは、成功したロックの実行に対して更新される。ロック特性が過去のＸ個のキャッシュ可能ロック命令においてＹ回以上違反していない場合、ステップ７２０において、ロックが投機的に実行される。投機的実行の間、ＴＬＣＰ回路は、投機的ロックのロック特性が違反したかどうかを検査する。
【００５０】
投機的ロックのロック特性が違反していないことを条件に（７２５）、及び、ロックが完了したことを条件に（７２７）、ステップ７６０において、ＴＬＣＰは、成功したロックの実行に対して更新される。ロック特性が違反していることが判別されたことを条件に（７２５）、ステップ７３０において、ＴＬＣＰ内のデータが、失敗したロックの実行に対して更新され、ステップ７３５において、実行パイプラインがフラッシュされ、ステップ７４０において、スレッドが再開され、ステップ７１５において、非投機的に実行され、ステップ７５０において、ＴＬＣＰは、成功したロックの実行に対して更新される。
【００５１】
別の例では、ＴＬＣＰ回路は、最後のＸ個のキャッシュ可能ロック命令の競合履歴を追跡する。この例では、キャッシュ可能ロックが、そのロック特性に違反した投機的ロックである場合、ロックされたアドレスは、ＴＬＣＰ回路によって記録される。ロック競合イベントの数が所望の数Ｙを超えた場合、後続のロック命令が投機的に実行されるのが抑制される。この実施形態は例示的である。例えば、ＴＬＣＰ回路は、代わりに、最後のＸ個のキャッシュ可能ロック命令等のように、特定の時間ウィンドウ内のフラッシュ／再開及びＮＡＫの数を追跡してもよい。この例では、投機的ロックの頻繁な失敗及び（投機的に又は非投機的に）ロックされたメモリに対する他のスレッドによる競合は、後の投機的ロックの失敗の予測因子とみなされる。
【００５２】
図８は、時間的ロック競合予測（ＴＬＣＰ）を使用して投機的ロックを実行する例示的な方法８００を示すフローチャートである。第１スレッドがロック命令を実行することを条件に（８０５）、ＴＬＣＰ回路は、過去のＸ個のキャッシュ可能ロック命令において投機的ロック後にロック特性がＹ回以上違反したかどうか（例えば、ロックを保持するスレッド以外のスレッドが、ロックされたアドレスにおいてプロセッサキャッシュへの書き込みアクセスについて競合したこと、又は、ロックのフェンシング性が違反したこと）を検査する。この例では、ＴＬＣＰ回路は、過去のＸ個のキャッシュ可能ロック命令において発生したロック特性の違反の数を追跡するカウンタを含むが、ＴＬＣＰ回路は、この実施形態に限定されない。
【００５３】
メモリ（この例では、任意のメモリエントリ）の投機的ロックのロック特性が過去のＸ個のキャッシュ可能ロック命令においてＹ回以上違反したことを条件に（８１０）、ステップ８１５においてロックが非投機的に実行される。ステップ８１５においてロックが非投機的に実行されている間、非投機的にロックされたメモリエントリに書き込むための書き込み要求が別のスレッドによって行われたかどうかが判別される。何れの場合も、条件８８７においてロックが完了していない限り、ステップ８１５においてロックが非投機的に実行され続ける。
【００５４】
このような要求がロック中の任意の時点で行われたことを条件に（８５０）、ステップ８５５において、ＴＬＣＰは、ロック競合を示すように更新される。このような要求が行われなかったことを条件に（８５０）、ステップ８８０において、ＴＬＣＰは、ロック競合がないことを示すように更新される。ＴＬＣＰが既に適切な状態を反映している場合には、明示的な更新が必要とされなくてもよいことに留意されたい。いくつかの実施形態では、ＴＬＣＰの更新は、ロックが完了したとき又はロックが完了した後に行われてもよいことに留意されたい。
【００５５】
ロック特性が過去のＸ個のキャッシュ可能ロック命令においてＹ回以上違反していない場合、ステップ８２０においてロックが投機的に実行される。投機的実行の後、ＴＬＣＰ回路は、投機的ロックのロック特性に違反したかどうかを検査する。いくつかの実施形態では、投機的実行中に別のスレッドがメモリ位置にアクセスした場合、データが無効であると推定される。
【００５６】
投機的ロックのロック特性が別のスレッドからのロック競合によって違反していないことを条件に（８２５）、及び、ロックが完了したことを条件に（８２７）、ステップ８９０において、ＴＬＣＰは、ロック競合がないことに対して更新される。投機的ロックのロック特性が別のスレッドからのロック競合によって違反したことを条件に（８２５）、ステップ８３０において、ＴＬＣＰは、ロック競合が発生したことを示すように更新され、ステップ８３５において、実行パイプラインがフラッシュされ、ステップ８４０において、スレッドが再開され、ステップ８１５において、非投機的に実行される。
【００５７】
いくつかの実施形態では、これらの概念が組み合わされてもよい。例えば、特定のメモリ位置への特定の数のロック命令がフラッシュ／再開をもたらし、特定の期間内の当該メモリ位置への特定の数のロック命令がフラッシュ／再開をもたらし、当該メモリ位置への特定の数のロック命令が特定の割合で又は時間に基づいてフラッシュ／再開をもたらした場合に、当該メモリ位置に対するロック命令の投機的な実行が抑制されてもよい。
【００５８】
メモリデバイス内のエントリをロックする方法が本明細書で開示される。メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令が検出される。ロック命令が検出された場合、以前の投機的ロック中に特定のメモリエントリについて競合が発生したかどうかが検出される。以前の投機的ロック中に特定のメモリエントリについて競合が発生した場合、ロック命令が非投機的に実行される。以前の投機的ロック中に特定のメモリエントリについて競合が発生しなかった場合、ロック命令が投機的に実行される。
【００５９】
いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生したかどうかは、ロック命令が投機的に実行されたことを条件に検出される。いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生した場合、スレッドが実行している実行パイプラインがフラッシュされ、スレッドが、ロック命令から開始して非投機的に再実行される。
【００６０】
いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することは、特定のメモリエントリが無効なデータを含むかどうかを検出することを含む。いくつかの例では、競合は、メモリエントリのロック中の別のスレッドによるメモリエントリへのアクセス、メモリエントリの変更、メモリエントリへのアクセス要求、又は、メモリエントリの変更要求のうち何れかを含む。いくつかの例では、以前の投機的ロック中に特定のメモリエントリについて競合が発生したかどうかを検出することは、以前の投機的ロック中に、別のスレッドが特定のメモリエントリへのアクセスを要求したかどうか、特定のメモリエントリにアクセスしたかどうか、特定のメモリエントリの変更を要求したかどうか、又は、特定のメモリエントリを変更したかどうかを検出することを含む。いくつかの例では、ロックを投機的に実行することは、ロックの制約を緩和することを含む。いくつかの例では、ロックを投機的に実行することは、ロックのアトミックアクセス性又はフェンシング性を緩和することを含む。
【００６１】
メモリデバイス内のエントリをロックする方法が本明細書で開示される。メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令が検出される。ロック命令が検出された場合、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかが検出される。この数が閾値を超えた場合、ロック命令が非投機的に実行される。この数が閾値を超えない場合、ロック命令が投機的に実行される。
【００６２】
いくつかの例では、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、特定の期間中に、競合が発生した特定のメモリエントリの以前の投機的ロックの数が閾値を超えたかどうかを検出することを含む。いくつかの例では、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、特定の期間中に、競合が発生したメモリデバイス内の何れかのメモリエントリの以前の投機的ロックの数が閾値を超えたかどうかを検出することを含む。
【００６３】
いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生したかどうかは、ロック命令が投機的に実行されることを条件に検出される。いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生した場合、スレッドが実行している実行パイプラインがフラッシュされ、スレッドが、ロック命令から開始して非投機的に再実行される。
【００６４】
いくつかの例では、投機的ロック中の特定のメモリエントリについて競合が発生したかどうかを検出することは、特定のメモリエントリが無効なデータを含むかどうかを検出することを含む。いくつかの例では、競合は、メモリエントリのロック中のスレッドによるメモリエントリへのアクセス、メモリエントリの変更、メモリエントリへのアクセス要求、又は、メモリエントリの変更要求のうち何れかを含む。いくつかの例では、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、以前の投機的ロック中に、別のスレッドがメモリへのアクセスを要求したかどうか、メモリにアクセスしたかどうか、メモリの変更を要求したかどうか、又は、メモリを変更したかどうかを検出することを含む。いくつかの例では、ロックを投機的に実行することは、ロックの制約を緩和することを含む。いくつかの例では、ロックを投機的に実行することは、ロックのアトミックアクセス性又はフェンシング性を緩和することを含む。
【００６５】
投機的ロック用に構成された処理デバイスが本明細書で開示される。プロセッサコアは、実行パイプラインを含む。ロック命令検出回路は、メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出するように構成されている。競合検出回路は、ロック命令が検出された場合、以前の投機的ロック中に特定のメモリエントリについて競合が発生したかどうかを検出するように構成されている。ロック回路は、以前の投機的ロック中に特定のメモリエントリについて競合が発生した場合、ロック命令を非投機的に実行するように構成されている。ロック回路は、以前の投機的ロック中に特定のメモリエントリについて競合が発生しなかった場合、ロック命令を投機的に実行するように構成されている。
【００６６】
いくつかの例では、競合検出回路は、ロック命令が投機的に実行されたことを条件に、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出するように構成されている。いくつかの例では、投機的ロック中に特定のメモリエントリについて競合が発生した場合、スレッドが実行している実行パイプラインをフラッシュし、スレッドをロック命令から開始して非投機的に再実行するように構成された再実行回路を含む。
【００６７】
いくつかの例では、投機的ロック中に特定のメモリエントリについて競合が発生したかどうかを検出することは、特定のメモリエントリが無効なデータを含むかどうかを検出することを含む。いくつかの例では、競合は、メモリエントリのロック中の別のスレッドによるメモリエントリへのアクセス、メモリエントリの変更、メモリエントリへのアクセス要求、又は、メモリエントリの変更要求のうち何れかを含む。いくつかの例では、以前の投機的ロック中に特定のメモリエントリについて競合が発生したかどうかを検出することは、以前の投機的ロック中に、別のスレッドが特定のメモリエントリへのアクセスを要求したかどうか、特定のメモリエントリにアクセスしたかどうか、特定のメモリエントリの変更を要求したかどうか、又は、特定のメモリエントリを変更したかどうかを検出することを含む。いくつかの例では、ロックを投機的に実行することは、ロックの制約を緩和することを含む。いくつかの例では、ロックを投機的に実行することは、ロックのアトミックアクセス性又はフェンシング性を緩和することを含む。
【００６８】
投機的ロック用に構成された処理デバイスが本明細書で開示される。プロセッサコアは、実行パイプラインを含む。ロック命令検出回路は、メモリデバイスの特定のメモリエントリに対してスレッドによって実行されたロック命令を検出するように構成されている。競合検出回路は、ロック命令が検出された場合、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出するように構成されている。ロック回路は、この数が閾値を超えた場合、ロックを非投機的に実行するように構成されている。ロック回路は、この数が閾値を超えない場合、ロックを投機的に実行するように構成されている。
【００６９】
いくつかの例では、特定の期間中に、競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、特定の期間中に、競合が発生した特定のメモリエントリの以前の投機的ロックの数が閾値を超えたかどうかを検出することを含む。いくつかの例では、特定の期間中に競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、特定の期間中に競合が発生したメモリデバイス内の何れかのメモリエントリの以前の投機的ロックの数が閾値を超えたかどうかを検出することを含む。いくつかの例では、競合検出回路は、ロック命令が投機的に実行されたことを条件に、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出するように構成されている。
【００７０】
いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生した場合、スレッドが実行している実行パイプラインをフラッシュし、スレッドをロック命令から開始して非投機的に再実行するように構成された再実行回路を含む。いくつかの例では、投機的ロック中に特定のメモリエントリについて別のスレッドからの競合が発生したかどうかを検出することは、特定のメモリエントリが無効なデータを含むかどうかを検出することを含む。いくつかの例では、競合は、メモリエントリのロック中のスレッドによるメモリエントリへのアクセス、メモリエントリの変更、メモリエントリのアクセス要求、又は、メモリエントリの変更要求を含む。
【００７１】
いくつかの例では、特定の期間中に競合が発生したメモリの以前の投機的ロックの数が閾値を超えたかどうかを検出することは、以前の投機的ロック中に、別のスレッドがメモリへのアクセスを要求したかどうか、メモリにアクセスしたかどうか、メモリの変更を要求したかどうか、又は、メモリを変更したかどうかの何れかを検出することを含む。いくつかの例では、ロックを投機的に実行することは、ロックの制約を緩和することを含む。いくつかの例では、ロックを投機的に実行することは、ロックのアトミックアクセス性又はフェンシング性を緩和することを含む。
【００７２】
本明細書における開示に基づいて多くの変形が可能であることを理解されたい。上記では、特徴及び要素が特定の組み合わせで説明されているが、各特徴又は要素は、他の特徴及び要素無しに単独で使用されてもよいし、他の特徴及び要素を伴って又は伴わずに様々な組み合わせで使用されてもよい。
【００７３】
提供された方法は、汎用コンピュータ、プロセッサ又はプロセッサコアで実施されてもよい。適切なプロセッサには、例として、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、複数のマイクロプロセッサ、ＤＳＰコアに関連する１つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）回路、他のタイプの集積回路（ＩＣ）、及び／又は、ステートマシンが含まれる。このようなプロセッサは、処理されたハードウェア記述言語（ＨＤＬ）命令（このような命令は、コンピュータ可読媒体に記憶することが可能である）の結果及びネットリストを含む他の中間データを用いて製造プロセスを構成することによって製造され得る。このようなプロセスの結果は、実施形態の形態を実施するプロセッサを製造するために半導体製造プロセスにおいて使用されるマスクワークであってもよい。
【００７４】
本明細書で提供された方法又はフローチャートは、汎用コンピュータ又はプロセッサによる実行のために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア又はファームウェアで実施されてもよい。非一時的なコンピュータ可読記憶媒体の例には、例えば読み出し専用メモリ（ＲＯＭ）、ランダムアクセスメモリ（ＲＡＭ）、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク、リムーバブルディスク等の磁気媒体、光磁気記憶媒体、例えばＣＤ−ＲＯＭディスク及びデジタル多用途ディスク（ＤＶＤ）等の光学媒体が含まれる。
【図１】
2019530120.tif 000003
【図２】
2019530120.tif 000004
【図３】
2019530120.tif 000005
【図４】
2019530120.tif 000006
【図５】
2019530120.tif 000007
【図６】
2019530120.tif 000008
【図７】
2019530120.tif 000009
【図８】
2019530120.tif 000010
【国際調査報告】
2019530120.tif 000011
2019530120.tif 000012