(57)【要約】コンピュータシステムはハードウェアバッファコントローラを含む。バッファへのメモリアクセスリクエストはバッファ内のアドレスを含まず、バッファにアクセスするスレッドは、バッファ内の位置への何れのポインタにもアクセスせず、それを直接更新することもない。メモリアクセスリクエストは、ハードウェアバッファコントローラにアドレス指定され、ハードウェアバッファコントローラは、自体の現在の状態からアドレスを特定し、そのアドレスへのメモリアクセスコマンドを発行する。ハードウェアバッファコントローラは、自体の状態をメモリアクセスリクエストに応じて更新する。ハードウェアバッファコントローラは、自体の状態を評価し、オーバーフロー若しくはアンダーフローな状態、又はほぼオーバーフロー若しくはほぼアンダーフローな状態に応じてスレッドスケジューラへイベントを出力する。次いで、スレッドスケジューラは、ハードウェアバッファコントローラへのメモリアクセスリクエストをスレッドが発行することをブロックしてもよい。実施されるバッファはＦＩＦＯ又はその他の種類のバッファであってもよい。【選択図】図２Ａ
2019502201.tif 000002
【特許請求の範囲】
【請求項１】
実行可能なデータを格納するメモリデバイスを提供することと、
前記メモリデバイスに結合され、前記実行可能なデータを抽出及び実行するように動作可能な処理デバイスを提供することと、
前記処理デバイスによって、バッファとして前記メモリデバイスの一部分を割り当てることと、
前記処理デバイスによって、前記バッファを参照するためにハードウェアバッファコントローラのある状態を引き起こすことと、
前記処理デバイスによって、アプリケーションを実行することであって、前記バッファにアクセスするためのリクエストを実行することを含み、前記リクエストが、前記ハードウェアバッファコントローラのみを参照し、前記バッファ内の何れのアドレスも含まない、アプリケーションを実行することと、
前記リクエストに応答して、前記処理デバイスによって前記リクエストを前記ハードウェアバッファコントローラに入力することと、
前記ハードウェアバッファコントローラによって、前記リクエストを処理することであって、前記リクエストを処理することが前記リクエスト毎に、
前記ハードウェアバッファコントローラの前記状態に基づいて前記バッファ内のアドレスを生成すること、
前記アドレスを含むメモリアクセス命令を前記メモリデバイスへ出力すること、
前記ハードウェアバッファコントローラの前記状態を更新すること
により行われる、前記リクエストを処理することと
を含む、方法。
【請求項２】
前記ハードウェアバッファコントローラは先入れ先出し（ＦＩＦＯ）バッファを実施する、請求項１に記載の方法。
【請求項３】
前記ハードウェアバッファコントローラの前記状態は読み出しポインタ及び書き込みポインタを含み、
前記ハードウェアバッファコントローラの前記状態を更新することは、前記リクエストの内の書き込みリクエスト毎に前記書き込みポインタをインクリメントすることを含み、
前記ハードウェアバッファコントローラの前記状態を更新することは、前記リクエストの内の読み出しリクエスト毎に前記読み出しポインタをインクリメントすることを含む、
請求項２に記載の方法。
【請求項４】
前記書き込みポインタをインクリメントすることは、１クロック周期中に受信された複数の書き込みリクエストの数を特定することと、前記複数の書き込みリクエストの前記数だけ前記書き込みポインタをインクリメントすることとを含み、
前記書き込みポインタをインクリメントすることは、前記クロック周期中に受信された複数の読み出しリクエストの数を特定することと、前記複数の読み出しリクエストの前記数だけ前記読み出しポインタをインクリメントすることとを含む、
請求項３に記載の方法。
【請求項５】
前記ハードウェアバッファコントローラの前記状態に基づいて前記バッファ内の前記アドレスを生成することは、前記リクエストの内の書き込みリクエスト毎に前記書き込みポインタの現在値を出力することを含み、
前記ハードウェアバッファコントローラの前記状態に基づいて前記バッファ内の前記アドレスを生成することは、前記リクエストの内の読み出しリクエスト毎に前記読み出しポインタの現在値を出力することを含む、
請求項３に記載の方法。
【請求項６】
前記処理デバイスによって、前記書き込みリクエストの量と前記読み出しリクエストの量との差を計算することと、
前記処理デバイスによって、前記差が第１の閾値よりも少なくゼロではないと判定することと、
前記差が第１の閾値よりも少なくゼロではないと判定することに応じて、前記処理デバイスによって、前記バッファがほぼ空であることを示すイベントを出力することと、
前記バッファがほぼ空であることを示す前記イベントに応じて、前記処理デバイスによって、前記処理デバイスによって実行される１つ以上の実行スレッドが読み出しリクエストを生成することをブロックすることと
を更に含む、請求項５に記載の方法。
【請求項７】
前記ハードウェアバッファコントローラによって、前記書き込みリクエストの量と前記読み出しリクエストの量との差を計算することと、
前記ハードウェアバッファコントローラによって、前記差が第１の閾値よりも大きいと判定することと、
前記差が第１の閾値よりも大きいと判定することに応じて、前記ハードウェアバッファコントローラによって、前記バッファがほぼ満杯であることを示すイベントを出力することと、
前記バッファがほぼ満杯であることを示す前記イベントに応じて、前記処理デバイスによって、前記処理デバイスによって実行される１つ以上の実行スレッドが書き込みリクエストを生成することをブロックすることと
を更に含む、請求項５に記載の方法。
【請求項８】
前記ハードウェアソフトウェア構成要素によって前記リクエストを処理することは、
前記リクエストの内の複数の書き込みリクエストを集計することと、
前記複数の書き込みリクエストに対応する前記バッファ内の複数のアドレスを含む集計書き込み命令を前記メモリデバイスへ送信することと、
前記リクエストの内の複数の読み出しリクエストを集計することと、
前記複数の読み出しリクエストに対応する前記バッファ内の複数のアドレスを含む集計読み出し命令を前記メモリデバイスへ送信することと
を更に含む、請求項１に記載の方法。
【請求項９】
前記複数の書き込みリクエストは、前記リクエストの内のその他のリクエストが前記ハードウェアバッファコントローラに入力されるよりも前に、前記書き込みリクエストの内の少なくとも１つの書き込みリクエストが受信されるような重複方式で、複数の実行スレッドによって発行される、請求項８に記載の方法。
【請求項１０】
前記処理デバイスによって、前記ハードウェアバッファコントローラの前記状態を評価することと、
前記処理デバイスによって、前記ハードウェアバッファコントローラの前記状態が閾条件を満たすと判定することと、
前記ハードウェアバッファコントローラの前記状態が前記閾条件を満たすと判定することに応じて、前記処理デバイスによって、前記ハードウェアバッファコントローラを参照する更なるリクエストを前記複数の実行スレッドが発行することをブロックすることと
を更に含む、請求項９に記載の方法。
【請求項１１】
実行可能なデータを格納するためのメモリデバイスと、
前記メモリデバイスに結合され、前記実行可能なデータを抽出及び実行するように動作可能な処理デバイスと、
前記処理デバイス及び前記メモリデバイスに結合されたハードウェアバッファコントローラであって、
前記メモリデバイス内の何れの格納位置に対する何れのアドレスも含まないメモリアクセスリクエストを前記処理デバイスから受信し、
前記ハードウェアバッファコントローラの状態に基づいて、バッファに割り当てられた前記メモリデバイスの領域内の生成アドレスを生成し、
前記生成アドレスを含むメモリアクセス命令を前記メモリデバイスへ出力し、
前記ハードウェアバッファコントローラの前記状態を更新する
ようにプログラムされた前記ハードウェアバッファコントローラと
を含む、システム。
【請求項１２】
前記ハードウェアバッファコントローラの前記状態は先入れ先出し（ＦＩＦＯ）バッファを実施する、請求項１１に記載のシステム。
【請求項１３】
前記ハードウェアバッファコントローラは、前記リクエストの内の書き込みリクエスト毎に書き込みポインタをインクリメントすることによって、前記ハードウェアバッファコントローラの前記状態を更新するように更にプログラムされ、
前記ハードウェアバッファコントローラの前記状態を更新することは、前記リクエストの内の読み出しリクエスト毎に読み出しポインタをインクリメントすることを含む、
請求項１２に記載のシステム。
【請求項１４】
前記ハードウェアバッファコントローラは、１クロック周期中に受信された複数の書き込みリクエストの数を特定することと、前記複数の書き込みリクエストの前記数だけ前記書き込みポインタをインクリメントすることとによって、前記書き込みポインタをインクリメントするように更にプログラムされ、
前記ハードウェアバッファコントローラは、前記クロック周期中に受信された複数の読み出しリクエストの数を特定することと、前記複数の読み出しリクエストの前記数だけ前記読み出しポインタをインクリメントすることとによって、前記読み出しポインタをインクリメントするように更にプログラムされる、
請求項１３に記載のシステム。
【請求項１５】
前記ハードウェアバッファコントローラは、前記リクエストの内の書き込みリクエスト毎に前記書き込みポインタの現在値を出力することによって、前記ハードウェアバッファコントローラの前記状態に基づいて、前記バッファに割り当てられた前記メモリデバイスの前記領域内の前記生成アドレスを生成するように更にプログラムされ、
前記ハードウェアバッファコントローラは、前記リクエストの内の読み出しリクエスト毎に前記読み出しポインタの現在値を出力することによって、前記ハードウェアバッファコントローラの前記状態に基づいて、前記バッファに割り当てられた前記メモリデバイスの前記領域内の前記生成アドレスを生成するように更にプログラムされる、
請求項１３に記載のシステム。
【請求項１６】
前記ハードウェアバッファコントローラは、
前記書き込みリクエストの量と前記読み出しリクエストの量との差を計算し、
前記差が第１の閾値よりも少なくゼロではない場合に、前記バッファがほぼ空であることを示すイベントを出力する
ように更にプログラムされ、
前記処理デバイスは、前記バッファがほぼ空であることを示す前記イベントに応じて、前記処理デバイスによって実行される１つ以上の実行スレッドが読み出しリクエストを生成することをブロックするように更にプログラムされる、
請求項５に記載のシステム。
【請求項１７】
前記ハードウェアバッファコントローラは、
前記書き込みリクエストの量と前記読み出しリクエストの量との差を計算し、
前記差が第２の閾値よりも大きい場合に、前記処理デバイスによって、前記バッファがほぼ満杯であることを示すイベントを出力する
ように更にプログラムされ、
前記処理デバイスは、前記バッファがほぼ満杯であることを示す前記イベントに応じて、前記処理デバイスによって実行される１つ以上の実行スレッドが書き込みリクエストを生成することをブロックするように更にプログラムされる、
請求項１６に記載のシステム。
【請求項１８】
前記ハードウェアソフトウェア構成要素は、
前記リクエストの内の複数の書き込みリクエストを集計することと、
前記複数の書き込みリクエストに対応する前記バッファ内の複数のアドレスを含む集計書き込み命令を前記メモリデバイスへ送信することと、
前記リクエストの内の複数の読み出しリクエストを集計することと、
前記複数の読み出しリクエストに対応する前記バッファ内の複数のアドレスを含む集計読み出し命令を前記メモリデバイスへ送信することと
によって前記リクエストを処理するように更にプログラムされる、請求項１１に記載のシステム。
【請求項１９】
前記ハードウェアソフトウェア構成要素は、前記リクエストの内のその他のリクエストが前記ハードウェアバッファコントローラに入力されるよりも前に、前記書き込みリクエストの内の少なくとも１つの書き込みリクエストが受信されるような重複方式で、前記処理デバイスによって実行される複数の実行スレッドから前記複数の書き込みリクエストを受信するようにプログラムされる、請求項１１に記載のシステム。
【請求項２０】
前記ハードウェアバッファコントローラは、
前記ハードウェアバッファコントローラの前記状態を評価し、
前記ハードウェアバッファコントローラの前記状態が閾条件を満たす場合に、前記ハードウェアバッファコントローラを参照する更なるリクエストを前記複数の実行スレッドが発行することを、前記処理デバイスによってブロックすることを引き起こす
ように更にプログラムされる、請求項１９に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＦＩＦＯバッファを実施するためのシステム及び方法に関する。
【背景技術】
【０００２】
従来のコンピュータシステムでは、先入れ先出し（ＦＩＦＯ）バッファは複数のスレッドによってアクセスされる場合がある。しかしながら、従来のシステムでは、同時に１つのスレッドのみがＦＩＦＯバッファにアクセスすることができる。このことにより、遅延と処理オーバヘッドとがもたらされるが、これは、ＦＩＦＯバッファのデータ構造が別のスレッドにより解放されることを待ちながら、スレッドをブロックすることによって同時アクセスを阻止するためである。
【０００３】
本明細書に開示されるシステム及び方法は、複数のスレッドにより同時にアクセス可能なＦＩＦＯバッファを実施するための改善したアプローチを提供する。
【図面の簡単な説明】
【０００４】
発明の利点が容易に理解されるように、簡単に上述した発明のより具体的な説明は、添付の図面で説明された特定の実施形態を参照することによって提供されることになる。これらの図面は、発明の典型的な実施形態のみを示し、それ故、その範囲を限定するとみされないと理解され、発明は、添付の図面の使用を通じて更なる特異性と詳細が記述及び説明される。
【図１】本発明の実施形態に従った方法を実施するのに適したコンピュータシステムの概略ブロック図である。
【図２Ａ】本発明の一実施形態に従ったハードウェアＦＩＦＯバッファを実施するための構成要素の概略ブロック図である。
【図２Ｂ】本発明の一実施形態に従ったハードウェアＦＩＦＯバッファを実施するための構成要素の概略ブロック図である。
【図３Ａ】本発明の一実施形態に従ったハードウェアＦＩＦＯバッファへの読み出し及び書き込みを実施するための方法のプロセスフロー図である。
【図３Ｂ】本発明の一実施形態に従ったハードウェアＦＩＦＯバッファへの読み出し及び書き込みを実施するための方法のプロセスフロー図である。
【図４】本発明の一実施形態に従ったハードウェアＦＩＦＯバッファを用いてバッファのオーバーフロー及びアンダーフローを防ぐための方法のプロセスフロー図である。
【発明を実施するための形態】
【０００５】
本明細書内で包括的に記述及びの図示されるような本発明の構成要素は、幅広い様々な異なる構成で配置及び設計され得ることが容易に理解されるであろう。したがって、図面で表されるような以下の発明の実施形態のより詳細な説明は、請求項で示されるような発明の範囲を限定することを意図せず、本発明に従って現在企図される実施形態の特定の例を代表するにすぎない。現在記述された実施形態は、全体を通じて同様の部分が同様の数字で示されている図面を参照することによって最も正確に理解されるであろう。
【０００６】
本発明に従った実施形態は、装置、方法、又はコンピュータプログラム製品として具体化されてもよい。したがって、本発明は、完全にハードウェアの実施形態、（ファームウェア、常駐ソフトウェア、マイクロコード等を含む）完全にソフトウェアの実施形態、又は“モジュール”若しくは“システム”として本明細書で概して全て称され得るソフトウェア及びハードウェアの態様の組み合わせの実施形態をとってもよい。更に、本発明は、任意の有形的表現媒体内で具体化されるコンピュータプログラム製品の形式をとってもよく、こうした有形的表現媒体内で、コンピュータ使用可能なプログラムコードが具体化される。
【０００７】
非一時的媒体を含めた、１つ以上のコンピュータ使用可能な又はコンピュータ可読な媒体の組み合わせが利用されてもよい。例えば、コンピュータ可読媒体は、携帯可能なコンピュータディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）デバイス、リードオンリーメモリ（ＲＯＭ）デバイス、消去可能プログラム可能リードオンリーメモリ（ＥＰＲＯＭ又はフラッシュメモリ）デバイス、携帯可能なコンパクトディスクリードオンリーメモリ（ＣＤＲＯＭ）、光学記憶デバイス、及び磁気記憶デバイスの内の１つ以上を含んでもよい。選択された実施形態では、コンピュータ可読媒体は、命令実行システム、装置（apparatus）、又はデバイス（device）によってされる、又はそれに関連して使用するためのプログラムを含み得、格納し得、通信し得、伝搬し得、又は搬送し得る任意の非一時的媒体を含んでもよい。
【０００８】
本発明の動作を遂行するためのコンピュータプログラムコードは、Ｊａｖａ、スモールトーク、又はＣ＋＋等のオブジェクト指向プログラミング言語、及び、“Ｃ”プログラミング言語若しくは同様のプログラミング言語等の同様の従来の手続型プログラミング言語を含む１つ以上のプログラミング言語の任意の組み合わせで書き込まれてもよい。プログラムコードは、スタンドアローンなソフトウェアパッケージとしてのコンピュータシステム上で全体的に実行されること、スタンドアローンなハードウェアユニット上で実行されること、コンピュータから幾らか間隔が空けられたリモートコンピュータ上で部分的にされること、又はリモートコンピュータ若しくはサーバ上で全体的に実行されることもある。後者の場合では、リモートコンピュータは、ローカルエリアネットワーク（ＬＡＮ）又は広域ネットワーク（ＷＡＮ）を含む任意の種類のネットワークを通じてコンピュータに接続されてもよく、又は該接続は（例えば、インターネットサービスプロバイダを用いてインターネットを通じて）外部のコンピュータへなされてもよい。
【０００９】
本発明は、本発明の実施形態に従った方法、装置（システム）、及びコンピュータプログラム製品のフローチャートの説明及び／又はブロック図を参照しながら以下に記述される。フローチャートの説明及び／又はブロック図中の各ブロック、並びにフローチャートの説明及び／又はブロック図中のブロックの組み合わせは、コンピュータプログラム命令又はコードによって実施され得ることが理解されるであろう。これらのコンピュータプログラム命令を、機械を生産するための汎用コンピュータ、専用コンピュータ、又はその他のプログラム可能なデータ処理装置のプロセッサに供給することもでき、こうすることで、その命令が、コンピュータ又はその他のプログラム可能なデータ処理装置のプロセッサを介して実行され、フローチャート及び／又はブロック図の１つ以上のブロックで指定される機能／作用を実施するための手段を作り出す。
【００１０】
これらのコンピュータプログラム命令を、特定の機能を行うようにコンピュータ又はその他のプログラム可能なデータ処理装置に命令を出すことが可能な非一時的コンピュータ可読媒体に格納することもでき、こうすることで、コンピュータ可読媒体に格納された該命令がフローチャート及び／又はブロック図の１つ以上のブロックで指定される機能／作用を実施する命令手段を含む製品を生み出す。
【００１１】
コンピュータプログラム命令はまたを、コンピュータ又はその他のプログラム可能なデータ処理装置上にロードして、一連の動作ステップをコンピュータ又はその他のプログラム可能装置上で実行させて、コンピュータ実施プロセスであって、コンピュータ又はその他のプログラム可能装置上で実行される命令が、フローチャート及び／又はブロック図の１つ以上のブロックで指定される機能／作用を実施するためのプロセスを提供するようなコンピュータ実施プロセスを生み出してもよい。
【００１２】
図１は、例示的な計算デバイス１００を説明するブロック図である。計算デバイス１００は、本明細書で論じられるような様々な手続を実行するために使用されてもよい。計算デバイス１００は、サーバ、クライアント、又は任意のその他のコンピューティングエンティティとして機能し得る。計算デバイスは、本明細書で論じられるような様々な監視機能を実行し得、本明細書で論じられるアプリケーションプログラム等、１つ以上のアプリケーションプログラムを実行し得る。計算デバイス１００は、デスクトップコンピュータ、ノートブックコンピュータ、サーバコンピュータ、ハンドヘルドコンピュータ、及びタブレットコンピュータ等の任意の幅広い計算デバイスであり得る。
【００１３】
計算デバイス１００は、１つ以上のプロセッサ１０２、１つ以上のメモリデバイス１０４、１つ以上のインタフェース１０６、１つ以上の大容量記憶デバイス１０８、１つ以上の入出力（Ｉ／Ｏ）デバイス１１０、及び表示デバイス１３０を含み、それら全てがバス１１２に結合される。（１つ以上の）プロセッサ１０２は、（１つ以上の）メモリデバイス１０４及び／又は（１つ以上の）大容量記憶デバイス１０８に格納された命令を実行する１つ以上のプロセッサ又はコントローラを含む。（１つ以上の）プロセッサ１０２は、キャッシュメモリ等の様々な種類のコンピュータ可読媒体をも含む。
【００１４】
（１つ以上の）メモリデバイス１０４は、揮発性メモリ（例えば、ランダムアクセスメモリ（ＲＡＭ）１１４）及び／又は不揮発性メモリ（例えば、リードオンリーメモリ（ＲＯＭ）１１６）等の様々なコンピュータ可読媒体を含む。（１つ以上の）メモリデバイス１０４は、フラッシュメモリ等の再書き込み可能なＲＯＭをも含んでもよい。
【００１５】
（１つ以上の）大容量記憶デバイス１０８は、磁気テープ、磁気ディスク、光ディスク、及び固体状態メモリ（例えば、フラッシュメモリ）等の様々なコンピュータ可読媒体を含む。図１に示すように、特定の大容量記憶デバイスが、ハードディスクドライブ１２４である。様々なコンピュータ可読媒体からの読み出し及び／又は様々なコンピュータ可読媒体への書き込みができるように、（１つ以上の）大容量記憶デバイス１０８には様々なドライブも含まれてもよい。（１つ以上の）大容量記憶デバイス１０８は、取り外し可能媒体１２６及び／又は不揮発性媒体を含む。
【００１６】
（１つ以上の）入出力デバイス１１０は、データ及び／又はその他の情報が計算デバイス１００に入力され得るように、又は計算デバイス１００から抽出され得るようにする様々なデバイスを含む。例示的な（１つ以上の）入出力デバイス１１０は、カーソル制御デバイス、キーボード、キーパッド、マイクロホン、モニタ若しくはその他の表示デバイス、スピーカ、プリンタ、ネットワークインタフェースカード、モデム、レンズ、及びＣＣＤ若しくはその他の画像取込デバイス等を含む。
【００１７】
表示デバイス１３０は、計算デバイス１００の１人以上のユーザに情報を表示可能な任意の種類のデバイスを含む。表示デバイス１３０の一例は、モニタ、表示端末、及び映像投射デバイス等を含む。
【００１８】
（１つ以上の）プロセッサ１０２及び／又は表示デバイス１３０にはグラフィック処理ユニット（ＧＰＵ）１３２が結合されてもよい。ＧＰＵは、コンピュータ生成の画像をレンダリングし、その他のグラフィック処理を実行するように動作可能であってもよい。ＧＰＵは、（１つ以上の）プロセッサ１０２等の汎用プロセッサの幾つか又は全ての機能を含んでもよい。ＧＰＵは、画像処理に特有の付加的機能をも含んでもよい。ＧＰＵは、座標変換、シェーディング、テクスチャリング、ラスタイゼーション、及びコンピュータ生成の画像をレンダリングするのに役立つその他の機能に関連するハードコードされた及び／又はハードワイヤードのグラフィック機能を含んでもよい。
【００１９】
（１つ以上の）インタフェース１０６は、計算デバイス１００がその他のシステム、デバイス、又は計算環境と相互作用できるようにする様々なインタフェースを含む。例示的な（１つ以上の）インタフェース１０６は、ローカルエリアネットワーク（ＬＡＮ）、広域ネットワーク（ＷＡＮ）、無線ネットワーク、及びインターネットへのインタフェース等の任意の数の異なるネットワークインタフェース１２０を含む。その他の（１つ以上の）インタフェースは、ユーザインタフェース１１８及び周辺デバイスインタフェース１２２を含む。（１つ以上の）インタフェース１０６は、１つ以上のユーザインタフェース要素１１８をも含んでもよい。（１つ以上の）インタフェース１０６は、プリンタ、ポインティングデバイス（マウス、トラックパッド等）、及びキーボード等のためのインタフェース等、１つ以上の周辺インタフェースをも含んでもよい。
【００２０】
バス１１２は、（１つ以上の）プロセッサ１０２、（１つ以上の）メモリデバイス１０４、（１つ以上の）インタフェース１０６、（１つ以上の）大容量記憶デバイス１０８、及び（１つ以上の）入出力デバイス１１０が、互いに通信を行うだけでなく、バス１１２に結合されたその他のデバイス又は構成要素と通信できるようにする。バス１１２は、システムバス、ＰＣＩバス、ＩＥＥＥ１３９４バス、及びＵＳＢバス等の幾つかの種類のバス構造体のうちの１つ以上を表す。
【００２１】
説明目的で、プログラム及びその他の実行可能プログラム構成要素が別々のブロックとして本明細書では示されるが、そうしたプログラム及び構成要素は、計算デバイス１００の異なる記憶構成要素中に様々な時間に存在し得、（１つ以上の）プロセッサ１０２により実行されることが理解される。或いは、本明細書で記述されるシステム及び手続は、ハードウェア、又はハードウェア、ソフトウェア、及び／若しくはファームウェアの組み合わせで実施され得る。例えば、本明細書で記述されるシステム及び手続の１つ以上を遂行するように１つ以上の特定用途向け集積回路（ＡＳＩＣ）がプログラムされ得る。
【００２２】
図２Ａを参照すると、処理デバイス１０２は、１つ以上のスレッド２００を実行してもよい。上述のように、コンピュータシステム１００は、複数の処理デバイス１０２を含んでもよい。処理デバイス１０２の内の任意の１つ、又は処理デバイス１０２の組み合わせが、本明細書の以下の説明において“処理デバイス”１０２に属する機能を実行し得る。スレッドは、処理デバイス１０２により実行されるアプリケーションによってインスタンス化されてもよい。プロセッサは、処理資源を分配してもよく、あるスレッド２００から別のスレッドへ従来の方法で実行を切り替えてもよい。スレッド２００は、メモリデバイス１０４を含み、処理デバイス１０２とメモリデバイス１０４との間に置かれたメモリコントローラを含むこともあるメモリサブシステム２０４に、メモリアクセスリクエスト２０２（例えば、読み出し及び書き込みのリクエスト）を発行してもよい。メモリアクセスリクエスト２０２は、＜オペコード、ソースタイプ、ソースアドレス、宛先タイプ、宛先アドレス＞等のフィールド（ここで、オペコードは、実行される動作を示すコードであり、ソースタイプ及び宛先タイプは、何れのメモリデバイス１０４へのアクセスかを示し、ソースアドレスは、データを抽出する記憶装置１０４内の位置であり、宛先アドレスは、データが書き込まれるメモリデバイス１０４内のである）の内の幾つか又は全てを含む命令等、当該技術分野で周知の任意の従来型のメモリアクセスリクエストであってもよい。同様に、メモリリクエスト２０２の処理の方法は従来型であってもよい。オペコードは、読み出し動作を示してもよく、それ故、ソースアドレスからデータを抽出し、リクエストを発行したプロセッサスレッド２００に返すように実行されてもよい。同様に、オペコードは、データを宛先アドレスに書き込むように実行される書き込み動作を示してもよい。
【００２３】
プロセッサスレッド２００は、メモリアクセスリクエスト２０６をハードウェアバッファコントローラ２０８に発行してもよい。ハードウェアバッファコントローラ２０８は、本明細書中ではハードウェアバッファコントローラ２０８に属する機能を実行するように構成された回路を含むハードウェアデバイスである。ハードウェアバッファコントローラ２０８は、処理デバイス１０２と異なる若しくは同じダイ、又はメモリサブシステム２０４の１つ以上の構成要素と同じダイ上に設置されてもよい。メモリアクセスリクエスト２０６は、従来のメモリアクセスリクエスト２０２と同じ又は異なるフォーマットを有してもよい。しかしながら、メモリアクセスリクエスト２０６は、メモリデバイス２０４内の何れのアドレス又はアドレス範囲も直接参照しない。代わりに、メモリアクセスリクエスト２０２が、特定のハードウェアバッファコントローラ２０８を参照する。ハードウェアバッファコントローラ２０８は、１つ以上のバッファを定義するために初期化されてもよく、各々のバッファの定義は、当該バッファに割り当てられるメモリデバイス１０４のうちの１つメモリデバイス内のアドレスの割り当てを含む。該割り当ては、開始及び終了のアドレスの形式、又は開始アドレス及びバッファサイズの形式で、バッファ毎に記録されてもよい。各ハードウェアバッファコントローラ２０８の初期化は、最初の読み出し位置を指し示すように読み出しポインタ２１０を初期化することと、最初の書き込み位置を指し示すように書き込みポインタ２１２を初期化することを含んでもよい。複数のバッファがハードウェアバッファコントローラ２０８内で初期化されてもよく、又は複数のハードウェアコントローラ２０８が同様の方法で初期化されてもよい。
【００２４】
バッファに対するハードウェアバッファコントローラ２０８の初期化は、処理デバイス１０２によって引き起こされてもよく、処理デバイス１０２は、当該技術分野で周知の任意の方法に従ってメモリデバイス１０４内でバッファに対してメモリを同じように割り当ててもよい。バッファの初期化は、１つ以上の処理スレッド２００をインスタンス化したアプリケーションによって引き起こされよく、初期化されたバッファへの参照は、該バッファへの読み出し及び書き込みのためのスレッドによる使用のために、アプリケーションに返されてもよい。
【００２５】
図示の実施形態では、ハードウェアバッファコントローラ２０８は、ＦＩＦＯバッファを実施する。しかしながら、その他の種類のバッファ（例えば、後入れ先出し）も実施されてもよい。
【００２６】
ハードウェアバッファコントローラ２０８は加算器２１４を含んでもよい。加算器２１４は、メモリアクセスリクエスト２０６を受信し、バッファ毎にリクエスト２０６の数を特定する。例えば、複数のリクエスト２０６がプロセッサ１０２、バス１１２、又はメモリサブシステム２０４の１クロック周期中に受信されてもよい。具体的には、同じバッファを参照する複数のリクエストが受信されてもよい。図示の実施形態では、加算器２１４は、各クロック周期中にバッファ毎に受信された読み出しリクエスト２０６の数と、各クロック周期中にバッファ毎に受信された書き込みリクエスト２０６の数とを合計する。各リクエスト２０６は、加算器２１４が同じバッファ識別子を有する全ての読み出しリクエスト２０６と、同じバッファ識別子２０６を有する全ての書き込みリクエスト２０６をし得るようにバッファ識別子を含んでもよい。
【００２７】
次いで、バッファ毎の読み出しポインタ２１０は、各バッファを参照するクロック周期中に受信された読み出しリクエスト２０６の数だけ、ハードウェアバッファコントローラ２０８によってインクリメントされる。同様に、バッファ毎の書き込みポインタ２１２は、各バッファを参照するクロック周期中に受信された書き込みリクエスト２０６の数だけ、ハードウェアバッファコントローラ２０８によってインクリメントされる。
【００２８】
ＦＩＦＯアドレス生成器２１６は、加算器２１４の出力又は読み出しポインタ２１０の変化のうちの一方又は両方を検出し、あるいは、１クロック周期中にバッファ毎に受信された任意の読み出しリクエスト２０６及び書き込みリクエストを通知される。次いで、ＦＩＦＯアドレス生成器２１６は、メモリアクセスリクエスト２１８をメモリサブシステム２０４へ出力する。具体的には、１クロック周期中にＮ個の読み出しリクエストが受信された場合、ＦＩＦＯアドレス生成器２１６は、Ｎ個の読み出しリクエスト２１８又はＮ個のアドレスの範囲を含む読み出しリクエスト２１８の何れかを出力する。同様に、１クロック周期中にＮ個の読み出しリクエストが受信された場合、ＦＩＦＯアドレス生成器２１６は、Ｎ個の書き込みリクエスト２１８、又は書き込まれるＮ個の値とＮ個のアドレスの範囲とを含む書き込みリクエスト２１８を生成する。
【００２９】
ＦＩＦＯアドレス生成器２１６は、読み出しポインタ２１０の状態に基づいたアドレスを各リクエスト２１８中に含む。例えば、単一の読み出し又は書き込みリクエストに対して、ＦＩＦＯ生成器２１６は、読み出し又は書き込みポインタ２１０、２１２の現在値（Ｃ）又はＣ＋１を含む読み出し又は書き込みリクエストを出力してもよいが、これは、Ｃがバッファ中の次に利用可能なアドレスを指し示すか、バッファ中の以前アクセスされたアドレスの何れを指し示すかに応じて行われてもよい。Ｎ個の読み出し又は書き込みリクエストに対して、ＦＩＦＯ生成器２１６は、アドレスＣ、Ｃ＋１、Ｃ＋２、．．．、Ｃ＋Ｎ−１を含むＮ個の読み出し又は書き込みリクエスト、又はＣからＣ＋Ｎ−１までのアドレスを参照する単一の読み出し又は書き込みリクエストを出力する。幾つかの実施形態では、ポインタ２１０、２１２の値は、リクエスト２１８に対するアドレスを特定するより前にインクリメントされる。したがって、リクエスト２１８のアドレスは、単一のリクエスト２１８について、Ｃ＋１、Ｃ＋２、．．．、Ｃ＋Ｎ、又は、Ｃ＋１からＣ＋Ｎの範囲となる。
【００３０】
前述したように、ハードウェアバッファコントローラ２０８は、複数のバッファを含んでもよい。したがって、ＭＵＸ２２０は、ＦＩＦＯアドレス生成器２１６へポインタ２１０、２１２を選択的に結合してもよく、次いで、ＦＩＦＯアドレス生成器２１６は、前述の段落で記述された方法でバッファ毎にリクエスト２１８を生成する。同様に、メモリアクセスリクエスト２０２はまた、メモリサブシステム２０４に入力されているため、リクエスト２０２、２１８をＭＵＸ２２２に入力することもでき、ＭＵＸ２２２は、ラウンドロビン選択スキーム又はその他の負荷平衡アプローチに従ってリクエスト２０２、２１８をメモリサブシステム２０４中に選択的に入力する。
【００３１】
図２Ｂを参照すると、ハードウェアバッファコントローラ２０８は、その状態に基づいてイベント２２４を更に生成してもよい。イベント２２４は、処理デバイス１０２により実行されるスレッドスケジューラ２２６に入力されてもよい。スレッドスケジューラ２２６は、処理デバイス１０２上で実行するのはいずれのプロセッサスレッド２００とするのかの確定、スレッドのブロック、他のスレッドへの分岐を行い、また、当該技術分野で周知のその他のスレッド管理機能を実行する。各イベント２２４は、該イベントが生成されたバッファを示してもよい。
【００３２】
幾つかの実施形態では、スレッドスケジューラ２２６は、イベント２２４を受信し、それについてのスレッド管理タスクを実行する。例えば、イベント２２４は、バッファが満杯又はほぼ満杯であることを示してもよい。したがって、スレッド２００は、該バッファへの書き込みがブロックされてもよい。例えば、アプリケーションが、“ほぼ満杯”のイベントに応答して、ブロックを行うために、１つ以上のスレッド２００をスレッドスケジューラに登録してもよい。同様に、スケジューラ２２６は、バッファが空又はほぼ空であることをイベント２２４が示すことに応答して、特定のスレッドがバッファから読み出されることをブロックするようにプログラムされてもよい。
【００３３】
図示の実施形態では、イベントは、読み出しカウンタ２２６又は書き込みカウンタ２２８に基づいて生成される。バッファ毎に、読み出しカウンタ２２６の値は、減算器２３０によって書き込みカウンタの値から減算される。カウンタ２２６、２２８の値の差は、１つ以上の閾値２３４と共に比較器２３２にその後入力される。
【００３４】
差がゼロであることは、バッファが空であること、ちょうど書き込みと同数の読み出しがあったことを示す。幾つかの実施形態では、差がゼロである場合、バッファを特定する“バッファ空”イベント２２４が生成されてもよい。閾値２３４は低閾値を含んでもよく、これにより、参照値がこの低閾値よりも少ない場合に、バッファを参照する“ほぼ空”イベント２２４が生成され得る。
【００３５】
差がバッファのサイズと等しいことは、バッファ中のエントリの総数だけ、書き込み動作が読み出し動作よりも多いためバッファが満杯であることを示す。幾つかの実施形態では、差がバッファのサイズと等しい場合、バッファが参照される“バッファ満杯”イベントが生成されてもよい。閾値２３４は、バッファのサイズよりも小さい、例えば、バッファのサイズの８０から９０％の間に等しい高閾値を含んでもよい。差が高閾値よりも大きい場合、バッファを参照する“ほぼ満杯”イベント２２４が生成されてもよい。
【００３６】
幾つかの実施形態では、カウンタ２２６、２２８のオーバーフローを避けるために、例えば、定期的に、又はカウンタ２２６、２２８によって表すことが可能な最大値にカウンタ２２６、２２８の内の１つが近づくことに応じて、カウンタ２２６、２２８の内の小さい方の値がカウンタ２２６、２２８から減算されてもよい。
【００３７】
幾つかの実施形態では、比較器２３２は、空、ほぼ空、満杯、又はほぼ満杯の状態がなくなった場合にイベントを生成してもよい。例えば、バッファが満杯又はほぼ満杯であることが検出され、その後、満杯又はほぼ満杯ではないことが検出された場合には、“バッファレディ（ready）”又は“バッファ満杯解消”イベントが比較器２３２によって生成されてもよい。同様に、バッファが空又はほぼ空であることが検出され、その後、空又はほぼ空ではないと検出された場合には、“バッファレディ”又は“バッファ空解消”イベントが比較器２３２によって生成されてもよい。
【００３８】
上述したように、ハードウェアバッファコントローラ２０８は、複数のバッファを実施してもよい。したがって、そうした実施形態では、バッファ毎のカウンタ２２６、２２８間の差を評価し、必要に応じて上述したアプローチに従ってバッファ毎にイベントを生成するために、マルチプレクサ２３６、２３８は、バッファ毎のカウンタ２２６、２２８を減算器２３０及び比較器２３２に選択的に結合してもよい。
【００３９】
イベント２２４を受信すると、スレッドスケジューラ２２４は、プロセッサスレッド２００に関する１つ以上の動作を呼び出してもよい。例えば、アプリケーションが、“バッファ空”又は“ほぼ空”イベントを受信するとスレッド２００をブロックするようにスケジューラ２２６に命じてもよい。したがって、そうしたイベントを受信すると、該スレッド２００は、実行をブロックされるであろう。“バッファレディ”又は“バッファ空解消”イベントを受信すること等に応じて、“バッファ空”又は“バッファ空”イベントが解消されるまで、スレッドは、スレッドスケジューラ２２４によってブロックされてもよい。
【００４０】
同様に、アプリケーションは、“バッファ満杯”又は“ほぼ満杯”イベントを受信するとスレッド２００をブロックするようにスケジューラ２２６に命じてもよい。したがって、そうしたイベントを受信すると、スレッド２００は、実行をブロックされるであろう。“バッファレディ”又は“バッファ空解消”イベントを受信すること等に応じて、“バッファ満杯”又は“ほぼ満杯”イベントが解消されるまで、スレッドは、スレッドスケジューラ２２４によってブロックされてもよい。
【００４１】
アプリケーションが、それ故、バッファに対する書き込みリクエストを実行するようにプログラムされた幾つかのスレッド２００を有してもよく、該バッファを参照する“バッファ満杯”又は“ほぼ満杯”イベントを受信すると、そうしたスレッド２００をブロックするようにスレッドスケジューラ２２６に命じてもよい。アプリケーションは、該バッファに対する読み出しリクエストを実行するようにプログラムされた１つ以上の異なるスレッド２００を有してもよく、該バッファに対する“バッファ空”又は“ほぼ空”イベントを受信すると、そうしたスレッド２００をブロックするようにスレッドスケジューラ２２６に命じてもよい。
【００４２】
スレッド２００は、２つ以上のバッファに対してリクエストを発行してもよく、アプリケーションは、それ故、ハードウェアバッファコントローラ２０８によって実施される１つ以上のバッファを参照するイベントに基づいてスレッドをブロックするようにスレッドスケジューラ２２６に命じてもよい。
【００４３】
図３Ａを参照すると、図示の方法３００は、バッファを参照する書き込みリクエストの受信に応じて、ハードウェアバッファコントローラ２０８によって実行されてもよく、該書き込みリクエストは、バッファのエントリが実際に格納されるメモリデバイス１０４内のアドレスを含まないが、バッファの識別子を含む。
【００４４】
方法３００は、バッファに対する１つ以上の書き込みリクエストを受信すること（３０２）と、ある期間中にバッファに対して受信された書き込みリクエストの数を特定するために書き込みリクエストを合計すること（３０４）とを含む。例えば、処理デバイス１０２、バス１１２、メモリデバイス１０４、又はハードウェアバッファ２０８の１クロック周期中に受信された書き込みリクエストの数がステップ３０４でカウントされてもよい。１クロック周期中に書き込みリクエストが受信されたバッファ毎に方法３００のステップが実行されるように、上述したように、複数のバッファがハードウェアバッファコントローラ２０８によって実施されてもよい。図３Ａ及び図３Ｂの目的で、“バッファ（the buffer）”は、図示の方法が実行されているバッファを指す。
【００４５】
方法３００は、書き込みポインタ２１２及び書き込みカウンタ２２８の一方又は両方を更新すること（３０６）を含んでもよい。幾つかの実施形態では、これらの値の１つのみがバッファの状態を表すために使用される。例えば、ハードウェアバッファコントローラ２０８は、カウンタではなく、バッファの状態を特定するために書き込みポインタ２１２及び読み出しポインタ２１０のみを格納してもよい。その他では、カウンタ２２６、２２８のみが使用され、アドレスは、該カウンタとバッファの開始アドレスとから判定される。具体的には、ポインタ２１２及びカウンタ２２８を更新することは、クロック周期中に受信された書き込みリクエストの数ずつ、それら各々をインクリメントすることを含んでもよい。
【００４６】
方法３００は、書き込みポインタ２１２の状態と３０２で受信された書き込みリクエストの数とに基づいてアドレスを生成すること（３０８）を更に含む。上述したように、ポインタの現在値が書き込みリクエストを受信すること（３０２）及び書き込みポインタ２１２を更新すること（３０６）よりも前にＣであり、Ｎ個の書き込みリクエストが受信された場合、生成されるアドレスは、Ｃ、Ｃ＋１、．．．、Ｃ＋Ｎ−１であってもよく、ただし、Ｃは、次に書き込まれるアドレスを示す。Ｃが最も直近に書き込まれたアドレスを指し示す場合には、生成されるアドレスは、Ｃ＋１、Ｃ＋２．．．、Ｃ＋Ｎである。アドレスは、範囲の形式、例えば、データ対＜Ｃ，Ｎ−１＞又は＜Ｃ＋１，Ｎ＞の形式で生成されてもよく、ただし、一方の値が開始アドレスであり、他方の値が開始アドレスからのオフセットである。
【００４７】
方法３００は、ステップ３０８で生成されたアドレスを含む１つ以上の書き込みコマンドであって、メモリデバイス１０４のうちの１つのメモリデバイス中の、１つ以上の書き込みコマンド内のアドレスにて、書き込みリクエストからデータの書き込みを引き起こす効果のある該書き込みコマンドをメモリサブシステム２０４へ出力すること（３１０）を更に含んでもよい。上述したように、Ｎ個の書き込みコマンドが、３０２で受信された書き込みリクエスト毎に、ステップ３０８で生成されたアドレスの内の１つを夫々含んで出力されてもよい（３１０）。或いは、ステップ３０８で生成されたＮ個全てのアドレス、又はＮ個全てのアドレスに渡るアドレスの範囲（例えば、開始アドレス及びオフセット）を指定する、ただ１つの書き込みコマンドが出力されてもよい（３１０）。書き込みコマンドは、それらがアドレス指定されるメモリデバイス１０４によってその後実行され、方法は終了する。
【００４８】
図３Ｂを参照すると、図示の方法３１２は、バッファを参照する読み出しリクエストであって、バッファの識別子を含み、バッファのエントリが実際に格納されるメモリデバイス１０４内のアドレスを含まない該読み出しリクエストの受信に応じてハードウェアバッファコントローラ２０８により実行されてもよい。
【００４９】
方法３１２は、バッファに対する１つ以上の読み出しリクエストを受信すること（３１４）と、ある期間中にバッファに対して受信された読み出しリクエストの数を特定するために読み出しリクエストを合計すること３１６とを含む。例えば、処理デバイス１０２、バス１１２、メモリデバイス１０４、又はハードウェアバッファ２０８の１クロック周期中に受信された読み出しリクエストの数がステップ３１６でカウントされてもよい。上述したように、１クロック周期中に書き込みリクエストが受信されたバッファ毎に方法３１２のステップが実行されるように、複数のバッファがハードウェアバッファコントローラ２０８によって実施されてもよい。
【００５０】
方法３１２は、読み出しポインタ２１０及び読み出しカウンタ２２６の一方又は両方を更新すること（３１８）を含んでもよい。幾つかの実施形態では、これらの値の１つのみがバッファの状態を表すために使用される。例えば、ハードウェアバッファコントローラ２０８は、カウンタではなく、バッファの状態を特定するために書き込みポインタ２１２及び読み出しポインタ２１０のみを格納してもよい。その他では、カウンタ２２６、２２８のみが使用され、アドレスは、該カウンタとバッファの開始アドレスとから特定される。ポインタ２１０及びカウンタ２２６を更新すること（３１８）は、クロック周期中に受信された書き込みリクエストの数ずつ、それら各々をインクリメントすることを含んでもよい。
【００５１】
方法３１２は、読み出しポインタ２１０の状態と３１４で受信された読み出しリクエストの数とに基づいてアドレスを生成すること（３２０）を更に含む。上述したように、ポインタの現在値が読み出しリクエストを受信すること（３１４）及び読み出しポインタ２１０を更新すること（３１８）よりも前にＣであり、Ｎ個の読み出しリクエストが受信された場合、生成されるアドレスは、Ｃ、Ｃ＋１、．．．、Ｃ＋Ｎ−１であってもよく、ただし、Ｃは、次に書き込まれるアドレスを指し示す。Ｃが最も直近に読み出されたアドレスを指し示す場合には、生成されるアドレスは、Ｃ＋１、Ｃ＋２．．．、Ｃ＋Ｎである。アドレスは、範囲の形式、例えば、データ対＜Ｃ，Ｎ−１＞又は＜Ｃ＋１，Ｎ＞の形式で生成されてもよく、ただし、一方の値が開始アドレスであり、他方の値が開始アドレスからのオフセットである。
【００５２】
方法３１２は、ステップ３０８で生成されたアドレスを含む１つ以上の読み出しコマンドであって、メモリデバイス１０４のうちの１つのメモリデバイスから、１つ以上の書き込みコマンド内のアドレスにてデータを抽出し、このデータを処理デバイス１０２へ返すことを引き起こす効果のある該読み出しコマンドをメモリサブシステム２０４へ出力すること(３２２)を更に含んでもよい。上述したように、Ｎ個の読み出しコマンドが、３０２で受信された読み出しリクエスト毎に、ステップ３０８で生成されたアドレスの内の１つを夫々含んで出力されてもよい（３２２）。或いは、ステップ３０８で生成されたＮ個全てのアドレス、又はＮ個全てのアドレスに渡るアドレスの範囲（例えば、開始アドレス及びオフセット）を指定するただ１つの読み出しコマンドが出力されてもよい（３２２）。読み出しコマンドは、それらがアドレス指定されるメモリデバイス１０４によってその後実行され、方法は終了する。
【００５３】
方法３００及び３１２は、実質的に同時に実行されてもよい。例えば、別々の読み出し及び書き込みのパイプラインがハードウェアバッファコントローラ２０８によって実施されてもよく、そうしたメモリアクセスコマンドは、読み出し及び書き込みのリクエスト両方に対して同時に生成され得る。ステップ３１０及び３２２からのメモリアクセスコマンドは、当該技術分野で周知の任意のコマンド実行スキームに従ってメモリサブシステム２０４によって順次バッファリングされ実行してもよい。
【００５４】
図４を参照すると、図示の方法４００は、バッファの満杯、ほぼ満杯、空、及びほぼ空の状態を検出するためにハードウェアバッファコントローラ２０８によって実行されてもよい。方法４００は、ハードウェアバッファコントローラ２０８によって制御されるバッファ（以後“バッファ（the buffer）”と称する）毎に実行されてもよい。
【００５５】
方法４００は、図３Ａに関して上述したようなクロック周期中に書き込み命令を受信すること（３０２）と、クロック周期中に受信された書き込み命令を合計すること（３０４）とのステップを含んでもよく、又は方法４００にそれらのステップが先行してもよい。合計するステップ３０４は、方法３００及び方法４００の両方に対して一回実行されてもよく、又は方法毎に別々に実行されてもよい。
【００５６】
方法４００は更に、図３Ｂに関して上述したようなクロック周期中に書き込み命令を受信すること（３１４）と、クロック周期中に受信された書き込み命令を合計すること（３１６）とのステップを含んでもよく、又は方法４００にそれらのステップが先行してもよい。合計するステップ３１６は、方法３００及び方法４００の両方に対して一回実行されてもよく、又は方法毎に別々に実行されてもよい。
【００５７】
方法４００は、書き込みカウンタ２３８を更新すること（４０２）と、読み出しカウンタ２３６を更新すること（４０４）とを更に含んでもよい。上述したように、これは、クロック周期中に受信された書き込みリクエストの数を書き込みカウンタ２３８に加算することと、クロック周期中に受信された読み出しリクエストの数を読み出しカウンタ２３６に加算することとを含んでもよい。
【００５８】
方法４００は、書き込みカウンタと読み出しカウンタの差を計算すること（４０６）を更に含んでもよい。読み出しが書き込みを超えるアンダーフロー状態ではないときは、書き込みカウンタと読み出しカウンタの差は正又はゼロであろう。幾つかの実施形態では、ステップ４０６の差分機能を回路により実行し、カウンタ２３６、２３８をレジスタにより格納することによって処理可能な最大数を超えることを回避するために、方法４００の繰り返し毎に、書き込みカウンタは該差の値に等しく設定されてもよく、読み出しポインタはゼロに設定されてもよい。
【００５９】
方法４００は、１つ以上のスレッドに関してステップ４０６で計算された差を評価することを含んでもよい。例えば、差が“ほぼ満杯”の閾値よりも大きいと４０８で検出された場合、“ほぼ満杯”のイベントが４１０で生成されてもよい。差が“ほぼ空”の閾値よりも小さいと４１２で検出された場合、“ほぼ空”のイベントが４１４で生成されてもよい。差がバッファのサイズよりも大きいと４１６で検出された場合、“バッファ満杯”のイベントが４１８で生成されてもよい。差がゼロであると４２０で検出された場合、“バッファ空”のイベントが生成されてもよい。ステップ４０８〜４２０の閾値は、並列パイプラインを使用して任意の順序で又は同時に評価されてもよい。
【００６０】
“ほぼ満杯”及び“ほぼ空”の閾値は、方法４００の実行よりも前にハードワイヤード化またはプログラムされた所定の値でもよい。幾つかの実施形態では、“ほぼ満杯”及び“ほぼ空”の閾値は、実行するスレッドの数と、ほぼ満杯又はほぼ空の状態が存在すると検出される時とそのイベントに応じてスレッドがブロックされる時との間の遅延との関数であってもよい。例えば、書き込みリクエストを発行するようにプログラムされたＭ個のスレッドが実行され、イベントに応答してスレッドをブロックするために少なくともＱのクロック周期かかる場合、“ほぼ満杯”の閾値は、Ｓ−Ｑ＊Ｍ−Ｒに等しく設定されることもあり、ただし、Ｓは、バッファのサイズであり、Ｒは、オーバーフローが生じないようにするためにゼロよりも大きい値である。このように、ほぼ満杯の状態が検出された場合、書き込みリクエストを発行し得るＭ個のスレッドのブロッキングが“ほぼ満杯”のイベントによりもたらされる前にバッファのオーバーフローは生じない。
【００６１】
同様に、読み出しリクエストを発行するようにプログラムされたＭ個のスレッドが実行されている場合、“ほぼ空”の閾値は、Ｑ＊Ｍ＋Ｒに等しく設定されることもあり、ただし、Ｓは、バッファのサイズであり、Ｒは、アンダーフローが生じないようにするためにゼロよりも大きい値である。このように、ほぼ空の状態が検出された場合、読み出しリクエストを発行し得るＭ個のスレッドのブロッキングが“ほぼ空”のイベントによりもたらされる前にバッファのアンダーフローは生じない。
【００６２】
本発明は、その精神又は本質的特徴から離れることなくその他の特定の形態で具体化されてもよい。記述された実施形態は、全ての点で、例示あって限定的ではないと考慮されるべきである。発明の範囲は、それ故、前述の説明よりもむしろ添付の請求項の範囲によって示される。請求項の意図及び均等範囲内に入る全ての変更は、それらの範囲内に包含されるべきである。
【図１】
2019502201.tif 000003
【図２Ａ】
2019502201.tif 000004
【図２Ｂ】
2019502201.tif 000005
【図３Ａ】
2019502201.tif 000006
【図３Ｂ】
2019502201.tif 000007
【図４】
2019502201.tif 000008
【国際調査報告】
2019502201.tif 000009