(57)【特許請求の範囲】
【請求項１】
プロセッサの第１のコア内の第１のスタックのコンテンツが第１の閾サイズを超過するかどうかを判定することと、
前記第１のスタックの前記コンテンツが前記第１の閾サイズを超過するとき、前記第１のスタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記第１のコアの外部の第１のスタック拡張に転送することと、
前記第１のコア内の前記第１のスタックと前記第１のスタック拡張の両方におけるエントリを追跡するために共通スタックカウンタを適用することと、
前記プロセッサの前記第１のコア内の複数のスタックを保持することと、ここで、前記複数のスタックの各々は、前記プロセッサによって実行されるアプリケーションの複数のスレッドのうちの異なる１つに対応し、
前記プロセッサの前記第１のコアの外部の複数のスタック拡張を保持することと、ここで、前記スタック拡張の各々は、前記プロセッサの前記第１のコア内の前記スタックのうちの１つに対応し、前記コンテンツの少なくとも一部を転送することは、前記プロセッサの前記第１のコア内の前記スタックのうちの１つのコンテンツの少なくとも一部を、対応するスタック拡張に転送することを含み、
前記転送中、前記複数のスレッドのうちの特定のスレッドをアイドル状態にすることと、ここで、前記特定のスレッドに関係する演算論理ユニットは、前記特定のスレッドが前記アイドル状態にあるとき、他のスレッドにより使用可能である、
を備える、方法。
【請求項２】
前記複数のスタックの各々は等しい大きさであり、前記複数のスタックの数は前記複数のスレッドの数に対応する、請求項１記載の方法。
【請求項３】
前記複数のスタックの各々は異なるアプリケーションに対し異なる大きさにされる、請求項１記載の方法。
【請求項４】
前記プロセッサの前記第１のコア内の前記複数のスタックのうちの第２のスタックのコンテンツの少なくとも一部を、対応するスタック拡張に転送することを更に含む、請求項１記載の方法。
【請求項５】
前記プロセッサの前記第１のコア内の前記第１のスタックは、アプリケーションの第１のスレッドに関連付けられ、前記方法は、前記プロセッサの前記第１のコア内の前記第１のスタックの前記コンテンツが前記第１のスタック拡張に転送される間、前記アプリケーションの前記第１のスレッドを前記アイドル状態にすることを更に含む、請求項１記載の方法。
【請求項６】
前記第１のスタック拡張の前記コンテンツを前記第１のスタックに転送することと、前記第１のスタック拡張の前記コンテンツが前記第１のスタックに転送される間、前記アプリケーションの前記第１のスレッドを前記アイドル状態にすることとを更に含む、請求項５記載の方法。
【請求項７】
前記第１のスタックの前記コンテンツの少なくとも一部を前記第１のスタック拡張に転送した後、前記プロセッサの前記第１のコア内の前記第１のスタックに新たなエントリをプッシュすることを更に備える、請求項１記載の方法。
【請求項８】
前記共通スタックカウンタが閾値に到達したときに、前記第１のスタックの前記コンテンツが前記第１の閾サイズを超過したと判定することを更に備える、請求項７記載の方法。
【請求項９】
前記共通スタックカウンタは、前記第１のスタックおよび前記第１のスタック拡張のための単一のスタックカウンタを含み、前記単一のスタックカウンタの第１の部分は、前記第１のスタックに対応し、前記単一のスタックカウンタの第２の部分は、前記第１のスタック拡張に対応する、請求項１記載の方法。
【請求項１０】
前記第１のスタックの前記コンテンツが第２の閾サイズを下回ったことを判定することと、
前記第１のスタックが前記第２の閾サイズを下回ったとき、前記プロセッサの前記第１のコアの外部の前記第１のスタック拡張の少なくとも一部を、前記プロセッサの前記第１のコア内の前記第１のスタックに転送することと
を更に備える、請求項１記載の方法。
【請求項１１】
前記第１のスタック拡張の前記コンテンツの少なくとも一部を、対応する第２のスタック拡張に転送することを更に備え、前記第１のスタック拡張は、前記プロセッサ内に存在し、前記対応する第２のスタック拡張は、前記プロセッサの外部のメモリ内に存在し、前記共通スタックカウンタは更に、前記対応する第２のスタック拡張におけるエントリを追跡する、請求項１記載の方法。
【請求項１２】
前記第１のスタックの前記コンテンツの少なくとも前記一部を転送することは、前記第１のスタックの前記コンテンツの前記一部を、前記プロセッサの他のリソースによって利用されるデータバスで転送することを含む、請求項１記載の方法。
【請求項１３】
前記プロセッサの前記第１のコアの外部の前記第１のスタック拡張は、前記プロセッサの共通キャッシュ内にある、請求項１記載の方法。
【請求項１４】
前記プロセッサの前記第１のコアの外部の前記第１のスタック拡張は、前記プロセッサの外部のメモリ内にある、請求項１記載の方法。
【請求項１５】
前記第１のスタックの前記コンテンツの少なくとも前記一部を転送することは、前記第１のスタックの全コンテンツを転送することを備える、請求項１記載の方法。
【請求項１６】
前記第１のスタック拡張の前記コンテンツが第２の閾サイズを超過したときに、前記第１のスタック拡張の前記コンテンツの少なくとも一部を第２のスタック拡張に転送することを更に含み、前記第２のスタック拡張は、前記第１のスタック拡張に対応する、請求項１記載の方法。
【請求項１７】
前記プロセッサの第２のコア内の第２のスタックのコンテンツが第２の閾サイズを超過したかどうかを判定することと、
前記第２のスタックの前記コンテンツが前記第２の閾サイズを超過したとき、前記第２のスタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記第２のコアの外部の第２のスタック拡張に転送することと
を更に含む、請求項１記載の方法。
【請求項１８】
前記第１のスタック拡張と前記第２のスタック拡張は、共通キャッシュメモリ内にある、請求項１７記載の方法。
【請求項１９】
前記第１のスタックと前記第１のスタック拡張とに連続的なキャッシュとしてアクセスすることを更に含む、請求項１記載の方法。
【請求項２０】
プロセッサコアを有するプロセッサと、
前記プロセッサコアの外部のスタック拡張を格納する第２のメモリと
を含む装置であって、
前記プロセッサコアは、
前記プロセッサの動作を制御する制御ユニットと、
前記プロセッサコア内のスタックを格納する第１のメモリと
を含み、
前記制御ユニットは、前記プロセッサコア内のスタックと前記スタック拡張の両方におけるエントリを追跡するために共通スタックカウンタをインクリメントし、
前記制御ユニットは、前記スタックのコンテンツが第１の閾サイズを超過したとき、前記スタックの前記コンテンツの少なくとも一部を前記スタック拡張に転送し、
前記スタックは、前記プロセッサコア内の複数のスタックを含み、前記複数のスタックの各々は、前記プロセッサによって実行されるアプリケーションの複数のスレッドのうちの異なる１つに対応し、前記スタック拡張は、前記プロセッサコアの外部の複数のスタック拡張を含み、前記スタック拡張の各々は、前記プロセッサコア内の前記スタックのうちの１つに対応し、
前記制御ユニットは、前記プロセッサコア内の前記複数のスタックのうちの１つのコンテンツの少なくとも一部を、対応するスタック拡張に転送することを実行し、
前記複数のスレッドのうちの特定のスレッドは、前記転送中、アイドル状態にされ、前記特定のスレッドに関係する演算論理ユニットは、前記特定のスレッドが前記アイドル状態にあるとき、他のスレッドにより使用可能である、装置。
【請求項２１】
前記複数のスタックの各々は等しい大きさであり、前記複数のスタックの数は前記複数のスレッドの数に対応する、請求項２０記載の装置。
【請求項２２】
前記複数のスタックの各々は異なるアプリケーションに対し異なる大きさである、請求項２０記載の装置。
【請求項２３】
前記制御ユニットは、前記プロセッサコア内の前記複数のスタックのうちの第２のスタックのコンテンツの少なくとも一部を、対応するスタック拡張に転送する、請求項２０記載の装置。
【請求項２４】
前記プロセッサコア内の前記スタックは、アプリケーションのスレッドに関連付けられ、前記制御ユニットは、前記プロセッサコア内の前記スタックのコンテンツが前記スタック拡張に転送される間、前記アプリケーションの前記スレッドを前記アイドル状態にする、請求項２０記載の装置。
【請求項２５】
前記制御ユニットは、前記スタック拡張の前記コンテンツを前記スタックに転送し、前記スタック拡張の前記コンテンツが前記スタックに転送される間、前記アプリケーションの前記スレッドを前記アイドル状態にする、請求項２４記載の装置。
【請求項２６】
前記制御ユニットは、前記スタックの前記コンテンツの少なくとも一部を前記スタック拡張に転送した後、前記プロセッサコア内の前記スタックに新たなエントリをプッシュする、請求項２０記載の装置。
【請求項２７】
前記制御ユニットは、前記プロセッサコア内の前記スタックにおけるエントリの数を追跡するために、前記共通スタックカウンタをインクリメントし、前記スタックカウンタが閾値に到達したとき、前記スタックの前記コンテンツが前記第１の閾サイズを超過したと判定する、請求項２６記載の装置。
【請求項２８】
前記共通スタックカウンタの第１の部分は、前記スタックにおけるエントリの第１の数を追跡し、前記共通スタックカウンタの第２の部分は、前記スタック拡張におけるエントリの第２の数を追跡し、前記共通スタックカウンタの第３の部分は、第２のスタック拡張におけるエントリの第３の数を追跡するために、前記第２のスタック拡張に対応する、請求項２０記載の装置。
【請求項２９】
前記制御ユニットは、前記スタックの前記コンテンツが第２の閾サイズを下回ったとき、前記プロセッサコアの外部の前記スタック拡張の少なくとも一部を、前記プロセッサコア内の前記スタックに転送する、請求項２０記載の装置。
【請求項３０】
前記共通スタックカウンタの値は、−１に初期設定される、請求項２０記載の装置。
【請求項３１】
前記制御ユニットは、前記スタックの前記コンテンツの前記一部を、前記プロセッサの他のリソースによって利用されるデータバスで転送する、請求項２０記載の装置。
【請求項３２】
前記プロセッサコアの外部の前記スタック拡張は、前記プロセッサの共通キャッシュ内のスタック拡張を備える、請求項２０記載の装置。
【請求項３３】
前記プロセッサコアの外部の前記スタック拡張は、前記プロセッサの外部のメモリ内のスタック拡張を備える、請求項２０記載の装置。
【請求項３４】
前記制御ユニットは前記スタックの全コンテンツを転送する、請求項２０記載の装置。
【請求項３５】
前記第２のメモリは、前記プロセッサの共通キャッシュおよび前記プロセッサの外部のメモリを含み、前記スタック拡張は、前記プロセッサの前記共通キャッシュ内の第１のスタック拡張を備え、前記制御ユニットは、前記第１のスタック拡張のコンテンツが第２の閾サイズを超過したとき、前記第１のスタック拡張の前記コンテンツの少なくとも一部を第２のスタック拡張に転送し、前記第２のスタック拡張は、前記プロセッサの外部の前記メモリ内に位置する、請求項２０記載の装置。
【請求項３６】
前記プロセッサコアは第１のプロセッサコアであり、前記スタックは第１のスタックであり、前記スタック拡張は第１のスタック拡張であり、前記制御ユニットは、
前記プロセッサの第２のプロセッサコア内の第２のスタックのコンテンツが第２の閾サイズを超過するかどうかを判定し、
前記第２のスタックの前記コンテンツが前記第２の閾サイズを超過するとき、前記第２のスタックの前記コンテンツの少なくとも一部を、前記第２のプロセッサコアの外部の第２のスタック拡張に転送する、請求項２０記載の装置。
【請求項３７】
前記第２のメモリは、共通キャッシュメモリを含み、前記第１のスタック拡張と前記第２のスタック拡張は、前記共通キャッシュメモリ内にある、請求項３６記載の装置。
【請求項３８】
前記制御ユニットは、前記スタックと前記スタック拡張とに連続的なキャッシュとしてアクセスする、請求項２０記載の装置。
【請求項３９】
命令を備えるコンピュータ読み取り可能な媒体であって、前記命令はプロセッサに、
前記プロセッサのコア内のスタックのコンテンツが第１の閾サイズを超過するかどうかを判定させ、
前記スタックの前記コンテンツが前記第１の閾サイズを超過するとき、前記スタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記コアの外部のスタック拡張に転送させ、ここで、前記命令は前記プロセッサに、
前記コア内の前記スタックと前記スタック拡張の両方におけるエントリを追跡するために共通スタックカウンタを適用させ、
前記プロセッサの前記コア内の複数のスタックを保持させ、ここで、前記複数のスタックの各々は、前記プロセッサによって実行されるアプリケーションの複数のスレッドのうちの異なる１つに対応し、
前記プロセッサの前記コアの外部の複数のスタック拡張を保持させ、ここで、前記スタック拡張の各々は、前記プロセッサの前記コア内の前記スタックのうちの１つに対応し、前記コンテンツの少なくとも一部を転送することは、前記プロセッサの前記コア内の前記スタックのうちの１つのコンテンツの少なくとも一部を、対応するスタック拡張に転送することを含み、前記複数のスレッドのうちの特定のスレッドは、前記転送中、アイドル状態にされ、前記特定のスレッドに関係する演算論理ユニットは、前記特定のスレッドが前記アイドル状態にあるとき、他のスレッドにより使用可能である、コンピュータ読み取り可能な媒体。
【請求項４０】
前記プロセッサの前記コア内の前記スタックは、前記アプリケーションの前記特定のスレッドに関連付けられ、前記命令は前記プロセッサに、前記プロセッサの前記コア内の前記スタックの前記コンテンツが前記スタック拡張に転送される間、前記アプリケーションの前記特定のスレッドを前記アイドル状態にさせる、請求項３９記載のコンピュータ読み取り可能な媒体。
【請求項４１】
前記命令は前記プロセッサに、前記スタック拡張の前記コンテンツを前記スタックに転送させ、前記スタック拡張の前記コンテンツが前記スタックに転送される間、前記アプリケーションの前記特定のスレッドを前記アイドル状態にさせる、請求項３９記載のコンピュータ読み取り可能な媒体。
【請求項４２】
前記命令は前記プロセッサに、
前記コンテンツが第２の閾サイズを下回ることを判定させ、
前記スタックが前記第２の閾サイズを下回るとき、前記プロセッサの前記コアの外部の前記スタック拡張の少なくとも一部を、前記プロセッサの前記コア内の前記スタックに転送させる、請求項３９記載のコンピュータ読み取り可能な媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、プロセッサのスタックデータ構造を保持することに関する。
【背景技術】
【０００２】
従来のプロセッサは、多数の制御命令を備えるスタックデータ構造（「スタック」）を保持する。スタックは、一般的にはプロセッサのコア内に設けられる。プロセッサコア内で実行されるスレッドは、２つの基本的な動作をスタックに対して実行し得る。制御ユニットは、制御命令をスタックにプッシュする（push）か、制御命令をスタックからポップする（pop）。
【０００３】
プッシュ動作は、制御命令をスタックの頂上に追加し、先行する制御命令がスタックでプッシュダウンされる。ポップ動作は、スタックの現在頂上にある制御命令を取り除いてリターンし、先行する制御命令がスタックで一つ上のロケーションに移動される。従って、プロセッサコアのスタックは後入れ先出し（LIFO）スキームに従って動作する。
【０００４】
プロセッサのコア内のメモリはサイズが限られていることから、スタックは非常に小さい。小さいサイズのスタックは、利用し得るネストされた制御命令の数を制限する。あまりに多くの制御命令をスタックにプッシュすることは、スタックオーバーフローという結果を招き、これは１つ又は複数のスレッドに誤動作やクラッシュを引き起こし得る。
【発明の開示】
【０００５】
[概要]
一般に、本願発明はスタックオーバーフローを制御する技法を対象とする。本明細書に記載される技法は、プロセッサコアの外部に設けられるメモリ又は共通のキャッシュの一部をスタック拡張として利用する。プロセッサコアは、プロセッサコアのメモリ内にスタックを保持する。プロセッサコアは、プロセッサコアスタックが閾サイズ（threshold size）、例えばエントリ数の閾値を超過するときに、スタックコンテンツの少なくとも一部を、プロセッサコアの外部にあるスタック拡張に転送する。例えば、プロセッサコアは、コアスタックが一杯になったときに、スタックのコンテンツの少なくとも一部をスタック拡張に転送してもよい。スタック拡張は、プロセッサコアの外部の他のメモリ又はキャッシュ内にあり、プロセッサコア内で利用可能な制限されたスタックサイズを補足する。
【０００６】
プロセッサコアはまた、プロセッサコア内のスタックが閾サイズ、例えばエントリ数の閾値を下回ることを判定する。例えば、エントリ数の閾値はゼロであってもよい。この場合、スタックが空になると、プロセッサコアはスタック拡張で保持されるコンテンツの少なくとも一部を、プロセッサコア内のスタックに転送する。換言すれば、プロセッサコアは、プロセッサコア内のスタックを、プロセッサコアの外部のスタック拡張のコンテンツで再ポピュレートする（repopulates）。それ故に、スタックコンテンツは、プロセッサコアと共通キャッシュ又は他のメモリとの間でコンテンツをスワップし合って、スタックのサイズが拡張されたり、縮小されたりすることを可能にする。このようにして、本技法は、プロセッサコアの外部のスタック拡張を利用することによって、プロセッサコア内で実行されているスレッドのクラッシュ又は誤動作を防止する。
【０００７】
一実施形態において、本開示は、プロセッサのコア内のスタックのコンテンツが閾サイズを超過するかどうかを判定し、前記スタックの前記コンテンツが前記閾サイズを超過するとき、前記スタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記コアの外部のスタック拡張に転送することを備える方法を提供する。
【０００８】
別の実施形態において、本開示は、プロセッサコアを有するプロセッサであって、前記プロセッサの動作を制御する制御ユニットと、前記プロセッサコア内のスタックを格納する第１のメモリとを含むプロセッサと、前記プロセッサコアの外部のスタック拡張に格納する第２のメモリとを備える装置であって、前記スタックの前記コンテンツが前記閾サイズを超過したとき、前記制御ユニットは前記スタックの前記コンテンツの少なくとも一部を前記スタック拡張に転送する装置を提供する。
【０００９】
本開示の技法は、ハードウェア、ソフトウェア、ファームウェア、又はこれらの任意の組み合わせで実施し得る。ソフトウェアで実施される場合、本開示の技法は、プロセッサによる実行時に、本開示に記載される１つ又は複数の技法を実行する命令を備える、コンピュータ読み取り可能な媒体で具現化され得る。ハードウェアで実施される場合、本技法は、１つ又は複数のプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、及び／又は他の同等の集積論理回路若しくは離散論理回路で具現化され得る。
【００１０】
本願発明の１つ又は複数の実施形態の詳細は、添付の図面及び以下の説明に示されている。本願発明の他の特徴、目的、及び利点は、説明及び図面、並びに特許請求の範囲から明白になるであろう。
【詳細な説明】
【００１１】
図１は、本明細書に記載される技法に従ってコアスタックデータ構造を管理する装置８を示すブロック図である。装置８は、プロセッサ１０のプロセッサコア１２の外部に設けられたメモリをスタック拡張（stack extension）として利用することで、スタックオーバーフローを制御し、装置８がスタックのサイズを拡張することを可能にする。例えば、LOOP/End Loop及びCALL/Retコマンドといった、ネストされた動的なフロー制御命令を実施するために、プロセッサコア１２内のスタック１４が必要である。コアスタック１４のサイズは、再帰的なネスティングの数を決定するので、如何なるアプリケーションについてのプロセッサの能力も制限する。装置８は、多数のネストされたフロー制御命令が実施されることができる環境を経済的に提供する。スタック拡張を用いることで、装置８はより多くのネストされたフロー制御命令をサポートし得る。
【００１２】
図１の例において、プロセッサ１０はシングルコアプロセッサを構成する。従って、プロセッサ１０は、シングルプロセッサコア１２を備えるが、これはマルチメディアアプリケーションといった、ソフトウェアアプリケーションの多数のスレッドを実行する環境を提供する。他の実施形態において、プロセッサ１０は複数のプロセッサコアを備えてもよい。プロセッサコア１２は、例えば、プロセッサ１０の動作を制御する制御ユニット、算術演算及び論理演算を実行する算術論理演算装置（ALU）、並びに、多数のレジスタ又はキャッシュといった、少なくとも幾らかのメモリを備え得る。プロセッサコア１２は、プロセッサ１０内のプログラム可能な処理ユニットを形成する。プロセッサ１０の他の部分、例えば固定機能パイプライン又は共働（co-working）ユニットは、プロセッサコア１２の外部に設けられてもよい。繰り返しになるが、プロセッサ１０は、単独のプロセッサコア又は複数のプロセッサコアを備え得る。
【００１３】
プロセッサコア１２は、プロセッサコア１２のローカルメモリの少なくとも一部を、コアスタックデータ構造１４（本明細書では「コアスタック１４」と称する）として割り当てる。コアスタック１４は、一定のサイズであり、アプリケーションのスレッドに関連付けられた、制御命令又はデータといったスタックエントリを含む。コアスタック１４は、例えば、合計で１６個のエントリ（entries）、３２個のエントリ、６４個のエントリ、又はより多数のエントリを保持するように構成され得る。一実施形態において、コアスタック１４は、プロセッサコア１２のレベル１（L1）キャッシュの一部を構成してもよい。従って、コアスタック１４のサイズは、L1キャッシュのサイズによって、又は制御命令を格納するために割り当てられたL1キャッシュの一部によって限定され得る。
【００１４】
コアスタック１４は、論理スタック１５Ａ−１５Ｎ（「論理スタック１５」）に構成可能である。プロセッサコア１２は、コアスタック１４を論理スタック１５に動的に細分して、現在のアプリケーションに関連付けられた複数のスレッドに適応する。論理スタック１５の各々は、プロセッサ１０上で現在実行されているアプリケーションのスレッドのうちの１つに対応してもよい。論理スタック１５の数及びサイズは、現在のアプリケーションで同時に実行されているスレッドの数に依存する。プロセッサコア１２は、コアスタック１４を、特定のアプリケーションに関連付けられた同時並行の（concurrent）スレッドの数に基づいて、アプリケーション毎に異なるように細分してもよい。
【００１５】
あるアプリケーションについて実行されているスレッドの数が多ければ多いほど、論理スタック１５の数は多くなり、論理スタック１５のサイズは小さくなる。逆に、あるアプリケーションについて実行されているスレッドの数が少なければ少ないほど、論理スタック１５の数は少なくなり、論理スタック１５のサイズは大きくなる。あるアプリケーションに関連付けられるスレッドの数は、例えば、特定のマルチメディアアプリケーションのリソース要件に従ってソフトウェアドライバによって決定されてもよい。そのように構成可能であること（configurability）は、スタック全体の稼働率を最大化し、種々のアプリケーションのニーズに対して柔軟性を提供することができる。論理スタック１５は通常、それぞれ所与のアプリケーションについて同一のサイズを有するであろうが、サイズは異なるアプリケーションについては異なっていてもよい。
【００１６】
プロセッサコア１２で実行されるスレッドは、制御命令をコアスタック１４にプッシュし、制御命令をコアスタック１４からポップして、アプリケーションの実行を制御する。より具体的には、スレッドは、当該スレッドに関連付けられた論理スタック１５に制御命令をプッシュし、当該スレッドに関連付けられた論理スタック１５から制御命令をポップする。コアスタック１４及び論理スタック１５は一定のサイズであるため、スレッドがスタックにプッシュし得る制御命令の数は限定される。あまりに多数の制御命令が論理スタック１５のうちの１つにプッシュされると、スタックオーバーフローという結果を招き、１つ又は複数のスレッドの誤動作及びクラッシュを引き起こし得る。
【００１７】
スタックオーバーフローの可能性を減少させるために、装置８は、プロセッサコア１２の外部のメモリをスタック拡張として利用する。装置８は、共通キャッシュ１６の一部、外部メモリ２４、又は双方を１つ又は複数のスタック拡張として利用してもよい。共通キャッシュ１６は、シングルプロセッサコアによって用いられてもよいし、マルチコアプロセッサ内の複数のプロセッサコアによって共用されてもよい。
【００１８】
共通キャッシュ１６とは一般に、プロセッサコア１２の外部に設けられるキャッシュメモリをいう。図１に示されるように、共通キャッシュ１６は、プロセッサ１０の内部に設けられ、プロセッサコア１２に内部バス２０を介して結合されてもよく、従って、他の内部のプロセッサリソースと同じバスを用いてもよい。例えば、共通キャッシュ１６は、プロセッサ１０のレベル２（L2）キャッシュを構成し得るのに対して、コアスタック１４は、プロセッサのレベル１（L1）キャッシュを構成し得る。あるいは、共通キャッシュ１６は、プロセッサ１０の外部、例えば、プロセッサ１０が接続されるマザーボード又は他の特別なモジュールに設けられてもよい。
【００１９】
更に別の例として、外部メモリ２４は、単独で又は共通キャッシュ１６に加えて、補足的なスタック拡張として用いられてもよい。メモリ２４は、プロセッサ１０の外部、例えば、プロセッサ１０が接続されるマザーボード又は他の特別なモジュールに設けられる。プロセッサ１０は、メモリ２４に外部バス２６を介して結合される。外部バス２６は、プロセッサ１０が他のリソースにアクセスするために用いられるのと同一のデータバスであってもよく、従って、付加的なハードウェアの必要性を除去し得る。メモリ２４は、例えば、汎用ランダムアクセスメモリ（RAM）を構成してもよい。
【００２０】
装置８は、スタック拡張データ構造１８Ａ−１８Ｎ（図１中で「スタック拡張１８」と称される）を共通キャッシュ１６内に保持する。スタック拡張１８の各々は、論理スタック１５のうちの１つに対応し、従って、プロセッサコア１２で実行されているスレッドのうちの１つに関連付けられる。スレッドが新たな制御命令を論理スタック１５のうちの対応する１つ（例えば、論理スタック１５Ａ）にプッシュすることを望み、論理スタック１５Ａが、エントリ数の閾値といった閾サイズ（threshold size）を超えるとき、例えば、論理スタック１５Ａが一杯であるか、一杯に近いとき、プロセッサコア１２は、対応する論理スタック１５Ａのコンテンツの少なくとも一部を共通キャッシュ１６に転送する。より具体的には、プロセッサコア１２は、論理スタック１５Ａのコンテンツを、論理スタック１５Ａに関連付けられたスタック拡張１８のうちの１つ（例えば、スタック拡張１８Ａ）に書き込む。一実施形態において、プロセッサコア１２は、共通キャッシュ１６のスタック拡張１８Ａにスタック全体を書き込むスワップアウトコマンド（swap-out command）を発行してもよい。対応する論理スタック１５Ａが閾サイズ、例えばエントリの数を超えるとき、繰り返しになるがプロセッサコア１２は、論理スタック１５Ａのより多くのコンテンツを、共通キャッシュ１６に設けられた対応するスタック拡張１８Ａに転送し、先に転送された制御命令をスタック拡張１８Ａの更に下部にプッシュする。
【００２１】
装置８は、付加的なスタック拡張データ構造２２Ａ−２２Ｎ（図１で「スタック拡張２２」と称される）を、例えばメモリ２４内に保持してもよい。スタック拡張２２の各々は、プロセッサコア１２で実行されているスレッドのうちの１つに関連付けられる。スタック拡張２２を利用して、共通キャッシュ１６のスタック拡張１８のオーバーフローを制御してもよい。例えば、共通キャッシュ１６のスタック拡張１８が一杯になるとき、例えば論理スタック１５Ａのコンテンツのスタック拡張１８Ａへの転送と同様の方法で、装置８はスタック拡張１８のコンテンツの少なくとも一部を、メモリ２４のスタック拡張２２Ａにスワップアウトしてもよい。このようにして、装置８は、多段スタック拡張（multi-level stack extension）、即ち、共通キャッシュ１６内に設けられているスタック拡張の第１のレベルの部分と、メモリ２４内に設けられた第２のレベルの部分を用いて、スタックオーバーフローを制御し得る。あるいは、一部の実施形態において、装置８は論理スタック１５Ａのコンテンツをメモリ２４のスタック拡張２２Ａに直接転送して、論理スタック１５Ａのオーバーフローを制御してもよい。
【００２２】
装置８内のソフトウェアドライバは、スタック拡張１８といったスタック拡張を、共通キャッシュの一部を、公知の長さの所望の数のスタック拡張１８を収容するのに充分なサイズと開始アドレスと共にメモリ空間に割り当てることで形成してもよい。共通キャッシュメモリ記憶装置の割り当てられた部分は、隣接していても隣接していなくてもよい。装置８は、コアスタック１４の論理スタック１５への分割と同様の方法で、割り当てられた空間を多数の等しいサイズのスタック拡張１８に分割してもよい。スタック拡張１８の数とサイズは、プロセッサ１０内で実行されているアプリケーションのスレッドの数、従って論理スタック１５の数に依存し得る。論理スタック１５が共通キャッシュ１６へスワップアウトされるとき、装置８は論理スタックのコンテンツを、対応するスタック拡張１８に当該スタックの開始アドレスから書き込む。開始アドレスは下記の方程式に従って計算し得る。  
【数１】
0005523828.tif 000002
【００２３】
ここで、末端アドレスとはスタック拡張１８の底のエントリのアドレスをいい、スタックエントリのユニットサイズとは、各スタックエントリの例えばバイト数でのユニットサイズをいい、仮想カウンタとは論理スタック１５から共通キャッシュ１６のスタック拡張へスワップされるべきスタックエントリの数を追跡する（tracks）。このようにして、装置８は、共通キャッシュメモリ記憶装置の一部をスタック拡張のために借用する。各スタック拡張は、ソフトウェアドライバによって一定のサイズを割り当てられる。論理スタック１５がコアスタック１４からスワップアウトされるとき、装置８は論理スタックのスタックエントリを仮想スタック空間に開始アドレスから１つずつ書き込む。仮想スタックが一杯になると、そのコンテンツは外部のメモリ２４の更なるスタック拡張２２にスワップされ得る。
【００２４】
コアスタック１４と共通キャッシュ１６のスタック拡張１８との間で論理スタック１５をスワップし合う代わりに、キャッシュ１６とコアスタック１４を、１つの連続する、アドレス可能なスタックとして真のキャッシュモード（true cache mode）で扱ってもよい。特に、装置８は、結合されたスタックをまたがるコアスタック１４及び共通キャッシュ１６が大きくなるに従って、共通キャッシュ１６中の個別のスタック拡張エントリを自動的に割り当てることでスタック拡張１８を形成してもよい。このようにして、所与のスタックのコンテンツが、プロセッサコア１２内のコアスタック１４のスタックエントリと共通キャッシュ１６のスタックエントリとの双方にまたがる連続的なスタックとしてアクセスされるように、真のスタック拡張が装置８に関連付けられたソフトウェアドライバによって割り当てられる。換言すれば、コアスタック１４と共通キャッシュ１６は、論理スタック１５をコアスタック１４と共通キャッシュ１６との間でスワッピングするというよりもむしろ、連続する範囲のスタックエントリを共通のスタックとして格納するのに用いられる。
【００２５】
この代替のキャッシュアプローチについて、プロセッサコア１２は、スタック拡張１８ごとに開始アドレスと仮想カウンタとを保持する。装置８は、各スタックエントリをL1キャッシュエントリの一部、即ちコアスタック１４にマッピングする。このようにして、スタック拡張１８を「仮想的な」スタック拡張としてみなしてもよい。キャッシュエントリへ書き込むとき、又はキャッシュエントリから読み出すとき、L1キャッシュのヒットがあれば、装置８は、コアスタック１４にキャッシュエントリを書き込むか、コアスタック１４のキャッシュエントリを読み出す。キャッシュミスがあれば、装置８は代わりに共通キャッシュ１６、例えばL2キャッシュに関連して読み出すか書き込む。共通キャッシュ１６は、同一のメモリアドレスをL2キャッシュの一部にマッピングする。L2キャッシュのヒットがあれば、装置８はキャッシュエントリをL2キャッシュに書き込むか、キャッシュエントリをL2キャッシュから読み出す。L1又はL2でキャッシュのヒットが無ければ、キャッシュエントリは廃棄されるか、利用可能であれば、同一のメモリアドレスに従って、外部メモリに向けられる。メモリアドレスのキャッシュエントリへのマッピングは、例えばメモリアドレスの中程の幾つかのビットをインデックスとして、他のビットをキャッシュヒット又はキャッシュミスを確認するためのTAGとして用いることで為し得る。
【００２６】
キャッシュスワッピングアプローチに更に関連して、スレッドが論理スタック１５Ａから制御命令をポップする必要があるとき、当該スレッドはプロセッサコア１２に対してスタックの頂上に位置する制御命令をポップオフさせ、当該制御命令によって特定される動作を実行する。換言すれば、処理スレッドは、プロセッサコア１２に対して、後入れ先出し（LIFO）スキームに従って制御命令をポップオフさせる。
【００２７】
プロセッサコア１２は、対応する論理スタック１５Ａのエントリの数が閾サイズ、例えばエントリ数の閾値を下回るまで、スレッドに対して制御命令のポップオフを継続する。一実施形態において、閾値には、論理スタックが空のとき、即ちエントリがゼロ個のときに達する。他の実施形態において、閾値は、論理スタックがほぼ空の状態に対応するように選択されてもよい。
【００２８】
論理スタック１５Ａが閾値を下回ったとき、プロセッサコア１２は、共通キャッシュ１６の対応するスタック拡張１８Ａの頂上部を、論理スタック１５Ａに転送する。プロセッサコア１２は、例えばスワップインコマンド（swap-in command）を発行して、共通キャッシュ１６のスタック拡張１５Ａの頂上部を読み出してもよい。頂上部は、コアスタックのサイズに適合する大きさにしてもよい。従って、プロセッサコア１２は、共通キャッシュ１６の関連付けられたスタック拡張１８Ａに格納されたエントリを、論理スタック１５Ａに再ポピュレートする（re-populates）。論理スタック１５Ａは、スタック拡張１８Ａに格納されたエントリで完全に満たされても、部分的に満たされてもよい。
【００２９】
同様に、メモリ２４のスタック拡張２２Ａのエントリは、スタック拡張又は論理スタックが適切な閾値レベルに達したとき、スタック拡張１８Ａ又は論理スタック１５Ａのどちらかに転送され得る。例えば、装置８は、スタック拡張１８Ａのエントリの数が閾値を下回ったときに、スタック拡張２２Ａの頂上部をスタック拡張１８Ａに転送してもよい。あるいは、例えば、装置８は、論理スタック１５Ａのエントリの数が閾値を下回ったときに、スタック拡張２２Ａの頂上部を論理スタック１５Ａに転送してもよい。繰り返しになるが、転送された部分は、スタック拡張２２Ａ又は論理スタック１５Ａを適切に完全に満たすか、部分的に満たし得る。
【００３０】
プロセッサコア１２は、論理スタック１５Ａ、スタック拡張１８Ａ及びスタック拡張２２Ａの制御命令全てが実行されるまで、又はプロセッサリソースがプロセッサコア１２内で実行されているスレッドのうちの別の１つに移されるまで、制御命令のポップオフ及び転送を継続する。別のスレッドは、プロセッサコア１２に対して、制御命令を関連付けられた論理スタック１５並びにスタック拡張１８及び２２に同様にしてポップオフ及びプッシュオンさせる。従って、プロセッサ１０は、メモリ２４及び／又は共通キャッシュ１６の一部をスタック拡張として利用することでスタックオーバーフローを制御し、プロセッサ１０が、無制限ではなくても、より多数のネストされたフロー制御命令を実施できるようにする。
【００３１】
プロセッサコア１２は、制御命令を論理スタック１５からスタック拡張１８へ内部バス２０を介して転送する。内部バス２０は、プロセッサコア１２によってアクセスされる他のリソースに用いられる同一のバスであってよい。例えば、プロセッサコア１２は、共通キャッシュ１６のレジスタ又は記憶バッファに、内部バス２０を用いてデータを書き込み得る。従って、プロセッサコア１２によって発行されるスワップインコマンド及びスワップアウトコマンドは、プロセッサコア１２の外部の仮想レジスタファイル又は記憶バッファ／一般的な負荷及び命令のフェッチといった、他のリソースへのアクセスと同一のデータパスを用いてもよい。このようにして、プロセッサコア１２は、制御命令を、共通キャッシュ１６のスタック拡張１８へ付加的なハードウェアの必要無しに転送する。
【００３２】
本願発明の技法は、増加された数のネストされたフロー制御命令を実施することについて例示的な目的のためにのみ記載されている。本技法はまた、種々のデータを格納するために実質的に無制限のサイズのスタックを導入するために利用してもよい。例えば、本技法は、アプリケーション開発者によってプログラムされた、明示的なプッシュ命令及びポップ命令を介してアプリケーションのデータを格納する、拡張されたサイズのスタックを導入するのに利用され得る。
【００３３】
図２は、プロセッサコアの外部に設けられたメモリをスタック拡張として利用することで、スタックオーバーフローを制御する装置２７のブロック図である。装置２７は、第１のプロセッサコア２９Ａと第２のプロセッサコア２９Ｂ（まとめて「プロセッサコア２９」）とを含む、マルチコアプロセッサ２８を備える。装置２７は、図１の装置８と実質的に同様だが、装置２７は単独のプロセッサコアの代わりに複数のプロセッサコア２９を備える。装置２７と、より具体的には、プロセッサコア２９の各々は、図１で述べたのと同様に動作する。特に、装置２７は、プロセッサコア２９の各々の内部のコアスタック１４を保持し、コアスタック１４のスタックオーバーフローを、共通キャッシュ１６のスタック拡張１８、メモリ２６のスタック拡張２２、又はスタック拡張１８及び２２の組み合わせを用いて制御する。異なるプロセッサコア２９のためのスタック拡張１８は通常、重なり合わないであろう。その代わりに、別個のスタック拡張１８が、異なるプロセッサコア２９に対して保持される。
【００３４】
図３は、図１の装置８を更に詳細に示すブロック図である。装置８は、プロセッサコア１０の外部のメモリをスタック拡張として利用して、スタックオーバーフローを制御する。装置８は、メモリ２４と、制御ユニット３０、コアスタック１４、論理スタックカウンタ３４Ａ−３４Ｎ（「論理スタックカウンタ３４」）、スタック拡張カウンタ３６Ａ−３６Ｎ（「スタック拡張カウンタ３６」）、及びスレッド３８Ａ−３８Ｎ（「スレッド３８」）を含むプロセッサコア１２を有するプロセッサ１０とを備える。
【００３５】
制御ユニット３０は、プロセッサ１０で実行されるスレッド３８のスケジューリングを含めて、プロセッサ１０の動作を制御する。例えば、制御ユニット３０は、スレッド３８を、固定優先度スケジューリング、タイムスライシング及び／又は任意の他のスレッドスケジューリング方法を用いてスケジューリングしてもよい。存在するスレッド３８の数は、プロセッサ１０によって処理されている、特定の１つ又は複数のアプリケーションのリソース要件に依存する。
【００３６】
スレッド３８のうちの１つ、例えばスレッド３８Ａが、プロセッサコア１２で実行されるようにスケジュールされたとき、スレッド３８Ａは制御ユニット３０に対して、制御命令といったスタックエントリを論理スタック１５Ａにプッシュさせるか、論理スタック１５Ａからエントリをポップオフさせる。上述したように、制御ユニット３０は、論理スタック１５のオーバーフローを防止するために、論理スタック１５Ａのコンテンツの少なくとも一部、随意的に論理スタック１５Ａの全コンテンツを、共通キャッシュ１６のスタック拡張１８、メモリ２４のスタック拡張２２、又はこの双方に転送する。
【００３７】
スレッド３８の各々について、プロセッサコア１２は、論理スタックカウンタ３４とスタック拡張カウンタ３６を保持する。論理スタックカウンタ３４とスタック拡張カウンタ３６とは、それぞれ論理スタック１５の制御命令の数とスタック拡張１８及び２２の制御命令の数とを追跡する。例えば、論理スタックカウンタ３４Ａは、論理スタック１５Ａの制御命令の数を追跡し、スタック拡張カウンタ３６Ａは、スタック拡張１８Ａの制御命令の数を追跡する。他のスタック拡張カウンタ３６は、スタック拡張２２Ａに格納された制御命令の数を追跡し得る。
【００３８】
上述したように、プロセッサ１０は、スタックオーバーフローを、共通キャッシュ１６の一部をスタック拡張として利用することで制御して、プロセッサ１０が、実質的に無制限のサイズではないとしても、拡張されたサイズのスタックを導入することを可能にする。最初に、制御ユニット３０は、新たな制御命令を、又は、アプリケーションに関連付けられた他のデータを、スレッド３８Ａ用の論理スタック１５Ａにプッシュし始める。制御ユニット３０は、論理スタックカウンタ３４Ａをインクリメントして、論理スタック１５Ａにプッシュされた新たな制御命令を反映する。制御ユニット３０は、論理スタック１５Ａがエントリ数の閾値を超えるまで、新たな制御命令をスレッド３８用の論理スタック１５Ａにプッシュし続ける。一実施形態において、制御ユニット３０は、論理スタック１５Ａが一杯になるまで、新たな制御命令を論理スタック１５Ａにプッシュし得る。このようにして、プロセッサ１０は、論理スタック１５のコンテンツをスタック拡張１８に転送しなければならない回数を減少させる。
【００３９】
制御ユニット３０は、スレッド３８Ａについて、論理スタックカウンタ３４Ａが閾値の最大値に達したときに、論理スタック１５Ａが閾値を越えたと判定する。閾値の最大値は、コアスタック１４が論理スタック１５に細分されるときに決定されてもよいし、論理スタック１５の各々のサイズと等しくてもよい。制御ユニット３０が、別の制御命令を論理スタック１５Ａにプッシュする必要があるが、論理スタック１５Ａは閾値に達したか、超えたと判定したとき、制御ユニット３０は、対応する論理スタック１５Ａのコンテンツの少なくとも一部をスタック拡張１８Ａに転送する。一実施形態において、制御ユニット３０は、論理スタック１５Ａの全コンテンツをスタック拡張１８Ａに転送する。例えば、制御ユニット３０は、スワップアウトコマンドを発行して、スタック１５Ａ全体を共通キャッシュ１６のスタック拡張１８Ａに書き込んでもよい。あるいは、制御ユニット３０は、スタック１５Ａのコンテンツの一部のみをスタック拡張１８Ａに転送してもよい。例えば、制御ユニット３０は、最下端部の１つ又は複数の制御命令をスタック拡張１８Ａに転送し得る。
【００４０】
同様にして、制御ユニット３０は、スタック拡張１８Ａのコンテンツの一部を、スタック拡張２２Ａに同様の方法で転送し得る。換言すれば、制御ユニット３０は、共通キャッシュ１６のスタック拡張１８Ａが一杯になったときにスワップアウトコマンドを発行して、共通キャッシュ１６のスタック拡張１８Ａのコンテンツの少なくとも一部を、メモリ２４のスタック拡張２２Ａに転送し得る。このようにして、装置８は、多段スタック拡張、即ち、共通キャッシュ１６内に設けられたスタック拡張の一部とメモリ２４内に設けられた一部を用いて、スタックオーバーフローを制御し得る。あるいは、制御ユニット３０は、論理スタック１５Ａのコンテンツを、メモリ２４のスタック拡張２２Ａに直接転送して、論理スタック１５Ａのオーバーフローを制御してもよい。論理スタックカウンタ３４Ａとスタック拡張カウンタ３６Ａは、コンテンツの転送を反映するように調整される。
【００４１】
制御ユニット３０は、論理スタックカウンタ３４とスタック拡張カウンタ３６を調整して、スタック間でのエントリの転送を反映する。一実施形態において、プロセッサコア１２は、スレッドの各々に関連付けられたスタック拡張カウンタ３６と論理スタックカウンタ３４を単独のカウンタとして導入する。例えば、論理スタック１５Ａのサイズが４エントリであり、スタック拡張１８Ａのサイズは１６エントリであり、外部のメモリのスタック拡張２２Ａのサイズは６４エントリである場合、プロセッサコア１２は６ビットのスタックカウンタを用い得る。２つの最下位ビット（即ち、ビット０と１）は、論理スタック１５Ａのエントリの数を表し、中間の２つのビット（即ち、ビット２と３）は、共通キャッシュ１６のスタック拡張１８Ａのエントリの数を表し、２つの最上位ビット（即ち、ビット４と５）は、外部のメモリ２４のスタック拡張２２Ａのエントリの数を表す。
【００４２】
最初に、カウンタは−１に設定されるが、これは如何なるスタックにもエントリが存在しないことを意味する。論理スタック１５Ａが４個のエントリを有するとき、６ビットのカウンタの値は３に等しい。新たなエントリが論理スタック１５Ａにプッシュされるべきとき、カウンタの値は４に等しくなるであろう。中間の２つのビットに対するこのキャリービットは、論理スタック１５Ａの全コンテンツを対応するスタック拡張１８Ａにスワップするためのスワップアウトコマンドをトリガーするであろう。スワップ後、カウンタの値は４に等しいが、最下位の２つのビットがゼロに等しいことは、論理スタック１５Ａに１個のエントリがあることを示し、中間の２つのビットが１に等しいことは、１つの論理スタックがスタック拡張１５Ａにオーバーフローしたことを示す。
【００４３】
論理スタックが３回オーバーフローしたとき、中間の２つのビットは３に等しい。次回のオーバーフローが発生するとき、スワップアウト命令がトリガーされて、３つの論理スタックのコンテンツを含む、スタック拡張１８Ａの全コンテンツに加えて、新たにオーバーフローした論理スタックのコンテンツを外部のメモリ２４にスワップする。そのとき、最上位の２つのビットは１に等しく、スタック拡張が外部のメモリ２６に１回オーバーフローすることを意味する。中間の２つのビットはゼロに等しく、論理スタック１５Ａのコピーはスタック拡張１８Ａに存在しないことを意味する。スタックがポップされて空になると、適当なカウンタが同様の方法でカウントダウンして、外部のメモリからスタック拡張１８Ａへ、次いで論理スタック１５Ａへとスワップインする。
【００４４】
制御ユニット３０は、論理スタック１５Ａの制御命令を、１つの連続するデータブロックとして転送してもよい。換言すれば、制御ユニット３０は、制御命令をスタック拡張１８Ａに１度の書き込み動作で書き込んでもよい。あるいは、制御ユニット３０は、制御命令をスタック拡張１８Ａに２度以上の書き込み動作を用いて書き込んでもよい。例えば、制御ユニット３０は、論理スタック１５Ａの個別の制御命令ごとに別個の書き込み動作を用いて、制御命令をスタック拡張１８Ａに書き込み得る。
【００４５】
制御ユニット３０は、論理スタック１５Ａの制御命令をスタック拡張１８Ａに転送する一方で、制御ユニット３０はスレッド３８ＡをＳＬＥＥＰキューに入れて、ＡＬＵスロットを他のスレッド３８による使用のためにオープンする。換言すれば、スレッド３８Ａはアイドル状態にされるので、スレッド３８のうちの別の１つがプロセッサコア１２のリソースを用いることが可能になる。新たなスレッドは、プロセッサコアの他のスレッドと同じメカニズムを再度用いる。例えば、命令ミス又はメモリアクセスの場合、データをスワップバックする前に、現在のスレッドがＳＬＥＥＰキューに移動され、ＡＬＵスロットが他のスレッド３８によって用いられるであろう。
【００４６】
一旦制御命令の転送が完了すると、制御ユニット３０は、別のスレッドに対して、より高い優先度が与えられていない場合、スレッド３８Ａを再起動する（reactivates）。このようにして、プロセッサコア１２は、そのリソースをより効率的に用いて複数のスレッドを実行することで、制御命令のスタック拡張１８への転送の期間に浪費される処理サイクルの回数を減少させる。また、制御ユニット３０は、論理スタックカウンタ３４Ａとスタック拡張カウンタ３６Ａとをインクリメントして、それぞれ論理スタック１５Ａ内とスタック拡張１８Ａ内の制御命令又は他のデータの数を追跡する。
【００４７】
特に、所与の時間にプロセッサコア１２で実行されるアプリケーションのスレッドの数は、必ずしもアプリケーションに関連付けられるスレッドの数に対応しない。１つのスレッドが完了した後、コアスタック１４内の論理スタック空間とスレッド空間は、新たなスレッドに再使用することができる。従って、所与の時間にコアスタック１４を用いるスレッドの数は、アプリケーションのスレッドの総数ではない。例えば、一部の実施形態において、プロセッサコア１２は、所与のアプリケーションの１６個のスレッドに充分なスタック空間を提供するように構成され得る。しかしながら、同時に、そのアプリケーションは１万個以上のスレッドを有するかもしれない。それ故、プロセッサコア１２は、アプリケーションを実行している間に多数のスレッドを開始及び完了し、一定数のスレッドに限定されるわけではない。その代わりに、スレッドは、アプリケーションの実行の過程において、繰り返し同一のスレッド空間と論理スタック空間を再使用する。
【００４８】
制御ユニット３０がスレッド３８Ａのための論理スタック１５Ａから制御命令をポップする必要があるとき、制御ユニット３０は、制御命令を論理スタック１５Ａの頂上からポップオフし始め、論理スタックカウンタ３４Ａをデクリメントする。論理スタック１５Ａが閾値の最小値を下回ったとき、例えば論理スタックカウンタ３４Ａがゼロのとき、制御ユニット３０は、スレッド３８Ａに関連付けられた制御命令がスタック拡張１８Ａにあるかどうかを判定する。例えば、制御ユニット３０は、スタック拡張カウンタ３６Ａの値を確認して、制御命令がスタック拡張３２に残存しているかどうかを判定してもよい。制御命令がスタック拡張１８Ａにある場合、制御ユニット３０は制御命令をスタック拡張１８Ａの頂上部から取り出して、論理スタック１５Ａに再ポピュレートする。例えば、制御ユニット３０は、スワップインコマンドを発行して、共通キャッシュ１６のスタック拡張１５Ａの頂上部を読み出してもよい。論理スタック１５Ａが空のときにスタック拡張１８Ａのコンテンツをスワップインすることは、スワップインコマンドの数を減少させ得る。
【００４９】
同様に、メモリ２４のスタック拡張２２Ａのエントリは、スタック拡張１８Ａか論理スタック１５Ａのいずれかに転送される。例えば、装置８は、スタック拡張１８Ａのエントリの数が閾値を下回ったとき、スタック拡張２２Ａの頂上部をスタック拡張１８Ａに転送してもよい。あるいは、例えば、装置８は、論理スタック１５Ａのエントリの数が閾値を下回ったとき、スタック拡張２２Ａの頂上部を論理スタック１５Ａに転送してもよい。スタック拡張２２又はスタック拡張１８Ａの頂上部は、論理スタック１５Ａのサイズに大きさで対応し得る。
【００５０】
制御ユニット３０は、制御命令をスタック１５Ａに転送する一方で、制御ユニット３０はスレッド３８Ａをアイドル状態にするので、他のスレッドがプロセッサ１２のリソースを利用することが可能になる。例えば、制御ユニット３０は、スレッド３８ＡをＳＬＥＥＰキューに入れることで、ＡＬＵスロットをその他のスレッド３８のうちの１つが用いるためにオープンしてもよい。一旦制御ユニット３０が制御命令を取り出すと、制御ユニット３０は、スレッド３８Ａがアイドルである期間に別のスレッドに対してより高い優先度が与えられていない場合、スレッド３８Ａを起動する。更に、制御ユニット３０はスタック拡張カウンタ３６Ａを調整して、スタック拡張１８Ａからの制御命令の除去を計上する。また、制御ユニット３０は、論理スタックカウンタ３４Ａを調整して論理スタック１５Ａに入れられた制御命令を計上する。
【００５１】
制御ユニット３０は、スレッド３８Ａのための論理スタック１５Ａからの制御命令のポップオフ及び実行を継続する。この処理は、論理スタック１５Ａとスタック拡張１８Ａ及び２２Ａとの双方で保持される制御命令の全てがスレッド３８Ａによって読み出され、実行されるまで、又は制御ユニット３０がプロセッサコア１２のリソースをスレッド３８のうちの別の１つに割り当てるまで、継続する。このようにして、プロセッサ１０は、制御命令をスタック拡張１８及びスタック拡張２２にプッシュし、その後それらの制御命令を取り出すことで、無限の数のネストされた制御命令を実施できる。しかしながら、上述したように、プロセッサ１０は、本明細書に記載された技法を利用して、制御命令以外のデータを格納する拡張されたサイズのスタックを導入してもよい。
【００５２】
図４は、コアスタック１４とスタック拡張１８を更に詳細に示すブロック図である。上述したように、コアスタック１４は一定のサイズのデータ構造であり、プロセッサコア１２のメモリ内に存在する。図４に示される例では、コアスタック１４は２４個の制御命令を保持するように構成されている。コアスタック１４は、任意の数の制御命令を保持するように構成され得る。しかしながら、コアスタック１４のサイズは、プロセッサコア１２内のメモリのサイズに制限され得る。
【００５３】
コアスタック１４は、１つ又は複数の論理スタックに構成可能であり、論理スタックの各々がアプリケーションのスレッドに対応する。上述したように、論理スタックのサイズと数は、現在のアプリケーションのスレッドの数に依存するが、特定のアプリケーションのリソース要件に従ってソフトウェアドライバによって決定されてもよい。換言すれば、プロセッサコア１２は、特定のアプリケーションに関連付けられたスレッドの数に基づいて、アプリケーションごとに別様にコアスタック１４を動的に細分する。
【００５４】
図４に示される例では、コアスタック１４は４個の等しいサイズの論理スタック１５Ａ−１５Ｄ（「論理スタック１５」）に構成される。論理スタック１５はそれぞれ、６個の制御命令といった６個のエントリを保持する。しかしながら、上述したように、アプリケーションがより多数のスレッドを含むとき、コアスタック１４はより多くの個数の論理スタック１５に細分されるであろう。例えば、アプリケーションが６個のスレッドを含む場合、コアスタック１４は、各々が４個の制御命令を保持する、６個の論理スタックに構成されてもよい。逆に、アプリケーションがより少数のスレッドを含む場合、コアスタック１４はより少ない個数の論理スタック１５に細分されるであろう。そのような構成可能性（configurability）は、スタック全体の利用を最大限にし、様々なアプリケーションのニーズに対して柔軟性を提供することができる。
【００５５】
プロセッサ１０は、プロセッサコア１２内の論理スタック１５と、共通キャッシュ１６内のスタック拡張１８との間で制御命令を転送することでスタックオーバーフローを制御する。スタック拡張１８の各々は、論理スタック１５のうちの１つに対応する。例えば、スタック拡張１８Ａは論理スタック１５Ａに対応し得る。しかしながら、スタック拡張１８Ａは論理スタック１５Ａよりも大きくてもよい。図４に示される例において、スタック拡張１８Ａは論理スタック１５Ａの４倍大きい。従って、プロセッサコア１２は、スタック拡張１８Ａが一杯になる前に、４回、論理スタック１５Ａを制御命令で満たし、論理スタック１５Ａから制御命令を転送し得る。あるいは、スタック拡張１８Ａは論理スタック１５Ａと同じサイズであってもよい。この場合、プロセッサコア１２は論理スタックを一回一杯にする制御命令のみを転送することができる。
【００５６】
しかしながら、スタック拡張が共通キャッシュ１６のサイズよりも大きい場合、共通キャッシュ１６はデータを外部のメモリ２４へスワップしたり、外部のメモリ２４からスワップしたりしてもよい。あるいは、スタック拡張の一部は、共通キャッシュ１６内とメモリ２４内の一部に設けられてもよい。従って、プロセッサ１２は無限の数のネストされたフロー制御命令を非常に低いコストで精確に実施し得る。
【００５７】
図５は、プロセッサ１０が制御命令を共通キャッシュのスタック拡張にプッシュして、コアスタックのスタックオーバーフローを防止する例示的な動作を示すフロー図である。最初に、制御ユニット３０は、新たな制御命令を、スレッド３８といったスレッドに関連付けられた論理スタック１５Ａにプッシュする必要性を判定する（４０）。例えば、制御ユニット３０は、新たなループが実行されなければならず、当該新たなループが完了した後に現在のループに戻る制御命令をプッシュする必要があると判定してもよい。
【００５８】
制御ユニット３０は、論理スタック１５Ａが閾値の最大値に達したか、又は閾値の最大値を越えたかどうかを判定する（４２）。例えば、制御ユニット３０は、論理スタックカウンタ３４Ａの値を閾値と比較して、論理スタック１５Ａが一杯かどうかを判定し得る。閾値は、例えば論理スタック１５Ａのサイズであり得るが、これはコアスタック１４のサイズと、現在のアプリケーションに関連付けられたスレッドの数に基づいて決定されてもよい。
【００５９】
論理スタック１５Ａのエントリの数が、閾値の最大値を超えない場合、制御ユニット３０は、スレッド３８Ａのための論理スタック１５Ａに新たな制御命令をプッシュする（４４）。また、制御ユニット３０は、論理スタックカウンタ４６をインクリメントして、論理スタック１５Ａに入れられた新たな制御命令を計上する（４６）。
【００６０】
論理スタック１５Ａのエントリの数が閾値の最大値に達したか、又は閾値の最大値を超えた場合、制御ユニット３０は現在のスレッドをアイドル状態にする（４８）。スレッド３８Ａがアイドルである間、スレッド３８のうちの別の１つが、プロセッサコア１２のリソースを用いるであろう。また、制御ユニット３０は、論理スタック１５Ａのコンテンツの少なくとも一部を、共通キャッシュ１６の対応するスタック拡張１８Ａに転送する（５０）。例えば、制御ユニット３０は、論理スタック１５Ａの全コンテンツをスタック拡張１８Ａに転送してもよい。制御ユニット３０は、論理スタック１５Ａのコンテンツを、１回の書き込み動作で、又は複数回の連続する書き込み動作で転送し得る。論理スタック１５Ａのコンテンツがスタック拡張１８Ａに転送された後、制御ユニット３０はスレッド３８Ａを再起動する（５２）。
【００６１】
制御ユニット３０は、スタック拡張カウンタ３６Ａをインクリメントして、スタック拡張１８Ａに転送された制御命令を計上する（５４）。一実施形態において、制御ユニット３０は、スタック拡張カウンタ３６Ａを書き込み動作の回数の関数としてインクリメントする。また、制御ユニット３０は論理スタックカウンタ３４Ａを調整して、論理スタック１５Ａから転送された制御命令を計上する（４６）。例えば、制御ユニット３０は、論理スタックカウンタ３４をゼロにリセットしてもよい。制御ユニット３０は次いで、新たな制御命令を論理スタック１５Ａにプッシュし得るが、論理スタック１５Ａは今や空である。
【００６２】
上述したように、スタック管理スキームはまた、外部のメモリ２４を更なるスタック拡張として用いてもよい。特に、例えば、共通キャッシュ１６のスタック拡張１８Ａが一杯になったとき、装置８は、論理スタック１５Ａのコンテンツがスタック拡張１８Ａに転送されるのと同様の方法で、共通キャッシュ１６のスタック拡張１８Ａのコンテンツの少なくとも一部をメモリ２４のスタック拡張２２Ａへスワップアウトしてもよい。このようにして、装置８は、多段スタック拡張、即ち共通キャッシュ１６内に設けられたスタック拡張の一部とメモリ２４内の一部とを用いてスタックオーバーフローを制御し得る。あるいは、装置８は論理スタック１５Ａのコンテンツをメモリ２４のスタック拡張２２Ａに直接転送して、論理スタック１５Ａのオーバーフローを制御してもよい。論理スタックカウンタ３２Ａとスタック拡張カウンタ３４Ａは、コンテンツの転送を反映するように調整される。
【００６３】
図６は、プロセッサ１０がスタック拡張に格納された制御命令を取り出す例示的な動作を示すフロー図である。最初に、スレッドが制御命令を論理スタックからポップすることを望み（６０）、論理スタックが空ではない場合（６２）、制御命令は論理スタックからポップされ（６３）、論理スタックカウンタが調整される（７６）。制御ユニット３０は、論理スタック１５Ａのエントリの数が、閾値の最小値を下回ったかどうかを判定する。一実施形態において、制御ユニット３０は論理スタック１５が空であるかどうかを判定する（６２）。従って、この場合、閾値はゼロである。例えば、制御ユニット３０は、論理スタックカウンタ３４Ａがゼロに等しいときに、論理スタック１５Ａが空であると判定し得る。論理スタック１５Ａのエントリの数が閾値の最小値を下回ったとき、制御ユニット３０はスタック拡張１８Ａの頂上部から次の制御命令をポップオフすることを試みる。
【００６４】
論理スタック１５Ａのエントリの数が閾値の最小値に達したか、閾値の最小値を下回った場合、制御ユニット３０はスタック拡張１８Ａが空であるか否かを判定する（６４）。例えば、制御ユニット３０は、スタック拡張カウンタ３６Ａがゼロに等しいときに、スタック拡張１８Ａは空であると判定し得る。スタック拡張１８Ａが空の場合、スレッド３８Ａに関連付けられた全ての制御命令が実行されており、制御ユニット３０は別のスレッドを起動し得る（６６）。
【００６５】
スタック拡張１８Ａが空ではない場合、制御ユニット３０はスレッド３８Ａをアイドル状態にする（６８）。スレッド３８Ａがアイドルである間、スレッド３８のうちの別の１つがプロセッサコア１２のリソースを用いるであろう。制御ユニット３０は、共通キャッシュ１６の対応するスタック拡張１８Ａの頂上部を論理スタック１５Ａに転送する（７０）。一実施形態において、制御ユニット３０はスタック拡張１８Ａから論理スタック１５Ａを満たすのに充分な制御命令を取り出す。換言すれば、制御ユニット３０は、論理スタック１５Ａに、共通キャッシュ１６の関連付けられたスタック拡張１８Ａに格納されたエントリを再ポピュレートする。制御ユニット３０は、アイドルなスレッド３８Ａを再起動する（７２）。
【００６６】
更に、制御ユニット３０はスタック拡張カウンタ３６Ａを調整して、スタック拡張１８Ａからの制御命令の除去を計上する（７４）。また、制御ユニット３０は論理スタックカウンタを調整して、論理スタック１５Ａに入れられた制御命令を計上する（７６）。制御ユニット３０は、論理スタック１５Ａからの制御命令のポップオフ及び実行を継続する。
【００６７】
図５及び図６のフロー図は、プロセッサ１０の内部に設けられた共通キャッシュ１６内のスタック拡張を利用するプロセッサ１０を記述しているが、プロセッサ１０は、図２に示されるように、プロセッサ１０の外部のメモリ又は外部のキャッシュに設けられたスタック拡張を保持及び利用してもよい。あるいは、プロセッサ１０は、プロセッサ１０の内部の共通キャッシュ１６と、プロセッサ１０の外部のメモリ又はキャッシュのいずれかとの双方を用いて、多段スタック拡張を保持してもよい。
【００６８】
本開示に記載された技法は、多数の利点を提供する。例えば、本技法は、プロセッサ又は他の装置に対して、実質的に無限の数のネストされたフロー制御命令、又はアプリケーションの他のアプリケーションデータを経済的に実施する能力を、アプリケーション開発者によってプログラムされた明示的なプッシュ命令及びポップ命令を介して提供する。更に、本技法は装置内に既に存在するリソースを利用する。例えば、プロセッサ又は他の装置は、スワップインコマンドとスワップアウトコマンドを、他のリソースアクセスに用いられるデータパスを用いて発行する。プロセッサ又は他の装置はまた、共通キャッシュ又は外部メモリといった、プロセッサコアの外部の既に利用可能なメモリを用いる。更に、本技法は、プロセッサコアで実行されているアプリケーション及びドライバに対して完全に明白である。
【００６９】
本開示に記載される技法は、ハードウェア、ソフトウェア、ファームウェア、又はこれらの任意の組み合わせで実施し得る。例えば、本技法の種々の側面は、１つ又は複数のマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルロジックアレイ（ＦＰＧＡ）、又は任意の他の同等の集積論理回路若しくは離散論理回路だけでなく、そのようなコンポーネントの任意の組み合わせで実施してもよい。「プロセッサ」又は「処理回路」といった用語は一般に、前述の論理回路のうちの任意のもの単独を、又は他の論理回路と組み合わせたものを指し得る。
【００７０】
ソフトウェアで実施されるとき、本開示に記載されるシステム及び装置に割り当てられた機能は、ランダムアクセスメモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、持久ランダムアクセスメモリ（ＮＶＲＡＭ）、電気的消去プログラム可能読み出し専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、磁気媒体、光学媒体等といった、コンピュータ読み取り可能な命令として具現化され得る。命令は、本開示に記載される機能性の１つ又は複数の側面をサポートすべく実行される。
【００７１】
本願発明の種々の実施形態について記載した。記載された実施形態は、例示的な目的のためのものにすぎない。これらの実施形態及び他の実施形態は、添付の特許請求の範囲の範囲内にあるものである。
以下に本願発明の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
プロセッサのコア内のスタックのコンテンツが閾サイズを超過するかどうかを判定し、  前記スタックの前記コンテンツが前記閾サイズを超過するとき、前記スタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記コアの外部のスタック拡張に転送する
ことを備える、方法。
［Ｃ２］
前記プロセッサの前記コア内の複数のスタックを保持し、前記複数のスタックの各々は、前記プロセッサによって実行されるアプリケーションの複数のスレッドのうちの異なる１つに対応しており、
前記プロセッサの前記コアの外部の複数のスタック拡張を保持し、前記スタック拡張の各々は、前記プロセッサの前記コア内の前記スタックのうちの１つに対応しており、
前記コンテンツの少なくとも一部を転送することは、前記プロセッサの前記コア内の前記スタックのうちの１つの前記コンテンツの少なくとも一部を、対応するスタック拡張に転送することを含む、
ことを更に含む、Ｃ１記載の方法。
［Ｃ３］
前記スタックの各々は等しい大きさであり、前記スタックの数は前記スレッドの数に対応する、Ｃ２記載の方法。
［Ｃ４］
前記スタックの各々は異なるアプリケーションに対しては異なる大きさにされる、Ｃ２記載の方法。
［Ｃ５］
前記プロセッサの前記コア内の前記スタックのうちの第２のスタックのコンテンツの少なくとも一部を、対応するスタック拡張に転送することを更に含む、Ｃ２記載の方法。
［Ｃ６］
前記プロセッサの前記コア内の前記スタックは、アプリケーションのスレッドに関連付けられ、
前記方法は、前記プロセッサの前記コア内の前記スタックの前記コンテンツが前記スタック拡張に転送される間に、前記アプリケーションの前記スレッドをアイドル状態にすることを更に含む、Ｃ１記載の方法。
［Ｃ７］
前記スタック拡張の前記コンテンツを前記スタックに転送し、前記スタック拡張の前記コンテンツが前記スタックに転送される間に、前記アプリケーションの前記スレッドをアイドル状態にすることを更に含む、Ｃ６記載の方法。
［Ｃ８］
前記スタックの前記コンテンツの少なくとも一部を前記スタック拡張に転送した後、前記プロセッサの前記コア内の前記スタックに新たなエントリをプッシュすることを更に備える、Ｃ１記載の方法。
［Ｃ９］
前記プロセッサの前記コア内の前記スタックのエントリの数を追跡するスタックカウンタを適用し、
前記スタックカウンタが閾値に到達したときに、前記スタックコンテンツは前記閾サイズを超過したと判定する
ことを更に備える、Ｃ８記載の方法。
［Ｃ１０］
前記コア内の前記スタックと前記スタック拡張との双方のエントリを追跡する共通スタックカウンタを適用することを更に備える、Ｃ１記載の方法。
［Ｃ１１］
前記コンテンツが第２の閾サイズを下回ったことを判定し、
前記スタックが前記第２の閾サイズを下回ったとき、前記プロセッサの前記コアの外部の前記スタック拡張の少なくとも一部を、前記プロセッサの前記コア内の前記スタックに転送する
ことを更に備える、Ｃ１記載の方法。
［Ｃ１２］
前記スタック拡張に転送される前記スタックコンテンツの前記一部を追跡するカウンタを調整することを更に備える、Ｃ１記載の方法。
［Ｃ１３］
前記スタックの前記コンテンツの少なくとも一部を転送することは、前記スタックの前記コンテンツの前記一部を、前記プロセッサの他のリソースによって利用されるデータバスで転送することを含む、Ｃ１記載の方法。
［Ｃ１４］
前記プロセッサの前記コアの外部の前記スタック拡張は、前記プロセッサの共通キャッシュ内のスタック拡張を備える、Ｃ１記載の方法。
［Ｃ１５］
前記プロセッサの前記コアの外部の前記スタック拡張は、前記プロセッサの外部のメモリ内のスタック拡張を備える、Ｃ１記載の方法。
［Ｃ１６］
前記スタックの前記コンテンツの少なくとも一部を転送することは、前記スタックの全コンテンツを転送することを備える、Ｃ１記載の方法。
［Ｃ１７］
前記スタック拡張は第１のスタック拡張を備え、前記方法は、前記第１のスタック拡張が閾サイズを超過したときに、前記第１のスタック拡張の前記コンテンツの少なくとも一部を第２のスタック拡張に転送することを更に含む、Ｃ１記載の方法。
［Ｃ１８］
前記コアは第１のコアであり、前記スタックは第１のスタックであり、前記スタック拡張は第１のスタック拡張であり、前記方法は、
前記プロセッサの第２のコア内の第２のスタックのコンテンツが閾サイズを超過したかどうかを判定し、
前記第２のスタックの前記コンテンツが前記閾サイズを超過したとき、前記第２のスタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記第２のコアの外部の第２のスタック拡張に転送する
ことを更に含む、Ｃ１記載の方法。
［Ｃ１９］
前記第１及び第２のスタック拡張は、共通キャッシュメモリ内にある、Ｃ１記載の方法。
［Ｃ２０］
前記スタックと前記スタック拡張とに連続的なキャッシュとしてアクセスすることを更に含む、Ｃ１記載の方法。
［Ｃ２１］
プロセッサコアを有するプロセッサであって、
前記プロセッサの動作を制御する制御ユニットと、
前記プロセッサコア内のスタックを格納する第１のメモリと
を含むプロセッサと、
前記プロセッサコアの外部のスタック拡張に格納する第２のメモリと
を備える装置であって、
前記スタックの前記コンテンツが前記閾サイズを超過したとき、前記制御ユニットは前記スタックの前記コンテンツの少なくとも一部を前記スタック拡張に転送する、装置。
［Ｃ２２］
前記スタックは前記プロセッサの前記コア内の複数のスタックを含み、前記複数のスタックの各々は、前記プロセッサによって実行されるアプリケーションの複数のスレッドのうちの異なる１つに対応し、前記スタック拡張は前記プロセッサの前記コアの外部の複数のスタック拡張を含み、前記スタック拡張の各々は前記プロセッサの前記コア内の前記スタックのうちの１つに対応し、前記制御ユニットは、前記プロセッサの前記コア内の前記スタックのうちの１つのコンテンツの少なくとも一部を、対応するスタック拡張に転送する、Ｃ２１記載の装置。
［Ｃ２３］
前記スタックの各々は等しい大きさであり、前記スタックの数は前記スレッドの数に対応する、Ｃ２２記載の装置。
［Ｃ２４］
前記スタックの各々は異なるアプリケーションに対して異なる大きさである、Ｃ２２記載の装置。
［Ｃ２５］
前記制御ユニットは、前記プロセッサの前記コア内の前記スタックのうちの第２のもののコンテンツの少なくとも一部を、対応するスタック拡張に転送する、Ｃ２２記載の装置。
［Ｃ２６］
前記プロセッサの前記コア内の前記スタックは、アプリケーションのスレッドに関連付けられ、前記プロセッサの前記コア内の前記スタックのコンテンツが前記スタック拡張に転送される間、前記制御ユニットは前記アプリケーションの前記スレッドをアイドル状態にする、Ｃ２１記載の装置。
［Ｃ２７］
前記制御ユニットは、前記スタック拡張の前記コンテンツを前記スタックに転送し、前記スタック拡張の前記コンテンツが前記スタックに転送される間、前記アプリケーションの前記スレッドをアイドル状態にする、Ｃ２６記載の装置。
［Ｃ２８］
前記制御ユニットは、前記スタックコンテンツの少なくとも一部を前記スタック拡張に転送した後、前記プロセッサの前記コア内の前記スタックに新たなエントリをプッシュする、Ｃ２１記載の装置。
［Ｃ２９］
前記制御ユニットは、スタックカウンタをインクリメントして前記プロセッサの前記コア内の前記スタックのエントリの数を追跡し、前記スタックカウンタが閾値に到達したとき、前記スタックコンテンツは前記閾サイズを超過したと判定する、Ｃ２８記載の装置。
［Ｃ３０］
前記制御ユニットは、共通スタックカウンタをインクリメントして、前記コア内の前記スタックと前記スタック拡張との双方のエントリを追跡する、Ｃ２１記載の装置。
［Ｃ３１］
前記制御ユニットは、前記スタックコンテンツが第２の閾サイズを下回ったと判定し、前記スタックが前記第２の閾サイズを下回ったとき、前記プロセッサの前記コアの外部の前記スタック拡張の少なくとも一部を、前記プロセッサの前記コア内の前記スタックに転送する、Ｃ２１記載の装置。
［Ｃ３２］
前記スタック拡張に転送される前記スタックコンテンツの前記一部を追跡するカウンタを更に備える、Ｃ２１記載の装置。
［Ｃ３３］
前記制御ユニットは、前記スタックコンテンツの前記一部を、前記プロセッサの他のリソースによって利用されるデータバスで転送する、Ｃ２１記載の装置。
［Ｃ３４］
前記プロセッサの前記コアの外部の前記スタック拡張は、前記プロセッサの共通キャッシュ内のスタック拡張を備える、Ｃ２１記載の装置。
［Ｃ３５］
前記プロセッサの前記コアの外部の前記スタック拡張は、前記プロセッサの外部のメモリ内のスタック拡張を備える、Ｃ２１記載の装置。
［Ｃ３６］
前記制御ユニットは前記スタックの全コンテンツを転送する、Ｃ２１記載の装置。
［Ｃ３７］
前記スタック拡張は第１のスタック拡張を備え、前記制御ユニットは、前記第１のスタック拡張の前記コンテンツが閾サイズを超過したとき、前記第１のスタック拡張の前記コンテンツの少なくとも一部を第２のスタック拡張に転送する、Ｃ２１記載の装置。
［Ｃ３８］
前記コアは第１のコアであり、前記スタックは第１のスタックであり、前記スタック拡張は第１のスタック拡張であり、前記制御ユニットは、
前記プロセッサの第２のコア内の第２のスタックのコンテンツが閾サイズを超過するかどうかを判定し、
前記第２のスタックの前記コンテンツが前記閾サイズを超過するとき、前記第２のスタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記第２のコアの外部の第２のスタック拡張に転送する、Ｃ２１記載の装置。
［Ｃ３９］
前記第１及び第２のスタック拡張は、共通キャッシュメモリ内にある、Ｃ２１記載の装置。
［Ｃ４０］
前記制御ユニットは、前記スタックと前記スタック拡張とに連続的なキャッシュとしてアクセスする、Ｃ２１記載の装置。
［Ｃ４１］
プロセッサに、
前記プロセッサのコア内のスタックのコンテンツが閾サイズを超過するかどうかを判定させ、
前記スタックの前記コンテンツが前記閾サイズを超過するとき、前記スタックの前記コンテンツの少なくとも一部を、前記プロセッサの前記コアの外部のスタック拡張に転送させる、
命令を備える、コンピュータ読み取り可能な媒体。
［Ｃ４２］
前記命令は前記プロセッサに、
前記プロセッサの前記コア内の複数のスタックを保持させ、前記複数のスタックの各々は、前記プロセッサによって実行されるアプリケーションの複数のスレッドのうちの異なる１つに対応し、
前記プロセッサの前記コアの外部の複数のスタック拡張を保持させ、前記スタック拡張の各々は、前記プロセッサの前記コア内の前記スタックのうちの１つに対応し、
前記コンテンツの少なくとも一部を転送することは、前記プロセッサの前記コア内の前記スタックのうちの１つの前記コンテンツの少なくとも一部を、対応するスタック拡張に転送することを含む、Ｃ４１記載のコンピュータ読み取り可能な媒体。
［Ｃ４３］
前記プロセッサの前記コア内の前記スタックは、アプリケーションのスレッドに関連付けられ、前記命令は前記プロセッサに、前記プロセッサの前記コア内の前記スタックの前記コンテンツが前記スタック拡張に転送される間、前記アプリケーションの前記スレッドをアイドル状態にさせる、Ｃ４１記載のコンピュータ読み取り可能な媒体。
［Ｃ４４］
前記命令は前記プロセッサに、前記スタック拡張の前記コンテンツを前記スタックに転送させ、前記スタック拡張の前記コンテンツが前記スタックに転送される間、前記アプリケーションの前記スレッドをアイドル状態にさせる、Ｃ４１記載のコンピュータ読み取り可能な媒体。
［Ｃ４５］
前記命令は前記プロセッサに、
前記コンテンツが第２の閾サイズを下回ることを判定させ、
前記スタックが前記第２の閾サイズを下回るとき、前記プロセッサの前記コアの外部の前記スタック拡張の少なくとも一部を、前記プロセッサの前記コア内の前記スタックに転送させる、Ｃ４１記載のコンピュータ読み取り可能な媒体。
【図面の簡単な説明】
【００７２】
【図１】図１は、本明細書に記載される技法に従ってコアスタックデータ構造を管理するシステムを示すブロック図である。
【図２】図２は、プロセッサコアの外部のメモリをスタック拡張として利用することで、スタックオーバーフローを制御する別の例示的なシステムを示すブロック図である。
【図３】図３は、図１のシステムを更に詳細に示すブロック図である。
【図４】図４は、コアスタックとスタック拡張を更に詳細に示すブロック図である。
【図５】図５は、エントリを共通キャッシュのスタック拡張にプッシュして、コアスタックのスタックオーバーフローを防止するシステムの例示的な動作を示すフロー図である。
【図６】図６は、スタック拡張に格納されたエントリを取り出すシステムの例示的な動作を示すフロー図である。
【図１】
0005523828.tif 000003
【図２】
0005523828.tif 000004
【図３】
0005523828.tif 000005
【図４】
0005523828.tif 000006
【図５】
0005523828.tif 000007
【図６】
0005523828.tif 000008