(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】
(43)【公表日】2022-04-18
(54)【発明の名称】リングバッファ更新の処理
(51)【国際特許分類】
G06F 9/52 20060101AFI20220411BHJP
G06F 9/54 20060101ALI20220411BHJP
【FI】
G06F9/52 150C
G06F9/54 B
【審査請求】未請求
【予備審査請求】未請求
(21)【出願番号】P 2021551586
(86)(22)【出願日】2020-02-25
(85)【翻訳文提出日】2021-10-14
(86)【国際出願番号】 GB2020050438
(87)【国際公開番号】W WO2020178554
(87)【国際公開日】2020-09-10
(32)【優先日】2019-03-01
(33)【優先権主張国・地域又は機関】GB
(81)【指定国・地域】
(71)【出願人】
【識別番号】500395107
【氏名又は名称】アーム・リミテッド
(74)【代理人】
【識別番号】110000855
【氏名又は名称】特許業務法人浅村特許事務所
(72)【発明者】
【氏名】リシュダール、エリック オラ ハラルド
(57)【要約】
【解決手段】 データ項目の待ち行列シーケンスを保持する複数のスロットを含むリングバッファを記憶するリングバッファ記憶回路が開示される。データ処理回路が、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行する。各プロセスは、リングバッファ内の少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている。リングバッファメタデータ記憶回路が、第1の参照インジケータ及び第2の参照インジケータを含む、リングバッファのメタデータを記憶する。第1の参照インジケータは、現在スロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含む。第2の参照インジケータは、現在スロットの期待される位置を示す期待スロットインジケータを含み、1つ以上の保留スロットは現在スロットの後に取得されたものである。解放プロセスは、リングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロットインジケータが現在スロットインジケータと比較されるアトミック操作を含む。現在スロットインジケータが期待スロットインジケータと一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新される。現在スロットインジケータが期待スロットインジケータと一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。対応する方法及び命令もまた、開示される。
【選択図】
図4a
【特許請求の範囲】
【請求項1】
装置であって、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち前記行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、前記少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理回路と、
前記リングバッファのメタデータを格納するリングバッファメタデータ記憶回路とを備え、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、前記リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、前記第2の参照インジケータは、前記現在スロットの期待される位置を示す期待スロットインジケータを含み、前記1つ以上の保留スロットは前記現在スロットの後に取得されたものであり、期待スロット値は、前記プロセスが前記リングバッファの少なくとも1つのスロットを取得するために前記取得プロセスを実行するときの前記期待スロットインジケータの値であり、
前記解放プロセスは、前記リングバッファの前記第1の参照インジケータを更新しようとするステップを含み、前記ステップは、前記プロセスのための前記期待スロット値が前記現在スロットインジケータと比較されるアトミック操作を含み、
前記現在スロットインジケータが前記期待スロット値と一致するときは、前記現在スロットインジケータの値を所定の値によって修正することによって、少なくとも前記現在スロットインジケータが更新され、
前記現在スロットインジケータが前記期待スロット値と一致しないときは、前記現在スロットインジケータを更新せずに、前記リングバッファの前記1つ以上の保留スロットの存在及び位置を示すように前記保留スロットインジケータの値を修正することによって前記保留スロットインジケータが更新される、
装置。
【請求項2】
前記現在スロットインジケータが前記期待スロット値と一致せず、かつ、前記期待スロットインジケータが、前記待ち行列シーケンスの順序に関して前記現在スロットインジケータの示す前記現在スロットの後に位置するのではない前記現在スロットの期待位置を示している場合、前記第1の参照インジケータは更新されない、請求項1に記載の装置。
【請求項3】
前記現在スロットインジケータが前記期待スロット値と一致しないとき、前記リングバッファ内の前記1つ以上の保留スロットの存在及び前記現在スロットインジケータの示す前記現在スロットに対する位置を示すように前記保留スロットインジケータの値を変更することによって、前記保留スロットインジケータが更新される、請求項1に記載の装置。
【請求項4】
前記保留スロットインジケータは限界インジケータを含み、前記限界インジケータは、前記リングバッファの前記現在スロットから前記待ち行列シーケンスの順序に関して最も遠くに位置する最遠保留スロットの位置を示す、請求項1に記載の装置。
【請求項5】
前記保留スロットインジケータは変化インジケータを含み、前記変化インジケータの変化は、前記現在スロットと前記最遠保留スロットとの間の前記保留スロットの数の変化を示す、請求項4に記載の装置。
【請求項6】
前記保留スロットインジケータは、前記現在スロットインジケータが前記期待スロット値に一致しないときに、前記限界インジケータと前記変化インジケータのうち少なくとも1つを変更することによって更新される、請求項5に記載の装置。
【請求項7】
前記期待スロット値が、前記リングバッファ内で前記待ち行列シーケンスの順序に関して前記限界インジケータの示す前記最遠保留スロットよりも遠くに位置するスロットを示すときに、前記限界インジケータは更新される、請求項6に記載の装置。
【請求項8】
前記限界インジケータは、前記期待スロット値に基づいて、別の位置を前記最遠保留スロットに示すように更新される、請求項7に記載の装置。
【請求項9】
前記期待スロット値が、前記現在スロットと前記最遠保留スロットとの間に位置するスロットを示すとき、前記限界インジケータを更新せずに前記変化インジケータが更新される、請求項5に記載の装置。
【請求項10】
前記現在スロットインジケータが前記期待スロット値と一致し、かつ、前記保留スロットインジケータが前記リングバッファ内の前記1つ以上の保留スロットの存在を示すとき、前記現在スロットインジケータは、前記現在スロットに隣接する連続した保留スロットの数に従って現在スロットインジケータの値を修正することによって更新される、請求項1~9のいずれか一項に記載の装置。
【請求項11】
前記現在スロットインジケータの値は、前記1つ以上の連続する保留スロットの最遠保留スロットを示すように修正され、前記最遠保留スロットは、前記1つ以上の連続する保留スロットのうち前記リングバッファ内で前記現在のスロットから最も遠くにある保留スロットである、請求項10に記載の装置。
【請求項12】
前記現在スロットインジケータは、前記データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかにおける前記現在スロットの位置を示し、前記期待スロットインジケータは、前記データ項目の待ち行列シーケンスの同じ端部における前記現在スロットの期待位置を示す、請求項1に記載の装置。
【請求項13】
前記第1の参照インジケータは、前記待ち行列シーケンスからデータ項目を取り出すプロセスのための、前記データ項目の待ち行列シーケンスの末尾端部に対する末尾端部インジケータであり、前記第2の参照インジケータは、前記待ち行列シーケンスにデータ項目を追加するプロセスのための、前記データ項目の待ち行列シーケンスの末尾端部に対する末尾端部インジケータである、請求項1に記載の装置。
【請求項14】
前記待ち行列シーケンスにデータ項目を追加する前記プロセスは、少なくとも前記リングバッファ内の次の占有されていないスロットを取得するために前記取得プロセスを実行するように構成されており、前記取得プロセスは、アトミック操作に従って前記第2の参照インジケータを更新しようとするステップを含む、請求項13に記載の装置。
【請求項15】
前記第1の参照インジケータは、前記待ち行列シーケンスにデータ項目を追加するプロセスのための、前記データ項目の待ち行列シーケンスの先頭端部に対する先頭端部インジケータであり、前記第2の参照インジケータは、前記待ち行列シーケンスからデータ項目を取り出すプロセスのための、前記データ項目の待ち行列シーケンスの先頭端部に対する先頭端部インジケータである、請求項1に記載の装置。
【請求項16】
前記待ち行列シーケンスからデータ項目を取り出す前記プロセスは、少なくとも前記リングバッファ内の次の占有されているスロットを取得するために前記取得プロセスを実行するように構成されており、前記取得プロセスは、アトミック操作に従って前記第2の参照インジケータを更新しようとするステップを含む、請求項15に記載の装置。
【請求項17】
前記プロセスが、前記リングバッファの少なくとも1つのスロットを取得するために前記取得プロセスを実行するとき、前記第2の参照インジケータは、前記複数プロセスのうち1つによって取得されたスロットの数に従って前記期待スロットインジケータの値を修正することによって更新される、請求項1~16のいずれか一項に記載の装置。
【請求項18】
前記データ処理回路は、並列して前記待ち行列にデータ項目を追加する複数の前記プロセスを実行するように構成されており、前記各プロセスは、前記アトミック操作に従って同時に前記第1の参照インジケータを更新しようとする、請求項13に記載の装置。
【請求項19】
前記データ処理回路は、並列して前記待ち行列からデータ項目を取り出す複数の前記プロセスを実行するように構成されており、前記各プロセスは、前記アトミック操作に従って同時に前記第1の参照インジケータを更新しようとする、請求項15に記載の装置。
【請求項20】
データ処理装置を動作させる方法であって、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファのために記憶領域を割り当てるステップと、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するステップであって、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、前記少なくとも1つのスロットを解放する解放プロセスを実行する、ステップと、
前記リングバッファのメタデータのために記憶領域を割り当てるステップとを含み、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、前記リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、前記第2の参照インジケータは、前記現在スロットの期待される位置を示す期待スロットインジケータを含み、前記1つ以上の保留スロットは前記現在スロットの後に取得されたものであり、前記期待スロット値は、前記プロセスが前記リングバッファの少なくとも1つのスロットを取得するために前記取得プロセスを実行するときの期待スロットインジケータの値であり、
前記解放プロセスは、前記リングバッファの前記第1の参照インジケータを更新しようとするステップを含み、前記ステップは、前記プロセスのための前記期待スロット値が前記現在スロットインジケータと比較されるアトミック操作を含み、
前記現在スロットインジケータが前記期待スロット値と一致するときは、前記現在スロットインジケータの値を所定の値によって修正することによって、少なくとも前記現在スロットインジケータが更新され、
前記現在スロットインジケータが前記期待スロット値と一致しないときは、前記現在スロットインジケータを更新せずに、前記リングバッファの前記1つ以上の保留スロットの存在及び位置を示すように前記保留スロットインジケータの値を修正することによって前記保留スロットインジケータが更新される、
方法。
【請求項21】
装置であって、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、
命令を復号する命令デコーダ回路と、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、前記少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理回路と、
前記リングバッファのメタデータを格納するリングバッファメタデータ記憶回路とを備え、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、前記リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、前記第2の参照インジケータは、前記現在スロットの期待される位置を示す期待スロットインジケータを含み、前記1つ以上の保留スロットは前記現在スロットの後に取得されたものであり、期待スロット値は、前記プロセスが前記リングバッファの少なくとも1つのスロットを取得するために前記取得プロセスを実行するときの前記期待スロットインジケータの値であり、
前記命令デコーダ回路は、前記リングバッファ解放命令が前記命令データ処理回路に実行されることに応答して、前記解放プロセスを実行するように前記データ処理回路を制御し、前記解放プロセスは、
前記リングバッファの前記第1の参照インジケータを更新しようとするステップを含み、前記ステップは、前記プロセスのための前記期待スロット値が前記現在スロットインジケータと比較されるアトミック操作を含み、
前記現在スロットインジケータが前記期待スロット値と一致するときは、前記現在スロットインジケータの値を所定の値によって修正することによって、少なくとも前記現在スロットインジケータが更新され、
前記現在スロットインジケータが前記期待スロット値と一致しないときは、前記現在スロットインジケータを更新せずに、前記リングバッファの前記1つ以上の保留スロットの存在及び位置を示すように前記保留スロットインジケータの値を修正することによって前記保留スロットインジケータが更新される、
装置。
【請求項22】
命令実行環境を提供するようにホストデータ処理装置を制御するコンピュータプログラムであって、
データ項目の待ち行列シーケンスを保持するために複数のスロットを含むリングバッファを記憶するリングバッファ記憶ロジックと、
命令を復号する命令デコーダロジックと、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理ロジックであって、各プロセスは、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、前記少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理ロジックと、
前記リングバッファのメタデータを格納するリングバッファメタデータ記憶ロジックとを備え、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、前記リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、前記第2の参照インジケータは、前記現在スロットの期待される位置を示す期待スロットインジケータを含み、前記1つ以上の保留スロットは、前記現在スロットの後に取得されたものであり、期待スロット値は、前記プロセスが前記リングバッファの少なくとも1つのスロットを取得するために前記取得プロセスを実行するときの前記期待スロットインジケータの値であり、
前記命令デコーダロジックは、前記リングバッファ解放命令が前記データ処理回路に実行されることに応答して、前記解放プロセスを実行するように前記データ処理回路を制御し、前記解放プロセスは、
前記リングバッファの前記第1の参照インジケータを更新しようとするステップを含み、前記ステップは、前記プロセスのための前記期待スロット値が前記現在スロットインジケータと比較されるアトミック操作を含み、
前記現在スロットインジケータが前記期待スロット値と一致するときは、前記現在スロットインジケータの値を所定の値によって修正することによって、少なくとも前記現在スロットインジケータが更新され、
前記現在スロットインジケータが前記期待スロット値と一致しないときは、前記現在スロットインジケータを更新せずに、前記リングバッファの前記1つ以上の保留スロットの存在及び位置を示すように前記保留スロットインジケータの値を修正することによって前記保留スロットインジケータが更新される、
コンピュータプログラム。
【請求項23】
装置であって、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理回路と、
前記リングバッファのメタデータを記憶するリングバッファメタデータ記憶回路とを備え、前記メタデータは第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、前記データ項目の待ち行列シーケンスの片端にある現在スロットの位置を示す現在スロットインジケータを含み、前記第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、前記データ項目の待ち行列シーケンスの片端は、前記データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、
前記取得プロセスは、前記リングバッファの前記第2の参照インジケータを更新しようとする試みを含み、前記試みは、あるプロセスによる取得のために要求されるスロットの数が前記現在スロットインジケータ及び前記期待スロットインジケータと比較されるアトミック操作を含み、
前記リングバッファ内の1つ以上のスロットが取得に適格であることが前記現在スロットインジケータ及び前記期待スロットインジケータによって示されるときは、前記期待スロットインジケータの値を修正することによって前記期待スロットインジケータが更新される、
装置。
【請求項24】
前記第1の参照インジケータは、前記待ち行列シーケンスからデータ項目を取り出す前記プロセスのための、データ項目の前記待ち行列シーケンスの末尾端部に対する末尾端部インジケータであり、前記第2の参照インジケータは、前記待ち行列シーケンスからデータ項目を取り出す前記プロセスのための、データ項目の前記待ち行列シーケンスの先頭端部に対する先頭端部インジケータである、請求項23に記載の装置。
【請求項25】
前記待ち行列シーケンスからデータ項目を取り出す前記プロセスについては、前記取得に適格なスロットの数が前記リングバッファ内の占有されているスロットの数に対応し、前記リングバッファ内の占有されているスロットの数が、先頭端部の前記現在スロットの位置及び末尾端部の前記現在スロットの位置に基づいて決定される、請求項24に記載の方法。
【請求項26】
前記第1の参照インジケータは、前記待ち行列シーケンスにデータ項目を追加する前記プロセスのための、データ項目の前記待ち行列シーケンスの先頭端部に対する先頭端部インジケータであり、前記第2の参照インジケータは、前記待ち行列シーケンスにデータ項目を追加する前記プロセスのための、データ項目の前記待ち行列シーケンスの末尾端部に対する末尾端部インジケータである、請求項23に記載の装置。
【請求項27】
前記待ち行列シーケンスにデータ項目を追加するプロセスについては、前記取得に適格なスロットの数が前記リングバッファ内の占有されていないスロットの数に対応し、前記リングバッファ内の占有されていないスロットの数が、前記リングバッファのスロットの総数、先頭端部の前記現在スロットの位置、及び末尾端部の前記現在スロットの位置に基づいて決定される、請求項26に記載の方法。
【請求項28】
データ処理装置を動作させる方法であって、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファのために記憶領域を割り当てるステップと、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するステップであって、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行する、ステップと、
前記リングバッファのメタデータのために記憶領域を割り当てるステップとを含み、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、前記データ項目の待ち行列シーケンスの片端にある現在のスロットの位置を示す現在スロットインジケータを含み、前記第2の参照インジケータは、前記データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、前記データ項目の待ち行列シーケンスの片端は、前記データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、
前記取得プロセスは、前記リングバッファの前記第2の参照インジケータを更新しようとするステップを含み、前記ステップは、あるプロセスによる取得のために要求されるスロットの数が前記現在スロットインジケータ及び前記期待スロットインジケータと比較されるアトミック操作を含み、
前記リングバッファ内の1つ以上のスロットが取得に適格であることが前記現在スロットインジケータ及び前記期待スロットインジケータによって示されるときは、前記期待スロットインジケータの値を修正することによって前記期待スロットインジケータが更新される、
方法。
【請求項29】
装置であって、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、
命令を復号する命令デコーダ回路と、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理回路と、
前記リングバッファのメタデータを記憶するリングバッファメタデータ記憶回路とを備え、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、前記データ項目の待ち行列シーケンスの片端にある現在スロットの位置を示す現在スロットインジケータを含み、前記第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、前記データ項目の待ち行列シーケンスの片端は、前記データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、
前記命令デコーダ回路は、前記リングバッファ取得命令が前記命令データ処理回路に実行されることに応答して、前記取得プロセスを実行するように前記データ処理回路を制御し、前記取得プロセスは、
前記リングバッファの前記第2の参照インジケータを更新しようとするステップを含み、前記ステップは、あるプロセスによる取得のために要求されるスロットの数が前記現在スロットインジケータ及び前記期待スロットインジケータと比較されるアトミック操作を含み、
前記リングバッファ内の1つ以上のスロットが取得に適格であることが前記現在スロットインジケータ及び前記期待スロットインジケータによって示されるときは、前記期待スロットインジケータの値を修正することによって前記期待スロットインジケータが更新される、
装置。
【請求項30】
命令実行環境を提供するようにホストデータ処理装置を制御するコンピュータプログラムであって、
データ項目の待ち行列シーケンスを保持するために複数のスロットを含むリングバッファを記憶するリングバッファ記憶ロジックと、
命令を復号する命令デコーダロジックと、
1つ以上の処理すべきデータ項目を前記待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために前記待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理ロジックであって、各プロセスは、前記リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理ロジックと、
前記リングバッファのメタデータを記憶するリングバッファメタデータ記憶ロジックとを備え、前記メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、前記第1の参照インジケータは、データ項目の前記待ち行列シーケンスの片端にある現在スロットの位置を示す現在スロットインジケータを含み、前記第2の参照インジケータは、データ項目の前記待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、データ項目の前記待ち行列シーケンスの前記片端は、データ項目の前記待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、
前記命令デコーダロジックは、前記リングバッファ解放命令が前記データ処理回路に実行されることに応答して、前記取得プロセスを実行するように前記データ処理回路を制御し、前記取得プロセスは、
前記リングバッファの前記第2の参照インジケータを更新しようとするステップを含み、前記ステップは、あるプロセスによる取得のために要求されるスロットの数が前記現在スロットインジケータ及び前記期待スロットインジケータと比較されるアトミック操作を含み、
前記リングバッファ内の1つ以上のスロットが取得に適格であることが前記現在スロットインジケータ及び前記期待スロットインジケータによって示されるときは、前記期待スロットインジケータの値を修正することによって前記期待スロットインジケータが更新される、
コンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、データ処理に関する。より具体的には、本開示はデータ処理装置におけるリングバッファの管理に関する。
【発明の概要】
【発明が解決しようとする課題】
【0002】
様々なデータ処理の状況において、特定の順序で更に処理されるべきデータ項目が生成されることがあり、これを管理してもよい1つの機構が、生成されたこれらのデータ項目をリングバッファ内で待ち行列シーケンスに保持することになり、ここで、新しく生成されたデータ項目が待ち行列シーケンスの末尾端部に追加される一方で、更なる処理のためにデータ項目が待ち行列シーケンスの先頭端部から取り出される。この、リングバッファに保持されたデータ項目の待ち行列シーケンスは、更なる処理を必要とする生成されたデータ項目の集中型ストアを提供することができ、そこには、データ処理システム内で動作している複数の「生成者」が生成したデータ項目を追加することもあり、そこから、データ処理システム内の複数の「消費者」が更なる処理のためにデータ項目を取り出すこともある。ところが、複数の生成者及び消費者がリングバッファと相互作用を行うということは、リングバッファの内容に関する1つの生成者又は消費者のアクションによって、他の生成者又は消費者によるリングバッファとの独自の相互作用がブロックされることを意味し得る。ブロック方式の手法では、一度にリングバッファにアクセスできるのは1つの生成者又は消費者のみであり、よって、スループットにおいて著しいボトルネックとなり得る。更に、「ロックのない」リングバッファ設計においても、やはり、リングバッファ及びリングバッファに加えられるべき更新の正しい順序付けを維持するために、リングバッファ取得の順序で(すなわち、データ項目の待ち行列シーケンスの順序で)更新をリングバッファに解放しなければならないという制約に起因して、ある生成者又は消費者が他の生成者又は消費者の完了をブロックする可能性がある。先行する生成者又は消費者がストールした場合(例えば、キャッシュミスなどの別のシステム構成要素との相互作用、又は、オペレーティングシステムによって先取りされたなど)、後の生成者又は消費者は、先行する生成者又は消費者が完了するまで待機しなければならない。これにより、非決定性がもたらされ(1つのスレッド内の遅延及びストールが他のスレッドに伝播することがある)、また、スケーラビリティの問題が生じることもある(複数のスレッドが、完了するためにスレッド間で記号トークンを有効に受け渡し、これによって関与する全てのスレッドの直列化が生じるため)。逆に、単一のスレッドを専任にして並べ替えの結果を処理させると、単一スレッドのボトルネックをもたらす可能性が高い。
【0003】
一実施形態例には装置があり、その装置は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理回路と、リングバッファのメタデータを記憶するリングバッファメタデータ記憶回路とを備え、メタデータは第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、第2の参照インジケータは現在スロットの期待される位置を示す期待スロットインジケータを含み、1つ以上の保留スロットは現在スロットの後に取得されたものであり、期待スロット値は、プロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するときの期待スロットインジケータの値であり、解放プロセスは、リングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロット値が現在スロットインジケータと比較されるアトミック(不可分)操作を含み、現在スロットインジケータが期待スロット値と一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新され、現在スロットインジケータが期待スロット値と一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。
【0004】
別の実施形態例にはデータ処理装置を動作させる方法があり、その方法は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファのために記憶領域を割り当てるステップと、
1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するステップであって、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行する、ステップと、リングバッファのメタデータのために記憶領域を割り当てるステップとを含み、メタデータは第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、第2の参照インジケータは現在スロットの期待される位置を示す期待スロットインジケータを含み、1つ以上の保留スロットは現在スロットの後に取得されたものであり、期待スロット値は、プロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するときの期待スロットインジケータの値であり、解放プロセスはリングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロット値が現在スロットインジケータと比較されるアトミック操作を含み、現在スロットインジケータが期待スロット値と一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新され、現在スロットインジケータが期待スロット値と一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。
【0005】
別の実施形態例には装置があり、その装置は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、命令を復号する命令デコーダ回路と、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理回路と、リングバッファのメタデータを格納するリングバッファメタデータ記憶回路とを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、第2の参照インジケータは、現在スロットの期待される位置を示す期待スロットインジケータを含み、1つ以上の保留スロットは、現在スロットの後に取得されたものであり、期待スロット値は、プロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するときの期待スロットインジケータの値であり、命令デコーダ回路は、リングバッファ解放命令が命令データ処理回路に実行されることに応答して、解放プロセスを実行するようにデータ処理回路を制御し、解放プロセスは、リングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロット値が現在スロットインジケータと比較されるアトミック操作を含み、現在スロットインジケータが期待スロット値と一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新され、現在スロットインジケータが期待スロット値と一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。
【0006】
別の実施形態例には、ホストデータ処理装置を制御して命令実行環境を提供するためのコンピュータプログラムがあり、そのコンピュータプログラムは、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶ロジックと、命令を復号するための命令デコーダロジックと、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理ロジックであって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理ロジックと、リングバッファのメタデータを記憶するリングバッファメタデータ記憶ロジックとを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、第2の参照インジケータは、現在スロットの期待される位置を示す期待スロットインジケータを含み、1つ以上の保留スロットは、現在スロットの後に取得されたものであり、期待スロット値は、プロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するときの期待スロットインジケータの値であり、命令デコーダロジックは、リングバッファ解放命令がデータ処理回路に実行されることに応答して、解放プロセスを実行するようにデータ処理回路を制御し、解放プロセスは、リングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロット値が現在スロットインジケータと比較されるアトミック操作を含み、現在スロットインジケータが期待スロット値と一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新され、現在スロットインジケータが期待スロット値と一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。
【0007】
別の実施形態例には装置があり、その装置は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理回路と、リングバッファのメタデータを記憶するリングバッファメタデータ記憶ロジックとを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、データ項目の待ち行列シーケンスの片端にある現在のスロットの位置を示す現在スロットインジケータを含み、第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、データ項目の待ち行列シーケンスの片端は、データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、取得プロセスは、リングバッファの第2の参照インジケータを更新しようとするステップを含み、そのステップは、あるプロセスによる取得のために要求されるスロットの数が現在スロットインジケータ及び期待スロットインジケータと比較されるアトミック操作を含み、リングバッファの1つ以上のスロットが取得に適格であることが現在スロットインジケータ及び期待スロットインジケータによって示されるときは、期待スロットインジケータの値を修正することによって期待スロットインジケータが更新される。
【0008】
別の実施形態例にはデータ処理装置を動作させる方法があり、その方法は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファのために記憶領域を割り当てるステップと、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するステップであって、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行する、ステップと、リングバッファのメタデータのために記憶領域を割り当てるステップとを含み、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、データ項目の待ち行列シーケンスの片端にある現在のスロットの位置を示す現在スロットインジケータを含み、第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、データ項目の待ち行列シーケンスの片端は、データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、
取得プロセスは、リングバッファの第2の参照インジケータを更新しようとするステップを含み、そのステップは、あるプロセスによる取得のために要求されるスロットの数が現在スロットインジケータ及び期待スロットインジケータと比較されるアトミック操作を含み、リングバッファの1つ以上のスロットが取得に適格であることが現在スロットインジケータ及び期待スロットインジケータによって示されるときは、期待スロットインジケータの値を修正することによって期待スロットインジケータが更新される。
【0009】
別の実施形態例には装置があり、その装置は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、命令を復号する命令デコーダ回路と、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理回路と、リングバッファのメタデータを記憶するリングバッファメタデータ記憶回路とを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、データ項目の待ち行列シーケンスの片端にある現在のスロットの位置を示す現在スロットインジケータを含み、第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、データ項目の待ち行列シーケンスの片端は、データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、命令デコーダ回路は、リングバッファ取得命令がデータ処理回路に実行されることに応答して、取得プロセスを実行するようにデータ処理回路を制御し、取得プロセスは、リングバッファの第2の参照インジケータを更新しようとするステップを含み、そのステップは、あるプロセスによる取得のために要求されるスロットの数が現在スロットインジケータ及び期待スロットインジケータと比較されるアトミック操作を含み、リングバッファの1つ以上のスロットが取得に適格であることが現在スロットインジケータ及び期待スロットインジケータによって示されるときは、期待スロットインジケータの値を修正することによって期待スロットインジケータが更新される。
【0010】
別の実施形態例には、ホストデータ処理装置を制御して命令実行環境を提供するためのコンピュータプログラムがあり、そのコンピュータプログラムは、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶ロジックと、命令を復号するための命令デコーダロジックと、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理ロジックであって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理ロジックと、リングバッファのメタデータを記憶するリングバッファメタデータ記憶ロジックとを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、データ項目の待ち行列シーケンスの片端にある現在のスロットの位置を示す現在スロットインジケータを含み、第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、データ項目の待ち行列シーケンスの片端は、データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、
命令デコーダロジックは、リングバッファ取得命令が命令データ処理回路に実行されることに応答して、取得プロセスを実行するようにデータ処理回路を制御し、取得プロセスは、
リングバッファの第2の参照インジケータを更新しようとするステップを含み、そのステップは、あるプロセスによる取得のために要求されるスロットの数が現在スロットインジケータ及び期待スロットインジケータと比較されるアトミック操作を含み、リングバッファの1つ以上のスロットが取得に適格であることが現在スロットインジケータ及び期待スロットインジケータによって示されるときは、期待スロットインジケータの値を修正することによって期待スロットインジケータが更新される。
【図面の簡単な説明】
【0011】
本技術について、下記の説明と併せて読むために、添付図面に示されるとおりの本技術の実施形態を参照しながら、単に一例として更に説明する。
【
図1】
図1は、本開示の実施形態によるデータ処理装置を概略的に示す図である。
【
図2】
図2は、本開示の実施形態による、リングバッファと、先頭端部ポインタ及び末尾端部ポインタを参照した生成者及び消費者によるリングバッファへのデータ項目の追加及び取り出しと、を概略的に示す図である。
【
図3】
図3は、先行する生成者が更新の解放をまだ完了していないために、ある生成者が更新を解放することがブロックされ得る様子を示す図である。
【
図4a】
図4aは、本開示の実施形態による、第1の参照インジケータ及び第2の参照インジケータを含む、リングバッファメタデータを示す図である。
【
図4b】
図4bは、本開示の実施形態による、データ項目の待ち行列シーケンスの末尾端部を追跡するリングバッファメタデータを示す図である。
【
図4c】
図4cは、本開示の実施形態による、データ項目の待ち行列シーケンスの先頭端部を追跡するリングバッファメタデータを示す図である。
【
図5】
図5は、本開示の実施形態による、リングバッファメタデータを示す図である。
【
図6】
図6は、システム構成要素がアトミックな取得操作を行うときに、一実施形態の方法で取られる一連のステップを示す図である。
【
図7】
図7は、システム構成要素が本技術の第2の参照インジケータを更新しようとするときに取られる一連のステップを示す図である。
【
図8】
図8は、システム構成要素がアトミックな解放操作を行うときに、一実施形態の方法で取られる一連のステップを示す図である。
【
図9】
図9は、システム構成要素が本技術の第1の参照インジケータを更新しようとするときに取られる一連のステップを示す図である。
【
図10】
図10は、本開示の実施形態によるデータ処理装置を概略的に示す図である。
【
図11】
図11は、一実施形態においてシミュレータ実装を提供するシステムの構成要素を概略的に示す図である。
【発明を実施するための形態】
【0012】
少なくともいくつかの実施形態が装置を提供し、その装置は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行するように構成されている、データ処理回路と、リングバッファのメタデータを記憶するリングバッファメタデータ記憶回路とを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、第2の参照インジケータは、現在スロットの期待される位置を示す期待スロットインジケータを含み、1つ以上の保留スロットは、現在スロットの後に取得されたものであり、期待スロット値は、プロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するときの期待スロットインジケータの値であり、解放プロセスは、リングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロット値が現在スロットインジケータと比較されるアトミック操作を含み、現在スロットインジケータが期待スロット値と一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新され、現在スロットインジケータが期待スロット値と一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。
【0013】
リングバッファを待ち行列シーケンスとして使用して、複数の独立した作用者(例えばスレッド)が待ち行列シーケンスに処理のためにデータ項目を追加し(すなわち「生成者」)、待ち行列シーケンスから処理のためにデータ項目を取り出す(すなわち「消費者」)データ処理システム内で、そのデータ項目のシーケンスが処理されるべき順序に関して作用者が厳格に順序通りに動作する(これは、リングバッファとの相互作用を許可される作用者を増やそうとすればするほどスケーラビリティの著しい問題を引き起こすことになる)のではない限り、スケーラビリティを得るために作用者が更新を順序外で解放できる必要があることが、本技術では認識されている。
【0014】
一般に、待ち行列シーケンスの末尾端部に処理のためにデータ項目を追加するには3ステップのエンキュー操作があり、待ち行列シーケンスの先頭端部から更なる処理のためにデータ項目を取り出すには3ステップのデキュー操作がある。3ステップのエンキュー操作は、まず、リングバッファのスロット(又は複数のスロット)を取得し、次に、取得したスロットに要素を書き込み、最後に、取得したスロットを解放することによって行われる。同様に、3ステップのデキュー操作は、まず、リングバッファのスロット(又は複数のスロット)を取得し、次に、取得したスロットから要素を読み出し、最後に、取得したスロットを解放することによって行われる。単一の生成者及び単一の消費者を有するシステムでは、当然のこととして状況がロックフリーなので、これは比較的単純なプロセスである。ところが、複数の生成者及び複数の消費者を含むシステムでは、エンキュー操作及びデキュー操作には、リングバッファと相互作用する独立した作用者の間で同期が必要になる。特に、複数の生成者(又は消費者)がそれぞれ、待ち行列シーケンスの末尾端部に(又は先頭端部から)1つ以上のデータ項目を追加する(又は取り出す)ためにリングバッファと相互作用する場合には、各生成者(又は消費者)は、待ち行列シーケンスの末尾端部(又は先頭端部)で所与の数のスレッドを取得しようとし、次いで、取得したスレッドを解放する。このようにして、1つの生成者(又は消費者)が、リングバッファ取得の順序で(すなわち、データ項目の待ち行列シーケンスの順序で)更新をリングバッファに解放しなければならないという制約に起因して、他の生成者(又は消費者)の完了をブロックする可能性がある。
【0015】
本技術は、リングバッファメタデータを使用して複数の独立した作用者間の相互依存性を断ち切って、複数の独立した作用者が並列に実行し、データ項目の待ち行列の順序を維持する一方で、待ち行列シーケンスの順序に関して順序外で更新を解放できるようにする。これを行うために、本技術は、アトミック操作によってアクセスできる第1の参照インジケータ及び第2の参照インジケータを含む、リングバッファメタデータを提供する。複数の独立した作用者はそれぞれ、このリングバッファメタデータを順序外で更新することができ、そのようにして、各作用者が後で解放するための更新をマークするためにメタデータを変更することができる。したがって、その後、スロットが取得された順序に従ってスロットを解放する様式でリングバッファメタデータを更新できるようにするために、リングバッファメタデータは、エンキュー操作又はデキュー操作を完了した作用者によって、リングバッファのどのスロットが解放を保留しているかを示す指示子を提供するように更新されることができる。このリングバッファメタデータによって、独立した作用者が、データ項目のシーケンスの処理されるべき順序に関して順序通りに、及び順序外で更新を解放することができるようになり、それにより、ブロックなしのリングバッファ解放の実施が提供される。それぞれの作用者は、同時にリングバッファと相互作用して更新を解放することができ、かつ、第1の参照インジケータをアトミックに更新することによってデータ項目のシーケンスの順序付けを維持することができ、ここで、更新を解放しようとする作用者は(順序通りでも、順序外でも)第1の参照インジケータを更新して第1の参照インジケータに関連する少なくとも1つの値を修正し、そのようにして、各作用者は、その作用者が順序外で解放を行う場合であってもリングバッファメタデータを修正することができる。更に、本技術は、メモリ内のリングバッファのメタデータのためのリングバッファメタデータ記憶領域を提供し、この領域には、プロセッサによって実行させられるそれぞれの独立した作用者によって、「遠い」アトミック(近接して結合されたキャッシュ内のデータにアトミックにアクセスする「近い」アトミックではなく、メモリ内のデータ又は、メモリシステム内でコアから更に遠いキャッシュにアクセスするという意味で、「遠い」アトミック)に基づくメタデータ操作を行うことによってアクセスできる。リングバッファメタデータにアトミックなメモリ更新を行うためにそのような「遠い」アトミック操作を実施すると、スヌーピングに関連する遅延(スヌープ遅延)を増加させるメタデータへの「近い」アクセスを回避又は制限することができるので、それぞれの作用者が同時に、スヌープ遅延を低減する様式でリングバッファメタデータを更新しようとすることが可能になる。これにより、独立した作用者が、リングバッファと相互作用して更新を解放するためにリングバッファメタデータを更新することが可能になり、また、複数の作用者が同時にメタデータへのアクセスしようとすることに起因するリングバッファメタデータに対する競合から生じる遅延を低減できる。そのような「遠い」アトミック操作を実施すると、スヌーピングに関連する遅延を短縮することができ、それにより、それぞれのメタデータ操作に必要な時間の低減が可能になり、作用者がそのメタデータ操作をより高頻度で行うことができるので、スケーラビリティが改善され、より多数のコアが同時にリングバッファで動作できるようになる。
【0016】
第1の参照インジケータは、リングバッファの複数のスロットのうち現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含み、1つ以上の保留スロットは、待ち行列シーケンスの順序に関して現在スロットの後に取得されたものである。現在スロットインジケータは、データ項目の待ち行列シーケンスの末尾端部又は先頭端部のいずれかの現在位置を示す、リングバッファ内の位置を示す。例えば、2N個のスロットを含むリングバッファ(すなわち、Nを整数として、2N個の要素を有するリングバッファ)では、現在スロットインジケータを、リングバッファのどのスロットが最古のデータ項目(先頭端部)に対応するかを示す指示子を提供するため、又は、リングバッファのどのスロットが最新のデータ項目(末尾端部)に対応するかを示す指示子を提供するためのいずれかに使用することができる。このように、現在スロットインジケータは、リングバッファ内の待ち行列シーケンスの先頭端部又は末尾端部の位置に応じて、所与の時刻におけるリングバッファの所与のスロットの位置を示すことのできるスカラー値であってもよい。理解されるように、書き込みに利用可能な空の(未使用)スロットの位置又は、書き込みに利用可能ではないが消費(読み出し)には利用可能な空ではない(使用中)スロットの位置を示すことによって、現在スロットインジケータがデータ項目の待ち行列シーケンスの端部(先頭端部又は末尾端部)の位置を示し得る。
【0017】
加えて、第1の参照インジケータは、リングバッファの複数スロットのうち1つ以上の保留スロットの位置を示す保留スロットインジケータを含む。保留スロットインジケータは、リングバッファ内の少なくとも1つの保留スロットの存在を示すように(保留スロットが存在しない可能性もある)、また、保留スロットが存在すると示された場合にはリングバッファ内の少なくとも1つの保留スロットの位置も示すように、更新を解放する作用者によって順序外で更新することができる。保留スロットインジケータは、例えば、作用者によってエンキュー操作(先頭端部)又はデキュー操作(末尾端部)が完了しており、かつ、作用者によって順序外で解放されており、リングバッファによる解放を保留している、あるスロットのリングバッファ内の位置を示すスカラー値であってもよい。
【0018】
このように、第1の参照インジケータは、リングバッファの現在スロットの位置の指示子と、リングバッファと相互作用する作用者によって順序外で解放された1つ以上の更新があるか否かを示す指示子と、リングバッファと相互作用する作用者によって順序外で解放された1つ以上の更新に対応するリングバッファの1つ以上の保留スロットの位置の指示子と、を含む。したがって、第1の参照インジケータは、例えば、データ項目の待ち行列シーケンスの現在スロットの先頭端部ポインタ又は末尾端部ポインタとして使用される一方で、それぞれ先頭端部又は末尾端部の、待ち行列シーケンスの1つ以上の保留中スロットの存在及び位置も示すこともできる。システム内の作用者が更新を解放(取得したスロットを、そのスロットに対する書き込み又は読み出しを完了した後に解放する)しようと望むとき、リングバッファのメタデータは、その作用者によってアトミックにアクセス可能であり、その作用者が更新を解放できるようにするために第1の参照インジケータを、第1の参照インジケータの現在スロットインジケータ又は保留スロットインジケータのいずれかを更新することによって更新することができる。このように、第1の参照インジケータは、データ項目の待ち行列シーケンスの順序に関して順序通りに更新を解放する作用者によって、かつまた、データ項目の待ち行列シーケンスの順序に関して順序外に更新を解放する作用者によって、更新が可能であり、したがって、作用者はリングバッファ取得の順序でリングバッファに更新を解放するという制約を受けず、したがって、ブロックのないリングバッファ解放の実施が実現できる。
【0019】
第2の参照インジケータは、リングバッファの現在スロットの期待される位置を示す、期待スロットインジケータを含む。リングバッファと相互作用する所与の作用者は、書き込み(生成者)又は読み出し(消費者)の対象となる、リングバッファの1つ以上のスロットを取得するために、第2の参照インジケータを更新しようとすることができる。生成者又は消費者がリングバッファの1つ以上のスロットの取得を望むことがあり、そして、その生成者又は消費者は、その1つ以上のスロットを取得するために第2の参照インジケータを更新をしようとし、この試みは、リングバッファメタデータにアクセスするアトミック操作(アトミックな取得操作)を含む。例えば、ある生成者が待ち行列シーケンスの末尾端部の1つ以上のスロットの取得を望むことがあり、したがって、その生成者は、リングバッファメタデータにアクセスしようとし、第2の参照インジケータを、第2の参照インジケータに関連する値を別のスロットを指すように修正することによって更新して、その後に待ち行列シーケンスの末尾端部の1つ以上のスロットを取得しようとする他の生成者が、最初の生成者によって既に取得されているスロットを取得できないようにする。生成者又は消費者が取得プロセスを実行して、リングバッファの1つ以上のスロットの取得に成功したときは、その生成者又は消費者のための期待スロット値が返される。期待スロット値は、生成者又は消費者がリングバッファの1つ以上のスロットを取得したときの期待スロットインジケータの値である。このように、あるプロセスがリングバッファの1つ以上のスロットを取得した時点の期待スロットインジケータの値を示す期待スロット値を、そのプロセスのために保持することができ、その後、そのプロセスがその後にその1つ以上のスロットを解放しようとするときに、その期待スロット値を第1の参照インジケータと比較することができる。このように、そのプロセスの期待スロット値を第1の参照インジケータと比較することにより、そのプロセスが、取得したスロットを、データ項目の待ち行列シーケンスの順序に関して順序外で解放しようとしているのか、順序通りに解放しようとしているのかを示す指示子が得られる。いくつかの例では、あるプロセスがリングバッファのX個のスロット(X>1)の取得に成功することがあり、期待スロット値は、そのプロセスがX個のスロットを取得したときの期待スロットインジケータの値を示す指示子を与えてもよい。よって、現在スロットインジケータと期待スロット値との比較は、現在スロットインジケータを、期待スロット値と取得したスロット数との組み合わせによって与えられる範囲と比較する、範囲比較であってもよい。例えば、あるプロセスが2個のスロットを取得し、そのプロセスがその2個のスロットを取得した時点の期待スロットインジケータの値がNであった場合には、N及び、Nで示されるスロットの隣のスロットによって定められる範囲を、現在スロットインジケータとの比較に使用することができる。
【0020】
本技術は、リングバッファメタデータがメモリ内に記憶されて、スロットを取得及び解放するためにアトミック操作を実行する作用者によってアクセス可能であり、かつ、リングバッファメタデータが待ち行列シーケンスの順序付けを維持できることを実現する。第2の参照インジケータにアクセスして更新することによってスロットを取得することができる一方で、作用者が完了する順序、よって、スロットを解放しようとする順序はスロットが取得された順序と異なっていてもよく、よって、作用者は、第2の参照インジケータがアクセスされて更新される順序とは異なる順序で第1の参照インジケータにアクセスして更新しようとしてもよい。作用者が第2の参照インジケータの更新に成功すると、期待スロットインジケータの値は、作用者がリングバッファの1つ以上のスロットを既に取得していることを示すように修正される。作用者が1つ以上のスロットを取得した時点の期待スロットインジケータの値に対応する期待スロット値が作用者に返され、その作用者が取得したスロットを解放しようとするときに、解放を順序通りに行うか順序外で行うかを確定するために使用される(すなわち、その作用者の期待スロット位置は、作用者が1つ以上のスロットを取得した時点の第2の参照インジケータの値に基づく)。作用者が取得した1つ以上のスロットに対する書き込み又は読み出しを完了して、その取得した1つ以上のスロットを解放しようとするとき、スロットを取得した時点でその作用者に返された期待スロット値を使用して、作用者は、リングバッファメタデータにアトミックにアクセスし、期待スロット値を第1の参照インジケータの現在スロットインジケータの値と比較することによって第1の参照インジケータを更新しようとすることができる。したがって、理解されるように、アトミック解放操作は、第1の参照インジケータを更新しようとする作用者による試みを含み、その中で作用者は期待スロット値を第1の参照インジケータと比較する。具体的には、作用者は、期待スロット値と現在スロットインジケータの値との比較に基づいて第1の参照インジケータをアトミックに更新しようとし、第1の参照インジケータが更新される様式は、期待スロット値によって示される、現在スロットの期待位置が、第1の参照インジケータの現在スロットインジケータの示す現在スロットの位置と一致するか否かに応じて異なる。
【0021】
いくつかの実施形態では、現在スロットインジケータが期待スロット値と一致せず、かつ、期待スロットインジケータが、待ち行列シーケンスの順序に関して現在スロットインジケータの示す現在スロットの後ではない現在スロットの期待位置を示している場合、第1の参照インジケータは更新されない。
【0022】
あるプロセスが第1の参照インジケータにアトミックにアクセスして更新しようとする一方で、同時に他のプロセスがスロットを解放するために、同時に第1の参照インジケータにアトミックにアクセスして更新しようとすることができることが、本技術では認識されている。そのプロセスのための期待スロット値が第1の参照インジケータの現在スロットインジケータの値に一致しないとき、これは、そのプロセスが、データ項目の待ち行列シーケンスの順序に関して順序外でスロットを解放しようとしていることを示す。そのプロセスのための期待スロット値が現在スロットインジケータの値に一致せず、かつまた、期待スロット値が、データ項目の待ち行列シーケンスの順序付けに関して現在スロットの位置の後に位置しないスロットの位置を示すとき、これは、そのプロセスが、シーケンスの順序付けに関して先行するスロットを解放しようとしていない(シーケンスの順序付けに関して早期にスロットを解放しようとしていない)ことを示す。この場合、プロセスは、待ち行列シーケンスの順序に関して「後方にある」スロットを解放しようとしており、そのスロットの解放は既に第1の参照インジケータに反映されているので、プロセスは、第1の参照インジケータを更新せずに解放プロセスを完了する。
【0023】
いくつかの実施形態では、現在スロットインジケータが期待スロット値と一致しないとき、リングバッファ内の1つ以上の保留スロットの存在及び、現在スロットインジケータの示す現在スロットに対する位置を示すように保留スロットインジケータの値を変更することによって、保留スロットインジケータが更新される。
【0024】
そのプロセスのための期待スロット値が第1の参照インジケータの現在スロットインジケータの値に一致せず、かつまた、期待スロット値が、データ項目の待ち行列シーケンスの順序付けに関して現在スロットの位置の後に位置するスロットの位置を示すとき、これは、そのプロセスが、シーケンスの順序付けに関して順序外の「先行する」スロットを解放しようとしていることを示すということが、本技術では認識される。換言すれば、このことは、そのプロセスが解放しようとしているスロットよりもシーケンス内で早期にある別のスロットを別のプロセスが解放する前に、そのプロセスがスロットを解放しようとしていることを示す。この場合、解放プロセスを実行するとき、プロセスは、第1の参照インジケータにアトミックにアクセスして、1つ以上の保留スロットが存在することを示すように保留スロットインジケータを更新する。
【0025】
いくつかの実施形態では、保留スロットインジケータは限界インジケータを含み、限界インジケータは、待ち行列シーケンスの順序に関してリングバッファの現在スロットから最も遠い位置にある、最遠保留スロットの位置を示す。
【0026】
いくつかの実施形態では、保留スロットインジケータは変化インジケータを含み、変化インジケータの変化は、現在スロットと最遠保留スロットとの間の保留スロットの数の変化を示す。
【0027】
本技術は、リングバッファ内の最遠保留スロットの位置を示す限界インジケータを含む、保留スロットインジケータを提供する。加えて、保留スロットインジケータは変化インジケータを含んでもよく、変化インジケータの変化は、現在スロットインジケータの示す現在スロットと限界インジケータの示す最遠保留スロットとの間に存在する保留スロットの数の変化を示す。プロセスは、追加の保留スロットの存在を示すように変化インジケータを変更することによって、現在スロットと最遠保留スロットとの間に位置するスロットを解放してもよい。
【0028】
プロセスが保留スロットインジケータを解放した時点の保留スロットインジケータの構成(例えば、1つ以上の保留スロットが存在するか、又は保留スロットインジケータが存在しないか)に応じて、限界インジケータ若しくは変更インジケータのいずれか、又は、限界インジケータと変化インジケータの両方を更新することができる。例えば、待ち行列シーケンスの順序は、スロットAの後にスロットBが続き、その次にスロットCが続くようなものであってもよい。この場合、現在スロットインジケータの示す現在スロットがスロットAであり、プロセスが、スロットB又はスロットCが解放される前にスロットDを解放したいと望むなら、プロセスは、保留スロットとしてスロットDの存在及び位置を示すように限界インジケータを更新する。このように、最遠保留スロットとしてスロットDの位置が示され得る。別のプロセスがその後にスロットEを解放したいと望むなら、限界インジケータを、現在スロット(スロットA)からの最遠保留スロットとしてスロットEの存在及び位置を示すように更新することができる。このように、順序外で更新を解放するプロセスによって、限界インジケータを、最遠保留スロットの位置を示すように更新することができる。
【0029】
上記の例を続けると、限界インジケータが、現在スロット(スロットA)からの最遠保留スロットとしてスロットEの存在及び位置を示し、かつ、別のプロセスがその後にスロットCを解放しようと望むなら、変化インジケータを、現在スロット(スロットA)と最遠保留スロット(スロットE)との間の保留スロットの数の変化を示すように更新することができる。このように、現在スロットと最遠保留スロットとの間に位置するスロットを解放できるようにするために、変化インジケータを更新することができる。よって、変化インジケータが変化することは、限界インジケータの更新を妨げていた更新が解放されたことを示す。よって、変化インジケータの変化は、現在スロットと最遠保留スロットとの間の保留スロットの数に変化があったことを示す。これにより、限界インジケータ若しくは変更インジケータのいずれか、又はその両方を更新することによって更新を解放することが可能になり、よって、プロセスは、先行するプロセスが更新を解放するのを待つ必要なく、解放されることができる。いくつかの例では、限界インジケータ又は変更インジケータのいずれかは、上述したとおり、プロセスが現在スロット及び限界インジケータの示す最遠保留スロットよりも遠いスロットを解放しようとしているか否かに応じて更新される。あるいは、いくつかの例では、変更インジケータは、解放される更新のそれぞれについて更新されて、変更インジケータの変化が、プロセスによって更新が解放されたことを示すように機能し、限界インジケータが最遠保留スロットの位置を示すようになっていてもよい。
【0030】
限界インジケータは、上述したとおり、現在スロット(スロットA)からの最遠保留スロットとしてスロットEの存在及び位置を示すように更新されてもよい。順序通りのプロセスがスロットBを解放しようとするとき、そのプロセスは、データ項目の待ち行列の順序に関して順序通りに解放しようとするので、その順序通りのプロセスは、その順序通りのプロセスが現在スロットと最遠保留スロットの間の他の保留スロットを解放できるように、現在スロットインジケータの示す現在スロットから限界インジケータの示す最遠保留スロットまで、リングバッファの走査を行う。このように、その順序通りのプロセスは、待ち行列シーケンスの順序に関して順序通りにスロットBを解放することができ、その順序通りのプロセスは、現在スロットと最遠保留スロットの間でリングバッファを走査して、現在スロットと最遠保留スロットの間の他のスロットを特定し、データ項目の待ち行列シーケンスの順序に関して順序通りに解放することができる。プロセスが保留中の更新についてリングバッファの走査を行う前の変化インジケータの値を、リングバッファの走査の後の変化インジケータの値との比較にプロセスが使用して、限界インジケータの更新を妨げていた1つ以上の更新が順序外で解放されたか否か特定することができる。変化インジケータの古い値(走査後)とそのインジケータの新しい値(走査前)の比較が、限界インジケータの更新を妨げていた更新が解放されたことを示すとき、順序通りのプロセスは再びリングバッファを走査して、順序通りに解放されてもよいさらなるスロットを特定することができる。
【0031】
いくつかの例では、保留スロットインジケータは、限界インジケータを使用せずに変更インジケータのみを使用してもよい。この場合、変化インジケータは、変化インジケータが保留スロットの数の変化を示すように更新されるように、解放される各スロットに対して更新されてもよい。順序通りのプロセスは、現在スロットインジケータの示す現在スロットで開始する走査を行うことができ、この走査は、その順序通りのプロセスが保留中の解放ではないスロットを特定したときに終了する。このように、順序通りのプロセスは、スロットBを順序通りに解放し、保留中の解放であるスロットCを解放するために保留スロットについてリングバッファを走査することができ、そのプロセスは、保留されていないスロットが特定されたときにスキャンを停止する(例えば、保留されていないスロットは、ヌルポインタによって示されてもよい)。
【0032】
いくつかの実施形態では、保留スロットインジケータは、現在スロットインジケータが期待スロット値に一致しないときに、限界インジケータと変化インジケータのうち少なくとも1つを変更することによって更新される。
【0033】
いくつかの実施形態では、期待スロット値がリングバッファ内で待ち行列シーケンスの順序に関して限界インジケータの示す最遠保留スロットよりも遠くに位置するスロットを示すときに、限界インジケータは更新される。いくつかの実施形態では、限界インジケータは、期待スロット値の値に基づいて、別の位置を最遠保留スロットに示すように更新される。
【0034】
保留スロットインジケータが保留スロットの存在を示し、そのプロセスのための期待スロット値が、限界インジケータが現在示している最遠保留スロットよりも現在スロットから遠くにあるスロットの位置を示しているときは、プロセスは、そのプロセスが解放しようとしているスロットに対応する新しい最遠保留スロットを示すように限界インジケータを更新することによって、保留スロットインジケータを更新する。順序外でスロットを解放しようとするプロセスは、限界インジケータが別のスロットを最遠保留スロットとして示すように、限界インジケータを更新することができる。したがって、あるプロセスがデータ項目の待ち行列シーケンスの順序に関して順序通りにスロットをしようとするとき、この順序通りのプロセスは、リングバッファ内の保留スロットのスキャンが現在スロットと最遠保留スロットとの間で行われるように、限界インジケータを使用して走査を行って最遠保留スロットを定めることができる。
【0035】
いくつかの実施形態では、期待スロット値が現在スロットと最遠保留スロットの間に位置するスロットを示すとき、限界インジケータを更新せずに変化インジケータが更新される。そのスロットは、最遠保留スロットよりも現在スロットに近い位置にあるため、限界インジケータは更新されず、代わりに、その順序外プロセスは、現在スロットと最遠保留スロットの間の保留スロットの数の変化を示すように変化インジケータを更新することによって、更新を解放する。
【0036】
保留スロットインジケータが保留スロットの存在を示し、そのプロセスのための期待スロット値が、限界インジケータが現在示している最遠保留スロットよりも現在スロットから遠くにあるのではないスロットの位置を示しているときは、最遠保留スロットの位置は変化していないので、プロセスは、限界インジケータを更新せずに、現在スロットと最遠保留スロットの間の追加の保留スロットの存在を示すように変化インジケータを更新することによって、保留スロットインジケータを変更する。これにより、順序外のプロセスが、そのプロセスが解放するプロットが現在スロットから最遠保留スロットよりも遠くにないときは、変化インジケータを更新することによって解放を更新できるようになる。したがって、別のプロセスがデータ項目の待ち行列シーケンスの順序に関して順序通りにスロットを解放しようとするとき、この順序通りのプロセスは、他のスロットがデータ項目の待ち行列シーケンスの順序に関して順序通りに解放されるようにするために、限界インジケータ及び変更インジケータに従って走査を行うことができる。順序通りのスロットを解放する前の変化インジケータを、順序通りのスロットを解放した後の変化インジケータと比較することにより、変化インジケータの変化を特定することができ、そのプロセスは、走査の開始と終了の間に解放された1つ以上の保留スロットについて、リングバッファの別の走査を行うか否か特定することができる。
【0037】
リングバッファ内に保留スロットが存在しないときは、限界インジケータは、リングバッファ内に保留スロットが一切存在しないことを示す。よって、プロセスが単一の保留スロットを解放しようとし、かつ、限界インジケータがそのような設定を有する場合、プロセスは、プロセスによって解放されるその単一のスロットの存在及び位置を示すように、限界インジケータのみを更新してもよい。加えて、プロセスはまた、変化があったことを示すように変化インジケータを更新してもよい。プロセスが複数の保留スロットを解放しようとし、かつ、限界インジケータが、保留スロットが存在しないことを示す場合、プロセスは、最遠保留スロットの存在及び位置を示し、かつ、現在スロットと最遠保留スロットの間の他の保留スロットの存在を示すように、限界インジケータと変化インジケータの両方を更新する。
【0038】
いくつかの実施形態では、現在スロットインジケータが期待スロット値と一致し、かつ、保留スロットインジケータがリングバッファ内の1つ以上の保留スロットの存在を示すとき、現在スロットインジケータは、現在スロットに隣接する連続した保留スロットの数に従って現在スロットインジケータの値を修正することによって更新される。期待スロット値が現在スロットインジケータの値と一致するとき、これは、プロセスが、データ項目の待ち行列シーケンスの順序に関して順序通りに解放しようとしていることを示す指示子を提供する。この場合、プロセスは、現在スロットインジケータの示すスロットから限界インジケータの示す最遠保留スロットまで、リングバッファの走査を行うことができ、現在スロットに隣接する保留スロットがプロセスによって解放されることができる。このように、プロセスは、そのプロセスが取得した1つ以上のスロットを解放し、また、現在スロットと隣接する1つ以上の連続した保留スロットも解放することができる。
【0039】
いくつかの実施形態では、現在スロットインジケータの値は、1つ以上の連続する保留スロットの最遠保留スロットを示すように修正され、最遠保留スロットは、1つ以上の連続する保留スロットのうちリングバッファ内で現在スロットから最も遠くにある保留スロットである。
【0040】
本技術は、プロセスが期待スロット値をリングバッファメタデータの現在スロットインジケータの値と比較することを可能にし、現在スロットインジケータが期待スロット値と一致するとき、これはそのプロセスがデータ項目の待ち行列シーケンスの順序に関して順序通りにスロットを解放しようとしていることを示す。待ち行列シーケンスの順序に関して順序通りにスロットを解放しようとするとき、保留スロットの存在及び、存在するなら、その最も遠い位置に関する指示子を提供するために、保留スロットインジケータを読み出すことができる。保留スロットインジケータが、保留スロットが存在しないことを示す(リングバッファ内に保留中のスロットが存在しないことを示す)ときは、待ち行列シーケンス内の次のスロットの位置を示すように現在スロットインジケータの値を修正をするように、現在スロットインジケータを更新することができる。保留スロットインジケータが、リングバッファ内の1つ以上の保留スロットの存在を示すときは、現在スロットと限界インジケータの示す最遠保留スロットとの間に位置するリングバッファ内のスロットの走査を行って、現在スロットに隣接する1つ以上の保留スロットが存在するか特定することができる。現在スロットに隣接する1つ以上の保留スロットが存在する場合、現在スロットインジケータを、現在スロットから最も遠い最遠保留スロットの位置を示すように更新することができ、ここで、現在スロットと最遠保留スロットの間の全てのスロットは保留中のスロットである。このように、保留スロットインジケータを読み出すことができ、リングバッファ内の所与の数のスロットに走査を行って、現在スロットと限界インジケータの示すスロットとの間のそれぞれの保留スロットの位置を特定することができ、システムが順序通りであるときは、現在スロットに隣接する連続した保留スロットの数に基づいて、第1の参照インジケータを更新することができる。1つ以上の保留スロットが存在するが、どの保留スロットも現在スロットに隣接していない場合、データ項目の待ち行列シーケンスの順序に関して順序通りに解放するために、待ち行列シーケンスの次のスロットの位置を示すように現在スロットインジケータの値を修正するように、現在スロットインジケータを更新することができる。
【0041】
いくつかの実施形態では、現在スロットインジケータは、データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかにおける現在スロットの位置を示し、期待スロットインジケータは、データ項目の待ち行列シーケンスの同じ端部における現在スロットの期待位置を示す。
【0042】
いくつかの実施形態では、第1の参照インジケータは、待ち行列シーケンスからデータ項目を取り出すプロセスのための、データ項目の待ち行列シーケンスの末尾端部に対する末尾端部インジケータであり、第2の参照インジケータは、待ち行列シーケンスにデータ項目を追加するプロセスのための、データ項目の待ち行列シーケンスの末尾端部に対する末尾端部インジケータである。
【0043】
いくつかの実施形態では、待ち行列シーケンスにデータ項目を追加するプロセスは、少なくともリングバッファ内の次の空のスロットを取得するために取得プロセスを実行するように構成されており、この取得プロセスは、アトミック操作に従って第2の参照インジケータを更新しようとするステップを含む。
【0044】
いくつかの実施形態では、第1の参照インジケータは、待ち行列シーケンスにデータ項目を追加するプロセスのための、データ項目の待ち行列シーケンスの先頭端部に対する先頭端部インジケータであり、第2の参照インジケータは、待ち行列シーケンスからデータ項目を取り出すプロセスのための、データ項目の待ち行列シーケンスの先頭端部に対する先頭端部インジケータである。
【0045】
いくつかの実施形態では、待ち行列シーケンスからデータ項目を取り出すプロセスは、少なくともリングバッファ内の次の空ではないスロットを取得するために取得プロセスを実行するように構成されており、取得プロセスは、アトミック操作に従って第2の参照インジケータを更新しようとするステップを含む。
【0046】
いくつかの実施形態では、そのプロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するとき、複数プロセスのうち1つによって取得されたスロットの数に従って期待スロットインジケータの値を修正することによって、第2の参照インジケータが更新される。
【0047】
いくつかの実施形態では、データ処理回路は、並列して待ち行列にデータ項目を追加する複数のプロセスを実行するように構成されており、各プロセスは、アトミック操作に従って同時に第1の参照インジケータを更新しようとする。
【0048】
いくつかの実施形態では、データ処理回路は、並列して待ち行列からデータ項目を取り出す複数のプロセスを実行するように構成されており、各プロセスは、アトミック操作に従って同時に第1の参照インジケータを更新しようとする。
【0049】
少なくともいくつかの実施形態が装置を提供し、その装置は、
データ項目の待ち行列シーケンスを保持する複数のスロットを備えるリングバッファを記憶するリングバッファ記憶回路と、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための複数のプロセスを実行するデータ処理回路であって、各プロセスは、リングバッファの少なくとも1つのスロットを取得する取得プロセスを実行するように構成されている、データ処理回路と、リングバッファのメタデータを記憶するリングバッファメタデータ記憶回路とを備え、メタデータは、第1の参照インジケータ及び第2の参照インジケータを含み、第1の参照インジケータは、データ項目の待ち行列シーケンスの片端にある現在スロットの位置を示す現在スロットインジケータを含み、第2の参照インジケータは、データ項目の待ち行列の他端にある現在スロットの期待される位置を示す期待スロットインジケータを含み、データ項目の待ち行列シーケンスの片端は、データ項目の待ち行列シーケンスの先頭端部又は末尾端部のいずれかであり、取得プロセスは、リングバッファの第2の参照インジケータを更新しようとするステップを含み、そのステップは、あるプロセスによる取得のために要求されるスロットの数が現在スロットインジケータ及び期待スロットインジケータと比較されるアトミック操作を含み、リングバッファの1つ以上のスロットが取得に適格であることが現在スロットインジケータ及び期待スロットインジケータによって示されるときは、期待スロットインジケータの値を修正することによって期待スロットインジケータが更新される。これにより、リングバッファの1つ以上のスロットを取得するために、プロセスがリングバッファメタデータにアトミックにアクセス及び更新することを可能にする、アトミック取得操作が提供される。
【0050】
いくつかの実施形態では、第1の参照インジケータは、待ち行列シーケンスからデータ項目を取り出すプロセスのための、データ項目の待ち行列シーケンスの末尾端部に対する末尾端部インジケータであり、第2の参照インジケータは、待ち行列シーケンスからデータ項目を取り出すプロセスのための、データ項目の待ち行列シーケンスの先頭端部に対する先頭端部インジケータである。いくつかの実施形態では、待ち行列シーケンスからデータ項目を取り出すプロセスについては、取得に適格なスロットの数は、リングバッファ内の占有されているスロットの数に対応し、リングバッファ内の占有されているスロットの数は、先頭端部の現在スロットの位置及び末尾端部の現在スロットの位置に基づいて決定される。このように、待ち行列シーケンスからデータ項目を取り出す消費者については、リングバッファ内の占有されているスロットの数を計算するために、末尾端部の位置に対応するインデックスから先頭端部の位置に対応するインデックスを減算する(末尾端部-先頭端部)ことができる。
【0051】
一部の実施形態では、第1の参照インジケータは、待ち行列シーケンスにデータ項目を追加するプロセスのための、データ項目の待ち行列シーケンスの先頭端部に対する先頭端部インジケータであり、第2の参照インジケータは、待ち行列シーケンスにデータ項目を追加するプロセスのための、データ項目の待ち行列シーケンスの末尾端部に対する末尾端部インジケータである。いくつかの実施形態では、待ち行列シーケンスにデータ項目を追加するプロセスについては、取得に適格なスロットの数は、リングバッファ内の占有されていないスロットの数に対応し、リングバッファ内の占有されていないスロットの数は、リングバッファのスロットの総数、先頭端部の現在スロットの位置、及び末尾端部の現在スロットの位置に基づいて決定される。このように、待ち行列シーケンスにデータ項目を追加する生成者については、リングバッファ内の占有されているスロットの数を計算するために、末尾端部の位置に対応するインデックスから先頭端部の位置に対応するインデックスを減算する(末尾端部-先頭端部)ことができ、リングバッファ内の占有されていないスロットの数を計算するために、リングバッファ内のスロットの総数から占有されているスロットの数を減算することができ(リンババッファサイズ-(末尾端部-先頭端部)=リングバッファサイズ+先頭端部-末尾端部=占有されていないスロットの数)、占有されていないスロットは、生成者による取得に適格である。
【0052】
ここで、いくつかの特定の実施形態を図を参照しながら説明する。
【0053】
図1は、一実施形態におけるデータ処理装置10を概略的に示す。データ処理装置10は、第1のコア12及び第2のコア14を含む。これらのコアのそれぞれには、それぞれ独自の専用L1キャッシュ、すなわちキャッシュ16及び18が備わる。レベル2キャッシュ20が共有され、メモリ22につながっている。データ処理装置10は、マルチコアシステムであるだけでなくマルチスレッドシステムでもあり、このことは
図1に、コア12上で実行するスレッドT0 24及びT1 26、並びに、コア14上のスレッドT2 28及びT3 30の表現によって示されている。当業者にはよく知られた様式で、所与のプロセッサコアで実行する所与のスレッドは、メモリ22から取り込んだデータにデータ処理操作を行い、メモリ22から取り込んだデータ項目の一時的コピーが、該当する中間キャッシュレベルによって形成されるキャッシュ階層にキャッシュされる。本技術のいくつかの実施形態に特に関連のあるいくつかのデータ構造が、
図1のメモリ22に概略的に示されており、これらはすなわち、リングバッファ記憶領域32及び、リングバッファメタデータ記憶領域34である。リングバッファメタデータ記憶領域34は、メモリ22のいくつかの記憶位置に対応しており、コアで実行しているスレッドによってその記憶位置にリングバッファメタデータを記憶し、アクセスできるようになっている。よって、メモリ22のその記憶位置に記憶されたリングバッファメタデータのデータ構造は、コア13及び14で実行するスレッドT0、T1、T2及びT3によってアトミックにアクセス可能である。本技術について、以下の図の中のこれらのデータ構造を参照しながら更に説明する
【0054】
図2は、当業者にはよく知られた様式で循環する、リングバッファ50を概略的に表す。リングバッファ記憶装置32の中に記憶され、よって必然的に
図1に示すメモリ22の中に記憶される、このリングバッファ50は、コア12及びコア14で実行するプロセスによって、特定のデータ項目の処理を調整するために使用される。一般に、リングバッファの使用は2つの側面から見ることができ、1つは、リングバッファ50に記憶されるデータ項目を生成する、システム内の1つ以上の「生成者」の側面であり、もう1つは、更なるデータ処理のためにリングバッファ50からデータ項目を取り出す「消費者」の側面である。リングバッファの重要な特徴は、データ項目が生成者によって生成される順序が消費者によって消費される順序でもあるようにするために、リングバッファに保持されたデータ項目が待ち行列シーケンス(順序付けられたシーケンス)内に存在するようにリングバッファが使用されるように構成されていることである。この特徴に影響を与える一般原理は、生成者によって生成される次の項目は、記憶されたシーケンス(
図2では斜線入りスロットによって表現される)の「末尾端部」にエンキューされ(
図2の項目52を参照)、一方で、シーケンス内で最も古いデータ項目が消費者による処理のためにシーケンスの先頭端部からデキューされる(
図2の項目54参照)というものである。換言すれば、待ち行列シーケンスの先頭端部のデータ項目は最古のデータ項目であり、待ち行列シーケンスの末尾端部のデータ項目は最新のデータ項目である。リングバッファ内の有効なデータ項目の現在の状態を追跡記録する目的で、システムは4つのポインタを記憶し、そのうち2つは生成者、2つは消費者のためのものである。本技術では、これらの4つのポインタのためにリングバッファメタデータが提供され、これらのポインタは、独立した作用者によってアトミックにアクセス及び更新することができる。生成者先頭端部ポインタ56は、システム内の生成者のために待ち行列シーケンスの先頭端部を示し、一方で、生成者末尾端部ポインタ58は、システム内の生成者のために待ち行列シーケンスの末尾端部を示す。同様に、消費者先頭端部ポインタ60は、システム内の消費者のために待ち行列シーケンスの先頭端部を示し、消費者末尾端部ポインタ62は、システム内の消費者のために待ち行列シーケンスの末尾端部を示す。この状況で留意すべき重要な点は、
図2に示すように、この例ではそれぞれスカラー値で表される生成者先頭端部ポインタ56、生成者末尾端部ポインタ58、消費者先頭端部ポインタ60、及び消費者末尾端部ポインタ62が、(
図1に示すように)メモリ22内のリングバッファメタデータ記憶回路34に記憶されたメタデータによって提供され、リングバッファのメタデータが作用者(例えば、スレッドT0 24、T1 26、T2 28又はT3 30)によって、アトミック操作に従ってアクセスされることである。
【0055】
ここで、
図3を参照しながら、複数のプロセスがリングバッファを使用するデータ処理システム、具体的には複数の生成者及び消費者が関与するデータ処理システムにおけるリングバッファの使用の調製に関して生じることのある前述した困難のいくつかについて考察する。前述したように、一般に、リングバッファを使用する3ステップのエンキュー操作及びデキュー操作が存在し、複数の生成者及び複数の消費者を含むシステムでは、エンキュー及びデキューには生成者と消費者の間で同期が必要である。具体的には、更新は、取得された順序で解放されなければならない(「更新」という用語は、読み出しと書き込みの両方の解放を包含することに留意されたい)。読み出し更新は、内容が読み出される前に上書きされない順序で解放されることが重要である。したがって、生成者又は消費者は、先行する生成者又は消費者がこれを終了するまで待つ必要がある。
【0056】
図3は、この相互依存性が現れる可能性のある1つのシナリオを概略的に示す。
図3に示すリングバッファを使用するシステムには、4つのポインタ、すなわち、生成者先頭端部ポインタ56、消費者先頭端部ポインタ60、生成者末尾端部ポインタ58、及び消費者末尾端部ポインタ62が定められている。新たに生成されたデータ項目が待ち行列シーケンスの末尾端部に追加される場合、ある生成者が、リングバッファを使用して新しいデータ項目をエンキューしたいと望むとき、その生成者は、生成者末尾端部ポインタ58及び消費者末尾端部ポインタ62に書き込む。逆に、ある消費者が、ある項目をデキューしたいと望むとき、その消費者は、消費者先頭端部ポインタ60及び生成者先頭端部ポインタ56を更新しなければならない。したがって、アクティブなキュー内に現在、スロットa、b、c、d、eが存在し、生成者がスロットfの取得を望む、図示した状況では、この取得は、生成者が、生成者末尾端部ポインタ58を更新することによって可能だが(スロットfを取得するための生成者による生成者末尾端部ポインタ58の更新は、生成者末尾端部58からスロットfを指す破線の矢印で表される)、生成者が消費者末尾端部ポインタ62をデータ項目fを示すように更新しようとしても、その更新はコンピュータ側では起こらない。すなわち、具体的には、消費者末尾端部ポインタ62に関して、そのポインタ62は、現在はデータ項目dを指したままとなる。このことは、消費者末尾端部ポインタ62からスロットdへの実線の矢印で表される。現在の生成者は、エンキュー操作の取得ステップの一部として、既に生成者末尾端部ポインタ58をfに更新しているが、一方で、更新は取得された順序で解放されなければならないので(すなわち、更新を取得の順序で解放するには、点線で表すように、消費者末尾端部ポインタ62はまず、スロットfを指すように更新されなければならない)、現在の生成者は、消費者末尾端部ポインタ62を更新することをブロックされ、したがって、現在の生成者は、消費者末尾端部ポインタ62が生成者末尾端部ポインタ58の古い値、すなわちfを有するようになるまで待つ必要がある。
【0057】
本技術はこの問題に、リングバッファメタデータ記憶領域34に記憶された第1の参照インジケータ及び第2の参照インジケータを含むリングバッファメタデータを使用する手法によって対処し、この手法では、生成者及び消費者は、順序通りに、及び順序外で更新を解放することができる。
図4aは、リングバッファメタデータを使用したこの手法の実施を概略的に示し、これにより、上述したような、先行の生成者又は消費者による解放の完了を待機する必要は生じない。
図4aに示す、リングバッファ50を使用するシステムでは、待ち行列シーケンスの先頭端部に対して第1の参照インジケータ66及び第2の参照インジケータ70が提供され、待ち行列シーケンスの末尾端部に対して第1の参照インジケータ72及び第2の参照インジケータ68が提供される(第1の参照インジケータ66が消費者によって更新され、第1の参照インジケータ72が生成者によって更新されることを除き、待ち行列シーケンスの先頭端部に対して提供される第1の参照インジケータ66は、待ち行列シーケンスの末尾端部に対して提供される第1の参照インジケータ72と実質的に同じである)。データ項目の待ち行列シーケンスの先頭端部に対して提供される第1の参照インジケータの一例である先頭端部インジケータと、これもまたデータ項目の待ち行列シーケンスの末尾端部に対して提供される第1の参照インジケータの一例である末尾端部インジケータとを参照しながら、本技術について説明する。具体的には、本技術は、待ち行列シーケンスの先頭端部に対する生成者用の第1の参照インジケータ66である先頭端部インジケータと、待ち行列シーケンスの末尾端部に対する消費者用の第1の参照インジケータ72である末尾端部インジケータと、を提供する。各生成者は、生成者用の第1の参照インジケータ66である先頭端部インジケータを読み出して、待ち行列シーケンスの先頭端部に対応するスロット位置を特定することができ、また、各生成者は、第2の参照インジケータ68を更新してリングバッファのスロットを取得し、第1の参照インジケータ72を更新してスロットを解放することができる。同様に、各消費者は、消費者用の第1の参照インジケータ72である末尾端部インジケータを読み出して、待ち行列シーケンスの末尾端部に対応するスロット位置を特定することができ、また、各消費者は、第2の参照インジケータ70を更新してリングバッファのスロットを取得し、第1の参照インジケータ66を更新してスロットを解放することができる。このように、待ち行列シーケンスの先頭端部に対して提供される先頭端部インジケータは、リングバッファ内の待ち行列シーケンスの先頭端部にある現在スロットの位置の指示子と、先頭端部でリングバッファと相互作用する消費者によって順序外で解放された1つ以上の更新が存在するか否かについての指示子と、先頭端部でリングバッファと相互作用する消費者によって順序外で解放された1つ以上の更新に対応する1つ以上の保留スロットの、最も遠い位置の指示子と、を含む。同様に、待ち行列シーケンスの末尾端部に対して提供される末尾端部インジケータは、リングバッファ内の待ち行列シーケンスの末尾端部にある現在スロットの位置の指示子と、末尾端部でリングバッファと相互作用する生成者によって順序外で解放された1つ以上の更新が存在するか否かについての指示子と、先頭端部でリングバッファと相互作用する生成者によって順序外で解放された1つ以上の更新に対応する1つ以上の保留スロットの、最も遠い位置の指示子と、を含む。リングバッファ内の待ち行列シーケンスの先頭端部にある有効なデータ項目の現在の状態を追跡記録する目的で、生成者先頭端部に対して現在スロットインジケータ及び保留スロットインジケータを含む先頭端部インジケータ(第1の参照インジケータ)66が提供され、消費者先頭端部に対して期待スロットインジケータを含む第2の参照インジケータ70が提供され、さらなる処理のために待ち行列シーケンスの先頭端部からデータ項目を取り出すためのデキュー操作が、先頭端部インジケータ66及び第2の参照インジケータ70にアトミックにアクセスするアトミック操作に基づいて行われる。同様に、リングバッファ内の待ち行列シーケンスの末尾端部にある有効なデータ項目の現在の状態を追跡記録する目的で、消費者末尾端部に対して現在スロットインジケータ及び保留スロットインジケータを含む末尾端部インジケータ(第1の参照インジケータ)72が提供され、生成者末尾端部に対して期待スロットインジケータを含む第2の参照インジケータ68が提供され、待ち行列シーケンスの末尾端部にデータ項目を追加するためのエンキュー操作が、末尾端部インジケータ72及び第2の参照インジケータ680にアトミックにアクセスするアトミック操作に基づいて行われる。
【0058】
図4bは、末尾端部インジケータ72及び第2の参照インジケータ68を含むリングバッファメタデータを使用した、待ち行列シーケンスの末尾端部に対するこの手法の実施を概略的に示す。複数の独立した作用者が並列でリングバッファと相互作用するシステムでは、第1の生成者及び第2の生成者がそれぞれ、待ち行列シーケンスの末尾端部にデータ項目をエンキューしようとすることがあり、各生成者は、リングバッファの1つ以上のスロットを取得するために取得プロセスを実行し、この取得プロセスは、生成者末尾端部に対して提供された第2の参照インジケータ68を、アトミック操作(例えば、各生成者が1つ以上のスロットを取得するためにリングバッファメタデータにアトミックにアクセスできるようにするアトミック取得操作)に基づいて更新しようとするステップを含む。例えば、第1の生成者(生成者1)は、リングバッファのスロットfを取得するための取得プロセスを、生成者末尾端部に対して提供された第2の参照インジケータ68をスロットfに更新することによって行ってもよく(これは、
図4bでは、第1の生成者が第2の参照インジケータ68を、「A」とラベル付けされた矢印がスロットfを指すように更新することで表される)、第2の生成者(生成者2)は、リングバッファのスロットgを取得するための取得プロセスを、生成者末尾端部に対して提供された第2の参照インジケータ68をスロットgに更新することによって行ってもよい(
図4bの、スロットgを指す「B」とラベル付けされた矢印を参照)。よって、作用者によってアトミックにアクセスされて更新される(インクリメントされる)、この第2の参照インジケータ68を設けることによって、適格になった作用者が、所与のどのスロットについても作用者間の競合なくスロットを取得できるようにする機構が得られる。本明細書において、「インクリメントされる」は、ある値の単位修正を意味することを意図し、慣例によって、これは加算(例えば、1だけ加算)」によるものでもよいことに留意されたい。ただし、増加は必須ではなく、この「インクリメント」は、減少(例えば、1だけ減算)によって実施されるようにも同様に選択され得る。
【0059】
このように、各生成者は、リングバッファの1つ以上のスロットを取得するために、アトミック操作に従って期待スロットインジケータの値を変更することによって第2の参照インジケータ68を更新し、ある生成者がリングバッファの1つ以上のスロットの取得に成功すると、その生成者に期待スロット値が返される。したがって、リングバッファのスロットの取得に成功した各生成者は、その生成者がスロットを取得した時点の期待スロットインジケータの値に対応する期待スロット値を入手する。第1の生成者がスロットfの取得に成功すると、スロットfの位置を示す期待スロット値が第1の生成者に返され得、第2の生成者がリングバッファのスロットgの取得に成功すると、スロットgの位置を示す期待スロット値が第2の生成者に返され得る。第1の生成者及び第2の生成者は、それぞれ取得したスロットf及び取得したスロットgに同時に書き込むことができ、続いて、第1及び第2の生成者は、書き込まれたデータを有する取得したスロットを解放するために解放プロセスを実行することができ、この解放プロセスは、消費者末尾端部に対して提供された末尾端部インジケータ72を更新しようとするステップを含む。したがって、各生成者は、その生成者のための期待スロット値と、末尾端部インジケータ72の現在スロットインジケータとの比較に従って、その生成者が取得したスロットを解放しようとし、その生成者による末尾端部インジケータ72を更新する試みが成功すると、末尾端部インジケータ72の現在スロットインジケータと保留スロットインジケータのうち少なくとも1つが更新される。
【0060】
場合によっては、第1の生成者が第2の生成者の前に完了することがあり、第2の生成者がスロットgを解放するために末尾端部インジケータ72を更新しようとする前に、第1の生成者はスロットfを解放するために末尾端部インジケータ72を更新しようとする。この場合、第1の生成者は、アトミック操作に従って末尾端部インジケータ72を更新しようとし、このアトミック操作では、第1の生成者は期待スロット値(アトミック操作に従って第2の参照インジケータを更新したときに第1の生成者に返される値)を、末尾端部インジケータ72の現在スロットインジケータと比較する。解放プロセスを実行するとき、第1の生成者は、末尾端部インジケータ72にアトミックにアクセスして、期待スロット値を末尾端部インジケータ72の現在スロットインジケータと比較する。現在スロットインジケータが期待スロット値と一致するとき、これは、第1の生成者が、待ち行列シーケンスの順序に関して順序通りにスロットを解放しようとしていることを示す。よって、現在スロットインジケータの値が期待スロット値と一致するとき、解放プロセスは、消費者末尾端部に対して提供された末尾端部インジケータ72の現在スロットインジケータを、現在スロットインジケータの値を所定量だけ修正してスロットfの位置を示すようにすることによって、アトミックに更新する(これは、スロットfを指す、「C」ととラベル付けされた矢印によって表される)。あるプロセスによる複数スロットのエンキューとデキューをサポートするために、期待スロット値と現在スロットインジケータとの比較には、範囲比較を使用することができる。このように、消費者末尾端部に対して提供された末尾端部インジケータ72の現在スロットインジケータを更新することによって、第1の生成者は更新を解放する。同様に、第1の生成者が末尾端部インジケータ72を更新することによってスロットfを解放した後に、第2の生成者が完了するときは、第2の生成者は、スロットgを解放するために末尾端部インジケータ72を更新しようとし(これは、スロットgを指す、「D」とラベル付けされた矢印によって表される)、待ち行列シーケンスの順序に関して順序通りにスロットを解放する。理解されるように、このことは、第1の生成者と第2の生成者のそれぞれがスロットを取得し、それぞれが更新を順序通りに解放するために末尾端部インジケータ72の現在スロットインジケータを更新する例を提供する。
【0061】
場合によっては、第2の生成者が第1の生成者の前に完了することがあり、第1の生成者がスロットfを解放するために末尾端部インジケータ72を更新しようとする前に、第2の生成者は、スロットgを解放するために末尾端部インジケータ72を更新しようとする。これは、複数の生成者がリングバッファと相互作用し、待ち行列の順序に関して順序外で更新を解放する例である。この場合、第2の生成者は、アトミック操作に従って末尾端部インジケータ72を更新しようとし、このアトミック操作では、第2の生成者は、第2の生成者のための期待スロット値を、末尾端部インジケータ72の現在スロットインジケータと比較する。解放プロセスを実行するとき、第2の生成者は、末尾端部インジケータ72にアトミックにアクセスして、期待スロット値を末尾端部インジケータ72の現在スロットインジケータと比較する。この場合、第1の生成者は、まだスロットfを解放しておらず、したがって第2の生成者は、待ち行列シーケンスの順序に関して順序外でスロットgを解放するために末尾端部インジケータ72を更新しようとし、末尾端部インジケータ72の現在スロットインジケータの値は第2の生成者のための期待スロット値と一致しない。現在スロットが期待スロット値と一致しないとき、これは、生成者が、待ち行列シーケンスの順序に関して順序外でスロットを解放しようとしていることを示し、したがって、現在スロットインジケータを更新することなく保留スロットインジケータの値をリングバッファの保留スロットの存在及び位置を示すように修正することによって、末尾端部インジケータ72の保留スロットインジケータが更新される。具体的には、第2の生成者が、第1の生成者の前に更新を解放しようとする(すなわち、順序外で解放しようとする)場合、第2の生成者は、末尾端部インジケータ72にアトミックにアクセスして、スロットgが保留スロットであることを示すように保留スロットインジケータを更新する。このように、先に取得されたスロットが他の生成者によって解放されるのを待ってから更新を解放する代わりに、生成者は、ある生成者によって既に解放されているスロットがリングバッファ内にあることを示すように保留スロットインジケータを更新することによって、更新を順序外で解放することができる。したがって、効果的に、更新を順序外で解放する生成者によって保留スロットインジケータをアトミックに更新することができ、これにより、そのような生成者は、先行する生成者を待機することなく放免されることができる。
【0062】
末尾端部インジケータ72を更新しようとするこの動作は様々な方法で実施できるが、いくつかの実施形態では、末尾端部インジケータ72を更新しようとすることは、アトミックな比較交換(compare-and-swap:CAS)操作を含む。この操作は、末尾端部インジケータ72から現在スロットインジケータの値を読み出して、そのアトミック操作を実行している作用者のための期待スロット値と現在スロットインジケータの値を比較するまでをアトミックに行い、このことは、値が一致するか否かによって、その作用者が更新を順序通りに解放しようとしているのか、順序外で解放しようとしているのかを示す。現在スロットインジケータの値をアトミックに読み出すことに加えて、保留スロットインジケータの値もまた末尾端部インジケータ72からアトミックに読み出されて、保留スロットインジケータに関連する値に基づいて、1つ以上の保留アップデートが存在するかを示す指示子を提供することができる。
【0063】
ある生成者による、末尾端部インジケータ72の保留スロットインジケータを更新する順序外の解放に続いて、システム内の他の生成者が末尾端部インジケータ72を更新しようとすることによって更新を解放し、末尾端部インジケータ72の現在スロットインジケータが、その生成者のための期待スロット値と一致しないときには続いて、追加の保留スロットの存在及び位置を示すように保留スロットインジケータを更に更新する。ある生成者が、末尾端部インジケータ72をアトミックに更新しようとし、かつ、現在スロットインジケータがその生成者の期待スロット値と一致するとき、これは、その生成者が、待ち行列シーケンスの順序に関して順序通りにスロットを解放しようとしていることを示し、保留スロットインジケータは1つ以上の保留スロットが存在することを示し、これは、リングバッファが順序通りであり、かつ1つ以上の保留スロットが存在することを示す。この場合、保留スロットインジケータの示す1つ以上の保留スロットが特定される。そして、現在スロットに隣接するとして保留スロットインジケータにより示される連続した保留スロットの数に従って現在スロットインジケータの値を修正することによって末尾端部インジケータ72を更新することにより、現在スロットに隣接している連続した保留スロットを解放することができる。このように、リングバッファを使用するシステムは、システムが保留中の更新を有して順序通りであるときを特定することができ、データ項目のシーケンスの順序を維持する保留スロットインジケータに対する以前の更新が解放されるように、末尾端部インジケータ72が更新され得る。よって、複数の生成者が並列に実行して、同時エンキュー操作を行うことによって、処理すべきデータ項目を待ち行列に追加することができ、各生成者は、その生成者が解放を順序通りに行うのか順序外で行うのかに応じて、末尾端部インジケータ72の現在スロットインジケータ又は保留スロットインジケータのいずれかを更新することができる。この技術により、更新を順序外で解放できながら、データ項目が待ち行列シーケンスに追加される順序は維持されるように、現在スロットインジケータの更新を制御できるようになる。
【0064】
図4cは、先頭端部インジケータ(第1の参照インジケータ)66及び第2の参照インジケータ70を含むリングバッファメタデータを使用した、待ち行列シーケンスの先頭端部に対するこの手法の同様の実施を概略的に示す。複数の独立した作用者が並列でリングバッファと相互作用するシステムでは、第1の消費者及び第2の消費者がそれぞれ、待ち行列シーケンスの先頭端部でデータ項目をデキューしようとすることがあり、各消費者はリングバッファの1つ以上のスロットを取得するために取得プロセスを実行し、この取得プロセスは、消費者先頭端部に対して提供された第2の参照インジケータ70を、アトミック操作(すなわち、各消費者が1つ以上のスロットを取得するためにリングバッファメタデータにアトミックにアクセスできるようにするアトミック取得操作)に基づいて更新しようとするステップを含む。例えば、第1の消費者(消費者1)は、リングバッファのスロットaを取得するための取得プロセスを、生成者末尾端部に対して提供された第2の参照インジケータ68をスロットaに更新することによって行ってもよく(
図4cの、「W」とラベル付けされた矢印を参照)、第2の消費者(消費者2)は、リングバッファのスロットbを取得するための取得プロセスを、生成者末尾端部に対して提供された第2の参照インジケータ70をスロットbに更新することによって行ってもよい(
図4cの、「X」とラベル付けされた矢印を参照)。よって、作用者によってアトミックに読み出され更新される、この第2の参照インジケータ70を設けることによって、適格になった消費者が、所与のどのスロットについても消費者間の競合なくスロットを取得できるようにする機構が得られる。
【0065】
各消費者は、第2の参照インジケータ70を更新してリングバッファの1つ以上のスロットを取得することができ、消費者がリングバッファの1つ以上のスロットの取得に成功したときに消費者に返される期待スロット値を入手する。第1の消費者及び第2の消費者は、それぞれ取得したスロットa及び取得したスロットbに同時に書き込むことができ、続いて、第1及び第2の消費者は、取得したスロットを解放するために解放プロセスを実行することができ、この解放プロセスは、生成者先頭端部に対して提供された先頭端部インジケータ66を更新しようとするステップを含む。
【0066】
上記で
図4bを参照して説明した待ち行列シーケンスの末尾端部に関する技術と同様に、場合によっては、第1の消費者が第2の消費者の前に完了することもあるし(すなわち順序通り)、又は第1の消費者が第2の消費者の後に完了することもあり(すなわち順序外)、所与の消費者は、待ち行列シーケンスの順序を維持しながら更新を解放できるようにするために、その消費者が解放を順序通りに行うのか順序外で行うのかに応じて、先頭端部インジケータ66の現在スロットインジケータ又は保留スロットインジケータを更新することができる。更新を解放するとき、第1の消費者は、アトミック操作に従って先頭端部インジケータ66を更新しようとし、このアトミック操作では、第1の消費者が期待スロット値を、先頭端部インジケータ66の現在スロットインジケータとを比較する。期待スロット値を現在スロットインジケータと比較することによって、第1の消費者は、第1の消費者が待ち行列シーケンスの順序に対して順序通りであるか、順序外であるかを特定することができる。現在スロットインジケータの値が第1の消費者のための期待スロット値と一致するとき、消費者の解放プロセスは、生成者先頭端部に対して提供された先頭端部インジケータ66の現在スロットインジケータを、現在スロットインジケータの値を所定量だけ修正してスロットaの位置を示すようにすることによって、アトミックに更新する(スロットaを指す、「Y」とラベル付けされた矢印によって表される)。このように、生成者先頭端部に対して提供された先頭端部インジケータ66の現在スロットインジケータを更新することによって、第1の消費者は更新を解放する。同様に、第1の消費者が先頭端部インジケータ66を更新することによってスロットaを解放した後に、第2の消費者が完了するときは、第2の消費者は、スロットbを解放するために先頭端部インジケータ66を更新しようとし(これは、スロットbを指す、「Z」とラベル付けされた矢印によって表される)、よって、待ち行列シーケンスの順序に関して順序通りにスロットを解放する。
【0067】
場合によっては、第2の消費者が第1消費者の前に完了することがあり、この場合、第2の消費者は、先頭端部インジケータ66の現在スロットインジケータを期待スロット値とを比較する。この場合、第2の消費者は、順序外で先頭端部インジケータ66を更新しようとしているため、比較した値は一致しない。よって、第2の消費者は、スロットbが保留スロットであることを示すように先頭端部インジケータ66の保留スロットインジケータを更新することによって、更新を解放する。したがって、効果的に、更新を順序外で解放する消費者によって保留スロットインジケータをアトミックに更新することができ、これにより、そのような消費者は、先行する消費者が完了するのを待機することなく放免されることができる。
【0068】
図5は、この手法をサポートするために本技術が提供するリングバッファメタデータ構造を概略的に示す。リングバッファメタデータ記憶領域34は、待ち行列シーケンスの先頭端部及び末尾端部をそれぞれ追跡記録するために、末尾端部メタデータ35及び先頭端部メタデータ36を含むメタデータを記憶しており、末尾端部メタデータ35及び先頭端部メタデータ36は、コア12、14で実行している作用者(例えば、スレッド)によってアトミックに更新される。末尾端部メタデータ35は、第1の参照インジケータ(末尾端部インジケータ)72、第2の参照インジケータ68、及びリングサイズインジケータ73を含む。同様に、先頭端部メタデータ36は、第1の参照インジケータ(先頭端部インジケータ)66、第2の参照インジケータ70、及びリングサイズインジケータ67を含む。生成者が末尾端部メタデータ35を更新することによって、システムはエンキュー操作を追跡記録することができ、一方で、消費者が先頭端部メタデータ36を更新することによって、システムはデキュー操作を追跡記録することができる。いくつかの例では、第1の参照インジケータ66、72は、現在スロットインジケータに割り当てられた32ビットと保留スロットインジケータに割り当てられた32ビットとを含む、64ビットスカラー値であり、第2の参照インジケータ68、70は、32ビットスカラー値であってもよく、リングサイズインジケータ73、67は、32ビットスカラー値であってもよい。リングバッファを追跡記録するために使用されるスカラー値には他のサイズも考えられることに留意されたい。例えば、場合によっては、第1の参照インジケータ68、70は、64ビットを超えるスカラー値によって表されてもよく、第1の参照インジケータ68、70の保留スロットインジケータは、32ビットを超えるスカラー値によって表されてもよい。理解されるように、それぞれのインスタンスは、
図5に示すように、それぞれのインジケータへのアトミックアクセスが可能になる様式で記憶される。
【0069】
リングバッファメタデータは、リングサイズインジケータ73を含み、これは、例えば、それぞれの要素の数によるリングバッファのサイズを示す32ビットスカラー値であってもよい。X個の要素を有するリングバッファを使用して、任意の一時点において最大でX-1個の要素が占有されるデータ項目の待ち行列シーケンスを実装することができ、これは、先頭端部と末尾端部の位置を識別することによってリングバッファが満杯のときとリングバッファが空のときを識別するために、リングバッファに常に少なくとも1つの空のスロットがあるようにするためである。あるいは、リングバッファが完全に占有されているか否かを示す追加のビットが提供されるならば、X個の要素を有するリングバッファを使用して、任意の一時点において最大でX個の要素が占有されるデータ項目の待ち行列シーケンスを実装することもできる。いくつかの例では、リングバッファは、2
N(Nは整数)によって与えられる数の要素を有し、各要素はメモリ22内に記憶位置を有する。作用者は、末尾端部で新しいデータ項目をエンキューし、先頭端部で古いデータ項目をデキューするためにリングバッファと相互作用し、先頭端部ポインタ及び末尾端部ポインタは、先頭端部及び末尾端部の位置がリングバッファを循環して移動するように更新される。リングバッファメタデータ記憶領域34内に記憶されたリングサイズインジケータ73並びに先頭端部ポインタ及び末尾端部ポインタにアクセスすることにより、リングバッファ内の占有されている(空ではない)スロットの数、及びまた占有されていない(空の)スロットの数を判断することができる。
図7を参照して後に説明するように、エンキュー操作の一部として取得プロセスを実行するときに、占有されているスロットへの上書きを確実に防ぐために、作用者によってリングサイズインジケータ73にアクセスすることができる。
【0070】
保留スロットインジケータは限界インジケータを含み、限界インジケータは、リングバッファの現在スロットから待ち行列シーケンスの順序に関して最も遠くに位置する最遠保留スロットの位置を示す。保留スロットインジケータはまた、変化インジケータを含み、変化インジケータの変化は、現在スロットと最遠保留スロットとの間の保留スロットの数の変化を示す。作用者が順序外で更新を解放するとき、保留スロットインジケータに関連する値を修正するために、保留スロットインジケータが作用者によってアトミックに更新される。保留スロットインジケータの値の修正は、限界インジケータと変化インジケータのうち少なくとも1つの修正を含む。保留中のスロットが存在しない場合、更新を順序外に解放するための解放プロセスを実行する作用者は、第1の参照インジケータ66、72にアトミックにアクセスしようとし、成功した場合は、保留スロットインジケータの限界インジケータを、現在スロットインジケータの示す現在スロットの位置に対する保留スロットの位置を示すように更新する。換言すれば、保留中のスロットが存在しないことが保留スロットインジケータによって示されるときには、保留スロットインジケータに対する更新では、変化インジケータを更新せずに限界インジケータの値を修正することもできる。あるいは、変化インジケータが順序外の作用者による解放に常に応答して更新されるように、作用者が順序外の更新を解放するたびに変化インジケータが更新されてもよい。
【0071】
(前の段落で説明したように)保留スロットインジケータの限界インジケータによって示されるとおりに単一の保留スロットが存在する場合、順序外の更新を解放するために解放プロセスを実行する作用者は、第1の参照インジケータにアトミックにアクセスしようとし、限界インジケータが示すスロットの位置に対する、作用者が解放しようとしているスロットの位置に応じて、限界インジケータ又は変化インジケータのいずれかを修正することによって、保留スロットインジケータを更新する。限界インジケータの示す保留スロットの位置よりも現在スロットから遠くに位置するスロットを作用者が解放しようとしている場合には、作用者は、作用者が解放しようとしているスロットの位置を示すように限界インジケータの値を修正することによって、保留スロットインジケータを更新する。限界インジケータの示す保留スロットの位置よりも現在スロットから遠くに位置しないスロットを作用者が解放しようとしている場合には、(すなわち、作用者は、限界インジケータの示す保留スロットの位置よりも現在スロットから近いスロットを解放しようとしている)、限界インジケータを更新せずに変化インジケータの値を変更することによって、保留スロットインジケータを更新する。したがって、作用者は、現在スロットと、限界インジケータの示す現在スロットから最遠の保留スロットとの間に新しい保留スロットが存在することを示すように、変更インジケータを更新する。理解されるように、それぞれの作用者は、第1のインジケータを更新するために第1の参照インジケータにアトミックにアクセスしようとし、保留スロットインジケータは、第1の参照インジケータに関連する64ビット値のいくつかの部分を修正することによって更新される。
【0072】
図6は、アトミック取得プロセスを実施するときに一実施形態で取られるステップのシーケンス例を示す。このプロセスはステップ610で開始し、ここでシステム内のあるプロセスが、リングバッファの1つ以上のスロットを取得したいと望む。ステップ620で、当該プロセスは、更新プロセスを呼び出して(
図7に関して以下でより詳細に説明する)リングバッファメタデータにアトミックにアクセスし、リングバッファメタデータを更新する。具体的には、当該プロセスは、リングバッファメタデータにアトミックにアクセスして、第2の参照インジケータを更新する。次にステップ630で、このローカル処理の進行中に(別のプロセスによって)更新が行われたか判断される。(別のプロセスによって)更新が行われたと判断されると、フローはステップ620に戻って、リングバッファメタデータにアトミックにアクセスしてリングバッファメタデータを更新するために、当該プロセスによって再び更新プロセスが呼び出される。ステップ630で、このローカル処理の進行中、リングバッファメタデータに更新が行われなかったと判断されると、フローはステップ640に進み、取得プロセスが完了する。
【0073】
本技術の実施形態では、エンキュー(生成者)及びデキュー(消費者)操作でアトミック取得操作を実施することによってリングバッファのスロットを取得することができ、この操作では、消費者及び生成者の両方が共通のアトミック取得操作を使用して、待ち行列シーケンスの先頭端部又は末尾端部でリングバッファのスロットを取得することができる。よって、リングバッファのスロットを取得するためのアトミック操作を生成者及び消費者の両方によって使用することができ、エンキュー取得操作とデキュー取得操作の間の差異は、エンキュー取得操作にはリングバッファのスロットを取得するためにリングサイズの知識が必要であるのに対して、デキュー取得操作にはリングバッファのスロットを取得するためにリングサイズの知識は必要ないことである。エンキュー取得操作とデキュー取得操作の間のこの差異は、デキュー取得操作がリングバッファに書き込まれたスロットのみをデキューするのに対して(すなわち、デキューは、リングバッファの空の(占有されていない)スロットを取得するために行われてはならず、リングバッファに占有されている数だけのスロットを取得するためにのみ行われるべきである)、エンキュー取得操作がリングバッファの空のスロットを取得するために行われることによって生じる。換言すれば、エンキュー操作の取得に適格なリングバッファのスロットの数を判断するために計算が必要であり、その計算では、リングバッファのサイズが判断され(リングバッファサイズは、リングバッファメタデータ、具体的には、リングサイズインジケータ67、73にアクセスすることによってリングバッファのサイズを判断することによって、取得される)、内容が読み出される前に上書きすることなくリングバッファのスロットを取得する位置を確定するために、先頭端部と末尾端部の位置の差が計算される。エンキュー取得操作の一部として、先頭端部及び末尾端部の位置が獲得され、取得に適格なリングバッファのスロットの数(すなわち、空のスロットの数)を、適格なスロットの数=リングサイズ-(末尾端部位置-先頭端部位置)、という計算に基づいて判断することができる。よって、作用者によって取得できるスロットの数が現在占有されていないスロットの数に制限されるように、エンキュー取得操作のために適格なスロットの数を決定することができる。デキュー取得操作の一部として、リングバッファ内の占有されたスロットの位置及び数を判断するために先頭端部及び末尾端部の位置が獲得される。デキュー取得操作については、取得に適格なリングバッファのスロットの数は、適格なスロットの数=末尾端部位置-先頭端部位置、という計算に基づいて決定することができる。
【0074】
消費者は、デキュー取得操作を行って、待ち行列シーケンスの先頭端部(消費者)に対して提供された第2の参照インジケータ70にアトミックにアクセスして更新し、待ち行列シーケンスの先頭端部で1つ以上のスロットを取得しようとする。同様に、生成者は、エンキュー取得操作を行って、待ち行列シーケンスの末尾端部に対して提供された第2の参照インジケータ68にアトミックにアクセスして更新し、待ち行列シーケンスの末尾端部で1つ以上のスロットを取得しようとする。
図7は、アトミック取得プロセスを実行するとき、具体的には(最初のステップ700が示すように)あるプロセスが先頭端部(消費者)又は末尾端部(生成者)に対して提供された第2の参照インジケータを更新しようと望むときに、一実施形態で行われるステップのシーケンスを示す。この場合、末尾端部の位置を示すように生成者によって更新される、待ち行列シーケンスの末尾端部に対するスロット位置インジケータは、第2の参照インジケータの一例であり、先頭端部の位置を示すように消費者によって更新される、待ち行列シーケンスの先頭端部に対するスロット位置インジケータは、第2の参照インジケータの別の例である。ステップ701で、取得すべきスロットの数がプロセスによって判断され、プロセスは、リングバッファメタデータにアトミックにアクセスして更新することによって、リングバッファのスロットの数を取得しようとする。ステップ702で、プロセスがエンキュー処理のために(すなわち、待ち行列処理されたシーケンスの末尾端部で)スロットを取得しようとしているのか、又はデキュー処理のために(すなわち、待ち行列処理されたシーケンスの先頭端部で)スロットを取得しようとしているのか、判断される。ステップ702で、プロセスがエンキュー処理のためにスロットを取得しようしていると判断されると、フローはステップ703に進み、エンキュー処理のための取得に適格なスロットの数が、リングサイズ(又はリングバッファの容量)、先頭端部の位置及び末尾端部の位置に基づいて計算される。リングバッファ内の占有されたスロットの数は[末尾端部-先頭端部]によって得られ、したがって、ステップ703では、エンキュー処理のための取得に適格なスロットの数は、リングサイズ-(末尾端部-先頭端部)、という計算を使用して計算される。ステップ702で、プロセスがデキュー処理のためにスロットを取得しようしていると判断されると、フローはステップ704に進み、デキュー処理のための取得に適格なスロットの数が、先頭端部の位置及び末尾端部の位置に基づいて、末尾端部-先頭端部という計算を使用して計算される。ステップ705で、適格なスロットの数の計算結果が、プロセスが取得しようとしているスロットの数と比較される。ステップ705で、適格なスロットの数が、プロセスが取得しようしているスロットの数よりも多いと判断されると、フローは工程706に進み、1つ以上のスロットがプロセスによって取得されたことを反映するように、第2の参照インジケータが更新される。ステップ705で、適格なスロットの数が、プロセスが取得しようとしているスロットの数より少ないと判断されると、フローはステップ707に進み、適格なスロットの数がゼロに等しいかどうかが判定され、そうであれば、プロセスがリングバッファの任意のスロットを取得することは不可能である。ステップ707で、適格なスロットの数がゼロに等しいと判断されると、フローはステップ702に戻って再びスロットを取得しようとしてもよい。又は、任意選択で、スロットが取得されていないことを示す値がプロセスに返されてもよく、プロセスはステップ700で開始する取得操作を再試行するか否かを判断することができる。ステップ707で、スロットの数がゼロに等しくないと判断されると、フローはステップ706に進み、第2の参照インジケータを更新する。このように、リングバッファの適格なスロットの数が、プロセスが取得しようとしているスロットの数よりも少ない場合、プロセスは、プロセスが取得しようとしているスロットの全てを取得することができなくても、リングバッファのいくつかのスロットを取得することができる。あるいは、プロセスが取得のために要求されたスロットの全数を取得できないとき、フローはステップ702に戻ってもよい。ステップ706で、プロセスがリングバッファで取得すべきスロットの数に従って第2の参照インジケータを更新すると、フローはステップ708に進み、このプロセスの進行中に間に第2の参照インジケータが変更されたか判断される。ステップ708で、このプロセスの間に第2の参照インジケータが変更されたと判断されると、フローはステップ702に戻るので、第2の参照インジケータへの更新は完了せず、したがって失敗となり、プロセスは再び第2の参照インジケータを更新しようとする(すなわち、このプロセスの進行中に別のプロセスによって第2のインジケータが変更されたときは、スロットを取得しようとする試みは失敗する)。よって、プロセスは、このプロセスの間に第2の参照インジケータが変更されなかったとステップ708で判断されるまで、第2の参照インジケータを更新しようとし続ける。ステップ708で、このプロセスの間に第2の参照インジケータが変更されなかったと判断されると、フローはステップ709に進み、第2の参照インジケータがアトミックに更新され、第2の参照インジケータの元の値を示す期待スロット値と、プロセスによって取得されたスロットの数を示す値とがプロセスに返される。よって、ステップ709ではプロセスに2つの値がプロセスに返され、第1の値は、プロセスが1つ以上のスロットを取得した時点の第2の参照インジケータの値に対応し、したがって、プロセスによって書き込み(エンキュー)又は読み出し(デキュー)に使用できるリングバッファの第1のスロットの位置を示し、第2の値は、アトミック取得操作によって取得されたスロットの数を示す。このことは、プロセスに返された値をプロセスが使用して、エンキュー又はデキュー操作がリングバッファのどこで行われるのかを判断することができ、プロセスによって取得されたスロットの数を示す値を使用して、プロセスが、そのプロセスが取得しようとしたスロットの全てを取得したのか一部を取得したのか判断することができることを意味する。
【0075】
図8は、ブロックのない解放プロセスを実行するときに一実施形態で取られるステップのシーケンス例を示す。このプロセスはステップ810で開始し、ここでシステム内のあるプロセスが、1つ以上のスロットを解放したいと望む。ステップ820で、そのプロセスは更新プロセスを呼び出して(
図9に関して以下でより詳細に説明する)リングバッファメタデータにアトミックにアクセスし、リングバッファメタデータを更新する。具体的には、プロセスは、リングバッファメタデータにアトミックにアクセスして、プロセスが1つ以上のスロットを取得したときにプロセスに返された期待スロット値に従って第1の参照インジケータを更新しようとする(
図6及び7に関して前述したように)。プロセスによる、第1の参照インジケータを更新するためのこの試みは「クリティカル区間」であり、複数の異なるプロセスが同時に第1の参照インジケータにアトミックにアクセスして更新しようとする可能性があるために、アトミックに行われなければならないという意味でクリティカルである。したがって、この「クリティカル区間」で行われる操作は、複数のプロセスがアトミックにリングバッファメタデータにアクセスして更新することができ、かつ、両方のプロセスが同時に第1の参照インジケータを更新しようとするときに別のプロセスが一時的に別のプロセスによって更新の解放をブロックされ得るように、比較交換(CAS)操作を使用して実施できる。換言すれば、複数のプロセスがリングバッファメタデータにアトミックにアクセスして更新することができ、1つのプロセスは、同時に別のプロセスが第1の参照インジケータを更新しようしているときは、更新を再試行する必要があり得る。これは、1つのプロセスが別のプロセスによってブロックされる可能性があることを意味し得るが、この「クリティカル区間」では各プロセスは短い相互作用に制限され、この区間中の別のプロセスによる1つのプロセスのブロックは、有意な時間的制約を表さない。ステップ830で、このローカル処理の進行中に、(別のプロセスによって)更新が行われたか判断される。(別のプロセスによって)更新が行われたと判断されると、フローはステップ820に戻って、リングバッファメタデータにアトミックにアクセスしてリングバッファメタデータを更新するために、当該プロセスによって再び更新プロセスが呼び出される。ステップ830で、このローカル処理の進行中、リングバッファメタデータに更新が行われなかったと判断されると、フローはステップ840に進み、解放プロセスが完了する。
【0076】
図9は、アトミック解放プロセスを実行するとき、具体的には(最初のステップ900が示すように)あるプロセスが第1の参照インジケータを更新しようと望むときに、一実施形態で行われるステップのシーケンスを示す。
この場合、第1の参照インジケータは、リングバッファの現在スロットの位置の指示子と、リングバッファと相互作用する作用者によって順序外で解放された1つ以上の更新があるか否かを示す指示子と、リングバッファと相互作用する作用者によって順序外で解放された1つ以上の更新に対応するリングバッファの1つ以上の保留スロットの位置の指示子と、を含む。したがって、現在スロットの位置を示し、かつ、待ち行列シーケンスの1つ以上の保留スロットの存在及び位置も示す、先頭端部インジケータ又は末尾端部インジケータは第1の参照インジケータの一例であり、データ項目の待ち行列シーケンスの順序に対して順序通りに、又は順序外で更新を解放する作用者によって更新され得る。第1の参照インジケータの一例である先頭端部インジケータ又は末尾端部インジケータは、現在スロットインジケータ、変化インジケータ、及び限界インジケータの3つのそれぞれのインジケータを含む。よって、先頭端部インジケータ又は末尾端部インジケータを更新しようとするプロセスは、
図9に示される処理に従って、現在スロットインジケータ、変化インジケータ及び限界インジケータのうちの少なくとも1つを更新しようとする。
【0077】
あるプロセスがエンキュー又はデキュー操作の書き込み又は読み出し段階を完了すると、そのプロセスは解放プロセスを開始し、よってステップ900で第1の参照インジケータを更新しようとする。ステップ901で、プロセスが1つ以上のスロットを取得したときにプロセスに返された期待スロット値が、リングバッファメタデータと比較するために、プロセスによって保持される。ステップ902で、プロセスによって保持された期待スロット値が第1の参照インジケータの現在スロットインジケータの値と一致するか、判断される。論じたように、リングバッファメタデータを更新しようとするこの試みは、アトミックな比較交換(CAS)操作に基づいて実施することができる。期待されるスロット値が現在スロットインジケータの値と一致しないとき、これは、プロセスが順序付けされたデータ項目のシーケンスを順序外で解放しようとしていることを示し(すなわち、プロセスはデータ項目の待ち行列シーケンスの順序に対して「先行して」、又は「遅れて」更新を解放しようとしている)、フローは903に進んで、プロセスが順序付けされたデータ項目のシーケンスに「先行」した様式で更新を解放しようとしているか否か判断される。ステップ903で、期待スロット値が現在スロットインジケータの値と比較され、期待スロット値が、現在スロットインジケータの示すスロット位置に先行していない(すなわち、現在の値に先行せず、かつ一致しておらず、よって、「後ろにある」)ときは、フローはリングバッファメタデータを更新せずにステップ911に進む。ステップ911で、プロセスがブロックのない解放プロセスを完了したことを示すために、プロセスに値が返される。このように、プロセスが、待ち行列シーケンスの順序に対して「後ろにある」更新を解放しようとしているとき、そのプロセスに値が返されることができ、この場合、プロセスは、第1の参照インジケータを更新せずにブロックなしの解放プロセスを完了することができる。
【0078】
ステップ903で、期待スロット値が現在値の示すスロット位置の前にあるスロットを示すと判断されるたときには、フローはステップ904に進み、第1の参照インジケータの保留スロットインジケータは、プロセスが解放しようとしている更新に対応する1つ以上の保留スロットの存在及び位置を示すように、プロセスによって更新される。理解されるように、ステップ903で、プロセスは、前述した様式で、現在スロットインジケータの示す位置に対する期待スロット値の示す位置に応じて、かつ、現在、保留スロットインジケータによって1つ以上の保留スロットが既に示されているか否かに応じて、保留スロットインジケータの限界インジケータ及び変化インジケータのうち少なくとも1つを更新する。ステップ904でプロセスが保留スロットインジケータを更新すると、フローはステップ910に進み、このプロセスの進行中に第1の参照インジケータが変更されたか否か(すなわち、このプロセスの進行中に、第1の参照インジケータの現在スロットインジケータ又は保留スロットインジケータが変更されたか)判断される。ステップ910で、このプロセス中に第1の参照インジケータが変更されたと判断されると、フローはステップ901に戻って、第1の参照インジケータに対する更新は失敗となり(ステップ904での保留スロットに対する更新が完了せず、従って失敗となる)、プロセスは第1の参照インジケータを再び更新しようとする。よって、プロセスは、ステップ911で値が返されるまで、第1の参照インジケータを更新しようとし続ける。ステップ910で、このプロセスの間に第1の参照インジケータが変更されなかったと判断されると、フローはステップ911に進み、第1の参照インジケータがアトミックに更新され、プロセスがブロックなしの解放プロセスを完了したことを示す値がステップ911でプロセスに返される。
【0079】
再びステップ902を参照すると、期待スロット値が現在スロットインジケータの値と一致していると判断されたときは、プロセスが順序付けられたデータ項目のシーケンスに対して順序通りに更新を解放しようとしていることを示し、次いで、フローはステップ905に進み、プロセスは、リングバッファに1つ以上の保留スロットが存在するかどうかを保留スロットインジケータが示すか判断する。ステップ905で、保留スロットが存在しないと判断されると、フローはステップ907に進み、プロセスは現在スロットインジケータを更新して、現在スロットインジケータの値を期待の値に従って修正する。ステップ907で現在スロットインジケータが更新されると、フローはステップ910に進んで、このプロセスの進行中に第1の参照インジケータが変更されたか判断され、このプロセスの進行中の時間の間に第1の参照インジケータが更新されたと判断されると、フローはステップ901に戻って、第1の参照インジケータへの更新は失敗となる(すなわち、ステップ907における現在スロットインジケータへの更新が完了せず、したがって失敗となる)。1つ以上の保留スロットの存在が保留スロットインジケータによって示されているとステップ905で判断されると、フローはステップ906に進み、1つ以上の保留スロットのいずれかが現在値の示すスロットに隣接しているか判断される。このことは、保留スロットインジケータを使用して、現在スロットと、限界インジケータの示す最遠保留スロットとの間に位置する保留スロットを探して走査することによって達成され得る。順序通りのプロセスは、現在スロットと最遠保留スロットとの間に位置する保留スロットを探して走査を行うことができる。いくつかの例では、走査中に変化インジケータの値が変化したときは、これは、現在スロットと最遠保留スロットとの間の保留スロットの数が変化したことを示し、したがって、プロセスは、現在スロットと最遠保留スロットとの間でリングバッファを再走査して、順序通りに解放できる保留スロットが存在するか特定することができる。1つ以上の保留スロットが存在し、そのうちのいずれも現在値の示すスロットに隣接していないときは、フローはステップ907に進み、現在スロットインジケータが更新される。ただし、ステップ906で、1つ以上の保留スロットが現在値の示すスロットに隣接していると判断されると、フローはステップ908に進み、現在スロットインジケータの値がプロセスによって更新される。理解されるように、ステップ908で、現在スロットインジケータの値は、先に論じたように、現在スロットに隣接していると判断された連続するスロットの数に従って更新される。ステップ908で現在スロットインジケータが更新されると、フローはステップ909に進み、現在スロットインジケータにステップ908で加えられた更新に従って保留スロットインジケータが更新される。よって、ステップ909では、保留スロットインジケータは、現在スロットインジケータがステップ908で更新された後の、リングバッファの1つ以上の保留スロットの存在及び位置を示すように更新される。このように、保留スロットインジケータは、現在値の示すスロットと隣接しないとステップ908で判断された1つ以上の保留スロットが保留スロットインジケータによって示されるように、ステップ909で更新されることができる。ステップ906で保留中のスロットの全てが現在値の示すスロットと隣接していると判断された場合は、保留スロットインジケータ909に対する更新は、保留スロットが存在しないことを示すように保留スロットインジケータが更新されるというものであってもよい。ステップ909で保留スロットインジケータが更新されたとき、フローはステップ910に進み、例えばアトミックな比較交換(CAS)操作を使用して、このプロセスの進行中に第1の参照インジケータが変更されたか判断される。ステップ910で、このプロセス中に第1の参照インジケータが変更されたと判断されると、フローは901に戻って、第1の参照インジケータに対する変更が失敗となり、プロセスは第1の参照インジケータを再び更新しようとする。ステップ910で、このプロセス中に第1の参照インジケータが変更されていないと判断されると、フローはステップ911に進み、プロセスがブロックなしの解放プロセスを完了したことを示す値がプロセスに返される。
【0080】
図10は、本技術の様々な例を具体化できるデータ処理装置100を概略的に示す。装置はデータ処理回路120を備え、この回路は、この回路が実行する命令シーケンスに応じてデータ項目にデータ処理操作を行う。例えば、データ処理回路120は、
図1に示されるコア12及び14を含んでもよく、それらのコアでスレッドT0、T1、T2及びT3が実行する。命令は、データ処理回路120がアクセスできるメモリ140から取り出され、この目的のために、当業者にはよく知られた様式でフェッチ回路160が提供される。データ処理装置がアクセスするメモリ140は、
図1及び
図5に示すリングバッファ記憶領域32及びリングバッファメタデータ記憶領域34を含み得ることに留意されたい。更に、フェッチ回路160によって取得された命令は命令デコーダ回路180に渡され、この回路は、処理回路120並びにレジスタのセット200及びロード/ストアユニット220の設定及び動作の様々な側面を制御するように構成された制御信号を生成する。一般に、データ処理回路120はパイプライン方式で配置されてもよいが、その詳細は本技術に関連しない。
図10が表す一般的な構成は当業者にはよく知られており、更に詳細な説明は、単に簡潔性の理由から免じられる。
図10に示すように、レジスタ200はそれぞれ、複数のデータ要素のための記憶領域を含み、処理回路120が指定のレジスタ内の指定のデータ要素にデータ処理操作を施すことができ、又は、又は指定のレジスタ内の指定のデータ要素グループ(「ベクトル」)にデータ処理操作を施すことができるようになっている。
【0081】
命令の実行においてデータ処理回路120が必要とするデータ値、及び、データ処理命令の結果として生成されたデータ値は、ロード/ストアユニット220によってメモリ140に書き込まれ、メモリ140から読み出される。また、一般に、
図1のメモリ140は、典型的には、処理回路が次に実行する所定命令シーケンス(「プログラム」)の一部として本技術の命令が記憶され得る、コンピュータ可読記憶媒体の例として見ることができることに留意されたい。ただし、処理回路は、RAM内、ROM内、ネットワークインタフェース経由など、様々な異なるソースからの、そのようなプログラムにアクセスしてもよい。本開示は、
図5に示すようなリングバッファメタデータ34にアトミックにアクセスして更新するために処理回路120が実行できる命令を提供する。このように、システム内の作用者は、末尾端部メタデータ35及び先頭端部メタデータ36を含むメタデータ34にアクセスする命令を実行して、待ち行列シーケンスの末尾端部及び先頭端部を追跡記録することができる。リングバッファのスロットをアトミックに取得し、リングバッファのスロットをアトミックに解放するために作用者によって実行され得る命令が、提供される。
【0082】
よって本技術はリングバッファ取得命令を提供し、これらの命令は、上述したとおり、メモリ140から取得され、処理回路120によって実行される命令シーケンスの一部を形成してもよい。したがって、理解されるように、そのような例では、上述の作用者は、処理回路120内で実行するプロセスとして具体化され、作用者は、リングバッファメタデータ34にアクセスして更新することによってリングバッファの1つ以上のスロットを取得するようにアトミック取得命令を行うために、定められたリングバッファ取得命令を使用することができる。
【0083】
リングバッファ取得命令は、以下の例のように、順序付けの取得(A)、順序付けの解放(L)、並びに、順序付けの取得及び解放(AL)という、リングバッファ取得命令の3つのバリエーションを含む。よって、これらのバリエーションは、以下のように表され得る。
RBACQ[E,D]{A,L,AL}<Xs>,<Wt>,[<Xn|SP>],
式中、Eは命令がエンキュー処理のためのものであることを示し、Dは命令がデキュー処理のためのものであることを示す。これらの例では、命令において指定されるレジスタは次のものである。
<Wt>-目標レジスタフィールドに符号化される項目の、要求される数を有する32ビット汎用レジスタ。
<Xs>-結果として得られる開始インデックスと、ソースレジスタフィールド内に符号化された項目の実際の数とがロードされる64ビット汎用レジスタ。
<Xn|SP>-追加レジスタフィールドに符号化される64ビットのベースレジスタ又はSP。
【0084】
よって、32ビット汎用レジスタ<Wt>は、取得の作用者が要求するスロットの数を指定する。64ビット汎用レジスタ<Xs>には、リングバッファの開始インデックスと、作用者によって取得されたスロットの数がロードされる。32ビット汎用レジスタ<Wt>、64ビット汎用レジスタ<Xs>及び64ビットベースレジスタ<Xn|SP>は、リングバッファ取得命令の必須パラメータであることに留意されたい。
【0085】
同様に、本開示は、リングバッファ解放命令を提供し、これらの命令もまた、上述したとおり、メモリ140から取得され、処理回路120によって実行される命令シーケンスの一部を形成してもよい。したがって、理解されるように、そのような例では、上述の作用者は、処理回路120内で実行するプロセスとして具体化され、作用者は、リングバッファメタデータ34にアクセスして更新することによってリングバッファの1つ以上のスロットを解放するようにアトミック取得命令を行うために、定められたリングバッファ解放命令を使用することができる。
【0086】
リングバッファ解放命令は、例えば、順序付けの取得(A)、順序付けの解放(L)、並びに、順序付けの取得及び解放(AL)という、リングバッファ取得命令の3つのバリエーションを含む。よって、これらのバリエーションは、以下のように表され得る。
RBREL{A,L,AL}<Xs>,<Xt>,[<Xn|SP>].
これらの例では、命令において指定されるレジスタは次のものである。
<Xt>-開始インデックスと、ソースレジスタフィールドに符号化された解放すべき項目の数とを有する64ビット汎用レジスタ。
<Xs>-現在と保留の古い値がロードされる、64ビット汎用レジスタ。
<Xn|SP>-追加レジスタフィールドに符号化される64ビットベースレジスタ又はSP。
【0087】
したがって、64ビット汎用レジスタ<Xt>は、リングバッファの開始インデックスと、作用者が解放するスロットの数を指定する。64ビット汎用レジスタ<Xs>には、期待スロットインジケータの期待される値がロードされる。64ビット汎用レジスタ<Xt>、<Xs>及び<Xn|SP>は、リングバッファ解放命令セットの必須パラメータである。
【0088】
したがって、理解されるように、上述のリングバッファ取得命令及びリングバッファ解放命令をサポートするシステムでは、デコード回路(
図10の例の項目180など)は、これらの命令を認識して、適切な制御信号を(例えば、
図10の処理回路100、レジスタ200、及び、ロード/ストアユニット220に対して)をアサートして、上述の取得及び解放プロセスを行わせるように構成される。
【0089】
図11は、使用され得るシミュレータの実装形態を示す。先に説明した実施形態は、当該技術をサポートする特定の処理ハードウェアを動作するための装置及び方法の観点から本発明を実装するものであるが、コンピュータプログラムを使用して実装される本明細書に記載の実施形態に従った命令実行環境を提供することも可能である。このようなコンピュータプログラムは、ハードウェアアーキテクチャのソフトウェアベースの実装形態を提供する限りにおいて、シミュレータと呼ばれることが多い。シミュレータコンピュータプログラムの種類には、エミュレータ、仮想マシン、モデル、及び動的バイナリトランスレータを含むバイナリトランスレータが含まれる。典型的には、シミュレータの実装形態は、任意選択でホストオペレーティングシステム720を実行して、シミュレータプログラム710をサポートしながら、ホストプロセッサ730で実行してもよい。いくつかの構成では、ハードウェアと提供される命令実行環境との間に複数のシミュレーション層が存在してもよく、及び/又は、同じホストプロセッサ上で提供される複数の異なる命令実行環境が存在してもよい。歴史的に、合理的な速度で実行するシミュレータの実装形態を提供するためには、強力なプロセッサが必要とされてきたが、互換性又は再利用の理由から別のプロセッサにネイティブなコードを実行したい場合など、特定の状況では、そのようなアプローチが正当化される場合がある。例えば、シミュレータの実装形態では、ホストプロセッサのハードウェアではサポートされていない追加機能を備えた命令実行環境を提供すること、又は異なるハードウェアアーキテクチャに典型的に関連する命令実行環境を提供することができる。シミュレーションの概要は、「Some Efficient Architecture Simulation Techniques」、Robert Bedichek、1990年冬USENIX Conference、53~63頁に記載されている。
【0090】
これまで特定のハードウェア構成又は機能を参照して実施形態を説明してきたが、その点で同等の機能が、シミュレーションされた実施形態では適切なソフトウェア構成又は機能によって提供されてもよい。例えば、特定の回路は、シミュレーションされた実施形態において、コンピュータプログラムロジックとして実装されてもよい。同様に、レジスタ又はキャッシュなどのメモリハードウェアは、ソフトウェアのデータ構造としてシミュレーションされた実施形態で実装することができる。先に説明した実施形態で参照されるハードウェア要素の1つ又は複数がホストハードウェア(例えば、ホストプロセッサ730)上に存在する構成では、いくつかのシミュレートされた実施形態は、適切な場合にはホストハードウェアを利用してもよい。
【0091】
シミュレータプログラム710は、コンピュータ読み出し可能な記憶媒体(非一時的媒体であってもよい)に記憶されてもよく、シミュレータプログラム710によってモデル化されているハードウェアアーキテクチャのアプリケーションプログラムインタフェースと同じプログラムインタフェース(命令実行環境)をターゲットコード700に提供する。よって、上述したリングバッファ取得命令及びリングバッファ解放命令を含め、目標コード700のプログラム命令は、シミュレータプログラム710を使用して命令実行環境内から実行されてもよく、そのため、上述の装置のハードウェア機能を実際には有さないホストコンピュータ730がそれらの機能をエミュレートすることができる。
【0092】
簡潔に要約すると、装置、方法、プログラム、並びに、リングバッファの取得命令及び解放命令が提供される。データ項目の待ち行列シーケンスを保持する複数のスロットを含むリングバッファを記憶するリングバッファ記憶回路が開示される。データ処理回路は、1つ以上の処理すべきデータ項目を待ち行列シーケンスに追加し、1つ以上のデータ項目を処理するために待ち行列シーケンスから取り出すための、複数のプロセスを実行する。各プロセスは、リングバッファ内の少なくとも1つのスロットを取得する取得プロセスを実行し、続いて、その少なくとも1つのスロットを解放する解放プロセスを実行するように構成される。リングバッファメタデータ記憶回路が、第1の参照インジケータ及び第2の参照インジケータを含む、リングバッファのメタデータを記憶する。第1の参照インジケータは、現在のスロットの位置を示す現在スロットインジケータと、リングバッファの複数のスロットのうち1つ以上の保留スロットの存在及び位置を示す保留スロットインジケータとを含む。第2の参照インジケータは、現在スロットの期待される位置を示す期待スロットインジケータを備え、1つ以上の保留スロットは、現在スロットの後に取得されたものであり、プロセスは、そのプロセスがリングバッファの少なくとも1つのスロットを取得するために取得プロセスを実行するときの期待スロットインジケータの値を示す期待スロット値を有する。解放プロセスは、リングバッファの第1の参照インジケータを更新しようとするステップを含み、そのステップは、そのプロセスのための期待スロット値が現在スロットインジケータと比較されるアトミック操作を含む。現在スロットインジケータが期待スロット値と一致するときは、現在スロットインジケータの値を所定の値によって修正することによって、少なくとも現在スロットインジケータが更新される。現在スロットインジケータが期待スロット値と一致しないときは、現在スロットインジケータを更新せずに、リングバッファの1つ以上の保留スロットの存在及び位置を示すように保留スロットインジケータの値を修正することによって保留スロットインジケータが更新される。
【0093】
本出願において、「~ように構成される(configured to)」という用語は、装置の要素が、定義された動作を実行することができる構成を有することを意味するために使用される。このコンテキストにおいて、「構成」は、ハードウェア又はソフトウェアの相互接続の構成又は方法を意味する。例えば、装置は、定義された動作を提供する専用ハードウェアを有してもよく、又はプロセッサ若しくは他の処理デバイスは、機能を実行するようにプログラムされてもよい。「~ように構成される」は、定義された動作を提供するために、装置要素を任意の方法で変更する必要を意味しない。
【0094】
本明細書では例示的な実施形態について添付の図面を参照して詳細に説明してきたが、理解されるように、本発明はそれらと寸分違わない実施形態に制限されるのではなく、また、添付の特許請求の範囲に定める本発明の範囲及び精神から逸脱することなく、当業者によって様々な変更、追加、及び修正を行うことができる。例えば、従属請求項の特徴の様々な組み合わせは、本発明の範囲から逸脱することなく、独立請求項の特徴によって作製され得る。
【国際調査報告】