(57)【特許請求の範囲】
【請求項１】
キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための前記スレッドの数の第1の割当て量を設定し、特定のコードセクションにおいて実行中の現在のスレッドの数を表すスレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記キューからの第1のスレッドを投機的に実行するロックと、
前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更する調整器と、
前記スレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記キューからの前記第1のスレッドをデキューするコントローラと、
を有し、
前記調整器は、前記第1のスレッドの投機的実行の結果に基づき、ロックがキュー内に存在した後に前記特定のコードセクションにおいて実行することが可能なスレッドの初期数の第2の割当て量の第2の値を、
前記結果が実行成功であって、前記第1の値が前記第2の値に等しいとき、前記第2の値を増加し、
前記結果が実行成功であって、前記第1の値が閾値量だけ前記第2の値より小さいとき、前記第2の値を減少することによって、
変更する装置。
【請求項２】
前記調整器は、前記結果が前記第1のスレッドの中止であるとき、前記第1の割当て量を減少させることによって、前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更する、請求項１記載の装置。
【請求項３】
前記コントローラは、前記スレッド計数が前記第1の割当て量に到達したことに応答して、前記キューの先頭に前記第1のスレッドを維持する、請求項１記載の装置。
【請求項４】
プロセッサが、キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための前記スレッドの数の第1の割当て量を設定するステップと、
特定のコードセクションにおいて実行中の現在のスレッドの数を表すスレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記プロセッサが、前記キューからの第1のスレッドを投機的に実行するステップと、
前記プロセッサが、前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更するステップと、
前記スレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記プロセッサが、前記キューからの前記第1のスレッドをデキューするステップと、
を有し、
前記プロセッサが、前記第1のスレッドの投機的実行の結果に基づき、ロックがキュー内に存在した後に前記特定のコードセクションにおいて実行することが可能なスレッドの初期数の第2の割当て量の第2の値を、
前記結果が実行成功であって、前記第1の値が前記第2の値に等しいとき、前記第2の値を増加し、
前記結果が実行成功であって、前記第1の値が閾値量だけ前記第2の値より小さいとき、前記第2の値を減少することによって、
変更するステップを更に有する方法。
【請求項５】
前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更するステップは、前記結果が前記第1のスレッドの中止であるとき、前記第1の割当て量を減少させるステップを含む、請求項４記載の方法。
【請求項６】
前記スレッド計数が前記第1の割当て量に到達したことに応答して、前記プロセッサが、前記キューの先頭に前記第1のスレッドを維持するステップを更に有する、請求項４記載の方法。
【請求項７】
キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための前記スレッドの数の第1の割当て量を設定するステップと、
特定のコードセクションにおいて実行中の現在のスレッドの数を表すスレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記キューからの第1のスレッドを投機的に実行するステップと、
前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更するステップと、
前記スレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記キューからの前記第1のスレッドをデキューするステップと、
をプロセッサに実行させ、
前記第1のスレッドの投機的実行の結果に基づき、ロックがキュー内に存在した後に前記特定のコードセクションにおいて実行することが可能なスレッドの初期数の第2の割当て量の第2の値を、
前記結果が実行成功であって、前記第1の値が前記第2の値に等しいとき、前記第2の値を増加し、
前記結果が実行成功であって、前記第1の値が閾値量だけ前記第2の値より小さいとき、前記第2の値を減少することによって、
変更するステップを更に前記プロセッサに実行させるプログラム。
【請求項８】
前記結果が前記第1のスレッドの中止であるとき、前記第1の割当て量を減少させることによって、前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更するステップを前記プロセッサに実行させる、請求項７記載のプログラム。
【請求項９】
前記スレッド計数が前記第1の割当て量に到達したことに応答して、前記キューの先頭に前記第1のスレッドを維持するステップを前記プロセッサに実行させる、請求項７記載のプログラム。
【請求項１０】
キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための前記スレッドの数の第1の割当て量を設定する手段と、
特定のコードセクションにおいて実行中の現在のスレッドの数を表すスレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記キューからの第1のスレッドを投機的に実行する手段と、
前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更する手段と、
前記スレッド計数が前記第1の割当て量に到達しなかったことに応答して、前記キューからの前記第1のスレッドをデキューする手段と、
を有し、
前記第1のスレッドの投機的実行の結果に基づき、ロックがキュー内に存在した後に前記特定のコードセクションにおいて実行することが可能なスレッドの初期数の第2の割当て量の第2の値を、
前記結果が実行成功であって、前記第1の値が前記第2の値に等しいとき、前記第2の値を増加し、
前記結果が実行成功であって、前記第1の値が閾値量だけ前記第2の値より小さいとき、前記第2の値を減少することによって、
変更する手段を更に有する適応的キュー化ロック処理マネージャ。
【請求項１１】
前記第1のスレッドの投機的実行の結果に基づき前記第1の割当て量の第1の値を変更する手段は、前記結果が前記第1のスレッドの中止であるとき、前記第1の割当て量を減少させる、請求項１０記載の適応的キュー化ロック処理マネージャ。
【請求項１２】
請求項７乃至９何れか一項記載のプログラムを記憶するコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
［関連出願］
本特許は、2015年6月3日に出願され、その全体が参照することによってここに援用される米国特許出願第14/729,914号からの優先権を主張する。
［開示の分野］
本開示は、一般に計算プラットフォームに関し、より詳細には、トランザクショナルメモリにおける投機的実行の制御のための適応的なキュー処理されたロック処理に関する。
【背景技術】
【０００２】
トランザクショナルメモリシステムでは、コード領域はパラレルに投機的に実行される。例えば、2つのトランザクションがメモリにおける同一の位置にアクセスすることを試みるとき、コンフリクトが生じる。例えば、第1及び第2のトランザクションがメモリにおける同一の位置に書き込むことを試みるとき、コンフリクトが発生する。さらに、第1のトランザクションがメモリにおけるある位置に書き込むことを試み、第2のトランザクションがメモリにおける同一の位置を読み込むことを試みるとき、コンフリクトが発生する。
【図面の簡単な説明】
【０００３】
【図１】図1は、本開示の教示により構成される一例となる計算プラットフォームの図である。
【図２】図2は、図1の一例となる適応的キュー化ロック処理（AQL）マネージャの一例となる実現形態のブロック図である。
【図３】図3は、図1及び/又は2のAQLマネージャの一例となる状態を示す図である。
【図４】図4は、図1及び/又は2の一例となるAQLマネージャを実現するため実行可能な一例となるマシーン可読命令を示すフローチャートである。
【図５】図5は、図1及び/又は2の一例となるAQLマネージャを実現するため実行可能な一例となるマシーン可読命令を示すフローチャートである。
【図６】図6は、図1及び/又は2の一例となるAQLマネージャを実現するため実行可能な一例となるマシーン可読命令を示すフローチャートである。
【図７】図7は、図4〜6の一例となるマシーン可読命令を実行することによって図1及び/又は2の一例となるAQLマネージャを実現可能な一例となる処理システムのブロック図である。
【発明を実施するための形態】
【０００４】
コードの並列実行を利用するシステムは、メモリの同じ部分に同時にアクセスする異なるコードから生じる困難に遭遇する。このようなコンフリクトの悪影響を緩和又は軽減するための技術が利用可能である。しかしながら、これらの技術はそれら独自の困難を伴う。例えば、いくつかのトランザクショナルメモリの機能は、コンフリクトオーバロードを受ける可能性がある。トランザクショナルメモリの実現形態であるトランザクショナル同期拡張（TSX）は、複数のスレッドが投機的に並行的に実行されることを伴う。各スレッドは、1つ以上のトランザクション（例えば、メモリトランザクション）を含む。特定のスレッドに関連してコンフリクトが発生すると、対応するトランザクションは中止され、その後にリトライされる。いくつかの例では、トランザクションは実行が成功可能になる前に複数回リトライされる。いくつかの例では、トランザクションは非トランザクショナルパスにフォールバックする。
【０００５】
多数のコンフリクトを受けると、それに対応して多数のトランザクションの中止がコードを介し順方向の進捗を妨げる。このような問題は、例えば、より多くのスレッドが実行されるに従って、特定のコードセクションに対するコンフリクトの確率が急激に増加する際に発生する。コンフリクトが発生し、スレッドが中止された後に実行をリトライするとき、新しいスレッドが到着し、より多くのコンフリクトを招くに従って、コンフリクトの確率が急速に高まり、コンフリクトの可能性について肯定的なフィードバックを形成する。最終的に、ボトルネックが形成され、中止された後に実行をリトライすることを試みるスレッドは、あまりにも多数のスレッドが同時に実行することを試みるため、有意な順方向の進捗を行うことができない（例えば、望ましくない遅い進捗が行われる）。
【０００６】
いくつかのトランザクショナルメモリシステムは、共有メモリにアクセスし、複数のスレッドによってパラレルに実行されるとコンフリクトを生じさせる可能性を有するコードセクションであるクリティカルセクションへのアクセスを緊密に制御するロックを実現することによってボトルネックを緩和する。具体的には、ロックは、１つ以外の全てのスレッドがコードのクリティカルセクションを実行することを禁止することによって、コードのクリティカルセクションを保護する。ロックを取得したスレッドのみがクリティカルセクションを実行することが許可される。このような例では、スレッドは、例えば、ロックを取得することを繰り返し試みることによってロックに対して競合し、これによって、クリティカルセクションにおける実行するためのロックパーミッションを取得するスレッドを与える。
【０００７】
ロックの一例はMCSロックであり、その著者のMichael  L.  Scott及びJohn  M.  Mellor-Crummeyのイニシャルにより命名されている。既知のシステムでは、MCSロックは、スレッドがクリティカルセクションにおいてパラレルに投機的に実行することが可能とされるトランザクションモードと対照されるように、1つのみのスレッドがクリティカルセクションにおいて実行することが可能とされる排他モードに対応するシステムが入るときに利用される。このような既知のシステムのシステムは、閾値数の中止が閾値時間内に発生したことに応答して、排他モードに入るようにしてもよい。排他モードを強制するため、既知のMCSロックは、（例えば、クリティカルセクションにおけるコンフリクトに応答して）中止されたスレッドをキューに編成する。MCSキューの各ノードは、クリティカルセクションで実行するためのパーミッションを待機する以前に中止されたスレッドに対応する。特に、MCSキューのスレッドは、キュー内で待機している間に、各自のローカル変数上でスピンする。特に、MCSロックは、MCSキューの先頭に位置するスレッドのみが中止されたトランザクションをリトライすることを可能にする。また、MCSロックは、クリティカルセクションにおけるリトライの実行を1つのスレッドに制限する。このアプローチは、上述されたボトルネックの影響を軽減するが、このアプローチのシングルスレッドの制限は、対応するシステムのスループットを抑制する可能性がある。
【０００８】
ここに開示される例示的な方法及び装置は、例えば、トランザクショナルメモリシステムにおけるコンフリクトの処理を改善する。以下の具体例は、トランザクショナルメモリシステムに関連して説明されるが、ここに開示される例示的な方法及び装置は、何れか適切なタイプのシステムにおいて利用可能である。ここに開示される具体例は、動的な数のスレッドがコンフリクトが発生したスレッドを含むクリティカルセクションにおいて投機的に実行されることを可能にする適応的キュー化ロック処理技術を提供する。全てのスレッドがクリティカルセクションにおいて投機的に実行されることが可能とされているか、あるいは、1つのスレッドしかクリティカルセクションにおいて実行されることが可能とされている既知のシステムとは対照的に、ここに開示された具体例は、クリティカルセクションにおいて同時に実行可能なスレッド数に対する精細な制御を提供する。ここに開示される具体例は、動的な割当て量を維持し、クリティカルセクションにおいて現在実行されているスレッドの数を追跡することによって、可能とされるスレッドの数を制御する。スレッドの数が割当て量に一致するとき、ここに開示される具体例は、追加的なスレッドがクリティカルセクションにおいて実行されることを拒否する。従って、ここに開示される具体例は、クリティカルセクションにおいて同時に投機的に実行されるスレッドの数を抑制する。
【０００９】
さらに、ここに開示される具体例は、スレッド実行の成功率（例えば、閾値リトライ数内及び/又は閾値時間内の実行リトライ）に従ってスレッドを実行する割当て量を適応させる。成功率は、例えば、コンフリクトを受けることなく実行成功する（例えば、完全に実行され、コミットされる）スレッド又はトランザクションのパーセンテージに対応する。例えば、最近リトライされた実行の成功率が閾値パーセンテージを上回っている場合、ここに開示された具体例は、クリティカルセクションにおいて実行を同時にリトライすることが可能とされるスレッドの数を制御する割当て量を増加させる。いくつかの具体例では、最近リトライされた実行の成功率が同じ又は異なる閾値パーセンテージよりも低い場合、ここに開示された具体例は割当て量を減少又はリセットする。従って、ここに開示された具体例は、コンフリクトの確率を低下させながらスループットを向上させるように、クリティカルセクションにおいて実行されるスレッドの数を反復的又は連続的に調整する。
【００１０】
図1は、トランザクショナルメモリシステム102を含む計算プラットフォーム100の一例を示す。図1の一例となるトランザクショナルメモリシステム102は、例えば、計算複合体106によるスレッド104の並列実行を可能にする。図1の一例となる計算複合体106は、スレッド104のコードを実行する1つ以上のプロセッサを含む。図示された具体例では、スレッド104の1つ以上は、トランザクショナルメモリシステム102を介し投機的に実行されるトランザクション（例えば、メモリトランザクション）を含む。スレッド104のあるコードは、メモリ108の共有部分へのアクセスを伴うクリティカルセクションである。
【００１１】
上述されるように、例えば、スレッド104の1つ以上の異なる投機的トランザクションがメモリ108の同じ部分にアクセス（例えば、書き込み）することを試みる際に、コンフリクトが発生する可能性がある。追加的又は代替的なタイプのコンフリクトが生じてもよい。図1の例示的なトランザクショナルメモリシステム102は、コンフリクト時に投機的に実行されるトランザクションを中止させることによって、コンフリクトに応答するコンフリクト検出器110を含む。中止されたトランザクションは、以降においてリトライされる。
【００１２】
図1の例示的なトランザクショナルメモリシステム102は、本開示の教示に従って構成される適応的キュー化ロック処理（AQL）マネージャ112を含む。図1の例示的なAQLマネージャ112は、対応するコードのクリティカルセクションにおいて投機的に実行可能なスレッド104の数を動的に制御する。さらに、図1の例示的なAQLマネージャ112は、例えば、スレッド104の成功率及び/又はスレッド104のトランザクションに基づき、クリティカルセクションにおいて実行可能なスレッド102の数を制御する割当て量を動的に調整する。
【００１３】
以下で詳細に説明されるように、図1の例示的なAQLマネージャ112は、例えば、コンフリクトによって以前に中止されたスレッド104の実行を編成及び実現するため連携するロック及びキューを提供する。コンフリクトを受けたスレッド104は、図1の例示的なAQLマネージャ112によって提供されるキューに自らを追加する。図1の例示的なAQLマネージャ112のロックは、キュー処理されたスレッド104の能力の動的な制御がクリティカルセクションにおいて実行されることを可能にする。すなわち、図1の例示的なAQLマネージャ112は、クリティカルセクションにおけるトランザクションの同時的な投機的実行の抑制を可能にする。図1に示される具体例では、AQLマネージャ112によって提供されるキューの先頭にあるスレッド104の1つは、クリティカルセクションにおいて投機的に実行することが可能とされるスレッド104の数を制御又は抑制する機能又は処理の1つ以上を実行する。
【００１４】
また、図1の例示的なAQLマネージャ112は、所与の時間にクリティカルセクションにおいて可能とされるスレッドの数に対する精細な制御を提供する。特に、例示的なAQLマネージャ112によって提供される精細な制御は、全てのスレッドが投機的に実行することを可能にし、それから中止のオーバロードに直面したときに一度に1つのスレッドのみの排他的実行に頼る必要がある既知のロック処理技術に対する改善である。（例えば、中止された後のリトライとして）精細な数のトランザクションが投機的に実行されることを可能にすることによって、図1の例示的なAQLマネージャ112は、一例となるトランザクショナルメモリシステム102（又は一例となるAQLマネージャ112を実現する他の何れか適切なタイプのシステム）がスレッド104のトランザクションをより迅速に処理し、多すぎるスレッドが投機されるときのコンスタントな中止を回避することを可能にする。
【００１５】
さらに、所与の時間にクリティカルセクションにおいて投機的に実行されることが可能なスレッドの数を動的に調整することによって（例えば、クリティカルセクションにおけるトランザクションの投機実行に関連する成功率に基づき）、図1の例示的なAQLマネージャ112は、トランザクションが実行成功してコミットされる率に従って、トランザクション投機的実行の抑制を調整する。図1の例示的なAQLマネージャ112によって提供される適応的な抑制は、クリティカルセクションにおいて実行されるスレッドの最適な平均数を実現することを試み、これによって、トランザクショナルメモリシステム102のハードウェアによって提供される並列性を最大限に利用する。
【００１６】
図2は、図1のAQLマネージャ112の一例となる実現形態を示す。図2の例示的なAQLマネージャ112は、ロック200、キュー202、キューコントローラ204及び調整器205を含む。図2の一例となるロック200は、排他的フラグ206、初期割当て量208、現在割当て量210、スレッド計数212及びポインタ214を維持する。以下で詳細に説明されるように、例示的なロック200は、キュー202と連携して、例えば、コードのクリティカルセクションにおけるスレッド104の実行を抑制する。
【００１７】
図2の一例となる排他的フラグ206は、図1のスレッド104によるクリティカルセクションの投機的実行が現在可能であるかを示すバイナリフィールドである。図2の図示された具体例では、排他的フラグ206は、クリティカルセクションにおける投機的実行が可能とされていないとき、真に設定される。図2の図示された具体例では、排他的フラグ206は、クリティカルセクションにおける投機的実行が可能とされているとき、偽に設定される。クリティカルセクションにおける投機的実行が図2の例示的なロック200によって可能とされていないとき、クリティカルセクションにおいて投機的に実行することを試みるスレッド104の何れかがキュー202に配置され、キュー202の先頭のスレッドのみがクリティカルセクションにおいて実行することが可能とされる。
【００１８】
スレッドがロック200によって保護されるクリティカルセクションに入ることを試みるとき、例示的な排他的フラグ206は、例えば、中止された後にキュー202に既に配置されていたスレッド104の投機的実行及び/又はスレッド104の抑制された実行を可能にするため、偽に設定される（例えば、キューの先頭のスレッドによって）。
【００１９】
図2の図示された具体例では、キュー202は、1つ以上のノード216を含み、各ノードはキュー202に配置されたスレッド104の1つに対応する。すなわち、キュー202に現在あるスレッド104のそれぞれは、ノード216の1つによって表される。図2の一例となるキュー202は、ノード216を含むリンクトリストによって実現される。しかしながら、何れか適切なデータ構造が、キュー202及び/又はノード216を実現するのに利用されてもよい。図2の具体例では、キュー202の先頭アイテムはノード216aとしてラベル付けされ、キュー202の最後のアイテムはノード216nとしてラベル付けされる。キュー202が1つのノードのみを含むとき、ノード216の同じノードが先頭ノード216a及び最後のノード216nとなる。
【００２０】
図2の図示された具体例では、キューコントローラ204は、キュー202からのスレッドの削除（例えば、デキュー）を制御する。図2の図示された具体例では、キュー202からのスレッドの削除に関連するキューコントローラ204の1つ以上の機能又は処理は、ヘッドノード216aに対応するキュー202の先頭のスレッドによって実現される。さらに、図2の図示された具体例では、スレッドは自らをキュー202に追加する。あるいは、キューコントローラ204は、キュー202への追加及び削除の両方を処理することができる。スレッド104の1つがキュー202に追加されると、当該スレッドは新しいノードを作成し、新しいノードを既にキュー202に存在する最後のノード216nと交換する（例えば、アトミック交換を介し）。すなわち、新たに作成されたノードは最後のノード216nとして指定され、キュー202のエンドに以前にあったノードは、キュー202における最後から2番目のアイテムとして指定される。図2の具体例では、ロック200のポインタ214は、キュー202の最後のノード216nを指し示す。従って、新しく作成されたノードがキュー202に追加されると、当該交換は、ロック200のポインタ214をノード216の以前の最後のものを指し示すことからノード216nの新たに作成されたものを指し示すことに変更することを伴う。さらに、当該交換は、ノード216の以前の最後のものにノード216nの新たなものを指し示させることを伴う。
【００２１】
図2の具体例では、スレッド104の中止されたものは、図1のコンフリクト検出器110によって対応するトランザクションの中止が実行されたことに応答して、図2のキュー202に追加される。さらに、排他的フラグ206が真に設定されている際にクリティカルセクションにおいて投機的に実行することを試みるスレッド104の何れかが、キュー202に追加される。排他的フラグ206が偽に設定され、キュー202に存在するスレッド104がクリティカルセクションにおいて実行をリトライすることが可能とされているとき、ロック200は、特定の数のスレッド104がクリティカルセクションにおいて実行をリトライすることを可能にする。特に、図2の例示的なロック200は、クリティカルセクションにおいて実行することが可能とされたスレッド104の特定の数を制御するため、割当て量を実施する。図2の具体例では、割当て量は、初期割当て量208及び現在割当て量210を介し実施される。図2の一例となる初期割当て量208は、ロック200がキュー202内に存在した後にクリティカルセクションにおいて実行することが可能なスレッド104の初期数を表す。初期割当て量208の初期値は、例えば、デフォルト設定及び/又はユーザ（例えば、管理者）の入力に従って設定される。図2の図示された具体例では、初期割当て量208は、キュー202からのリトライされた実行の成功又は失敗に従って調整される。あるいは、初期割当て量208は静的であってもよく、クリティカルセクションにおいて許容されるスレッド104の数の開始点としてのみ役立つ。図2の例示的な調整器205を介した初期割当て量208の動的調整は、以下において詳細に説明される。
【００２２】
例示的な現在割当て量210は、ロック200がキュー202内に存在した後にクリティカルセクションにおいて実行することが可能なスレッド104の現在の数を表す。図示された例では、現在割当て量210は、初期割当て量208に等しくなるよう初期的に設定され、キュー202からのリトライされた実行の成功又は失敗に従って経時的に調整される。図2の図示された具体例では、以下で詳細に説明されるように、初期割当て量208及び現在割当て量210が動的に調整される。しかしながら、初期割当て量208が静的であるとき、例示的な現在割当て量210は単に動的に調整される。
【００２３】
例示的なスレッド計数212は、所与の時間にクリティカルセクションにおいて実行しているキュー202からのスレッド104の現在の数を表す。例えば、キュー202内に存在するスレッド104の1つが中止後に実行をリトライするためクリティカルセクションに入ると、一例となる調整器205はスレッド計数212を増やす（例えば、インクリメントする）。さらに、ヘッドノード216aのスレッドが完了まで実行成功してコミットされると、一例となる調整器205はスレッド計数212をリセットする（例えば、ゼロ(0)に調整する）。従って、例示的なスレッド計数212は、キュー202にあった後、クリティカルセクションにおいて現在実行中のスレッド104の数を表す。後述されるように、図2の一例となるロック200は、キュー202内に存在するスレッドのより多くがクリティカルセクションにおいて実行することが可能とされるべきか判断するため、スレッド計数212と現在割当て量210とを比較する。
【００２４】
図2の例示的なロック200によって実施される割当て量に対して行われる動的調整の一例として、初期割当て量208は、キュー202のノード216がクリティカルセクションにおいて実行するため利用可能になった時点で第1の値に設定される。ロック200がキュー処理されたスレッド104がクリティカルセクションに入ることが可能になると、スレッド計数212はおそらくゼロである。図示された例では、ヘッドノード216aのスレッドは、ヘッドノード216aがスレッド104の対応するもののトランザクションの実行をリトライするためクリティカルセクションに入ることが可能であるかに対する付与された制御である。また、ヘッドノード216aのスレッドは、スレッド計数212が初期割当て量208と同じ値に初期的に設定される現在の割当て量210未満であるか判定する。スレッド計数212が現在の割当て量210未満であり、ヘッドノード216aもキュー202の最後のノード216nでない場合、ヘッドノード216aのスレッドがデキューされ、対応するスレッド104の1つがクリティカルセクションにおいて実行をリトライし、スレッド計数212が、例えば、調整器205によって増加される（例えば、インクリメントされる）。さらに、ヘッドノード216aがデキューされると、以前の第2のノード216bがヘッドノード216aになる。
【００２５】
スレッド計数212が現在の割当て量210未満であり、ヘッドノード216aもまたキュー202の最後のノード216nである場合、ヘッドノード216aはキュー202に残り、対応するスレッド104の1つが投機的実行に進む。
【００２６】
スレッド計数212が現在の割当て量210に達した場合、ヘッドノード216aはキュー202の先頭に留まり、スレッド104の対応する1つはクリティカルセクションにおいて実行をリトライし、調整器205は、スレッド計数212を増加する（例えば、インクリメントする）。図2の図示される具体例では、ヘッドノード216aは、現在の割当て量210に達しているため、キュー202のノード216のクリティカルセクションへのさらなる進捗を停止するためのコルクとして、そのような例においてキュー202の先頭に留まる。すなわち、スレッド計数212が現在の割当て量210に達したとき、ヘッドノード216aは、クリティカルセクションにおいて実行をリトライしている間は、自身をデキューしない。また、現在の割当て量212に達すると、特定の数のスレッド104がデキューされ、キュー202の先頭にあるスレッドと共にクリティカルセクションにおいて実行をリトライしている。クリティカルセクションにおいて実行されるキュー200の先頭にあるスレッドと共に、クリティカルセクションを実行するデキューされたスレッドの数は、クリティカルセクションにおいて実行をリトライすることが可能とされるスレッドの数に対応する。
【００２７】
キュー202に入った後に実行をリトライするスレッド104が成功したか、あるいは、別のコンフリクトを受ける。図2の具体例では、ヘッドノード216aのスレッドの成功又は失敗は、初期割当て量208及び/又は現在割当て量210が調整されているか判定する。図2の具体例では、クリティカルセクションにおける何れかのスレッドがコンフリクトを受けた場合、ヘッドノード216aのスレッドを含むクリティカルセクションにおける全てのスレッドが、コンフリクト検出器110によって中止される。キュー202上にないクリティカルセクションにおけるスレッドは自らを再キューする。コンフリクトを見たスレッド104が、コンフリクト時にヘッドノード216aに対応する場合、キューコントローラ204は、ヘッドノード216aのスレッドをキューのエンドに再キューしてもよい（例えば、公平性のため）。あるいは、キューコントローラ204は、即時のリトライ投機的実行のため、ヘッドノード216aのスレッドをデキューしてもよい。さらに、コンフリクトを見たスレッド104が、コンフリクト時にヘッドノード216aに対応する場合、調整器205は、現在の割当て量210を減少し（例えば、デクリメントし）、スレッド計数212をゼロ（0）に設定する。現在の割当て量210の減少は、以降の繰り返しにおいてクリティカルセクションにおいて実行をリトライすることが可能とされるスレッド104の数を減少させ、従って、成功の可能性を増加させる（例えば、コンフリクトなしの完全な実行）。従って、キュー202に入った後にスレッドがリトライされることによって受けるコンフリクトは、より少ない現在の割当て量210をもたらす。従って、現在の割当て量210と初期割当て量208との間の差は、キュー200のヘッド216aが実行成功する前のリトライ試行の計数として役立つ。
【００２８】
図示された具体例では、コンフリクトが発生した場合、あるいは、実行が成功した場合（例えば、スレッド計数212がゼロ（0）に再設定されたことによって示される）、ロック200は、初期割当て量208の現在値と現在割当て量210の現在値との間の関係を決定する。初期割当て量208が現在割当て量210と同じであり、それによって、現在の割当て量210が減少しなかったためにコンフリクトが発生しなかったことを示す場合、調整器205は、初期割当て量208を増加する（例えば、インクリメントする）。すなわち、第1の値に設定された初期割当て量208によってコンフリクトが発生しなかったため、AQLマネージャ112は、クリティカルセクションにおいて（例えば、投機的に）実行することが許可されたスレッド104の数に対してアグレッシブ性を増加させる。リトライの次の繰り返しの開始時、現在割当て量210は初期割当て量208に等しく設定され、従って、キュー202からの実行をリトライすることが可能とされたスレッド104の数は以前の実行より大きい。
【００２９】
逆に、ロック200が初期割当て量208の現在値と現在割当て量210の現在値との間の関係を決定したとき、現在の割当て量210は初期割当て量208未満である可能性があり、それにより、コンフリクトが発生したことを示す。図2の具体例では、現在割当て量210が初期割当て量208よりも閾値量（例えば、1）以上小さい場合、調整器205は、初期割当て量208を減少させる（例えば、デクリメントする）。現在割当て量210が各繰り返しの始めに初期割当て量208に等しく設定されているため、初期割当て量208の減少は、現在割当て量210を減少させ、従って、クリティカルセクションにおいて実行することが可能とされるスレッド104の数が減少する。
【００３０】
従って、図2の例示的なロック200及び対応する変数は、クリティカルセクションにおいて実行をリトライすることが可能とされるスレッド104の数及び当該数の動的調整に対する精細な制御を可能にする。いくつかの例では、リトライ試行回数が閾値を超えたとき、あるいは、初期割当て量208が特定の値（例えば、2）に達した場合、ロック200は、排他的フラグ206を真に設定し、ヘッドノード216aにおけるスレッド104にクリティカルセクションの排他的オーナシップを所持させる。このような例では、クリティカルセクションに対する排他的制御によって、スレッド104はもはや投機的には実行されず、成功するはずである。いくつかの例では、クリティカルセクションにおける投機的実行は、クリティカルセクションへの排他的アクセスを介しヘッドノード216aにおけるスレッド104の実行成功に続いて再開する。
【００３１】
図2の上記説明は、一例となる調整器205によって実行される初期割当て量208、現在割当て量210及びスレッド計数212に対する調整を含むが、いくつかの具体例では、キュー202の先頭のスレッドは、初期割当て量208、現在割当て量210及び/又はスレッド計数212に対する調整を実行する。例えば、キュー202の先頭のスレッドは、適切な変更を実行するため調整器205に命令を提供してもよく、及び/又はキュー202の先頭のスレッドは、ロック200に関連する変数の1つ以上に対する調整を直接実行してもよい。
【００３２】
図1のAQLマネージャ112を実現する例示的な方式が図2に示されているが、図2に示される要素、処理及び/又はデバイスの1つ以上は、他の何れかの方法において組み合わせ、分割、再配置、省略、除去及び/又は実現されてもよい。さらに、例示的なロック200、例示的なキュー202、例示的なキューコントローラ204、例示的な調整器205及び/又はより一般的には図2の例示的なAQLマネージャ112は、ハードウェア、ソフトウェア、ファームウェア及び/又はハードウェア、ソフトウェア及び/又はファームウェアの何れかの組み合わせによって実現されてもよい。従って、例えば、例示的なロック200、例示的なキュー202、例示的なキューコントローラ204、例示的な調整器205及び/又はより一般的には図2の例示的なAQLマネージャ112の何れかは、1つ以上のアナログ若しくはデジカル回路、論理回路、プログラマブルプロセッサ、特定用途向け集積回路（ASIC）、プログラマブルロジックデバイス（PLD）及び/又はフィールドプログラマブルロジックデバイス（FPLD）によって実現可能である。純粋にソフトウェア及び/又はファームウェア実装をカバーするよう本特許の装置又はシステムクレームの何れかを読むとき、例示的なロック200、例示的なキュー202、例示的なキューコントローラ204、例示的な調整器205及び/又はより一般的には図2の例示的なAQLマネージャ112の少なくとも1つは、ソフトウェア及び/又はファームウェアを記憶するメモリ、デジタル多用途ディスク（DVD）、コンパクトディスク（CD）、ブルーレイディスクなどの有形のコンピュータ可読記憶デバイス又はストレージディスクを含むよう明示的に定義される。さらに、図1の例示的なAQLマネージャ112は、図2に示されるものに加えて又は代わりに、1つ以上の要素、処理及び/又はデバイスを含んでもよく、及び/又は図示された要素、処理及びデバイスの何れか1つ以上又は全てを含んでもよい。
【００３３】
図3は、図2の例示的なAQLマネージャ112の例示的なロック200及び例示的なキュー202の状態の例を示す。図3の例は、ロック200の排他的フラグ206が偽に設定されていることに対応し、これにより、キュー202に存在するスレッド104が現在割当て量210に従ってクリティカルセクションにおいて実行をリトライすることを可能にする。図3の具体例は、クリティカルセクションにおいて実行中のスレッド104の第1のセット300を含む。図3のスレッド104の例示的な第1のセット300は、スレッド104のデキューされたものを含む。例えば、図3に示される状態の前の時点では、キューのヘッドノード216aは、スレッド104の第1のセット300を加えるようデキューされたものであってもよい。いくつかの例では、第1のセット300は更に、1つ以上の新たに到着するスレッド（例えば、正常に完了せず、中止されなかったスレッド）を含む。
【００３４】
図3の具体例では、キューのヘッドノード216aはクリティカルセクションにおいて実行をリトライしているが、キュー202には残っている。従って、図3の例は、スレッド計数212が現在割当て量212に到達していることに対応する。ヘッドノード216aは、（例えば、ノードがヘッドノード216aになったことに応答して）真に設定されたヘッドノード216aの“locked”というローカル変数によって示される。キュー202の残りのノード216b、216nは、キュー202の先頭に到達するのを待機し（例えば、現在の偽に設定されている各自のローカル変数に対するスピニング）。その時点において、それらのノード216b、216nはクリティカルセクションにおける実行をリトライしてもよい。上述されたように、現在の割当て量212に達したときにキュー202に残っているヘッドノード216aは、キュー202の他のノードがヘッドノード216aになり、従って、クリティカルセクションにおいて実行をリトライ可能になることを防ぐ。しかしながら、ヘッドノード216aがデキューされる（例えば、スレッド104の第1のセット300に参加する）場合、第2のノード216bがヘッドノード216aになり、スレッド計数210が現在割当て量212に達したか判定される。
【００３５】
図4〜6は、図1及び/又は2の例示的なAQLマネージャ112を実現するための例示的なマシーン可読命令を表すフローチャートである。図4〜6の例では、マシーン可読命令は、図7に関連して以下に説明される例示的なプロセッサプラットフォーム700に示されるプロセッサ712などのプロセッサによる実行のための1つ以上のプログラムを含む。プログラムは、CD-ROM、フロッピー（登録商標）ディスク、ハードドライブ、デジタル多用途ディスク（DVD）、ブルーレイディスク又はプロセッサ712に関連するメモリなどの有形のコンピュータ可読記憶媒体に格納されたソフトウェアにおいて具現化されてもよいが、プログラム全体及び/又はその一部は、プロセッサ1012以外のデバイスによって代替的に実行され、及び/又はファームウェア又は専用ハードウェアにおいて具体化されてもよい。さらに、例示的なプログラムが、図4〜6に示されるフローチャートを参照して説明されるが、図1及び/又は2の例示的なAQLマネージャ112を実現する他の多くの方法が代替的に利用されてもよい。例えば、ブロックの実行順序が変更されてもよく、及び/又は説明されたブロックのいくつかが、変更、削除又は組み合わせされてもよい。
【００３６】
上述されるように、図4〜6の一例となる処理は、ハードディスクドライブ、フラッシュメモリ、読み出し専用メモリ（ROM）、コンパクトディスク（CD）、デジタル多用途ディスク（DVD）、キャッシュ、ランダムアクセスメモリ（RAM）及び/又は情報が何れかの持続時間の間に記憶される他の何れかのストレージデバイス又はストレージディスク（例えば、延長された時間期間、永続的、簡単な例のため、一時的なバッファリングのため、及び/又は情報のキャッシュのため）などの非一時的なコンピュータ及び/又はマシーン可読媒体に記憶される符号化された命令（例えば、コンピュータ及び/又はマシーン可読命令）を用いて実現されてもよい。ここで用いられるような有形のコンピュータ可読記憶媒体という用語は、何れかのタイプのコンピュータ可読記憶デバイス及び/又は記憶ディスクを含み、伝播信号を排除し、伝送媒体を排除するよう明示的に定義される。ここで使用されるように、“少なくとも”という語句が請求項のプリアンブルにおいて遷移語として使用されるとき、“有する”いう用語がオープン・エンドであるのと同様にオープン・エンドである。
【００３７】
図4〜6の例示的なフローチャートは、図1及び/又は2の一例となるAQLマネージャ112の開始から始まる（ブロック400）。図示された具体例では、AQLマネージャ112の開始は、排他的フラグ206の値（例えば、偽）、初期割当て量208（例えば、デフォルト値又はユーザ入力に基づく値）、スレッド計数212（例えば、ゼロ）及びポインタ214（例えば、ヌル）を（例えば、ロック200を介し）設定することを含む。図示された例では、ロック200は、現在割当て量210を初期割当て量208に等しくなるよう設定する（ブロック402）。上述されたように、現在割当て量210は、クリティカルセクションにおいて同時に実行することが可能とされるスレッドの数を決定する。
【００３８】
図示された具体例では、ロック200は、排他的フラグ206の値をチェックする（ブロック404）。図4の例では、排他的フラグ206が真に設定されている場合（ブロック404）、ロック200は、キュー202の先頭にないスレッドがクリティカルセクションにおいて実行することを制限又は禁止する（ブロック406）。図示された例では、クリティカルセクションに入ることを試みるスレッドは、自身をキュー202に配置する（ブロック406）。図示された例では、スレッドは、スレッドが受信された順にノード216としてキュー202に配置される。また、キュー202のヘッドノード216aは、キュー202の最も古いメンバーである。図示された例では、ロック200は、クリティカルセクションへのアクセスを制限し続け、スレッドは、排他的フラグ206が偽に設定されるまでキュー202に追加され続ける（ブロック404）。図示された例では、排他的フラグ206が偽に設定されているとき（ブロック404）、ロック200は、キュー202にないスレッド104の実行と、スレッド202のヘッドノード216aによって表されるスレッドの実行とを許可する（ブロック408）。
【００３９】
図示された例では、ヘッドノード216aのスレッドは、ヘッドノード216aがキュー202における唯一のノードであるか判定する（ブロック410）。ヘッドノード216aがキュー202における唯一のノードでない場合、制御はブロック412に進む。ヘッドノード216aがキュー202における唯一のノードである場合、キューコントローラ204は、キューの先頭のヘッドノード216aを維持し、調整器205は、スレッド計数212を増加させる（例えば、インクリメントさせる）（ブロック414）。さらに、ヘッドノード216aに対応するスレッドは、クリティカルセクションにおいて投機的に実行することが可能とされる（ブロック414）。従って、キュー202の先頭に新たに検出されたノードに対応するスレッドが、ブロック414においてキュー202の先頭に維持されるとき、当該スレッドはクリティカルセクションにおいて実行をリトライする。制御は図5に進む。
【００４０】
ブロック410において、ヘッドノードがキュー202における唯一のノードでないとき、ヘッドノード216aのスレッドは、スレッド計数212が現在割当て量210未満であるか判定する（ブロック412）。図示された例では、スレッド計数212が現在割当て量210未満である場合（ブロック410）、ヘッドノード216aに対応するスレッドは自身をデキューし、調整器205は、スレッド計数212を増加させる（例えば、インクリメントする）（ブロック416）。さらに、ブロック408に関連して上述されたように、もはやキュー202に存在しないデキューされたスレッドは、クリティカルセクションにおいて投機的に実行することが可能とされる（ブロック416）。従って、ヘッドノード216aに対応するスレッドがデキューされるとき、対応するスレッドは、クリティカルセクションにおいて実行をリトライする。制御はブロック410に進む。
【００４１】
上述されたように、制御が図5の例に到着すると、1つ以上のスレッド104がクリティカルセクションにおいて投機的に実行される。例えば、もはやキュー202に存在しない1つ以上のスレッドは、クリティカルセクションにおいて投機的に実行されてもよく、ヘッドノード216aに対応するスレッドは、クリティカルセクションにおいて投機的に実行されてもよい。図示された例では、キュー202に現在存在しないクリティカルセクションにおいて実行中のスレッドにコンフリクトが生じた場合（ブロック500）、新たなノードが、コンフリクトを受けたスレッドに対応するキュー202の最後のノード216nとしてキュー202に追加される（ブロック502）。図示された例では、クリティカルセクションにおいて実行をリトライしているヘッドノード216aのスレッドにコンフリクトが生じた場合（ブロック504）、調整器205は、現在割当て量210を減少させ、スレッド計数212をゼロ（0）にリセットする（ブロック506）。さらに、図示された例では、キューコントローラ204は、ヘッドノード216aからスレッドをデキューし、当該スレッドのキュー202の最後のノード216nとして対応する新しいノードを作成する（ブロック508）。すなわち、ヘッドノード216aのスレッドは、自身をキュー202のエンドに移動させる。あるいは、ヘッドノード216aのスレッドは、直ちにデキューされ、投機的実行を開始することができる。特に、現在割当て量210に対する減少は、クリティカルセクションにおいて同時に実行することが可能とされるスレッドの数を減らすのに望ましいコンフリクトの発生及び調整を反映する。
【００４２】
図示された例では、キュー202にないスレッドにコンフリクトが発生せず（ブロック500）、キュー202のヘッドノード216aのスレッドにコンフリクトが発生しない場合（ブロック504）、制御はブロック510に進む。図5の図示された例では、ヘッドノード216aのスレッドが実行成功した場合（例えば、中断されたトランザクションを受けることによって完全にコミットされた）（ブロック510）、制御は図6に進む。そうでない場合、制御は図4のブロック404に進む。
【００４３】
図6の図示された例では、調整器205は、スレッド計数212をゼロ（0）にリセットする（ブロック600）。図示された例では、ヘッドノード216aのスレッドは、例えば、ヘッドノード216aのスレッドが実行成功する前に発生したコンフリクトによって、現在割当て量210が減少したか判定する。図示された例では、現在割当て量210が初期割当て量208と同じである場合（例えば、図4のブロック402において初期割当て量208に等しくなるよう設定されてから、現在割当て量210は減少されていない）（ブロック602）、調整器205は、初期割当て量208を増加させる（例えば、インクリメントする）（ブロック604）。初期割当て量208の増加は、より多くのスレッドがクリティカルセクションにおいて同時に投機的に実行することを可能にすることによって、AQLマネージャ112のアグレッシブ性を増加させる。図示された例では、現在割当て量210が初期割当て量208と同じでない場合（ブロック602）、ヘッドノード216aのスレッドは、現在割当て量210が初期割当て量208より閾値量（例えば、1又は2）だけ小さいか判定する（ブロック606）。図示された例では、現在割当て量210が閾値量だけ初期割当て量208より小さい場合（ブロック606）、調整器205は、初期割当て量を減少させる（例えば、デクリメントさせる）（ブロック608）。初期割当て量208の減少は、より少ないスレッドがクリティカルセクションにおいて同時に投機的に実行することを可能にすることによって、AQLマネージャ112のアグレッシブ性を減少させ、それによって、スレッドがコンフリクトを起こさずに実行成功する可能性を高める。図示された例では、制御は図4のブロック402に戻る。図6の図示された例では、現在割当て量210が閾値量だけ初期割当て量208より小さくない場合（ブロック606）、制御は図4のブロック402に進む。
【００４４】
図4〜6の一例となるフローチャートは、初期割当て量208、現在割当て量210及びスレッド計数212に対する調整を実行する調整器205を含むが、これらの調整及び/又は図4〜6の他の何れか適切な処理が、キュー202の先頭のスレッドによって実行されてもよい。例えば、キュー202の先頭のスレッドは、適切な変更を行うための命令を調整器205に提供してもよく、及び/又はキュー202の先頭のスレッドは、ロック200に関連する変数の1つ以上に対して調整を直接実行してもよい。
【００４５】
図7は、図1及び/又は2の一例となるAQLマネージャ112を実現するため図4〜6の命令を実行可能な一例となるプロセッサプラットフォーム700のブロック図である。プロセッサプラットフォーム700は、例えば、サーバ、パーソナルコンピュータ、モバイルデバイス（例えば、携帯電話、スマートフォン、タブレット、ウェアラブルなど）、パーソナルデジタルアシスタント（PDA）、インターネット機器、メディアプレーヤ（例えば、DVDプレーヤ、CDプレーヤ、デジタルビデオレコーダ、ブルーレイプレーヤなど）、ゲームコンソール又は他の何れかのタイプの計算デバイスとすることが可能である。
【００４６】
図示された例のプロセッサプラットフォーム700は、プロセッサ712を含む。図示された例のプロセッサ712は、ハードウェアである。例えば、プロセッサ712は、何れか所望のファミリ又は製造業者からの1つ以上の集積回路、論理回路、マイクロプロセッサ又はコントローラによって実現可能である。いくつかの例では、プロセッサ712は、図1の例示的なコンフリクト検出器110、図1及び/又は2の例示的なAQLマネージャ112、図1及び/又は2の例示的なロック200、図2の例示的なキューコントローラ204及び図2の例示的な調整器205を実現する。
【００４７】
図示された例のプロセッサ712は、ローカルメモリ713（例えば、キャッシュ）を含む。図示された例のプロセッサ712は、バス718を介し揮発性メモリ714及び不揮発性メモリ716を含むメインメモリと通信する。揮発性メモリ714は、シンクロナスダイナミックランダムアクセスメモリ（SDRAM）、ダイナミックランダムアクセスメモリ（DRAM）、RAMBUSダイナミックランダムアクセスメモリ（RDRAM）及び/又は他の何れかのタイプのランダムアクセスメモリデバイスによって実現されてもよい。不揮発性メモリ716は、フラッシュメモリ及び/又は他の何れか所望のタイプのメモリデバイスによって実現されてもよい。メインメモリ714,716へのアクセスは、メモリコントローラによって制御される。
【００４８】
図示された例のプロセッサプラットフォーム700はまた、インタフェース回路720を含む。インタフェース回路720は、イーサネット（登録商標）インタフェース、ユニバーサルシリアルバス（USB）及び/又はPCIエクスプレスインタフェースなどの何れかのタイプのインタフェース規格によって実現されてもよい。
【００４９】
図示された例では、1つ以上の入力デバイス722が、インタフェース回路720に接続される。入力デバイス722は、ユーザがデータ及びコマンドをプロセッサ712に入力することを可能にする。入力デバイス722は、例えば、オーディオセンサ、マイクロホン、カメラ（スチル又はビデオ）、キーボード、ボタン、マウス、タッチスクリーン、トラックパッド、トラックボール、アイソポイント及び/又は音声認識システムなどによって実現可能である。
【００５０】
1つ以上の出力デバイス724はまた、図示された例のインタフェース回路720に接続される。出力デバイス724は、例えば、ディスプレイデバイス（例えば、発光ダイオード（LED）、有機発光ダイオード（OLED）、液晶ディスプレイ、陰極線管ディスプレイ（CRT）、タッチスクリーン、触覚出力デバイス、プリンタ及び/又はスピーカ）によって実現可能である。従って、図示された例のインタフェース回路720は、典型的には、グラフィックスドライバカード、グラフィックドライバチップ又はグラフィックスドライバプロセッサを含む。
【００５１】
図示された例のインタフェース回路720はまた、ネットワーク726（例えば、イーサネット（登録商標）接続、デジタル加入者回線（DSL）、電話回線、同軸ケーブル、携帯電話システムなど）を介し外部装置とのデータ交換を容易にするための送信機、受信機、送受信機、モデム及び/又はネットワークインタフェースカードなどの通信デバイスを含む。
【００５２】
図示された例のプロセッサプラットフォーム700はまた、ソフトウェア及び/又はデータを格納するための1つ以上の大容量記憶デバイス728を含む。そのような大容量記憶デバイス728の具体例は、フロッピー（登録商標）ディスクドライブ、ハードディスクドライブ、コンパクトディスクドライブ、ブルーレイディスクドライブ、RAIDシステム及びデジタル多用途ディスク（DVD）ドライブを含む。
【００５３】
図4〜6の符号化された命令732は、大容量記憶デバイス728、揮発性メモリ714、不揮発性メモリ716及び/又はCD又はDVDなどの着脱可能な有形のコンピュータ可読記憶媒体に格納されてもよい。
【００５４】
一例となる開示された装置は、キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための第1の割当て量を実施し、第1の割当て量に到達しなかったことに応答して、キューからの第1のスレッドが投機的に実行することを可能にするロックと、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更する調整器とを有し、ロック又は調整器の少なくとも1つは論理回路を介し実現される。
【００５５】
開示される具体例では、調整器は、結果が第1のスレッドの中止であるとき、第1の割当て量を減少させることによって、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更する。
【００５６】
開示される具体例では、調整器は、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更する。
【００５７】
開示される具体例では、調整器は、結果が実行成功であって、第1の値が第2の値に等しいとき、第2の値を増加し、結果が実行成功であって、第1の値が閾値量だけ第2の値より小さいとき、第2の値を減少することによって、第1のスレッドの投機的実行の結果に基づき前記第2の割当て量の第2の値を変更する。
【００５８】
開示される具体例では、装置は、第1の割当て量に到達しなかったことに応答して、キューからの第1のスレッドが投機的に実行することを可能にすることに関連して第1のスレッドをデキューするコントローラを有する。
【００５９】
開示される具体例では、コントローラは、第1の割当て量に到達したことに応答して、キューの先頭に第1のスレッドを維持する。
【００６０】
開示される具体例では、ロックは、第1の割当て量に到達したことに応答して、第1のスレッドがキューの先頭に維持されることによって、第1のスレッドが投機的に実行することを可能にする。
【００６１】
一例となる開示される方法は、プロセッサが、キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための第1の割当て量を実施するステップと、第1の割当て量に到達しなかったことに応答して、プロセッサが、キューからの第1のスレッドが投機的に実行することを可能にするステップと、プロセッサが、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更するステップとを有する。
【００６２】
開示される具体例では、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更するステップは、結果が第1のスレッドの中止であるとき、第1の割当て量を減少させるステップを含む。
【００６３】
開示される具体例では、方法は、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更するステップを更に有する。
【００６４】
開示される具体例では、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更するステップは、結果が実行成功であって、第1の値が第2の値に等しいとき、第2の値を増加するステップと、結果が実行成功であって、第1の値が閾値量だけ第2の値より小さいとき、第2の値を減少するステップとを含む。
【００６５】
開示される具体例では、方法は、第1の割当て量に到達しなかったことに応答して、キューからの第1のスレッドが投機的に実行することを可能にすることに関連してキューから第1のスレッドを削除するステップを更に有する。
【００６６】
開示される具体例では、方法は、第1の割当て量に到達したことに応答して、キューの先頭に前記第1のスレッドを維持するステップを更に有する。
【００６７】
開示される具体例では、方法は、第1の割当て量に到達したことに応答して、第1のスレッドがキューの先頭に維持されることによって、第1のスレッドが投機的に実行することを可能にするステップを更に有する。
【００６８】
開示される具体例は、実行時、キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための第1の割当て量を実施するステップと、第1の割当て量に到達しなかったことに応答して、キューからの第1のスレッドが投機的に実行することを可能にするステップと、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更するステップとを少なくともマシーンに実行させる命令を有する少なくとも1つの有形なコンピュータ可読記憶媒体を含む。
【００６９】
開示される具体例では、実行時、命令は、結果が第1のスレッドの中止であるとき、第1の割当て量を減少させることによって、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更するステップをマシーンに実行させる。
【００７０】
開示される具体例では、実行時、命令は、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更するステップをマシーンに実行させる。
【００７１】
開示される具体例では、実行時、命令は、結果が実行成功であって、第1の値が第2の値に等しいとき、第2の値を増加し、結果が実行成功であって、第1の値が閾値量だけ第2の値より小さいとき、第2の値を減少することによって、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更するステップをマシーンに実行させる。
【００７２】
開示される具体例では、実行時、命令は、第1の割当て量に到達しなかったことに応答して、キューからの第1のスレッドが投機的に実行することを可能にすることに関連してキューから第1のスレッドを削除するステップをマシーンに実行させる。
【００７３】
開示される具体例では、実行時、命令は、第1の割当て量に到達したことに応答して、前記キューの先頭に前記第1のスレッドを維持するステップをマシーンに実行させる。
【００７４】
開示される具体例では、実行時、命令は、第1の割当て量に到達したことに応答して、第1のスレッドがキューの先頭に維持されることによって、第1のスレッドが投機的に実行することを可能にするステップをマシーンに実行させる。
【００７５】
一例となる開示される適応的キュー化ロック処理（AQL）マネージャは、キューに配置された後に同時に投機的に実行することが可能とされるスレッドの数を制御するための第1の割当て量を実施する手段と、第1の割当て量に到達しなかったことに応答して、キューからの第1のスレッドが投機的に実行することを可能にする手段と、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更する手段とを有する。
【００７６】
開示される具体例では、第1のスレッドの投機的実行の結果に基づき第1の割当て量の第1の値を変更する手段は、結果が第1のスレッドの中止であるとき、第1の割当て量を減少させる。
【００７７】
開示される具体例では、第1の値を変更する手段は、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更する。
【００７８】
開示される具体例では、第1の値を変更する手段は、結果が実行成功であって、第1の値が第2の値に等しいとき、第2の値を増加し、結果が実行成功であって、第1の値が閾値量だけ第2の値より小さいとき、第2の値を減少することによって、第1のスレッドの投機的実行の結果に基づき第2の割当て量の第2の値を変更する。
【００７９】
開示される具体例では、適応的キュー化ロック処理マネージャは、キューからの第1のスレッドが投機的に実行することを可能にすることに関連してキューから第1のスレッドを削除する手段を更に有し、キューからの第1のスレッドの削除は、第1の割当て量に到達しなかったことに応答する。
【００８０】
開示される具体例では、キューから第1のスレッドを削除する手段は、第1の割当て量に到達したことに応答して、キューの先頭に第1のスレッドを維持する。
【００８１】
開示される具体例では、キューからの第1のスレッドが投機的に実行することを可能にする手段は、第1の割当て量に到達したことに応答して、第1のスレッドがキューの先頭に維持されることによって、第1のスレッドが投機的に実行することを可能にする。
【００８２】
特定の例示的な方法、装置及び製造物がここに開示されたが、本特許のカバレッジ範囲はそれに限定されない。逆に、本特許は本特許の請求項の範囲内に属する全ての方法、装置及び製造物をカバーする。
【図１】
0006789976.tif 000002
【図２】
0006789976.tif 000003
【図３】
0006789976.tif 000004
【図４】
0006789976.tif 000005
【図５】
0006789976.tif 000006
【図６】
0006789976.tif 000007
【図７】
0006789976.tif 000008