(57)【要約】  所定の深さのパイプラインを有するプロセッサ上で第１のコンテキストから第２のコンテキストに切り替えるための方法が提供される。第１のコンテキストにおける第１のタスクが、プロセッサ上で第１のタスクがパイプラインを横断するように実行される。プロセッサ用の切替えリード(force_pcz、force_ctxz)を、切替えリード(force_pcz、force_ctxz)に対する信号の状態を変更することを介してアサートすることによってコンテキスト切替えが呼び出される。第２のタスクの第２のコンテキストが保存／復元メモリから読み取られる。第２のタスクの第２のコンテキストが入力リード(new_ctx、new_pc)を介してプロセッサに提供される。第２のタスクに対応する命令がフェッチされる。第２のコンテキストにおける第２のタスクが、プロセッサ上で実行され、第１のタスクがパイプラインを横断してその所定のパイプライン深さに達した後、プロセッサの保存／復元リード（ｃｍｅｍ＿ｗｒｚ）がアサートされる。
2014501969.tif 000002
【特許請求の範囲】
【請求項１】
所定の深さのパイプラインを有するプロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）上で第１のコンテキストから第２のコンテキストに切り替えるための方法であって、
前記プロセッサ（４３２４、４３２６、５４１４、７６１０）上で前記第１のコンテキストにおける第１のタスクを、前記第１のタスクが前記パイプラインを横断するように実行するステップ、
前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）用の切替えリード（ｆｏｒｃｅ＿ｐｃｚ、ｆｏｒｃｅ＿ｃｔｘｚ）を、前記切替えリードに対する信号の状態を変更することを介してアサートすることによってコンテキスト切替えを呼び出すステップ、
保存／復元メモリ（４３２４、４３２６、５４１４、７６１０）から第２のタスクに対し前記第２のコンテキストを読み取るステップ、
前記第２のタスクに対する前記第２のコンテキストを入力リード（ｎｅｗ＿ｃｔｘ、ｎｅｗ＿ｐｃ）を介して前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）に提供するステップ、
前記第２のタスクに対応する命令をフェッチするステップ、
前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）上で前記第２のコンテキストにおける前記第２のタスクを実行するステップ、及び
前記第１のタスクがその所定のパイプライン深さまで前記パイプラインを横断した後、前記プロセッサ（４３２４、４３２６、５４１４、７６１０）の保存／復元リード（ｃｍｅｍ＿ｗｒｚ）をアサートするステップ、
を特徴とする、方法。
【請求項２】
請求項１に記載の方法であって、
前記呼び出すステップが、
プログラムカウンタ切替えリード（ｆｏｒｃｅ＿ｐｃｚ）をアサートするステップ、及び
コンテキスト切替えリード（ｆｏｒｃｅ＿ｃｔｘｚ）アサートするステップ、
を更に特徴とする、方法。
【請求項３】
請求項２に記載の方法であって、前記プログラムカウンタ切替えリード及びコンテキスト切替えリードのそれぞれが１ビット幅である、方法。
【請求項４】
請求項１、２、又は３に記載の方法であって、
前記提供するステップが、
プログラムカウン入力リード（ｎｅｗ＿ｐｃ）を介してプログラムカウンタ値を提供するステップ、及び
コンテキスト入力リード（ｎｅｗ＿ｃｔｘ）を介して機械状態を提供するステップ、
を更に特徴とする、方法。
【請求項５】
請求項４に記載の方法であって、前記プログラムカウンタ入力リードが１７ビット幅であり、前記コンテキスト入力リードが５９２ビット幅である、方法。
【請求項６】
請求項１、２、３、４、又は５に記載の方法であって、前記第１のタスクを実行する前記ステップが、前記第１のコンテキストで複数の第１のタスクを実行することを更に特徴とする、方法。
【請求項７】
請求項１、２、３、４、５、又は６に記載の方法であって、前記第２のタスクを実行する前記ステップが更に、前記第２のコンテキストで複数の第２のタスクを実行することを特徴とする、方法。
【請求項８】
装置であって、
保存／復元メモリ（４３２４、４３２６、５４１４、７６１０）、
命令メモリ（１４０４−１〜１４０４−Ｒ、５４０５、７６１６）、
データメモリ（４３２８、５４０３、７６１８）、及び
前記保存／復元メモリ、前記命令メモリ、及び前記データメモリに結合され、所定のパイプライン深さを有するプロセッサ（４３２２、５４０２、７６１４）、
を特徴とし、
前記プロセッサが、
切替えリード（ｆｏｒｃｅ＿ｐｃｚ、ｆｏｒｃｅ＿ｃｔｘｚ）であって、前記切替えリード上の信号の状態を変更することによってコンテキスト切替えを呼び出すための切替えリード、
前記保存／復元メモリからコンテキストデータを提供するための入力リード（ｎｅｗ＿ｃｔｘ、ｎｅｗ＿ｐｃ）、
命令メモリアドレスを提供する命令アドレスリード（ｉｍｅｍ＿ａｄｄｒ）、
命令データを受け取るための命令データリード（ｉｍｅｍ＿ｒｄａｔａ）、及び
コンテキスト書込みをイネーブルにするための書込みイネーブルリード（ｃｍｅｍ＿ｗｒｚ）、
を含む、装置。
【請求項９】
請求項８に記載の装置であって、前記切替えリードが、プログラムカウンタ切替えリード（ｆｏｒｃｅ＿ｐｃｚ）及びコンテキスト切替えリード（ｆｏｒｃｅ＿ｃｔｘｚ）を更に特徴とする、装置。
【請求項１０】
請求項９に記載の装置であって、前記プログラムカウンタ切替えリード及びコンテキスト切替えリードのそれぞれが１ビット幅である、装置。
【請求項１１】
請求項８、９、又は１０に記載の装置であって、
前記入力リードが、
プログラムカウンタ値を提供するためのプログラムカウンタ入力リード（ｎｅｗ＿ｐｃ）、及び
機械状態を提供するためのコンテキスト入力リード（ｎｅｗ＿ｃｔｘ）、
を更に特徴とする、装置。
【請求項１２】
請求項１１に記載の装置であって、前記プログラムカウンタ入力リードが１７ビット幅であり、前記コンテキスト入力リードが５９２ビット幅である、装置。
【請求項１３】
所定の深さのパイプラインを有するプロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）上で第１のコンテキストから第２のコンテキストに切り替えるためのシステムであって、
前記プロセッサ（４３２４、４３２６、５４１４、７６１０）上で前記第１のコンテキストにおける第１のタスクを、前記第１のタスクが前記パイプラインを横断するように実行するための手段、
プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）用の切替えリード（ｆｏｒｃｅ＿ｐｃｚ、ｆｏｒｃｅ＿ｃｔｘｚ）を、前記切替えリードに対する信号の状態を変更することを介してアサートすることによってコンテキスト切替えを呼び出すための手段、
保存／復元メモリ（４３２４、４３２６、５４１４、７６１０）から第２のタスクの前記第２のコンテキストを読み取るための手段、
前記第２のタスクに対する前記第２のコンテキストを、入力リード（ｎｅｗ＿ｃｔｘ、ｎｅｗ＿ｐｃ）を介して前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）に提供するための手段、
前記第２のタスクに対応する命令をフェッチするための手段、
前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）上で前記第２のコンテキストにおける前記第２のタスクを実行するための手段、及び
前記第１のタスクがその所定のパイプライン深さまで前記パイプラインを横断した後、前記プロセッサ（４３２４、４３２６、５４１４、７６１０）の保存／復元リード（ｃｍｅｍ＿ｗｒｚ）をアサートするための手段、
を特徴とする、システム。
【請求項１４】
請求項１３に記載のシステムであって、
前記呼び出すための手段が更に、
プログラムカウンタ切替えリード（ｆｏｒｃｅ＿ｐｃｚ）をアサートするための手段、及び
コンテキスト切替えリード（ｆｏｒｃｅ＿ｃｔｘｚ）アサートするための手段、
を特徴とする、システム。
【請求項１５】
請求項１４に記載のシステムであって、前記プログラムカウンタ切替えリード及びコンテキスト切替えリードのそれぞれが１ビット幅である、システム。
【請求項１６】
請求項１３、１４、又は１５に記載のシステムであって、
前記提供するための手段が更に、
プログラムカウン入力リード（ｎｅｗ＿ｐｃ）を介してプログラムカウンタ値を提供するための手段、及び
コンテキスト入力リード（ｎｅｗ＿ｃｔｘ）を介して機械状態を提供するための手段、
を特徴とする、システム。
【請求項１７】
請求項１６に記載のシステムであって、前記プログラムカウンタ入力リードが１７ビット幅であり、前記コンテキスト入力リードが５９２ビット幅である、システム。
【請求項１８】
請求項１３、１４、１５、１６、又は１７に記載のシステムであって、前記第１のタスクを実行するための前記手段が、前記第１のコンテキストで複数の第１のタスクを実行するための手段を更に特徴とする、システム。
【請求項１９】
請求項１、２、３、４、５、又は６に記載の方法であって、前記第２のタスクを実行する前記ステップが更に、前記第２のコンテキストで複数の第２のタスクを実行することを特徴とする、方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、全般的にプロセッサに関し、より具体的には処理クラスタに関する。
【背景技術】
【０００２】
図１はマルチコアシステム（２〜１６コアの範囲）についての実行速度のスピードアップ対並列オーバーヘッドを示すグラフである。スピードアップとは、単一プロセッサの実行時間を並列プロセッサの実行時間で除したものである。図からわかるように、多数のコアから有意な利益を得るために、並列オーバーヘッドはゼロに近くなければならない。しかし並列プログラム間に何らかの相互作用が存在する場合、オーバーヘッドは極めて高くなる傾向があるため、完全に分離されたプログラムでなければ２又は３以上のプロセッサを効率的に使用するのは通常極めて難しい。従って、改善された処理クラスタが必要とされている。
【発明の概要】
【０００３】
従って、本開示の実施形態は、所定の深さのパイプラインを有するプロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）上で第１のコンテキストから第２のコンテキストに切り替えるための方法を提供する。その方法は下記を特徴とする。即ち、プロセッサ（４３２４、４３２６、５４１４、７６１０）上で前記第１のコンテキストにおける第１のタスクを、前記第１のタスクが前記パイプラインを横断するように実行すること、前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）用の切替えリード（ｆｏｒｃｅ＿ｐｃｚ、ｆｏｒｃｅ＿ｃｔｘｚ）を、前記切替えリードに対する信号の状態を変更することを介してアサートすることによってコンテキスト切替えを呼び出すこと、保存／復元メモリ（４３２４、４３２６、５４１４、７６１０）から第２のタスクに対し前記第２のコンテキストを読み取ること、前記第２のタスクに対する前記第２のコンテキストを入力リード（ｎｅｗ＿ｃｔｘ、ｎｅｗ＿ｐｃ）を介して前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）に提供すること、前記第２のタスクに対応する命令をフェッチすること、前記プロセッサ（８０８−１〜８０８−Ｎ、１４１０、１４０８）上で前記第２のコンテキストにおける前記第２のタスクを実行すること、及び前記第１のタスクがその所定のパイプライン深さまで前記パイプラインを横断した後、前記プロセッサ（４３２４、４３２６、５４１４、７６１０）の保存／復元リード（ｃｍｅｍ＿ｗｒｚ）をアサートすることである。
【図面の簡単な説明】
【０００４】
【図１】マルチコアのスピードアップパラメータのグラフである。
【０００５】
【図２】本開示の実施形態に従ったシステムの図である。
【０００６】
【図３】本開示の実施形態に従ったＳＯＣの図である。
【０００７】
【図４Ａ】本開示の実施形態に従った並列処理クラスタの図である。
【図４Ｂ】本開示の実施形態に従った並列処理クラスタの図である。
【０００８】
【図５】処理クラスタ内のノード又は計算要素の一部分の図である。
【０００９】
【図６】グローバルロード／ストア（ＧＬＳ）ユニットの一例の図である。
【００１０】
【図７】共有機能メモリのブロック図である。
【００１１】
【図８】コンテキストに対する用語を示す図である。
【００１２】
【図９】例示のシステムのアプリケーションの実行の図である。
【００１３】
【図１０】例示のシステムのアプリケーションの実行におけるプリエンプションの例の図である。
【００１４】
【図１１】タスクスイッチの例である。
【図１２】タスクスイッチの例である。
【図１３】タスクスイッチの例である。
【００１５】
【図１４】ノードプロセッサ又はＲＩＳＣプロセッサのより詳細な図である。
【００１６】
【図１５】ノードプロセッサ又はＲＩＳＣプロセッサの一部の例の図である。
【図１６】ノードプロセッサ又はＲＩＳＣプロセッサの一部の例の図である。
【００１７】
【図１７】ゼロサイクルコンテキスト切替えの例の図である。
【発明を実施するための形態】
【００１８】
図２では、並列処理を実行するＳＯＣ用アプリケーションの例が見られる。この例では、撮像デバイス１２５０が示される。この（例えば携帯電話又はカメラであり得る）撮像デバイス１２５０は、概して、画像センサ１２５２、ＳＯＣ１３００、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）１３１５、フラッシュメモリ１３１４、ディスプレイ１２５４、及び電力管理集積回路（ＰＭＩＣ）１２５６を含む。動作では、画像センサ１２５２は、（静止画像又はビデオであり得る）画像情報を捕捉することができ、この画像情報はＳＯＣ１３００及びＤＲＡＭ１３１５によって処理され得、不揮発性メモリ（即ち、フラッシュメモリ１３１４）に保存され得る。また、フラッシュメモリ１３１４に保存される画像情報は、ＳＯＣ１３００及びＤＲＡＭ１３１５の使用によって、ディスプレイ１２５４上で使用するために表示され得る。また、撮像デバイス１２５０は、可搬型であることが多く、電源としてバッテリを含む。（ＳＯＣ１３００によって制御され得る）ＰＭＩＣ１２５６は、バッテリ寿命を長持ちさせるために電力使用量の調整を補助し得る。
【００１９】
図３では、本開示の実施形態に従ったシステムオンチップ又はＳＯＣ１３００の例が図示されている。この（典型的には、ＯＭＡＰ（登録商標）等の集積回路又はＩＣである）ＳＯＣ１３００は、（概して上述の並列処理を実行する）処理クラスタ１４００、及び、（上で説明及び参照された）ホスト環境を提供するホストプロセッサ１３１６を概して含む。ホストプロセッサ１３１６は、ワイド（即ち、３２ビット、６４ビット等）ＲＩＳＣプロセッサ（例えばＡＲＭ  Ｃｏｒｔｅｘ−Ａ９等）であり得、バスアービトレータ１３１０、バッファ１３０６、（ホストプロセッサ１３１６がインタフェースバス又はＩバス１３３０上で周辺インタフェース１３２４にアクセスすることを許可する）バスブリッジ１３２０、ハードウェアアプリケーションプログラミングインタフェース（ＡＰＩ）１３０８、及び割り込みコントローラ１３２２と、ホストプロセッサバス又はＨＰバス１３２８上で通信する。処理クラスタ１４００は、典型的に、（例えば、荷電結合デバイス、又はＣＣＤインタフェースであり得、オフチップデバイスと通信し得る）機能回路要素１３０２、バッファ１３０６、バスアービトレータ１３１０、及び周辺インタフェース１３２４と、処理クラスタバス又はＰＣバス１３２６上で、通信する。この構成を用いて、ホストプロセッサ１３１６は、ＡＰＩ１３０８を介して情報を提供する（即ち、所望の並列実装に適合するように処理クラスタ１４００を構成する）ことができ、一方、処理クラスタ１４００及びホストプロセッサ１３１６はいずれも、（フラッシュインタフェース１３１２を介して）フラッシュメモリ１３１４に、（メモリコントローラ１３０４を介して）ＤＲＡＭ１３１５に、直接アクセスできる。また、Ｊｏｉｎｔ  Ｔｅｓｔ  Ａｃｔｉｏｎ  Ｇｒｏｕｐ（ＪＴＡＧ）インタフェース１３１８を介して、テスト及びバウンダリスキャンが実行され得る。
【００２０】
図４を参照すると、本開示の実施形態に従った並列処理クラスタ１４００の例が示されている。典型的には、処理クラスタ１４００はハードウェア７２２に対応する。処理クラスタ１４００は、概して、パーティション１４０２−１〜１４０２−Ｒを含む。これらは、ノード８０８−１〜８０８−Ｎ、ノードラッパー８１０−１〜８１０−Ｎ、命令メモリ１４０４−１〜１４０４−Ｒ、及び（以下で詳しく説明する）バスインタフェースユニット又は（ＢＩＵ）４７１０−１〜４７１０−Ｒを含む。ノード８０８−１〜８０８−Ｎは、各々データインターコネクト８１４に（各々のＢＩＵ４７１０−１〜４７１０−Ｒ及びデータバス１４２２を介して）結合され、パーティション１４０２−１〜１４０２−Ｒのための制御及びメッセージが制御ノード１４０６からメッセージ１４２０を介して提供される。また、グローバルロード／ストア（ＧＬＳ）ユニット１４０８及び共有機能メモリ１４１０は、（後述のように）データ移動のための付加的な機能を提供する。それに加えて、レベル３又はＬ３キャッシュ１４１２、（概して、ＩＣ内には含まれない）周辺装置１４１４、（典型的にはフラッシュメモリ１３１４及び／又はＤＲＡＭ１３１５、並びにＳＯＣ１３００内に含まれないその他のメモリである）メモリ１４１６、及びハードウェアアクセラレータ（ＨＷＡ）ユニット１４１８が処理クラスタ１４００と共に用いられる。また、データ及びアドレスを制御ノード１４０６に通信するように、インタフェース１４０５が提供される。
【００２１】
処理クラスタ１４００は、概して、データ転送のために「プッシュ」モデルを使用する。データ転送は要求応答型のアクセスではなく、概してポステッドライトとして現れる。これは、データ転送が一方向であるため要求応答アクセスに比べてグローバルインターコネクト（即ち、データインターコネクト８１４）の占有を２分の１に減らすという利点を有する。概して、インターコネクト８１４を介して要求をルーティングし、その後、応答が要求元へルーティングされ、その結果インターコネクト８１４上で２つの遷移が生成されることは望まれない。プッシュモデルは単一転送を生成する。これは、ネットワークサイズが増大するとネットワークレイテンシが増大するため、またこのことが要求応答型トランザクションのパフォーマンスを低下させることは避けられないことであるため、スケーラビリティに関して重要である。
【００２２】
プッシュモデルは、データフロープロトコル（即ち、８１２−１〜８１２−Ｎ）と同様に、グローバルデータトラフィックを、正確さのために用いられるものまで概して最小化する一方、ローカルノードの利用率に対するグローバルデータフローの影響も概して最小化する。大量のグローバルトラフィックであってもノード（即ち、８０８−ｉ）のパフォーマンスに対する影響は、通常、皆無に近い。ソースはデータを（後述する）グローバル出力バッファに書き込み、転送成功の確認を要求することなく継続する。データフロープロトコル（即ち、８１２−１〜８１２−Ｎ）は、概して、インターコネクト８１４で単一転送を用い、データをあて先へ移動する最初の試みでの転送が成功することを確実にする。（後述する）グローバル出力バッファは（例えば）最大１６出力まで保持することができるため、出力のための瞬時グローバル帯域幅が不充分になることに起因するノード（即ち、８０８−ｉ）のストールの可能性が非常に低くなる。更に、瞬時帯域幅は、要求応答トランザクション又は転送失敗の繰り返しによる影響を受けない。
【００２３】
最後に、プッシュモデルはプログラミングモデルに一層密接に適合する。言い換えるとプログラムは自己データを「フェッチ」せずに、その代わりに、プログラムの入力変数及び／又はパラメータは呼び出される前に書き込まれる。プログラミング環境では、入力変数の初期化は、ソースプログラムによるメモリへの書き込みとして行われる。処理クラスタ１４００内では、これらの書き込みがポステッドライトに変換され、変数の値をノードコンテキストにポピュレートさせる。
【００２４】
（後述する）グローバル入力バッファは、ソースノードからデータを受け取るために用いられる。各ノード８０８−１〜８０８−Ｎのためのデータメモリが単一ポートであるため、入力データの書き込みが、ローカルの単一入力多重データ（ＳＩＭＤ）による読み出しとコンフリクトすることがあり得る。入力データをグローバル入力バッファへ受け入れ、そこで入力データが空きのデータメモリサイクルを待つことができることによって、この競合は回避される（即ち、ＳＩＭＤアクセスとのバンクコンフリクトはない）。データメモリは、（例えば）３２バンクを有し得るため、直ちにバッファがフリーになる可能性が非常に高い。しかしながら、転送を確認するためのハンドシェイキングがないので、ノード（即ち、８０８−ｉ）はフリーのバッファエントリを持つはずである。所望とされる場合は、グローバル入力バッファは、バッファ位置をフリーにするために、ローカルノード（即ち、８０８−ｉ）をストールさせてデータメモリに強制的に書き込みを行うことができるが、このイベントは極めて希であるべきである。典型的には、グローバル入力バッファは２つの別々のランダムアクセスメモリ（ＲＡＭ）として実装されて、一方がデータメモリへ読み出されるべき状態にある間、他方がグローバルデータを書き込むための状態になり得るようにする。メッセージングインターコネクトは、グローバルデータインターコネクトとは分かれているが、同様にプッシュモデルを使用する。
【００２５】
システムレベルでは、所望のスループットにスケーリングされた多数のノードを備えるＳＭＰ又は対称型多重処理のように、ノード８０８−１〜８０８−Ｎが処理クラスタ１４００内で複製される。処理クラスタ１４００は極めて多数のノードにまでスケーリングし得る。ノード８０８−１〜８０８−Ｎはパーティション１４０２−１〜１４０２−Ｒにグループ分けされ、各パーティションは１つ又は複数のノードを有する。パーティション１４０２−１〜１４０２−Ｒは、ノード間のローカル通信を増大させることによって及びより大きなプログラムで一層大量の出力データを計算させることによってスケーラビィリティを促進し、その結果、所望のスループット要件を達成する可能性を更に高める。パーティション（即ち、１４０２−ｉ）内では、ノードはローカルインターコネクトを用いて通信し、グローバルリソースを必要としない。また、パーティション（即ち、１４０４−ｉ）内のノードは、排他的命令メモリを用いる各ノードから共通命令メモリを用いる全てのノードまで、任意の粒度で、命令メモリ（即ち、１４０４−ｉ）を共有することができる。例えば、３つのノードが命令メモリの３つのバンクを共有し、第４のノードが命令メモリの排他的バンクを有することができる。ノードが命令メモリ（即ち、１４０４−ｉ）を共有するとき、それらのノードは、概して、同期して同じプログラムを実行する。
【００２６】
また、処理クラスタ１４００は非常に多数のノード（即ち、８０８−ｉ）及びパーティション（即ち、１４０２−ｉ）をサポートし得る。しかしながら、１つのパーティションについて４以上のノードを持つと概してノンユニフォームメモリアクセス（ＮＵＭＡ）アーキテクチャに類似するため、パーティション毎のノードの数は通常は４つに限定されている。この例では、パーティションは、（後でインターコネクト８１４に関連して説明する）１つ（又は複数）のクロスバーを介して接続される。クロスバーは概して横断帯域幅が一定している。処理クラスタ１４００は、現在、サイクル毎に１ノード幅のデータ（例えば、６４、１６ビットピクセル）を転送するように設計されており、４サイクルに亘り、１サイクルにつき１６ピクセルの４転送に区分される。処理クラスタ１４００は、概して、レイテンシトレラントであり、インターコネクト８１４がほぼ飽和（この状態を達成するのは合成プログラム以外では極めて難しいことに留意されたい）であっても、ノードバッファリングが、概して、ノードストールを防止する。
【００２７】
典型的には、処理クラスタ１４００はパーティション間で共有する下記のグローバルリソースを含む。
（１）  制御ノード１４０６。これは（メッセージバス１４２０で）システムワイドのメッセージングインターコネクト、イベント処理及びスケジューリング、及びホストプロセッサ及びデバッガ（これらは全て後で詳しく説明する）へのインタフェースを提供する。
（２）  ＧＬＳユニット１４０８。これはプログラマブル縮小命令セット（ＲＩＳＣ）プロセッサを含み、システムデータ移動を可能にする。システムデータ移動は、ＧＬＳデータ移動スレッドとして直接コンパイルされ得るＣ＋＋プログラムによって記述され得る。これによって、ソースコードを修正することなく、クロスホスト環境でのシステムコードの実行が可能になり、また、システム又は（後述する）ＳＩＭＤデータメモリ内の任意のアドレス（変数）のセットから別の任意のアドレス（変数）のセットに移動できるため、ダイレクトメモリアクセスよりもより一般的である。ＧＬＳユニット１４０８は、（例えば）０−サイクルのコンテキストスイッチを備え、マルチスレッド化され、例えば、最大１６スレッドまでサポートする。
（３）  共有機能メモリ１４１０。これは、一般のルックアップテーブル（ＬＵＴ）及び統計収集機能（ヒストグラム）を提供する大型共有メモリである。また、これは大型共有メモリを使用して、リサンプリング及び歪補正等のノードＳＩＭＤにより（コストの理由で）充分サポートされていないピクセル処理をサポートし得る。この処理はネイティブタイプとして、スカラ、ベクトル、及び２Ｄアレイを実装する（例えば）６発行命令ＲＩＳＣプロセッサ（即ち、後で詳しく説明するＳＦＭプロセッサ７６１４）を用いる。
（４）  ハードウェアアクセラレータ１４１８。これは、プログラマビリティを必要としない機能のため、或いは電力及び／又は面積を最適化するために組み込まれ得る。アクセラレータは、サブシステムにはシステム内の他のノードとして現れ、制御及びデータフローに参加し、イベントを作成可能であり、スケジューリング可能である。またデバッガにとっては可視的である。（ハードウェアアクセラレータは、適用可能であるときは、専用のＬＵＴ及び統計収集を有し得る。）
（５）  データインターコネクト８１４及びシステムオープンコアプロトコル（ＯＣＰ）Ｌ３接続１４１２。これらは、ノードパーティション、ハードウェアアクセラレータ、及びシステムメモリ、及び、データバス１４２２上の周辺装置の間のデータ移動を管理する。（ハードウェアアクセラレータは、Ｌ３へのプライベート接続も有し得る）。
（６）  デバッグインタフェース。これらは、図には示されていないが、本明細書中に記載される。
【００２８】
図５を参照すると、ノード８０８−ｉの例の更なる詳細が見られる。ノード８０８−ｉは、処理クラスタ１４００内の計算要素であり、アドレス指定及びプログラムフロー制御のための基本要素はＲＩＳＣプロセッサ又はノードプロセッサ４３２２である。典型的には、このノードプロセッサ４３２２は、（４０ビット命令内の２０ビットイミディエート（immediate）フィールドの可能性のある）２０ビット命令を備える、３２ビットのデータパスを有することができる。ピクセル操作は、例えば３２ピクセル機能ユニットのセットで、ＳＩＭＤ構成で、ＳＩＭＤレジスタとＳＩＭＤデータメモリとの間で（例えば）４つのロードと（例えば）２つのストアを用いて並列に実行される（ノードプロセッサ４３２２の命令セットは以下のセクション７で説明する）。命令パケットは、すべてのＳＩＭＤ機能ユニット４３０８−１〜４３０８−Ｍによって実行される３発行ＳＩＭＤ命令と並列に、（例えば）１つのＲＩＳＣプロセッサコア命令、４つのＳＩＭＤロード、及び２つのＳＩＭＤストアを記述する。
【００２９】
典型的には、（ロードストアユニット４３１８−ｉからの）ロード及びストアは、ＳＩＭＤデータメモリ位置と、例えば、最大６４、１６ビットピクセルまで表すことができる、ＳＩＭＤローカルレジスタとの間でデータを移動する。ＳＩＭＤロード及びストアは間接アドレス指定（直接アドレス指定もサポートされている）に共有レジスタ４３２０−ｉを用いるが、ＳＩＭＤアドレス指定処理はこれらのレジスタを読み出し、アドレス指定コンテキストはコア４３２０によって管理される。コア４３２０は、レジスタのスピル／フィル、アドレス指定コンテキスト、及び入力パラメータのためのローカルメモリ４３２８を有する。ノード毎にパーティション命令メモリ１４０４−ｉが提供され、そこでは、多数のノードに及ぶデータセット上で、より大きなプログラムを実行するために、多数のノードがパーティション命令メモリ１４０４−ｉを共有することも可能である。
【００３０】
また、ノード８０８−ｉは、並列処理をサポートするための幾つかの機能を組み込む。（Ｌｆ及びＲｔバッファ４３１４−ｉ及び４３１２−ｉに関連し、概してノード８０８−ｉのための入力／出力（ＩＯ）回路要素を含む）グローバル入力バッファ４３１６−ｉ及びグローバル出力バッファ４３１０−ｉは、ノード８０８−ｉ入力及び出力を命令実行から切り離し、システムＩＯに起因してノードがストールする可能性を極めて低くする。入力は、通常、（ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍ及び機能ユニット４３０８−１〜４３０８−Ｍによる）処理よりも、充分前に受け取られ、空きサイクルを用いてＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍ内に保存される（これらは非常に一般的である）。ＳＩＭＤ出力データは、グローバル出力バッファ４２１０−ｉに書き込まれ、そこから処理クラスタ１４００を介してルーティングされ、たとえ、システムのパフォーマンスがその限界に近づいた場合（これも可能性が低い）でも、ノード（即ち、８０８−ｉ）がストールする可能性を低くする。ＳＩＭＤデータメモリ４３０８−１〜４３０６−Ｍ及び対応するＳＩＭＤ機能ユニット４３０６−１〜４３０６−Ｍは、各々、集合的に「ＳＩＭＤユニット」と称される。
【００３１】
ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍは、重複しないコンテキスト内に構成され、可変サイズであり、関連又は非関連タスクのいずれかへ割り振られる。コンテキストは、水平及び垂直の両方向で充分に共有可能である。水平方向での共有はリードオンリーメモリ４３３０−ｉ及び４３３２−ｉを使用し、それらは、典型的には、プログラムについてはリードオンリーであるが、書き込みバッファ４３０２−ｉ及び４３０４−ｉ、ロード／ストア（ＬＳ）ユニット４３１８−ｉ、又は他のハードウェアによって書き込み可能である。また、これらのメモリ４３３０−ｉ及び４３３２−ｉのサイズは、約５１２×２ビットである。概してこれらのメモリ４３３０−ｉ及び４３３２−ｉはその上で操作される中央ピクセル位置に対して、左方向及び右方向へのピクセル位置に対応する。これらのメモリ４３３０−ｉ及び４３３２−ｉは、書き込みをスケジューリングするために、書き込み−バッファリング機構（即ち、書き込みバッファ４３０２−ｉ及び４３０４−ｉ）を使用し、そこでは、サイド−コンテキスト書き込みは、通常、ローカルアクセスとは同期されていない。バッファ４３０２−ｉは、概して、同時に動作する（例えば）隣接するピクセルコンテキストとのコヒーレンスを維持する。垂直方向の共有はＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍ内のサーキュラーバッファを用いる。サーキュラーアドレス指定は、ＬＳユニット４３１８−ｉによって適用されるロード及びストア命令によってサポートされているモードである。共有データは、概して、上述のシステムレベル依存性プロトコルを用いてコヒーレントに保たれる。
【００３２】
コンテキスト割り振り及び共有は、ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍコンテキスト記述子によって、ノードプロセッサ４３２２に関連付けられるコンテキスト状態メモリ４３２６内に特定される。このメモリ４３２６は、例えば、１６×１６×３２ビット又は２×１６×２５６ビットＲＡＭであり得る。また、これらの記述子は、コンテキスト間でデータがどのように共有されるかを、充分に一般的な方式で特定し、コンテキスト間のデータ依存性を取り扱うための情報を保持する。コンテキスト保存／復元メモリ４３２４は、レジスタ４３２０−ｉを並列に保存及び復元させることによって、（後で説明する）０−サイクルタスク切り替えをサポートするように使用される。ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍ、及びプロセッサデータメモリ４３２８コンテキストは、各々のタスクのための非依存コンテキストエリアを用いて保存される。
【００３３】
ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍ、及びプロセッサデータメモリ４３２８は、可変サイズの可変数コンテキストに区分される。垂直フレーム方向のデータは、そのコンテキスト自体の中で保持及び再使用される。水平フレーム方向のデータは、コンテキストを共に水平グループにリンクさせることによって共有される。なお、コンテキスト構成は、計算に関係するノード数及びそれらが互いにどのように相関するかとはほぼ無関係であることに留意することが重要である。コンテキストの主目的は、画像データを、このデータを操作するノードの構成に関係なく、保持、共有、及び再使用することである。
【００３４】
典型的には、ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍは、機能ユニット４３０８−１〜４３０８−Ｍによって操作される（例えば）ピクセル及び中間コンテキストを含む。ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍは、概して、（例えば）最大１６の分離コンテキストエリアに区分される。各分離コンテキストエリアは、プログラマブルベースアドレスを備え、コンパイラによってレジスタのスピル／フィルに使用される全てのコンテキストからアクセス可能な共通エリアを備える。プロセッサデータメモリ４３２８は、入力パラメータ、アドレス指定コンテキスト、及びレジスタ４３２０−ｉのためのスピル／フィルエリアを含む。プロセッサデータメモリ４３２８は、各々プログラマブルベースアドレスを備える、ＳＩＭＤデータメモリ４３０６−１〜４３０６−Ｍコンテキストに対応する（例えば）最大１６の分離ローカルコンテキストエリアを有し得る。
【００３５】
典型的には、ノード（即ち、ノード８０８−ｉ）は、８個のＳＩＭＤレジスタ（第１の構成）、３２個のＳＩＭＤレジスタ（第２の構成）、及び３２個のＳＩＭＤレジスタと、より小さい機能ユニットの各々に３つの予備実行ユニット（第３の構成）の例えば３つの構成を有する。
【００３６】
図６を参照すると、グローバルロードストア（ＧＬＳ）ユニット１４０８がより詳細に示されている。ＧＬＳユニット１４０８の主な処理構成要素はＧＬＳプロセッサ５４０２である。ＧＬＳプロセッサ５４０２は、上述したノードプロセッサ４３２２と同様の一般的な３２ビットＲＩＳＣプロセッサであり得るが、ＧＬＳユニット１４０８内での使用にカスタマイズされてもよい。例えば、コンパイルされたプログラムが所望に応じてノード変数のアドレスを生成できるように、ＧＬＳプロセッサ５４０２がノード（即ち、８０８−ｉ）のためのＳＩＭＤデータメモリのためのアドレッシングモードを複製することができるようカスタマイズされてもよい。また、ＧＬＳユニット１４０８は、概して、コンテキスト保存メモリ５４１４、スレッドスケジューリング機構（即ち、メッセージリスト処理５４０２及びスレッドラッパー５４０４）、ＧＬＳ命令メモリ５４０５、ＧＬＳデータメモリ５４０３、リクエストキュー及び制御回路５４０８、データフロー状態メモリ５４１０、スカラ出力バッファ５４１２、グローバルデータＩＯバッファ５４０６、及びシステムインタフェース５４１６を含み得る。また、ＧＬＳユニット５４０２は、インターリーブされたシステムデータをデインターリーブされた処理クラスタデータに変換及びその逆を行う、インターリービング及びデインターリービング用の回路要素、及び構成読み出しスレッド（Ｃｏｎｆｉｇｕｒａｔｉｏｎ  Ｒｅａｄ  ｔｈｒｅａｄ）を実装するための回路要素を含み得る。構成読み出しスレッドは、処理クラスタ１４００のための構成（即ち、並列化されたシリアルプログラムのために、処理クラスタ１４００の計算及びメモリリソースに少なくとも部分的に基づくデータ構造）を（プログラム、ハードウェア初期化等を含む）メモリ１４１６からフェッチし、それを処理クラスタ１４００にディストリビュートする。
【００３７】
ＧＬＳユニット１４０８では３つのメインインタフェース（即ち、システムインタフェース５４１６、ノードインタフェース５４２０、及びメッセージングインタフェース５４１８）があり得る。システムインタフェース５４１６では、典型的に、システムメモリ１４１６及び周辺装置１４１４へのアクセスのため、システムＬ３インターコネクトへの接続がある。このインタフェース５４１６は概して、各々２５６ビットＬ３パケットの（例えば）１２８ラインを格納するために充分な大きさの２つのバッファ（ピンポン配置）を有する。メッセージングインタフェース５４１８では、ＧＬＳユニット１４０８はオペレーショナルメッセージ（即ち、スレッドスケジューリング、シグナルリング終了イベント、及びグローバルＬＳユニット構成）を送信／受信が可能であり、処理クラスタ１４００に対するフェッチされた構成をディストリビュートすることが可能であり、送信スカラ値を宛て先コンテキストを送信することが可能である。ノードインタフェース５４２０では、グローバルＩＯバッファ５４０６は概してグローバルデータインターコネクト８１４に結合される。概して、このバッファ５４０６は、ノードＳＩＭＤデータの６４ライン（例えば、各ラインは１６ビットの６４ピクセルを含み得る）を格納するために充分な大きさである。また、バッファ５４０６は、１サイクル当たり１６ピクセルのグローバル転送幅にマッチングするように、２５６×１６×１６ビットとして編成され得る。
【００３８】
ここで、メモリ５４０３、５４０５、及び５４１０を参照すると、各々が概してレジデントスレッドに関連する情報を含む。ＧＬＳ命令メモリ５４０５は、スレッドがアクティブであるか否かに拘らず、全てのレジデントスレッドのための命令を概して含む。ＧＬＳデータメモリ５４０３は、全てのレジデントスレッドのための変数、テンポラリ、及びレジスタスピル／フィル値を概して含む。また、ＧＬＳデータメモリ５４０３は、スレッドコンテキスト記述子及び宛て先リスト（ノード内の宛て先記述子に似ている）を含む、スレッドコードから隠されたエリアを有し得る。また、宛て先コンテキストへの出力を含み得るスカラ出力バッファ５４１２がある。このデータは水平グループ内の多数の宛て先コンテキストへコピーされるべき順番に概して保たれ、処理クラスタ１４００の処理パイプラインにマッチングするようにスカラデータの転送をパイプライン化する。データフロー状態メモリ５４１０は処理クラスタ１４００からスカラ入力を受け取る各スレッドのためのデータフロー状態を概して含み、この入力に依存するスレッドのスケジューリングを制御する。
【００３９】
典型的に、ＧＬＳユニット１４０８のためのデータメモリは、いくつかの部分に構成される。データメモリ５４０３のスレッドコンテキストエリアはＧＬＳプロセッサ５４０２のためのプログラムには可視であるが、データメモリ５４０３の残りの部分及びコンテキスト保存メモリ５４１４はプライベートのままである。コンテキスト保存／復元又はコンテキスト保存メモリは、通常、全ての中断されたスレッド（即ち、１６×ｌ６×３２ビットのレジスタコンテント）のためのＧＬＳプロセッサ５４０２レジスタのコピーである。データメモリ５４０３内の他の２つのプライベートエリアは、コンテキスト記述子及び宛て先リストを含む。
【００４０】
リクエストキュー及び制御５４０８は、ＧＬＳプロセッサ５４０２のためのロード及びストアアクセスをＧＬＳデータメモリ５４０３の外で概して監視する。これらのロード及びストアアクセスは、スレッドにより、システムデータを処理クラスタ１４００へ移動及びその逆を行うように実行されるが、データは通常ＧＬＳプロセッサ５４０２の中を物理的に流れることはなく、またそれはデータ上で動作を概して実行しない。代わりに、リクエストキュー５４０８がスレッドの「移動」をシステムレベルでの物理的移動に変換し、ロードを移動のためのストアアクセスにマッチングさせ、且つシステムＬ３及び処理クラスタ１４００データフロープロトコルを用いて、アドレス及びデータシーケンシング、バッファ割り付け、フォーマッティング、及び、転送制御を実行する。
【００４１】
コンテキスト保存／復元エリア又はコンテキスト保存メモリ５４１４は概して、ＧＬＳプロセッサ５４０２のための全てのレジスタを一度に保存及び復元し得るワイドランダムアクセスメモリ又はＲＡＭであり、０−サイクルコンテキスト切り替えをサポートする。スレッドプログラムは、アドレス計算、状態試験、ループ制御等のための１データアクセス当たり数サイクルを必要とし得る。大量の潜在的スレッドがあるため、且つ、目的が、ピークスループットをサポートするために充分なように全てのスレッドをアクティブに保持することであるため、最小サイクルオーバヘッドでコンテキスト切り替えが起こることが重要であり得る。また、単一スレッドの「移動」が全てのノードコンテキストのためのデータ（例えば、水平グループの１コンテキスト当たりの１変数当たり６４ピクセル）を転送するという事実によって、スレッド実行時間が部分的にオフセットされ得ることに留意すべきであろう。これは、ピークピクセルスループットをサポートする一方で、相当大きな数のスレッドサイクルを可能にし得る。
【００４２】
ここで、スレッドスケジューリング機構を参照すると、この機構はメッセージリスト処理５４０１及びスレッドラッパー５４０４を概して含む。スレッドラッパー５４０４は、典型的に、ＧＬＳユニット１４０８のためのスレッドをスケジューリングするために、入ってくるメッセージをメールボックスに受け取る。概して、１スレッド当たり１つのメールボックスエントリがあり、メールボックスエントリは、そのスレッドのための初期プログラムカウントや、スレッドの宛て先リストのプロセッサデータメモリ（即ち、４３２８）内の位置等の情報を含み得る。また、このメッセージは、オフセット０で始まり、スレッドのプロセッサデータメモリ（即ち、４３２８）コンテキストエリアに書き込まれる、パラメータリストを含み得る。また、スレッドが中断されるときスレッドプログラムカウントを保存するため、及びデータフロープロトコルを実装するために宛て先情報を置くために、スレッド実行中にもメールボックスエントリが用いられる。
【００４３】
ＧＬＳユニット１４０８は、メッセージングに加えて、構成処理も実行する。典型的に、この構成処理は構成読み出しスレッドを実装し得る。構成読み出しスレッドは、処理クラスタ１４００のための構成（プログラム、ハードウェア初期化等を含む）をメモリからフェッチし、処理クラスタ１４００の残りの部分にディストリビュートする。典型的に、この構成処理は、ノードインタフェース５４２０で実行される。加えて、ＧＬＳデータメモリ５４０３は、コンテキスト記述子、宛て先リスト、及びスレッドコンテキストのためのセクション又はエリアを概して含む。典型的に、スレッドコンテキストエリアはＧＬＳプロセッサ５４０２に対して可視であり得るが、ＧＬＳデータメモリ５４０３の残りのセクション又はエリアは可視でなくてもよい。
【００４４】
図７を参照すると、共有機能メモリ１４１０が見られる。共有機能メモリ１４１０は、概して、ノードにより（コストの理由で）充分サポートされない操作をサポートする、大型の集中メモリである。共有機能メモリ１４１０の主な構成要素は、（各々が、例えば４８〜１０２４Ｋバイトの間で構成可能なサイズ及び構成を有する）２つの大型メモリ、機能メモリ７６０２及びベクトルメモリ７６０３である。この機能メモリ７６０２は、高帯域、ベクトルベースのルックアップテーブル（ＬＵＴ）、及びヒストグラムの、同期、命令駆動型の実装を提供する。ベクトルメモリ７６０３は、（上記のセクション８で説明したように）ベクトル命令を暗示する、（例えば）６発行命令プロセッサ（即ち、ＳＦＭプロセッサ７６１４）による操作をサポートし得る。ベクトル命令は、例えば、ブロックベースのピクセル処理のために用いられ得る。典型的には、このＳＦＭプロセッサ７６１４は、メッセージングインタフェース１４２０及びデータバス１４２２を用いてアクセスされ得る。ＳＦＭプロセッサ７６１４は、例えば、ノード内のＳＩＭＤデータメモリに比べて、より一般的な構成、及びより大きな総メモリサイズを有し、より一般的な処理がデータに適用される得る、ワイドピクセルコンテキスト（６４ピクセル）上で動作し得る。それは、標準Ｃ＋＋整数データタイプ上で、スカラ、ベクトル、及びアレイ操作、並びに、各種のデータタイプと適合性のある、パックされたピクセル上の操作をサポートする。例えば、図示されるように、ベクトルメモリ７６０３及び機能メモリ７６０２に関連するＳＩＭＤデータパスは、概して、ポート７６０５−１〜７６０５−Ｑ及び機能ユニット７６０７−１〜７６０７−Ｐを含む。
【００４５】
全ての処理ノード（即ち、８０８−ｉ）が機能メモリ７６０２及びベクトルメモリ７６０３にアクセスし得るという意味で、機能メモリ７６０２及びベクトルメモリ７６０３は、全般的に「共有」されている。機能メモリ７６０２に提供されるデータは、ＳＦＭラッパーを介して（典型的にはライトオンリーの方式で）アクセスされ得る。また、この共有は、全般的に、ノード（即ち、８０８−ｉ）を処理するための上述のコンテキスト管理と一貫性がある。また、処理ノードと共有機能メモリ１４１０との間のデータＩ／Ｏもデータフロープロトコルを使用し、処理ノードは、典型的には、ベクトルメモリ７６０３に直接アクセスできない。また、共有機能メモリ１４１０は、機能メモリ７６０２に書き込むことができるが、処理ノードによってアクセスされている間は、書き込むことができない。処理ノード（即ち、８０８−ｉ）は、機能メモリ７６０２内の共通位置を読み出し及び書き込みできるが、（通常は）リードオンリーＬＵＴ操作、又はライトオンリーヒストグラム操作のいずれかとしてである。また、処理ノードが機能メモリ７６０２領域への読み出し−書き込みアクセスを有することも可能であるが、これは所定のプログラムによるアクセスに限定されるべきである。
【００４６】
データを共有する様式は多く存在するので、共有の種類及び依存性条件が満足されることを概ね保証するために用いられるプロトコルを区別するために用語が導入される。下記のリストは、図８の用語を定義したものであり、依存性の解決を説明するために用いられる他の用語も導入している。
・中心入力コンテキスト（Ｃｉｎ）：これは、１つ又は複数のソースコンテキスト（すなわち３５０２−１）から主要ＳＩＭＤデータメモリ（読み取り専用の左側及び右側コンテキストランダムアクセスメモリすなわちＲＡＭを除く）へのデータである。
・左入力コンテキスト（Ｌｉｎ）：これは、中心入力コンテキストとして書き込まれる１つ又は複数のソースコンテキスト（すなわち３５０２−１）から別の宛先へのデータである。ここで、この宛先の右コンテキストポインタはこのコンテキストを指す。データは、ソースノードによって、そのコンテキストが書き込まれるときに左コンテキストＲＡＭにコピーされる。
・右入力コンテキスト（Ｒｉｎ）：Ｌｉｎに類似しているが、ここではこのコンテキストはソースコンテキストの左コンテキストポインタによって指し示される。
・中心ローカルコンテキスト（Ｃｌｃ）：これは、コンテキストにおいて実行されるプログラムによって生成される中間データ（変数、一時値など）である。
・左ローカルコンテキスト（Ｌｌｃ）：これは、中心ローカルコンテキストに類似している。ただし、これは、このコンテキスト内では生成されず、データを共有しているコンテキストによってその右コンテキストポインタを介して生成され、左側コンテキストＲＡＭにコピーされる。
・右ローカルコンテキスト（Ｒｌｃ）：左ローカルコンテキストに類似しているが、ここでは、このコンテキストはソースコンテキストの左コンテキストポインタによって指し示される。
・有効に設定（Ｓｅｔ＿Ｖａｌｉｄ）：最後の転送を示すデータの外部ソースからの信号であり、最後の転送により、この入力セットについて入力コンテキストを完了する。この信号は最後のデータ転送に同期して送出される。
・出力停止（Ｏｕｔｐｕｔ＿Ｋｉｌｌ）：フレーム境界の一番下で、環状バッファは境界よりも早く提供されたデータに対して境界処理を実施し得る。この場合、ソースは、Ｓｅｔ＿Ｖａｌｉｄを用いて実行のトリガをかけることができるが、通常は、新たなデータは提供しない。そうすると境界処理に必要とされるデータを上書きしてしまうからである。この場合、データには、このデータは書き込まれるべきではないことを示すためにこの信号が付随する。
・ソース数（＃Ｓｏｕｒｃｅｓ）：コンテキスト記述子によって指定される入力ソース数。コンテキストは、実行が開始され得る前に各ソースから必要とされる全データを受け取るはずである。ノードプロセッサデータメモリ４３２８へのスカラー入力は、ＳＩＭＤデータメモリ（すなわち４３０６−１）へのベクトル入力とは別とみ成される。全部で４つの可能なデータソースがあり得、ソースはスカラー又はベクトル或いはその両方を提供し得る。
・Ｉｎｐｕｔ＿Ｄｏｎｅ：これは、ソースから信号として送られ、このソースからはさらなる入力がないことを示す。この状態は、ソースプログラム内のフロー制御によって検出され、データ出力には同期しないので、付随するデータは無効である。これにより、受取側コンテキストは、例えば初期化用に一度提供されたデータのソースからのＳｅｔ＿Ｖａｌｉｄを待つのをやめる。
・Ｒｅｌｅａｓｅ＿Ｉｎｐｕｔ：これは、入力データがもはや求められずソースによって上書きされ得ることを示す（コンパイラによって決定される）命令フラグである。
・左有効入力（Ｌｖｉｎ）：これは、左側コンテキストＲＡＭにおいて入力コンテキストが有効であることを示すハードウェア状態である。これは、左側のコンテキストが正確な数のＳｅｔ＿Ｖａｌｉｄ信号を受け取った後で、このコンテキストが最後のデータを左側ＲＡＭにコピーするときに設定される。この状態は、入力データがもはや求められずソースによって上書きされ得ることを示す（コンパイラ７０６によって決定される）命令フラグによってリセットされる。
・左有効ローカル（Ｌｖｌｃ）：この依存性プロトコルは、概して、プログラムが実行されるときにＬｌｃデータが通常は有効であることを保証する。ただし、Ｌｌｃデータは実行と同時に又は実行からずれて提供され得るので、２つの依存性プロトコルがある。この選択は、タスクが開始されるときにコンテキストがすでに有効かどうかに基づいて成される。更に、このデータのソースは、概して、このデータが使用されるまでこのデータへの上書きが禁止される。Ｌｖｌｃがリセットされる場合、これは、Ｌｌｃデータがコンテキストに書き込まれ得ることを示す。
・中心有効入力（Ｃｖｉｎ）：これは、中心コンテキストが正確な数のＳｅｔ＿Ｖａｌｉｄ信号を受け取ったことを示すハードウェア状態である。この状態は、入力データがもはや求められずソースによって上書きされ得ることを示す（コンパイラ７０６によって決定される）命令フラグによってリセットされる。
・右有効入力（Ｒｖｉｎ）：右側コンテキストＲＡＭであることを除いてＬｖｉｎに類似している。
・右有効ローカル（Ｒｖｌｃ）：この依存性プロトコルは、右側コンテキストＲＡＭが通常はＲｌｃデータを受け取るのに利用可能であることを保証する。ただし、このデータは、関連するタスクが他の方式で実行する準備ができているときに有効であるとは限らない。Ｒｖｌｃは、コンテキストにおいてＲｌｃデータが有効であることを示すハードウェア状態である。
・左側右有効入力（ＬＲｖｉｎ）：これは、左側コンテキストのＲｖｉｎビットのローカルコピーである。中心コンテキストへの入力は左側コンテキストにも入力され、そのため、この入力は概してさらなる左側入力が求められなくなるまでイネーブルにされ得ない（ＬＲｖｉｎ＝０）。これは、アクセスを容易にするローカル状態として維持される。
・右側左有効入力（ＲＬｖｉｎ）：これは、右側コンテキストのＬｖｉｎビットのローカルコピーである。この使用目的はＬＲｖｉｎに類似しており、入力に利用可能でもある右側コンテキストに基づいてローカルコンテキストへの入力をイネーブルにする。
・イネーブル入力（ＩｎＥｎ）：これは、コンテキストに対して入力がイネーブルにされたことを示す。これは、入力が中心コンテキスト、左側コンテキスト、及び右側コンテキストに対してリリースされたときに設定される。この条件は、Ｃｖｉｎ＝ＬＲｖｉｎ＝ＲＬｖｉｎ＝０のときに満足される。
【００４７】
水平方向に共有されるコンテキストは、左右いずれの方向にも依存性を有する。コンテキスト（すなわち３５０２−１）は、その左右のコンテキストからＬｌｃ及びＲｌｃデータを受け取り、また、これらのコンテキストにＲｌｃ及びＬｌｃデータを提供する。これによって、データ依存性に循環性が導入される。すなわち、コンテキストは、その左のコンテキストから、左のコンテキストにＲｌｃデータを提供し得る前にＬｌｃデータを受け取るはずであるが、左のコンテキストはこのコンテキスト、すなわち右側のコンテキストから、左のコンテキストがＬｌｃコンテキストを提供し得る前にＲｌｃデータを要求する。
【００４８】
この循環性は、きめの細かいマルチタスキングを用いて破られる。例えば、（図９の）タスク３３０６−１〜３３０６−６は、同一命令シーケンスとし得、６つの異なるコンテキスト内で動作する。これらのコンテキストは、そのフレームの隣接する水平領域でサイドコンテキストデータを共有する。この図は、それぞれ同じタスクセット及びコンテキスト構成を有する２つのノードも示す（ノード８０８−（ｉ＋１）についてシーケンスの一部が示されている）。図示の都合上、タスク３３０６−１は左境界にあると仮定する。そのため、このタスクはＬｌｃ依存性を有さない。同じノード（すなわち８０８−ｉ）で異なる時間帯に実行されるタスクによってマルチタスキングが示されており、タスク３３０６−１〜３３０６−６は、フレーム内での水平位置の関係を強調するために水平方向に広がっている。
【００４９】
タスク３３０６−１は、実行されると、タスク３３０６−２に対する左ローカルコンテキストデータを生成する。タスク３３０６−１は、それが右ローカルコンテキストデータを要求し得る時点に達すると、前に進み得ない。というのは、このデータが利用可能でないからである。それ自体のコンテキストにおいて実行されるタスク３３０６−２によって、タスク３３０６−１のＲｌｃデータが、（必要な場合には）タスク３３０６−１によって生成される左ローカルコンテキストデータを用いて生成される。タスク３３０６−２は、（いずれのタスクも同じノード８０８−ｉで実行される）ハードウェア競合のためにまだ実行されていない。この時点で、タスク３３０６−１は中断され、タスク３３０６−２が実行される。タスク３３０６−２は、その実行中、タスク３３０６−３に左ローカルコンテキストデータを提供し、また、タスク３３０８−１にはＲｌｃデータを提供する。ここで、タスク３３０８−１は、単に同じプログラムの継続であるが、有効なＲｌｃデータを有する。この図はノード内編成のための図であるが、同じ問題がノード間編成にも当てはまる。ノード間編成は、単に一般化したノード内編成であり、例えば、ノード８０８−ｉを２つ以上のノードで置き換えたものである。
【００５０】
プログラムは、Ｌｖｉｎ、Ｃｖｉｎ、及びＲｖｉｎの状態によって決まるように、或るコンテキストに対して（必要な場合）、Ｌｉｎ、Ｃｉｎ、及びＲｉｎデータがいずれも有効であるときこのコンテキストにおいて実行が開始され得る。このプログラムは、実行の間、この入力コンテキストを用いて結果を生成し、Ｌｌｃ及びＣｌｃデータを更新する。このデータは、制約なしに使用され得る。Ｒｌｃコンテキストは有効ではないが、Ｒｖｌｃ状態は、ハードウェアがストールせずにＲｉｎコンテキストを使用し得るように設定される。プログラムにおいてＲｌｃデータへのアクセスに遭遇すると、プログラムはこの時点より先に進めない。というのは、このデータがまだ演算されていないかもしれないからである（これを演算するプログラムは、ノード数がコンテキスト数よりも少ないために必ずしも実行されないことがあり、そのため、全てのコンテキストは並列に演算され得ない）。Ｒｌｃデータがアクセスされる前に命令が終了すると、タスク切替えが行われ、現在のタスクを中断し、別のタスクを開始させる。タスク切替えが行われるときＲｖｌｃ状態がリセットされる。
【００５１】
タスク切替えは、右側中間コンテキストがプログラムフローにおいて初めてアクセスされていることを認識するコンパイラ７０６によって設定される命令フラグに基づいて行われる。コンパイラ７０６は、入力変数と中間コンテキストを区別することができ、そのため、求められなくなるまで有効である入力データに対してこのタスク切替えが行われないようにし得る。タスク切替えによりノードが解放されて、新たなコンテキスト、通常は最初のタスクによって更新されたＬｌｃデータを有するコンテキストにおいて演算が成される（例外については後で述べる）。このタスクは、Ｌｖｉｎ、Ｃｖｉｎ、及びＲｖｉｎが設定されていると仮定して、最初のタスクと同じコードを、ただし新たなコンテキストで実行する。Ｌｌｃデータは、すでに左側コンテキストＲＡＭにコピーされているので有効である。この新たなタスクが生成する結果は、Ｌｌｃ及びＣｌｃデータを更新し、前のコンテキストにおけるＲｌｃデータも更新する。この新たなタスクは最初と同じコードを実行するので、やはり同じタスク境界に行き当たり、それに続いてタスク切替えが行われる。このタスク切替えは、その左側のコンテキストに信号を送ってＲｖｌｃ状態を設定する。というのは、タスクの終了は、実行のこの時点まですべてのＲｌｃが有効であることを暗に示しているからである。
【００５２】
２番目のタスク切替えでは、次のタスクのスケジューリングに関して２つの選択肢が可能である。３番目のタスクは、少し前に説明したように、右側の次のコンテキストにおいて同じコードを実行し得るか、又は、中断されたところから最初のタスクが再開され得る。というのは、この時点では、最初のタスクは、有効なＬｉｎ、Ｃｉｎ、Ｒｉｎ、Ｌｌｃ、Ｃｌｃ、及びＲｌｃデータを有するからである。いずれのタスクも同じ時点で実行されるはずであるが、順序は正確さの点で概して問題にならない。スケジューリングアルゴリズムは、通常、二者択一の最初を選択しようと試みて、可能な限り左から右に（おそらくは右境界に至るまで）進む。これにより依存性がより満足される。というのは、この順序では有効なＬｌｃ及びＲｌｃデータがともに生成されるが、最初のタスクが再開されるとＬｌｃデータが前と同様に生成されるからである。依存性をより満足させると、再開される準備ができているタスクの数が最大になり、それによって、タスク切替えが生じたときに何らかのタスクが実行する準備ができている可能性が高くなる。
【００５３】
実行準備ができているタスクの数を最大にすることは重要である。というのは、マルチタスキングは、演算リソースの使用を最適化するためにも用いられるからである。ここで、多数のリソース依存性と相互作用する多数のデータ依存性が存在する。依存性及びリソース競合がともに存在する状態でハードウェアを充分に使用し続け得る既定のタスクスケジューリングは存在しない。何らかの理由で（概して、依存性が満足されていないために）ノード（すなわち８０８−ｉ）が左から右に進めない場合、スケジューラは、最初のコンテキストにおいて、すなわち、ノード（すなわち８０８−ｉ）の左端のコンテキストにおいてタスクを再開させる。左側のコンテキストのいずれかが実行準備ができているはずであるが、左端のコンテキストで再開させると、実行順序の変更の原因となったこれらの依存性を解決するために利用可能なサイクル数が最大になる。というのは、これにより、最大数のコンテキストでタスクが実行され得るからである。その結果、タスクスケジューリングが改変される期間であるプリエンプション（すなわちプリエンプション３８０２）を用い得る。
【００５４】
図１０に移ると、プリエンプションの例を見ることができる。ここで、タスク３３１０−６は、タスク３３１０−５の直後には実行し得ないが、タスク３３１２−１〜３３１２−４は実行する準備ができている。タスク３３１２−５は、タスク３３１０−６に依存しているので、実行する準備ができていない。ノード８１０−ｉに対するノードスケジューリングハードウェア（すなわちノードラッパー８１０−ｉ）は、タスク３３１０−６が、Ｒｖｌｃが設定されていないために準備ができていないことを認識し、このノードスケジューリングハードウェア（すなわちノードラッパー８１０−ｉ）は、左端のコンテキストにおいて準備ができている次のタスク（すなわちタスク３３１２−１）を開始させる。タスク３３１０−６の準備が整うまで、連続したコンテキストにおいてこのタスクの実行が継続される。この状態は、可能な限り早く、例えば、タスク３３１４−１のプリエンプション２２１２−５だけで、元のスケジュールに戻る。左から右の実行を優先することは依然として重要である。
【００５５】
要約すると、タスクは、それらの水平位置に対して左端のコンテキストで開始され、左から右に可能な限り、ストールが発生するか、又は右端のコンテキストに到達するまで進み、次いで、左端のコンテキストで再開される。これにより、依存性ストールの可能性を最小限にすることによってノードの使用が最大になる（ノード８０８−ｉのようなノードは、最大で８つのスケジューリングされるプログラムを有し得、これらのいずれかからのタスクがスケジューリングされ得る）。
【００５６】
ここまで、サイドコンテキスト依存性に関する考察では、真の依存性に焦点を当ててきたが、サイドコンテキストを介した反依存性もある。プログラムは、所与のコンテキスト位置を２回以上書き込むことができ、通常、メモリ要件を最小限にするためにそうする。プログラムがこれらの書込みの間にその位置でＬｌｃデータを読み込む場合、これは、右側のコンテキストもこのデータの読込みを要求することを暗に示しているが、このコンテキストでのタスクがまだ実行されていないので、２番目の書込みは、最初の書込みのデータを、２番目のタスクがそれを読み込む前に上書きする。この依存性のケースは、２番目の書込みの前にタスク切替えを導入することによって取り扱われ、タスクスケジューリングにより、このタスクが右側のコンテキストにおいて実行されることが保証される。というのは、スケジューリングは、Ｒｌｃデータを提供するためにこのタスクが実行されなければならないことが仮定しているからである。ただし、この場合は、タスク境界により、２番目のタスクは、Ｌｌｃデータを、それが２回目に改変される前に読み込むことができる。
【００５７】
タスク切替えは、（例えば）２ビットフラグを用いるソフトウェアによって示される。タスク切替えは、ｎｏｐ動作なし、リリース入力コンテキスト、出力用の有効設定、又はタスク切替えを示し得る。この２ビットフラグは、命令メモリ（すなわち１４０４−ｉ）の段階で復号される。例えば、タスク１の最初のクロックサイクルにより２番目のクロックサイクルでタスク切替えが生じ得、２番目のクロックサイクルでは、命令メモリ（すなわち１４０４−ｉ）からの新たな命令がタスク２用にフェッチされると仮定し得る。この２ビットフラグは、ｃｓ＿ｉｎｓｔｒと呼ばれるバス上にある。また、ＰＣは、概して、（１）タスクがＢＫビットに遭遇していない場合にはプログラムからのノードラッパー（すなわち８１０−ｉ）から、と（２）ＢＫに遭遇し、タスクの実行がラップされた場合にはコンテキスト保存メモリから、の２つの位置から得られる。
【００５８】
タスクプリエンプションは、図１０の２つのノード８０８−ｉ及び８０８−（ｉ＋１）を用いて説明され得る。この例のノード８０８−ｋは、プログラムに割り当てられる３つのコンテキスト（コンテキスト０、コンテキスト１、及びコンテキスト２）を有する。また、この例では、ノード８０８−ｉ及び８０８−（ｉ＋１）はノード内構成で動作し、ノード８０８−（ｋ＋１）もそうであり、ノード８０８−（ｋ＋１）のコンテキスト０に対する左側のコンテキストポインタはノード８０８−ｋの右側のコンテキスト２を指す。
【００５９】
ノード８０８−ｋにおける様々なコンテキストとｓｅｔ＿ｖａｌｉｄの受取りの間には関係がある。コンテキスト０に対してｓｅｔ＿ｖａｌｉｄが受け取られると、ｓｅｔ＿ｖａｌｉｄは、コンテキスト０に対してＣｖｉｎを設定し、コンテキスト１に対してＲｖｉｎを設定する。Ｌｆ＝１は左境界を示すので、左コンテキストには何も成されないはずである。同様に、Ｒｆが設定されると、Ｒｖｉｎは伝わらないはずである。コンテキスト１がＣｖｉｎを受け取ると、コンテキスト１はコンテキスト０にＲｖｉｎを伝え、Ｌｆ＝１なので、コンテキスト０の実行準備が整う。コンテキスト１では、概して、実行前にＲｖｉｎ、Ｃｖｉｎ、及びＬｖｉｎが１に設定されるはずであり、同じことがコンテキスト２に当てはまる。また、コンテキスト２では、ノード８０８−（ｋ＋１）がｓｅｔ＿ｖａｌｉｄを受け取るとき、Ｒｖｉｎが１に設定され得る。
【００６０】
Ｒｖｌｃ及びＬｖｌｃは、概して、Ｂｋが１になるまで検査されず、Ｂｋが１になった後でタスクの実行がラップされ、この時点で、Ｒｌｖｃ及びＬｖｌｃが検査されるはずである。Ｂｋが１になる前は、ＰＣは別のプログラムから得られ、その後、ＰＣはコンテキスト保存メモリから得られる。同時タスクは、書込みバッファを介して左コンテキスト依存性を解決し得る。これについては上述した。右コンテキスト依存性は、上述のプログラミング規則を用いて解決され得る。
【００６１】
有効なローカル値は、ストア値のように取り扱われ、ストア値と対にもされ得る。有効なローカル値はノードラッパー（すなわち８１０−ｉ）に送信され、そこから、直接、局所、又は遠隔経路が取られて有効なローカル値が更新され得る。これらのビットはフリップフロップで実装され、設定されるビットは上述のバスではＳＥＴ＿ＶＬＣである。コンテキスト番号はＤＩＲ＿ＣＯＮＴに担持される。ＶＬＣビットのリセットは、１サイクル遅れのＣＳ＿ＩＮＳＴＲ制御を用いてタスク切替えの前に保存された前のコンテキスト番号を用いてローカルに行われる。
【００６２】
上述のように、タスクの準備ができているかどうかを決定するために確認される様々なパラメータがある。ここでは、入力有効値及びローカル有効値を用いてタスクプリエンプションを説明する。ただし、これは、他のパラメータにも拡張され得る。Ｃｖｉｎ、Ｒｖｉｎ、及びＬｖｉｎが１になると、（Ｂｋ＝１に遭遇しなかった場合）タスクは実行準備が整う。タスクの実行がラップされると、Ｃｖｉｎ、Ｒｖｉｎ、及びＬｖｉｎに加えてＲｖｌｃ及びＬｖｌｃも確認されることがある。同時タスクでは、リアルタイム依存性確認に切り替わるので、Ｌｖｌｃは無視され得る。
【００６３】
また、タスク間（すなわち、タスク１とタスク２の間）から移行するとき、タスク０でコンテキスト切替えが生じたときタスク１についてのＬｖｌｃが設定され得る。タスク間隔カウンタを用いてタスク０が終了しようとしている前にタスク１の記述子が検査されるこの時点では、Ｌｖｌｃが設定されないのでタスク１は準備ができていない。ただし、タスク１は、現在のタスクが０で次のタスクが１であることを把握しており、準備ができていると仮定される。同様に、タスク２が例えばタスク１に戻るとき、タスク１についてのＲｖｌｃはタスク２によってまた設定され得る。Ｒｖｌｃは、コンテキスト切替えを示すものがタスク２に対して存在するとき設定され得る。したがって、タスク２が完了しようとしている前にタスク１が検査されるとき、タスク１は準備ができていない。ここでも、タスク１が、現在のコンテキストが２であり、次に実行されるコンテキストが１であることを把握しており、準備ができていると仮定する。当然のことながら、（入力有効値及び有効ローカル値のような）すべての他の変数は設定されるはずである。
【００６４】
タスク間隔カウンタは、実行中のタスクのサイクル数を示し、このデータはベースコンテキストが実行を完了したとき取得され得る。この例でまたタスク０及びタスク１を用いると、タスク０が実行されるとき、タスク間隔カウンタは有効ではない。したがって、タスク０が記述子の推定読取りを実行した後で（タスク０の段階１の実行の間）、プロセッサデータメモリがセットされる。実際の読み取りは、タスク０の後続の段階の実行の際に行われ、推定有効ビットがタスク切替えを想定して設定される。次のタスク切替えの間、この推定コピーにより、前述のアーキテクチャコピーが更新される。次のコンテキストの情報へのアクセスは、タスク間隔カウンタを用いるのと同じ程度には理想的ではない。というのは、次のコンテキストが有効か否かを確認しても、タスクの準備ができていないという結果にただちにつながるかもしれず、タスクの終了まで待機すると実際にタスクが準備完了になり得るが、タスク準備確認により長い時間がかかるからである。しかし、カウンタが有効でないので、他になすすべがない。タスクの準備ができているかどうか確認する前にタスク切替えを待つことにより遅延がある場合、タスク切替えは遅れる。どのタスクを実行するかなどのすべての決定がタスク切替えフラグの出現前に成され、出現後はタスク切替えが即座に行われ得ることが概して重要である。当然のことながら、フラグの出現後、次のタスクが入力を待っており、他に実行予定のタスク／プログラムがないのでタスク切替えが生じ得ないようにするケースがある。
【００６５】
カウンタが有効になると、タスクが完了しようとする前の幾つかの（すなわち１０）サイクルで、次に実行されるコンテキストの準備ができているかどうかが確認される。コンテキストの準備ができていない場合、タスクプリエンプションが考えられる。タスクプリエンプションがすでに成されているためタスクプリエンプションを成し得ない場合（タスクプリエンプションの１つのレベルは成され得る）、プログラムプリエンプションが考えられる。他のプログラムの準備ができていない場合、現在のプログラムがタスクの準備ができるまで待機し得る。
【００６６】
タスクがストールすると、このタスクは、上述したようにＮｘｔコンテキスト番号にあるコンテキスト番号に対する有効な入力又は有効なローカル値によって起動され得る。Ｎｘｔコンテキスト番号は、プログラムが更新されるときベースコンテキスト番号とともにコピーされ得る。また、プログラムプリエンプションが行われるとき、プリエンプションされるコンテキストの番号がＮｘｔコンテキスト番号にストアされる。Ｂｋに遭遇せず、タスクプリエンプションが行われる場合も、Ｎｘｔコンテキスト番号は実行されるべき次のコンテキストを有する。起動条件によりプログラムが初期化され、プログラムエントリが、エントリ０から、準備ができているエントリが検出されるまで１つずつ確認される。準備ができているエントリがない場合、プロセスは準備ができているエントリが検出されるまで継続され、準備ができているエントリが検出された時点で、プログラム切替えが生じる。起動条件は、プログラムプリエンプションを検出するために用いられ得る条件である。タスクが完了しようとするときにタスク間隔カウンタが幾つかの（すなわち２２）のサイクル（プログラム可能な値）であるとき、各プログラムエントリは、準備ができているか否か確認される。準備ができている場合、準備ができているビットが、現在のプログラムに準備ができているタスクがない場合に用いられ得るプログラム内に設定される。
【００６７】
タスクプリエンプションを見てみると、プログラムは、先入れ先出し（ＦＩＧＯ）として記述され得、任意の順序で読み出され得る。この順序は、次にどのプログラムの準備ができているかによって決定され得る。プログラムの準備ができているかは、現在実行中のタスクが完了しようとする幾（すなわち２２）サイクルが前で決定される。このプログラム探索（すなわち２２サイクル）は、選択されるプログラム／タスクに対する最後の探索が成される前（すなわち１０サイクル前）に完了するはずである。どのタスク又はプログラムも準備ができていない場合、有効な入力又は有効なローカル値が入力されるときはいつも、どのエントリの準備ができているかを見つけるために探索が再開される。
【００６８】
ノードプロセッサ４３２２に対するＰＣ値は幾つかの（すなわち１７個の）ビットであり、この値はプログラムからこれら幾つかの（すなわち１６個の）ビットを（例えば）１ビットだけ左にシフトすることによって得られる。コンテキスト保存メモリからＰＣを用いてタスク切替えを実施するとき、シフト操作は必要とされない。
【００６９】
（アルゴリズムを記述する）ノードレベルプログラム内のタスクは、このタスクの間に演算される変数のサイドコンテキストが要求されるときに有効でありタスク切替えである、入力又は要求される入力のサイドコンテキストから開始される命令の集合である。下記にノードレベルプログラムの例を示す。
／＊  Ａ＿ｄｕｍｂ＿ａｌｇｏｒｉｔｈｍ．ｃ  ＊／
Ｌｉｎｅ  Ａ，Ｂ，Ｃ；／＊ｉｎｐｕｔ＊／
Ｌｉｎｅ  Ｄ，Ｅ，Ｆ；Ｇ／＊ｓｏｍｅ  ｔｅｍｐｓ＊／
Ｌｉｎｅ  Ｓ；／＊ｏｕｔｐｕｔ＊／
Ｄ＝Ａ．ｃｅｎｔｅｒ＋Ａ．ｌｅｆｔ＋Ａ．ｒｉｇｈｔ；
Ｄ＝Ｃ．ｌｅｆｔ−Ｄ．ｃｅｎｔｅｒ＋Ｃ．ｒｉｇｈｔ；
Ｅ＝Ｂ．ｌｅｆｔ＋２＊Ｄ．ｃｅｎｔｅｒ＋Ｂ．ｒｉｇｈｔ；
＜タスク切替え＞
Ｆ＝Ｄ．ｌｅｆｔ＋Ｂ．ｃｅｎｔｅｒ＋Ｄ．ｒｉｇｈｔ；
Ｆ＝２＊Ｆ．ｃｅｎｔｅｒ＋Ａ．ｃｅｎｔｅｒ；
Ｇ＝Ｅ．ｌｅｆｔ＋Ｆ．ｃｅｎｔｅｒ＋Ｅ．ｒｉｇｈｔ；
Ｇ＝２＊Ｇ．ｃｅｎｔｅｒ；
＜タスク切替え＞
Ｓ＝Ｇ．ｌｅｆｔ＋Ｇ．ｒｉｇｈｔ；
次いで図１１でタスク切替えが生じる。というのは、「Ｄ」の右コンテキストがコンテキスト１で演算されていないからである。図１２で、反復が完了し、コンテキスト０が保存される。図１３で、前のタスクが完了するとともに次のタスクが実施され、その後、タスク切替えが生じる。
【００７０】
処理クラスタ１４００内で、汎用ＲＩＳＣプロセッサは様々な目的に用いられる。例えば、（ＲＩＳＣプロセッサとし得る）ノードプロセッサ４３２２は、プログラムフロー制御に用いられ得る。下記にＲＩＳＣアーキテクチャの例を説明する。
【００７１】
図１４に移ると、ＲＩＳＣプロセッサ５２００（すなわちノードプロセッサ４３２２）のより詳細な例を見ることができる。プロセッサ５２００が用いるパイプラインは、処理クラスタ１４００における一般のハイレベル言語（すなわちＣ／Ｃ＋＋）の実行を概ねサポートする。動作においては、プロセッサ５２００は、フェッチ、復号、及び実行の３段階のパイプラインを用いる。典型的には、コンテキストインターフェース５２１４及びＬＳポート５２１２が命令をプログラムキャッシュ５２０８に提供し、命令フェッチ５２０４によってこれらの命令がプログラムキャッシュ５２０８からフェッチされ得る。命令フェッチ５２０４とプログラムキャッシュ５２０８の間のバスは例えば４０ビット幅とし得、そのためプロセッサ５２００は２発行命令をサポートし得る（すなわち、命令は４０ビット又は２０ビット幅とし得る）。概して、（処理ユニット５２０２内の）「Ａ側」及び「Ｂ側」の機能ユニットは小さいほうの命令（すなわち２０ビット命令）を実行し、「Ｂ側」の機能ユニットは大きいほうの命令（すなわち４０ビット命令）を実行する。提供される命令を実行するために、処理ユニットは、レジスタファイル５２０６を「スクラッチパッド」として使用し得る。このレジスタファイル５２０６は、「Ａ側」と「Ｂ側」の間で共有される（例えば）１６エントリ３２ビットレジスタファイルとし得る。また、プロセッサ５２００は、制御レジスタファイル５２１６及びプログラムカウンタ５２１８を含む。また、プロセッサ５２００は、境界ピン又はリードを介してアクセスされ得る。各ピン又はリードの例が表１に記載されている。（「ｚ」はアクティブローのピンを表す）。
【表１】
2014501969.tif 000003
【００７２】
図１５に移ると、プロセッサ５２００をパイプライン５３００とともにより詳細に見ることができる。ここで、（フェッチ段５３０６に対応する）命令フェッチ５２０４はＡ側とＢ側に分割され、Ａ側は、（１つの４０ビット命令又は２つの２０ビット命令を有する４０ビット幅の命令ワードとし得る）「フェッチパケット」の最初の２０ビット（すなわち「１９：０」）を受け取り、Ｂ側は、フェッチパケットの最後の２０ビット（すなわち「３９：２０」）を受け取る。典型的には、命令フェッチ５２０４は、フェッチパケット内の命令の構造及びサイズを決定し、それに従って命令を送り出す（以上は下記のセクション７．３で説明する）。
【００７３】
（復号段５３０８及び処理ユニット５２０２の一部である）復号器５２２１は、命令フェッチ５２０４からの命令を復号する。復号器５２２１は、概して、それぞれＢ側及びＡ側の（インターミディエイト（intermediates）を生成する）演算子フォーマット回路５２２３−１及び５２２３−２並びに復号回路５２２５−１及び５２２５−２を含む。次いで、復号器５２２１からの出力が、（やはり復号段５３０８及び処理ユニット５２０２の一部である）復号‐実行ユニット５２２０によって受け取られる。復号‐実行ユニット５２２０は、フェッチパケットを介して受け取られた命令に対応する実行ユニット５２２７用コマンドを生成する。
【００７４】
実行ユニット５２２７のＡ側及びＢ側は更に分割される。実行ユニット５２２７のＢ側及びＡ側はそれぞれ、乗算ユニット５２２２−１／５２２２−２、ブールユニット５２２６−１／５２２６−２、加算／減算ユニット５２２８−１／５２２８−２、及び移動ユニット５３３０−１／５３３０−２を含む。実行ユニット５２２７のＢ側は、ロード／ストアユニット５２２４及び分岐ユニット５２３２も含む。乗算ユニット５２２２−１／５２２２−２、ブールユニット５２２６−１／５２２６−２、加算／減算ユニット５２２８−１／５２２８−２、及び移動ユニット５３３０−１／５３３０−２はそれぞれ、（Ａ側及びＢ側のそれぞれのための読み取りアドレスも含む）汎用レジスタファイル５２０６内にロードされるデータに対して乗算演算、論理ブール演算、加算／減算演算、及びデータ移動演算を実施し得る。移動演算は、制御レジスタファイル５２１６でも実施され得る。
【００７５】
ベクトル処理モジュールを有するＲＩＳＣプロセッサは、概して、共有機能メモリ１４１０とともに用いられる。このＲＩＳＣプロセッサは、プロセッサ５２００に用いられるＲＩＳＣプロセッサと概ね同じであるが、演算及びロード／ストア帯域幅を拡張するベクトル処理モジュールを含む。このモジュールは、それぞれサイクル当たり４演算実行パケットを実行し得る１６個のベクトルユニットを含み得る。典型的な実行パケットは、概して、ベクトルユニットアレイ、２つのレジスタ−レジスタ演算、及びベクトルメモリアレイにストアされる結果からロードされるデータを含む。この種のＲＩＳＣプロセッサは、概して、８０ビット幅又は１２０ビット幅の命令ワードを用い、いずれの幅の命令ワードも概して「フェッチパケット」を構成し、不整号命令を含み得る。フェッチパケットは、４０ビット命令と２０ビット命令の混合を含み得、この混合は、プロセッサ５２００によって用いられる命令に類似のベクトルユニット命令及びスカラー命令を含み得る。典型的には、ベクトルユニット命令は２０ビット幅とし得、他の命令は２０ビット又は４０ビット幅とし得る（プロセッサ５２００と同様）。ベクトル命令は、命令フェッチバスのすべてのレーン上にも提示され得るが、フェッチパケットがスカラー及びベクトルユニット命令をいずれも含む場合、（例えば）命令フェッチバスビット［３９：０］上にベクトル命令が提示され、（例えば）命令フェッチバスビット［７９：４０］上にスカラー命令が提示される。また、未使用命令フェッチバスレーンはＮＯＰで埋められる。
【００７６】
次いで、１つ又は複数のフェッチパケットから「実行パケット」が形成され得る。部分実行パケットは、完了するまで命令キュー内に保持される。典型的には、完全な実行パケットが実行段（すなわち５３１０）に提示される。（例えば）４つのベクトルユニット命令、（例えば）２つのスカラー命令、又は（例えば）２０ビット命令と４０ビット命令の組合せが、１サイクル内で実行され得る。連続２０ビット命令もシリアルに実行され得る。現在の２０ビット命令の第１９ビットが設定される場合、これは、現在の命令及び後続の２０ビット命令が実行パケットを形成することを示す。第１９ビットは、一般に、Ｐビット又は並列ビットと呼ばれることがある。Ｐビットが設定されていない場合、これは実行パケットの終わりを示す。Ｐビットが設定されていない連続２０ビット命令では、これらの２０ビット命令がシリアルに実行される。（ベクトル処理モジュールを有する）ＲＩＳＣプロセッサは以下の制約のいずれかを含み得ることにも留意されたい。
（１）（例えば）４０ビット命令ではＰビットを１に設定することは禁じられている。
（２）ロード又はストア命令は、命令フェッチバス（すなわち、４０ビットロード及びストアではビット７９：４０、又は２０ビットロード又はストアではフェッチバスのビット７９：６０）のＢ側に現れるべきである。
（３）単一のスカラーロード又はストアは許される。
（４）ベクトルユニットに対して、単一のロード及び単一のストアがともにフェッチパケットに存在し得る。
（５）４０ビット命令の前にＰビットが１に等しい２０ビット命令がくることは禁止されている。
（６）これらの禁止条件を検出するためにハードウェアを配置してはならない。これらの制約は、システムプログラミングツール７１８によって実施されると予想される。
【００７７】
図１６に移ると、ベクトルモジュールの例を見ることができる。このベクトルモジュールは、ベクトル復号器５２４６、復号‐実行ユニット５２５０、及び実行ユニット５２５１を含む。ベクトル復号器は、命令フェッチ５２０４から命令を受け取るスロット復号器５２４８−１〜５２４８−４を含む。典型的には、スロット復号器５２４８−１及び５２４８−２は互いに類似の方法で動作し、スロット復号器５２４８−３及び５２４８−４はロード／ストア復号回路を含む。次いで、復号‐実行ユニット５２５０は、ベクトル復号器５２４６の復号済み出力に基づいて実行ユニット５２５１用の命令を生成し得る。これらのスロット復号器のそれぞれは、（それぞれ汎用レジスタ５２０６内のデータ及びアドレスを使用する）乗算ユニット５２５２、加算／減算ユニット５２５４、移動ユニット５２５６、及びブールユニット５２５８が使用し得る命令を生成し得る。また、スロット復号器５２４８−３及び５２４８−４は、ロード／ストアユニット５２６０及び５２６２用のロード及びストア命令を生成し得る。
【００７８】
図１７に移ると、ゼロサイクルコンテキスト切替えの例のタイミングチャートを見ることができる。ゼロサイクルコンテキスト切替えの特徴は、現在実行中のタスクから新たなタスクにプログラムの実行を変更するために、又は、前に実行されていたタスクの実行をリストアするために用い得る。ハードウェアの実装により上記のことがペナルティなしに可能である。タスクが中断され、異なるタスクがサイクルペナルティなしで呼び出されて、コンテキスト切替えが行われ得る。図１７では、タスクＺが現在実行されている。タスクＡのオブジェクトコードが現在命令メモリにロードされており、タスクＡのプログラム実行コンテキストがコンテキスト保存メモリに保存されている。サイクル０では、ｆｏｒｃｅ＿ｐｃｚ及びｆｏｒｃｅ＿ｃｔｘｚピンへの制御信号のアサートによってコンテキスト切替えが呼び出される。タスクＡのコンテキストが、コンテキスト保存メモリから読み取られ、プロセッサ入力ピンｎｅｗ＿ｃｔｘ及びｎｅｗ＿ｐｃに供給される。ｎｅｗ＿ｃｔｘピンは、タスクＡの中断に続く解決済み機械状態を含み、ｎｅｗ＿ｐｃピンは、次に実行されるタスクＡ命令のアドレスを示すタスクＡ用プログラムカウンタ値である。出力ピンｉｍｅｍ＿ａｄｄｒは命令メモリにも供給される。ｆｏｒｃｅ＿ｐｃｚがアサートされると、組合せ論理によりｉｍｅｍ＿ａｄｄｒに対してｎｅｗ＿ｐｃの値が駆動される。これを図１７では「Ａ」と示す。サイクル１では、位置「Ａ」の命令がフェッチされ、図１７では「Ａｉ」と標識され、サイクル「１｜２」の境界でプロセッサ命令復号器に供給される。３段パイプラインを仮定すると、前に実行されていたタスクＺからの命令が依然としてサイクル１／２／３でパイプラインを進んでいる。サイクル３の終了時には、タスクＺのすべての保留命令が実行パイプフェーズを完了している（すなわち、この時点でタスクＺのコンテキストは完全に解決され保存され得る）。サイクル４で、プロセッサは、コンテキスト保存メモリ書込みイネーブルピンｃｍｅｍ＿ｗｒｚをアサートし、コンテキスト保存メモリデータ入力ピンｃｍｅｍ＿ｗｄａｔａに対して解決済みのタスクＺコンテキストを駆動することによってコンテキスト保存メモリに対してコンテキスト保存操作を実施する。この操作は、完全にパイプライン化されており、ペナルティ又はストールなしでｆｏｒｃｅ＿ｐｃｚ／ｆｏｒｃｅ＿ｃｔｘｚの連続シーケンスをサポートし得る。この例は、これらの信号の連続アサートにより各タスク毎に１つの命令が実行されるので、作為的であるが、タスクのサイズにもタスク切替えの頻度にも概ね何ら制約はなく、コンテキスト切替えの頻度及びタスクのオブジェクトコードのサイズにかかわらずシステムは充分な性能を維持する。
【００７９】
下記の表２は、プロセッサ５２００用の命令セットアーキテクチャの例を示す。ここで、
（１）ユニットの指定．ＳＡ及び．ＳＢは、どの発行スロットで２０ビット命令が実行されるかを区別するために用いられ、
（２）４０ビット命令は、慣例によりＢ側（．ＳＢ）で実行され、
（３）基本フォームは、＜ニューモニック＞、＜ユニット＞、＜カンマで分離されたオペランドリスト＞であり、
（４）擬似コードは、Ｃ＋＋シンタックスを有し、適切なライブラリが直接、シミュレータ又は他の優れたモデルに含まれ得る。
【表２】
2014501969.tif 000004
【００８０】
本発明の特許請求の範囲から逸脱することなく、説明した実施形態に改良を加え得ること、及び付加的な実施形態が実現され得ることが本発明に関係する当業者には理解されよう。
【図４】
2014501969.tif 000005
【図６】
2014501969.tif 000006
【図８】
2014501969.tif 000007
【図９】
2014501969.tif 000008
【図１０】
2014501969.tif 000009
【図１１】
2014501969.tif 000010
【図１２】
2014501969.tif 000011
【図１３】
2014501969.tif 000012
【図１４】
2014501969.tif 000013
【図１５】
2014501969.tif 000014
【図１６】
2014501969.tif 000015
【図１７】
2014501969.tif 000016
【図１】
2014501969.tif 000017
【図２】
2014501969.tif 000018
【図３】
2014501969.tif 000019
【図４Ａ】
2014501969.tif 000020
【図４Ｂ】
2014501969.tif 000021
【図５】
2014501969.tif 000022
【図７】
2014501969.tif 000023
【国際調査報告】
2014501969.tif 000024
2014501969.tif 000025