(57)【特許請求の範囲】
【請求項１】
スレッドを実行するためのプロセッサにおいて、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令の少なくともいくつかがメモリアクセス操作を定義するプロセッサであって、
複数の命令バッファであって、前記バッファと関連付けられたスレッドの少なくとも１つの命令をそれぞれ保持するための複数の命令バッファと、
前記命令バッファから命令を発行するための命令発行段と、
メモリに接続され、前記命令発行段によって発行された命令を受け取るように構成されたメモリアクセス段とを含み、
前記メモリアクセス段は、
発行された各命令にメモリアクセス操作が定義されているかどうかを検出するように形成された検出ロジックと、
メモリアクセス操作が検出されるときはいつもメモリアクセス操作を推進し、さもなければ、命令フェッチを推進してスレッドの命令をフェッチするように形成された命令フェッチロジックとを含むプロセッサ。
【請求項２】
メモリアクセス操作を定義しない命令の前記命令フェッチ操作を行うために、前記メモリアクセス段におけるアドレスを提供するように構成された、請求項１に記載のプロセッサ。
【請求項３】
各スレッドと関連付けられて前記スレッドの実行可能状態を示す手段を含む、請求項１または２に記載のプロセッサ。
【請求項４】
前記命令発行段は、実行可能スレッドと関連付けられた各バッファから１つの命令を次々に取得することによって前記命令バッファから命令を発行するように構成された、請求項３に記載のプロセッサ。
【請求項５】
前記フェッチされた命令をスレッドの前記命令バッファにロードする手段を含む、請求項１に記載のプロセッサ。
【請求項６】
前記フェッチされた命令は、前記命令が前記命令フェッチ操作を推進した前記スレッドのものである、請求項５に記載のプロセッサ。
【請求項７】
前記フェッチされた命令は、前記命令が前記命令フェッチ操作を推進した前記スレッドと異なるスレッドのものである、請求項５に記載のプロセッサ。
【請求項８】
前記命令発行段は、次に命令を発行すべきスレッドの命令バッファが空の場合にフェッチノーオペレーション要求を発行するように構成され、前記フェッチノーオペレーション要求は、前記メモリアクセス段において命令フェッチ操作を推進して命令をフェッチする、請求項１に記載のプロセッサ。
【請求項９】
前記命令発行段は、次に命令を発行すべきスレッドの前記命令バッファが、前記スレッドが資源からのベクトルを待っているという理由で空の場合にフェッチベクトル要求を発行するように構成され、前記フェッチベクトル要求は、前記資源から前記ベクトルをフェッチし、前記ベクトルを使用して前記メモリアクセス段においてメモリアクセス操作を推進してアドレスを提供する、請求項１に記載のプロセッサ。
【請求項１０】
前記スレッドと関連した固有アクティビティの指示に基づいて実行するために、複数スレッドをスケジューリングするように構成されたスレッドスケジューラを更に含む、請求項１に記載のプロセッサ。
【請求項１１】
複数組のスレッドレジスタを含み、各組のスレッドレジスタは、前記複数スレッドのそれぞれに関する情報を格納するように割り当てられている、請求項１０に記載のプロセッサ。
【請求項１２】
命令が前記スレッドレジスタにアクセスする読み取りレジスタ段を含む、請求項１１に記載のプロセッサ。
【請求項１３】
アドレスを提供するように構成された前記手段が、プログラムカウンタを含む、請求項２に記載のプロセッサ。
【請求項１４】
アドレスを提供するように構成された前記手段は、プログラムカウンタと、前記命令がフェッチされるスレッドの命令バッファに残っている前記命令の数とから前記アドレスを計算するように適応されたロジックを含む、請求項２に記載のプロセッサ。
【請求項１５】
スレッドを実行するためのプロセッサを含む移動端末装置において、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令の少なくともいくつかがメモリアクセス操作を定義する移動端末装置であって、
複数の命令バッファであって、前記バッファと関連付けられたスレッドの少なくとも１つの命令をそれぞれ保持するための複数の命令バッファと、
前記命令バッファから命令を発行するための命令発行段と、
メモリに接続され、前記命令発行段によって発行された命令を受け取るように構成されたメモリアクセス段とを含み、
前記メモリアクセス段は、
発行された各命令にメモリアクセス操作が定義されているかどうかを検出するように形成された検出ロジックと、
メモリアクセス操作が検出されるときはいつもメモリアクセス操作を推進し、さもなければ、命令フェッチを推進してスレッドの命令をフェッチするように形成された命令フェッチロジックとを含む移動端末装置。
【請求項１６】
プロセッサのアレイにおいて、各プロセッサが、スレッドを実行するためのプロセッサを含み、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令のいくつかがメモリアクセス操作を定義するプロセッサのアレイであって、
複数の命令バッファであって、前記バッファと関連付けられたスレッドの少なくとも１つの命令を保持するための複数の命令バッファと、
前記命令バッファから命令を発行するための命令発行段と、
メモリに接続され、前記命令発行段によって発行された命令を受け取るように構成されたメモリアクセス段とを含み、
前記メモリアクセス段は、
発行された各命令にメモリアクセス操作が定義されているかどうかを検出するように形成された検出ロジックと、
メモリアクセス操作が検出されるときはいつもメモリアクセス操作を推進し、さもなければ、命令フェッチを推進してスレッドの命令をフェッチするように形成された命令フェッチロジックとを含むプロセッサアレイ。
【請求項１７】
スレッドを実行する方法において、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令の少なくともいくつかがメモリアクセス操作を定義する方法であって、
スレッドの少なくとも１つの命令を、前記スレッド用の命令バッファに保持するステップと、
前記命令バッファから実行パイプラインの命令発行段に命令を発行するステップと、
前記命令発行段によって発行された命令を、メモリに接続されたメモリアクセス段に受け取るステップと、
前記命令にメモリアクセス操作が定義されているかどうかを検出し、定義されるときはいつもメモリアクセス操作を推進し、さもなければ、命令フェッチ操作を推進してスレッドの命令をフェッチするステップとを含む方法。
【請求項１８】
メモリアクセス操作を定義していない命令の前記命令フェッチ操作を行うために前記メモリアクセス段にアドレスを提供するステップを含む、請求項１７に記載の方法。
【請求項１９】
アドレスを提供する前記ステップは、前記メモリアクセス段にプログラムカウントを提供するステップを含む、請求項１８に記載の方法。
【請求項２０】
アドレスを提供する前記ステップは、プログラムカウントと、前記命令がフェッチされるスレッドの命令バッファに残っている前記命令の数とに基づいてアドレスを生成するステップを含む、請求項１８に記載の方法。
【請求項２１】
前記命令は、命令をフェッチするメモリアクセス操作を定義する第１のタイプの分岐命令を含む、請求項１７に記載の方法。
【請求項２２】
前記命令は、前記メモリから分岐ターゲットを取り出すためのメモリアクセス操作を定義する第２のタイプの分岐命令を含み、前記ターゲットは、前記メモリアクセス段に提供されたアドレスである、請求項１８に記載の方法。
【請求項２３】
命令は、実行可能スレッドと関連付けられた各バッファから１つの命令を次々に取り出すことによって前記命令バッファから発行される、請求項１７に記載の方法。
【請求項２４】
前記フェッチされた命令をスレッドの前記命令バッファにロードする前記ステップを含む、請求項１７に記載の方法。
【請求項２５】
前記命令を、前記命令フェッチ操作を推進した前記スレッドの前記命令バッファにロードするステップを含む、請求項１７に記載の方法。
【請求項２６】
前記フェッチされた命令を、前記命令フェッチ操作を推進したスレッドと別のスレッドの前記命令バッファにロードするステップを含む、請求項１７に記載の方法。
【請求項２７】
次に命令を発行すべきスレッドの前記命令バッファが空の場合にフェッチノーオペレーション要求を発行するステップを含み、前記フェッチノーオペレーション要求は、前記メモリアクセス段において命令フェッチ操作を推進して命令をフェッチする、請求項１７に記載の方法。
【請求項２８】
次に命令を発行すべきスレッドの前記命令バッファが、前記スレッドが資源からのベクトルを待っているという理由のために空である場合にフェッチベクトル要求を発行するステップを含み、前記フェッチベクトル要求は、前記資源からの前記ベクトルをフェッチし、前記ベクトルを使用して前記メモリアクセス段におけるメモリアクセス操作を推進する、請求項１７に記載の方法。
【請求項２９】
スレッドを実行するためのプロセッサにおいて、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令のうちの少なくともいくつかがメモリアクセス操作を定義するプロセッサであって、
スレッドの命令を保持するためのバッファ手段と、
前記バッファ手段からの命令を発行するための命令発行手段と、
メモリに接続され、前記命令発行手段によって発行された命令を受け取るように構成されたメモリアクセス手段とを含み、
前記メモリアクセス手段は、
発行された各命令にメモリアクセス操作が定義されているかどうかを検出するための手段と、
メモリアクセス操作が検出されるときはいつもメモリアクセス操作を推進し、さもなければ、命令フェッチを推進してスレッドの命令をフェッチするための手段とを含むプロセッサ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プロセッサにおける複数スレッドのスケジューリングに関する。
【背景技術】
【０００２】
マルチスレッドプロセッサは既知である。各スレッドは、一般にそのスレッドに固有の特定の独立した操作または機能を実行するための一連の命令を含む。スレッドは、プロセッサのアーキテクチャにより直列または並列で実行することができ、またスレッドが実現しようとする操作および機能に応じてスケジュールが立てられたりスケジュールが解除されたりすることができる。マルチスレッドプロセッサには、特にどれか特定のスレッドの操作を保証することが難しいという問題が起こる。
【０００３】
マルチスレッドプロセスでは、何も行うことがない可能性があるスレッドにも、各スレッド用にプロセッササイクルを確保するか、確保されたスレッドをより適切に使用するためにより多くのメモリアクセスポートのような過剰な資源を用意しなければならない。例えば、従来の命令フェッチ方式では、メモリに対する命令フェッチのキューとデータアクセスの別のキューとがある。命令フェッチに優先順位が付けられている場合は、その命令フェッチを実行するパイプラインをストールしなければならない場合がある。データアクセスに優先順位が付けらている場合には、個々のスレッドが、次の命令を待っている間、数サイクル遅延される場合がある。いずれの場合も、スレッドの実行は、他のスレッドから予測できない影響を受ける。この問題は、デュアルポートメモリを使用したり（但し、これは高価で消費電力が多い）、個別のプログラムとデータメモリを備えたり（対応するオーバヘッドを有する）することにより克服することができる。
【０００４】
過去において、マルチスレッドプロセスは、メモリアクセスの遅延を隠すために使用されてきており、したがって、個々のスレッドの実時間性能を高めることは、具体的事例では重要でないため、実際には必要とされていなかった。
【０００５】
プロセッサ設計者が直面している課題の１つは、プロセッサと通信することを望む外部装置の増加をどう処理するかである。一般に、この処理は、外部装置に接続されたポートで生じるアクティビティを処理するために、プロセッサに何らかの割り込み処理機能を提供することにより行われる。例えば１つのポートで複数の外部装置に対応するために、より高性能なインタフェースロジックが使用されるようになってきている。
【０００６】
様々な異なる状況でインタフェーシングが必要とされる。本明細書において背景例として述べる１つの状況は、モバイルアプリケーションの処理にある。
【０００７】
図１は、モバイルアプリケーションプロセッサ２の例示的な応用例を示す。アプリケーションプロセッサ２は、ＣＰＵ４と、複数の周辺装置８と接続する複数のインタフェースコントローラ６とを含む。インタフェースコントローラには、ハードドライブ（ＨＤＤ）８ａおよびＳＤＲＡＭメモリ８ｂと接続するためのメモリコントローラ６ａと、カメラ８ｃと接続するためのビデオコントローラ６ｂと、液晶ディスプレイ（ＬＣＤ）８ｄと接続するためのディスプレイコントローラ６ｃと、マイクロフォン８ｅ、スピーカ８ｆおよびヘッドセット８ｇと接続するための音声コントローラ６ｄと、キーボード８ｈ、汎用シリアルバス（ＵＳＢ）デバイス８ｉ、セキュアデジタル（ＳＤ）カード８ｊ、マルチメディアカード（ＭＭＣ）８ｋ、および万能非同期レシーバ／トランスミッタ（ＵＡＲＴ）装置８１と接続するための接続コントローラ６ｅが挙げられる。インタフェースコントローラ６は、一般に、バス３を介してＣＰＵ４に接続される。システムは、また、電源コントローラ１０と無線プロセッサ１２を含む。
【０００８】
インタフェースコントローラ６は、多少概略的に示されているが、何らかの専用入出力ロジックまたは特別に構成されたポートを概略的に表わしていることに注意されたい。
【０００９】
従来、外部インタフェーシングは、割り込みまたはポーリングを使用して達成されている。割り込みが使用されるとき、外部周辺装置は、プロセッサに入力する準備ができているデータがあること、またはプロセッサからのデータを必要とすることをプロセッサに知らせるために信号を送る。ポーリングを使用するとき、プロセッサは、常にデバイスの状態を確認してデータを提供するか受け入れる準備ができているかどうかを判定する。
【００１０】
図１のようなアプリケーションプロセッサ２を実現する１つの可能性は、特定用途向け集積回路マイクロコントローラ（ＡＳｉＣ）を使用することである。ＡＳＩＣは、特定用途に専用化されその用途に適するように最適化されたマイクロプロセッサを含む場合があるハードワイヤードデバイスである。ＡＳＩＣは、所定の機能では、一般に、他の選択肢よりの安価で消費電力が少ない。しかしながら、ＡＳＩＣは、設計が複雑で、予め設計されなければならず、構成しなおすのが容易ではない。
【００１１】
別の可能性は、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）デバイスを使用することである。ＦＰＧＡは、製造後に「現地で」構成することができる半導体デバイスである。ＦＰＧＡを構成するには、最初に、コンピュータを使用して、例えば、回路図を描くか機能を示すテキストファイルを作成することにより、所望の論理機能をモデル化する。ＦＰＧＡは、静的に構成された相互接続を介して通信するルックアップテーブルの配列を含む。コンピュータモデルは、ＦＰＧＡベンダから提供されたソフトウェアを使用してコンパイルされ、このソフトウェアは、ＦＰＧＡルックアップテーブルにダウンロードすることができるバイナリファイルを作成する。これにより、機器の製造業者は、ＦＰＧＡを調整して自分自身の個別のニーズを満たすことができる。
【００１２】
この例では、インタフェースコントローラ６は、ＦＰＧＡとして実現される。これは、携帯電話の製造業者が、汎用ＦＰＧＡデバイス２を購入し、次にそれを自分の望む用途に固有になるように現場で（すなわち現地で）構成できるという利点を有する。しかしながら、ＦＰＧＡの欠点は、ＡＳＩＣより高価で、速度が遅く、電力を消費することである。
【００１３】
代替例では、チップ全体２がＦＰＧＡで実現されてもよく、あるいはチップ２が、チップ２とそれぞれの周辺装置８との間に接続された個別のＦＰＧＡチップを有する汎用プロセッサでもよい。しかしながら、これらの選択肢は、ほとんどの携帯電話や他の消費者機器では、より高価で法外に電力を消費する。
【００１４】
上記の問題のいくつかは、各スレッドが、固有のアクティビティ、詳細には入出力操作と関連付けられたマルチスレッドプロセッサを使用することによって克服することができる。そのようなマルチスレッドプロセッサは、例えば、特許文献１に記載されており、以下でより詳しく説明される。そのようなマルチスレッドプロセッサの場合、個々のスレッドの動作を保証できることが重要である。例えば、すべてのスレッドが、データまたは命令を同時にフェッチするためのメモリアクセスを必要とする場合、またはいくつかの入出力操作が同時に起こる場合に問題が生じる可能性がある。そのような状況では、１つのスレッドが、他のすべてのスレッドのアクセスの完了を待つために遅延されたり、１つのスレッドを活動化する入出力要求が、他のすべてのスレッドを活動化する要求が処理されてしまうまで遅延されたりする場合がある。
【００１５】
この問題を回避する１つの方法は、すべてのスレッドが常に進行できるようにするのに十分な資源を有するコンピュータアーキテクチャを構成することであるが、これは、法外に高価で、冗長がきわめて冗長になる。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】２００７年３月１４日出願の米国出願第１１／７１７，６２３号明細書（弊所番号３１４５６３ＵＳ／ＶＲＤ）。
【００１７】
本発明の１つの態様によれば、スレッドを実行するためのプロセッサであって、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令のうちの少なくともいくつかがメモリアクセス操作を定義するプロセッサが提供され、前記プロセッサは、複数の命令バッファであって、前記バッファと関連付けられたスレッドの少なくとも１つの命令をそれぞれ保持する複数の命令バッファと、前記命令バッファから命令を発行するための命令発行段と、メモリに接続され、前記命令発行段によって発行された命令を受け取るように構成されたメモリアクセス段とを含み、前記メモリアクセス段は、発行された各命令においてメモリアクセス操作が定義されているかどうかを検出するように適応された検出ロジックと、メモリアクセス操作が検出されないときに命令フェッチを推進（intigate)
してスレッドの命令をフェッチするように適応された命令フェッチロジックとを含む。
【００１８】
プロセスは、スレッドと関連付けられた固有アクティビティの指示に基づいて実行するために複数スレッドをスケジューリングするように構成されたスレッドスケジューラを含むことができる。
【００１９】
スレッドスケジューラは、スレッドをサスペンドした際に、継続点ベクトルを、ポートと関連付けられたベクトルレジスタに送るように構成されてもよく、また、継続点ベクトルは、ポートにおけるアクティビティにより戻されてもよい。継続点ベクトルは、それぞれのアクティビティの発生時にスレッドの実行が継続されるべきシーケンスにおけるポイントを識別する。これにより、スレッドの付加的な役割をポートに移行することができ、保留命令で満杯にしておく必要のない命令バッファを解放することができ有利である。
【００２０】
さらに、継続点ベクトルを使用すると、１スレッド当たり複数のアクティビティ（またはイベント）を処理できる場合がある。
【００２１】
命令ユニットは、次に命令を発行しなければならないスレッドの命令バッファが、そのスレッドが資源からのベクトルを待っていると理由で空の場合に、フェッチ命令要求を発行するように構成されてもよく、フェッチベクトル要求は、資源からベクトルをフェッチし、ベクトルを使用するメモリアクセス段におけるメモリアクセス操作を推進してアドレスを提供する。
【００２２】
プロセッサは、複数組のスレッドレジスタを含んでもよく、各組のスレッドレジスタは、前記複数スレッドのそれぞれに関する情報を記憶するように割り当てられる。プロセッサは、前記組のうちの少なくとも２組の間に少なくとも１つのチャネルを含んでもよく、スレッドスケジューラは、前記チャネル上に生じるアクティビティに基づいてスレッドをスケジューリングするように適応されてもよい。
【００２３】
プロセッサは、チップ上に実装されてもよい。
【００２４】
実行ユニットは、スレッドをサスペンドし実行するための専用命令を認識し実行するように適応されてもよい。
【００２５】
スレッドスケジューラは、更に、割り込みに基づいてスレッドをスケジューリングするように適応されてもよい。
【００２６】
スレッドスケジューラは、関連アクティビティが、そのアクティビティに依存するスレッド内の命令の実行時または実行前に生じる場合に、サスペンドなしにスレッドをスケジューリングするように適応されてもよい。
【００２７】
本発明の別の態様によれば、モバイルアプリケーションプロセッサ、少なくとも１つの周辺装置、およびモバイルアプリケーションプロセッサと周辺装置の間に接続されたインタフェースプロセッサを有する移動端末が提供され、インタフェースプロセッサは、以上で定義されたようなプロセッサである。
【００２８】
本発明の別の態様によれば、相互接続されたプロセッサの配列が提供され、前記プロセッサの少なくとも１つは、以上で定義されたようなものである。
【００２９】
本発明の別の態様は、スレッドを実行する方法であって、各スレッドが一連の命令を含み、前記命令が操作を定義し、前記命令のうちのいくつかがメモリアクセス操作を定義する方法が提供され、この方法は、スレッドの少なくとも１つの命令をそのスレッド用の命令バッファに保持するステップと、命令バッファから実行パイプラインの命令発行段に命令を発行するステップと、命令発行段によって発行された命令を、メモリに接続されたメモリアクセス段で受け取るステップと、メモリアクセス操作が命令に定義されているかどうかを検出し、定義されていないときは、命令フェッチ操作を推進してスレッドの命令をフェッチするステップとを含む。
【００３０】
命令フェッチ操作の推進は、命令フェッチ操作を完了しない場合があることを理解されよう。例えば、すべてのスレッドの命令バッファがすべて既に満杯の場合は、命令フェッチ操作の推進の結果として命令はフェッチされない。
【００３１】
命令に定義されたメモリアクセス操作は、異なるタイプでもよい。例えば、ロード命令は、メモリからデータを取り出すメモリアクセス操作を定義する。ストア命令は、メモリにデータをロードするメモリアクセス操作を定義する。第１のタイプの分岐命令は、分岐命令で提供されたターゲットアドレスにおいてメモリから命令をフェッチするメモリアクセス操作を定義する。
【００３２】
第２のタイプの分岐操作は、分岐命令内のアドレスに基づいてメモリからターゲットを取り出すメモリアクセス操作を定義する。このタイプの分岐命令の場合、ターゲットにある命令自体が、その後の命令フェッチ操作でフェッチされることを理解されよう。
【００３３】
本発明をよりよく理解し、本発明を実施できる方法を示すために、例として、次に対応する図面について言及する。
【図面の簡単な説明】
【００３４】
【図１】当該技術分野で既知のようなＦＰＧＡデバイスの例示的な応用例を示す図である。
【図２】インタフェースプロセッサの例示的な応用例を示す図である。
【図２Ａ】インタフェースプロセッサの別の応用例を示す図である。
【図３】インタフェースプロセッサの構成の概略図である。
【図３Ａ】スレッド命令の発行と実行を処理する実行ユニット１６内の構成要素を示す図である。
【図３Ｂ】一連の命令を示す図である。
【図３Ｃ】命令発行の例を示す図である。
【図３Ｄ】命令発行の別の例を示す図である。
【図４】ポートの概略図である。
【図５】スレッドレジスタセットの概略図である。
【図６】スレッドスケジューラの動作を示す流れ図である。
【図７】スレッドレジスタセット間のチャネルの概略図である。
【図７Ａ】チャネル端の概略図である。
【発明を実施するための形態】
【００３５】
図２は、携帯電話内におけるインタフェースプロセッサの応用例を示す。モバイルアプリケーションプロセッサ２は、複数の周辺装置８との通信を必要とする。図１と同じように、アプリケーションプロセッサ２は、バス３、ＣＰＵ４、およびハードドライブ（ＨＤＤ）８ａとＳＤＲＡＭメモリ８ｂと接続するためのメモリコントローラ６ａ、ならびに電源コントローラ１０と無線プロセッサ１２を含む。
【００３６】
しかしながら、図２の構成は、専用コントローラ６の代わりに、ＣＰＵ４が、汎用ポート７を介して外部と通信することを可能にする。この例では、カメラ８ｃおよび液晶ディスプレイ８ｄと接続するための汎用ポート７ａおよび７ｂが提供され、マイクロフォン８ｅ、スピーカ８ｆおよびヘッドセットと８ｇと接続するための汎用ポート７ｃが提供され、キーボード８ｈ、汎用シリアルバス（ＵＳＢ）デバイス８ｉ、セキュアデジタル（ＳＤ）カード８ｊ、マルチメディアカード（ＭＭＣ）８ｋおよび汎用非同期レシーバ／トランスミッタ（ＵＡＲＴ）デバイス８１と接続するための汎用ポート７ｄが提供される。
【００３７】
図２では、インタフェースプロセッサ１４ａ、１４ｂおよび１４ｃが、関連ポート７の出力側に配置され、第１のインタフェースプロセッサ１４ａが、画像装置８ｃ〜８ｄと汎用ポート７ａ〜７ｂとの間に接続されており、第２のインタフェースプロセッサ１４ｂが、音声装置８ｅ〜８ｇとの間に接続されており、第３のインタフェースプロセッサ１４ｂが、汎用ポート７ｄと様々な接続性装置８ｈ〜８ｍとの間に接続されている。後述するように、応用例に固有の表示機能、音声機能および接続機能がインタフェースプロセッサ１４ａ〜１４ｃによって実現されるので、ポート７は汎用ポートでよい。インタフェースプロセッサ１４は、他の場合にはＦＰＧＡによって提供される適応性と設定可能性を提供するので、ポート７は、ＦＰＧＡロジックを使用しなくてもよい。インタフェースプロセッサ１４ａは、ポート７ａおよび７ｂに接続されたポート２２ａおよび２２ｂと、外部装置８ｃおよび８ｇに接続されたポート２２ｃ、２２ｄ、２２ｅおよび２２ｆとを有する。図２に示していないが、インタフェースプロセッサ１４ｂおよび１４ｃは、類似のポートを有する。
【００３８】
インタフェースプロセッサは、通常、インタフェースを介してデータを転送するために使用される固有プロトコルの実施、パラレル形式とシリアル形式間の変換を含むデータの再フォーマット、および場合によってはデータの符号化、圧縮、暗号化などのより高度な機能に関与する。
【００３９】
インタフェースプロセッサの別の応用例は、図２ａに示した多重プロセッサチップ２０２内のタイルとしてのものである。このチップ２０２は、チップ２０２上のプロセッサ間の通信を支援する高性能相互接続２０４と、複数のチップからシステムを容易に構成できるようにするチップ間リンク２０６とを使用する。各プロセッサ１４は、ポート２２を介して、そのチップ間リンク２０６と高性能相互接続２０４に接続される。
【００４０】
以下でより詳しく述べるインタフェースプロセッサの重要な特徴は、ポート２２におけるアクティビティを管理する機能である。各インタフェースプロセッサは、ＣＰＵ、メモリおよび通信を含む。ＣＰＵとポート間の直接接続と応答接続を可能にするために、各プロセッサは、いくつかの並行プログラムスレッドを実行するためのハードウェア支援を有し、各プログラムスレッドは、一連の命令を含み、それらの命令の少なくとも幾つかは、具体的には、ポートにおけるアクティビティを処理する役割を持つ。以下でより詳しく検討されるように、ハードウェア支援には次のようなものがある。
−各スレッドごとに１組のレジスタ
−実行するスレッドを動的に選択するスレッドスケジューラ
−入出力に使用される１組のポート（ポート２２）
各プロセッサ上で小さな組のスレッドを使用して、通信または入出力が、プロセッサによって処理される他の保留タスクと共に進行することを可能にし、また幾つかのスレッドが継続すると同時に他のスレッドをサスペンドしてリモートインタフェースプロセッサとの間の通信を保留することにより、相互接続における待ち時間を隠すことができる。
【００４１】
本発明の一実施形態によれば、任意の幾つかのスレッドが入出力システムを共通のメモリシステムと共用することができ、また実行可能なｎ個のスレッドによって、各スレッドが少なくとも１／ｎプロセッササイクルを得ることを保証するように、スレッド命令が発行される。実行可能なスレッドには、実行中スレッド、休止スレッド、および一時的にスケジュール解除されたスレッドを含む、レジスタなどが割り当て済み／使用中のスレッドがある。実際には、１個のスレッドサイクルをｎ個のプロセッササイクルとして考えると有効である。
【００４２】
すなわち、ソフトウェア設計の観点からは、プログラム内の特定ポイントにおける並行スレッドの数を数えることによって、スレッドの最小パフォーマンスを計算することができる。実際には、個々のスレッドが入出力を待つために遅延され、使用されていないプロセッササイクルが他のスレッドによって使用されるため、パフォーマンスは、ほとんど常にこれより高くなる。さらに、待機スレッドを再開するのにかかる時間は、常に、１スレッドサイクル以下である。したがって、１組のｎ個のスレッドは、プロセッサ自体のクロックレートの１／ｎのクロックレートをそれぞれ有する１組の仮想プロセッサと見なすことができる。これの唯一の例外は、スレッドの数がパイプライン段数ｐより少ない場合に、仮想スレッドのクロックレートが１／ｐ以下であることである。
【００４３】
図３は、本発明の一実施形態によるインタフェースプロセッサ１４の例示的アーキテクチャを概略的に示す。プロセッサ１４は、スレッドスケジューラ１８の制御下で命令のスレッドを実行する実行ユニット１６を含む。プロセッサ１４は、さらに、プログラムコードや他のデータを保持するためのランダムアクセスメモリ（ＲＡＭ）２４、およびブートコードなどの永続的情報を記憶するための読み取り専用メモリ（ＲＯＭ）（図示せず）とを含む。
【００４４】
スレッドスケジューラ１８は、実行ユニット１６が実行すべきスレッドを動的に選択する。従来、スレッドスケジューラの機能は、単に、プロセッサが完全に占有状態を維持するように、プログラムメモリからのスレッドをスケジューリングすることである。しかしながら、本発明によれば、スレッドスケジューラ１８によるスケジューリングは、ポート２２におけるアクティビティとも関連付けられる。この点において、ポートにおける入力または出力アクティビティの結果としてスレッドが実行可能になるときの遅延を最小にするために、スレッドスケジューラが、ポート２２に直接結合されてもよいことに注意されたい。
【００４５】
スレッドスケジューラ１８が検討中のｍ個のスレッドはそれぞれ、スレッドスケジューラ１８がアクセスするレジスタ２０のバンク内のそれぞれ対応する組のスレッドレジスタ２０1．．．２０mによって表される。また、メモリ２４からフェッチされ、その後で実行ユニット１６に発行される命令を一時的に保持するために、命令バッファ（ＩＮＳＴＲ）１９が提供される。実行ユニットは、レジスタ２０とバッファ１９のそれぞれにアクセスする。命令は、スレッドスケジューラ１８の制御下でプログラムメモリ２４からフェッチされ、命令バッファ１９に一時的に入れられる。これらのレジスタとバッファの詳細は後で述べる。
【００４６】
スレッドスケジューラ１８は、ｍ個のスレッドのうち、「実行（run）」と呼ばれる１組ｎ個の実行可能スレッドを維持し、その実行可能スレッドから、好ましくはラウンドロビン方式で実行する命令を次々に発行する。実行可能スレッドは、割り当て済みスレッドの組から選択される。スレッドが継続できないとき、そのスレッドは、実行セットから除外することによってサスペンドされるが、割り当て済みの組のままである。その理由は、例えば、スレッドが以下のタイプのアクティビティのうちの１つまたは複数を待っているからである。
−そのレジスタが、実行できる前に初期化されている。
−準備ができていないか利用可能なデータがないポートからの入力を試みた。
−準備ができていないかデータ用の余裕のないポートに出力を試みた。
−ポートが入力の準備ができるときに起こる可能性のある１つまたは複数のイベントを待機させる命令を実行した。
【００４７】
以下の説明では、命令は、実行可能スレッドからラウンドロビン方式でフェッチされるが、いくつかの実施形態ではすべての割り当て済みスレッドから命令をラウンドロビン方式でフェッチすることができる。
【００４８】
用語「イベント」は、本明細書で使用されるとき、基本的な入出力操作と少し異なる特定タイプの操作を指すことに注意されたい。その相違は、図４と図５に関して後述される。
【００４９】
反応時間を早くするために、スレッドスケジューラ１８と実行ユニット１６の間に、実行ユニット１６がどのスレッドをフェッチし実行すべきかをスレッドスケジューラ１８が制御できるようにする直接ハードワイヤード接続２８が提供されると好都合である。次に図３Ａから図３Ｄを参照して、スレッド命令が発行される方法をより詳細に説明する。図３Ａは、実行ユニット１６内のスレッド命令の発行と実行を処理する構成要素を示す。図は概略的なものに過ぎず、システムの動作を機能ブロックによって示すように意図されていることに注意されたい。実行ユニット１６は、バッファ１９に保持された命令を発行する命令発行段１６０を含むパイプラインを含む。パイプラインは、さらに、読み取りレジスタ１６１、メモリアクセス段１６２、処理段１６４、およびライトバック段１６６を含む。読み取りレジスタ段とライトバック段は、レジスタ２０に接続されているが、これは図３Ａ〜図３Ｄに示されていない。
【００５０】
図３Ａに示したように、各スレッド用に個別のバッファ１９ａ〜１９ｄがある。示した実施形態では、各バッファ１９ａ．．．１９ｄは、６４ビット長で、４つの短い命令か２つの長い命令のいずれかを保持することができる。図３Ａでは、各バッファは、４つの短い命令を保持するように示されている。これらのバッファは、プロトコルＴｉＩＮＳＴｊに従って表示され、ここで、ｉは、スレッドの番号を示し、ｊは、そのスレッド内の命令の番号を示す。すなわち、Ｔ１ＩＮＳＴ１は、スレッド１の最初の命令を示す。命令は、実行可能スレッド用のバッファ１９ａ．．．１９ｄからラウンドロビン方式で発行され、使用中でないスレッドまたは休止されているスレッドは無視される。これは、図３Ａに概略的に示されており、ここで、スレッドＴ１、Ｔ２およびＴ４は実行状態であるが、Ｔ３は休止状態である。スレッド状態については後でより詳細に述べる。命令発行段１６０は、パイプラインの読み取りレジスタ段１６１に命令を発行する役割をする。読み取りレジスタ段は、メモリアクセス段１６２と処理段１６４に接続される。命令は、いくつかの異なるタイプのものである。第１のタイプは、データアクセス命令であり、これは、メモリ４との間でデータを転送するように意図されたロード／ストアなどの命令である。第２のタイプは、分岐命令である。これら命令には２つの型がある。第１の型は、分岐命令で定義されたターゲットアドレスにおいてメモリからの命令をフェッチするメモリアクセス操作を定義する。第２の型は、分岐ターゲットアドレスがあるメモリ内の場所を識別し、プログラムカウンタ（ＰＣ）にターゲットアドレスをロードする。第３のタイプは、実行ユニット内の処理段１６４の操作をそれらのオペコード（opcode）に基づいて指示する計算命令である。従来のプロセッサでは、通常、実行パイプラインのメモリアクセス段に送られる唯一のタイプの命令は、データアクセス命令である。
【００５１】
本発明に示した実施態様によれば、すべてのタイプの命令は、例えばオペコードによって命令自体に定義された操作に関係なく、メモリアクセス段において有効である。第１のタイプの命令は、通常通り、データにアクセスする。第２と第３の両方のタイプの命令は、メモリ２４から命令をフェッチする。第１の型の分岐命令は、メモリアクセス段でその分岐ターゲット命令をフェッチする。第２の型は、メモリアクセス段を使用してターゲットアドレスにアクセスする。その場合、分岐ターゲット命令自体は、フェッチノーオペレーション（fetch no-op）（後述）によって、またはそのメモリアクセス段を使用する必要のない別のスレッドのメモリアクセス段の間にフェッチされることになる。
【００５２】
他のどの命令も、メモリアクセス段を使用して命令フェッチを実行し、さらにその定義された操作を処理段１６４で実行する。すなわち、その命令は、バッファ１９ａ．．．１９ｄをロードするために使用される命令を戻すアドレスをメモリ２４にディスパッチする。フェッチされた命令は、スレッド自体の命令バッファが満杯でない限りその命令バッファをロードし、満杯の場合は、別のスレッドのバッファをロードするために使用される。後述するように、各スレッドは、スレッドが命令シーケンス内のどのポイントにあるかを示すプログラムカウンタ値（図３Ａには、ＰＣ１、ＰＣ２などが示された）を維持する。
【００５３】
この目的のために、メモリアクセス段は、命令のオペコード（opcode）を検出して、そのオペコード内にメモリアクセス演算が定義されるているかどうかを判定するように構成された検出ロジック２００を含む。さらに、メモリアクセス段は、検出ロジック２００がメモリアクセス操作を検出しないときに命令フェッチにスレッドの命令をフェッチさせるように適応された命令フェッチロジック２０２を含む。
【００５４】
ＰＣは、メモリアクセス段への命令を受け、メモリアクセスに使用されるアドレスを決定するために使用される。スレッド自体のバッファが満杯の場合、命令ユニットは、その状態を検出し、その場合に別のスレッドのＰＣをメモリアクセス段に渡して、メモリアクセスに使用されるアドレスを決定する。あるスレッドが、別のスレッドの代わりに命令フェッチを実行するときは、そのスレッドが、実行可能スレッドから選択される。選択されたスレッドは、発行するラウンドロビンシーケンスにおいて、空のバッファを有する次の次のスレッドになる。どのスレッドにも空のバッファがない場合は、発行するラウンドロビンシーケンスにおいて、満杯でないバッファを有する次の次のスレッドになる。
【００５５】
どのスレッドを選択するかの正確な詳細は、特定の実施態様に依存することを理解するであろう。例えば、次のスレッドは、フェッチを待っているスレッドの別のラウンドロビングループから取り出されてもよい。休止後の次の命令または命令シーケンスが分かっている場合には休止スレッド用に命令がフェッチされてもよいが、どのイベントが最初に起こるかによってスレッドが違う命令に分岐する可能性があるので、サスペンドされて複数のイベント（下を参照）を待っているスレッドには命令がフェッチされないことが好ましい。
【００５６】
命令を発行しなければならないときにその命令バッファが空の場合（命令発行段１６０によって検出されたとき）は、特別の「フェッチノーオペレーション」要求が出される。この要求は、メモリアクセス段を使用して、発行スレッドの命令バッファをロードする。
【００５７】
図３Ｂは、そのシーケンスをより詳細に示す。図３Ｂの下矢印は、命令発行ユニット１６０からメモリアクセス段に命令が出されている方向を示す。「ラウンドロビン方式」により、例えば、最初にＴ１ＩＮＳＴ１が発行され、次にＴ２ＩＮＳＴ１が発行され、次にＴ４ＩＮＳＴ１が発行される。Ｔ３のスレッドが実行可能でないので、Ｔ３からは何も発行されないことに注意されたい。
【００５８】
説明のために、Ｔ１ＩＮＳＴ１とＴ２ＩＮＳＴ２がデータアクセス命令であり、それぞれのデータアクセス命令が、メモリアクセス段でデータを取り出すと仮定する。Ｔ４ＩＮＳＴ１は、「第１の型」の分岐命令でり、データを取り出す代わりに、分岐ターゲットにある命令を取り出す。図３Ｃでは、ステップＳ１は、命令発行ユニットによるＴ４ＩＮＳＴ１のフェッチを示す。ステップＳ２は、分岐ターゲット命令にアクセスし、それをＴ４のバッファ（その空スロット）にロードするメモリアクセス段を示す。各バッファは、バッファが先入れ先出しバッファとして働くように移動するバッファポインタＢＰを有する。
【００５９】
ラウンドロビン方式に従ってＴ４ＩＮＳＴ１の後で発行される次の命令は、ＡＬＵ命令として示されたＴ１１ＮＳＴ２（ステップ５３でフェッチされた）であり、これは、通常、メモリアクセス段を使用しない命令である。しかしながら、本発明の実施形態では、処理段にＡＬＵ操作を実行するように指示する他に、メモリアクセス段に、図３ＣにステップＳ４で示されたようなスレッドＴ１用に次の命令のフェッチを開始させる。この命令（Ｔ１ＩＮＳＴ５と示された）は、スレッドＴ１と関連付けられたバッファ１９ａの空スロットにロードされる。
【００６０】
命令は、このように発行され処理され続ける。図３Ｄに示した状況になり、次に発行するスレッド（この場合は、Ｔ２）と関連したバッファが空であるが、命令発行ユニットが、命令の発行を待っている可能性がある。その場合、他の状況では発行されるスレッド用の次の命令をフェッチする「フェッチノーオペレーション」要求が、メモリアクセス段に発行される。この例では、このスレッドがＴ１であって、現在はそのｎ番目の命令であると仮定する。そのスレッド用の最後の発行命令のＰＣによってアドレスが決定される。より正確に言えば、バッファが空の場合に、ＰＣはフェッチアドレスである。バッファが部分的に満杯の場合、フェッチアドレスは、バッファ内の命令の数をＰＣに追加することによって計算される。プロセッサ内にフェッチアドレスとＰＣを維持することができる。
【００６１】
「フェッチノーオペレーション」が必要な状況はきわめて少なく、そのような状況は、多くの場合、コンパイラまたはアセンブラ内の単純な命令スケジューリングによって回避することができる。
【００６２】
後でより深く検討されるように、特定の命令は、例えば入力ポートに利用可能なデータがないためにスレッドを実行不能にする。データが利用可能になったとき、スレッドは、休止した点から続く。高速の入出力に対応するためには、命令を迅速に発行しなければならない。これを達成するために、ポート２２でレディビットまたはフラグ３７が提供される（図４と関連して後で詳しく述べるように）。レディフラグ３７を検出すると、通常、スレッドをラウンドロビンシーケンスに再び入れるか入力命令を再発行することによってスレッドが再開される。この結果、再発行命令が実行パイプラインを通過する時間のために、応答時間は仮想サイクル時間より長くなる場合がある。
【００６３】
理想的には、仮想プロセッサは、入出力操作を１回の仮想サイクルで実行できなければならない。実施形態では、これは、各ポートに「高速モード」を提供することによって達成することができる。入力または出力命令が、高速モードのポートが準備ができていないことを検出したとき、入力または出力命令は、スレッドの次の命令と置き換わり、ポートの準備ができ入力命令が完了できるまで次の命令を再発行させる。
【００６４】
ポートと関連したスレッド６０スケジューラの動作については、図４と図６に関して後で述べる。また、直接ハードワイヤードパス３０ａ、３０ｂ、３０ｃが、スレッドスケジューラ１８とそれぞれのポート２２の間に提供され、スレッドスケジューラ１８と各レジスタ２０の間に直接ハードワイヤードパス２９1．．．２９mが提供される。これらの直接パスは、制御パスを提供することが好ましく、この制御パスは、スレッドスケジューラが、それぞれのスレッドをポート２２の１つまたは複数と関連付け、特に特定のアクティビティが生じたときにそのポートからレディ指示を戻すことを可能にし、プロセッサがポート２２で生じているアクティビティまたは刺激に素早く応答できるようにする。
【００６５】
実行ユニット１６は、また、直接接続２７および３１を介して、各ポート２２ａ〜２２ｃと各レジスタ２０1〜２０mにアクセスし、それによりコアプロセッサとレジスタと外部環境の間の直接リンクが実現される。これらの直接パスは、実行ユニットが状態をポートに渡すことを可能にするさらに別の制御パスを提供することが好ましい。このことは、後で図４に関してさらに詳しく述べる。また、直接パス２７および３１は、データがスレッドレジスタ２０とポート２２の間で直接入出力されることを可能にし、それにより、スレッドが外部環境と直接通信することが可能になる。例えば、データは、メモリ２４に書き込まれその後でフェッチされるのではなく、外部装置からスレッドのオペランドレジスタの１つに直接書き込まれてもよい。これと反対に、演算後に、オペランドレジスタからのデータが、実行ユニット１６によって収集され、ポート２２から直接送信されてもよい。これにより、反応時間が大幅に改善される。
【００６６】
「直接接続」または「直接パス」は、実行ユニットとプログラムメモリ２４の間の接続とは別の接続を意味する。したがって、例えば、スレッドスケジューラ１８と実行ユニット１６は、データを記憶しその後でメモリ２４からフェッチすることなく、ポート２２から入力されたデータにアクセスする。詳細には、実行ユニット１６とメモリ２４の間の接続が、バス３を介している場合は、「直接」接続またはパスは、バスと別のものを意味する。したがって、ポート２２とレジスタ２０とスレッドスケジューラ１８と実行ユニット１６間の様々な通信をすべて、バスアービトレーションの必要なしに行うことができ、反応時間が改善される。ポート２２には、バス１３との付加的な接続（図示せず）が提供されてもよい。
【００６７】
用語「ポート」は、本出願でで使用されるとき、「ピンポート（pin port）」または「データポート」を指すことができる。ピンポートは、プロセッサチップの物理的境界でピンに生じる信号の個別の論理的遷移（すなわち、立ち上がりと立ち下り）を検出する役割をする。データポートは、立ち上がりと立ち下がりを検出する代わりに、一般に入出力バッファに蓄積され、一般にワードなどのデータの一部分を構成する１つまたは複数のビットを処理することができるという点で「より高いレベル」であり、データポートは、特定の瞬間におけるビットの状態または論理レベルを処理する。データポートは、チップ上にあってもよくチップ外にあってもよく、同じチップ上に実装された別のプロセッサへのポートでもよい。「ピンポート」と「データポート」が、実際には、同じ実際のポートの異なるモードを指す場合があることに注意されたい。
【００６８】
図４は、本発明の好ましい実施形態によるポート２２を概略的に示す。ポート２２は、プロセッサ１４との間で入出力データを渡すための入出力バッファ３２を含む。さらに、各ポート２２は、ポートに生じるアクティビティを監視し、レディビットまたはフラグ３７によって特定アクティビティの発生を知らせるためのアクティビティロジック３６を含む。レディフラグ３７は、直接パス３０によってスレッドスケジューラに知らさせることが好ましい。複数のレディフラグがあってもよい。ポートが検出する可能性のあるアクティビティには、次のものがある。
−データはポートに入力され、
−ある特定のデータがポートに入力され、かつ／または
−ポートが出力に利用可能になったこと。
【００６９】
そのようなアクティビティの検出を容易にするために、ポート２２は、１組のレジスタ３８を備える。そのようなレジスタは、関連スレッドの識別を記憶するためのスレッド識別子（ＴＩＤ）レジスタ、１つまたは複数の状態を記憶するための制御（ＣＴＲＬ）レジスタ、プログラムにおいて実行がサスペンドされた位置を記憶するための継続点ベクトル（ＶＥＣＴＯＲ）レジスタ、および状態と関連した任意のデータを記憶するためのデータ（ＤＡＴＡ）レジスタを含む。値ＴＩＤは、直接パス３０（図３では、３０ａ、３０ｂ、３０ｃになる）を介してスレッドスケジューラ１８によってレジスタ３８に書き込まれ、値ＶＥＣＴＯＲ、ＣＴＲＬ、およびＤＡＴＡは、直接パス３１を介して実行ユニット１６によって書き込まれる。ＴＩＤは、関連スレッドを識別するために、所望のアクティビティの検出時にスレッドスケジューラ１８に戻される。アクティビティロジックは、また、さらに詳しく述べるイネーブルフラグ３９を含む。
【００７０】
レジスタ３８は、図４ではポート２２に含まれているように示されているが、実際には、プロセッサ１４内のどこか他の場所に配置され、単にポート２２と関連付けられてもよいことに注意されたい。
【００７１】
図５は、スレッドを表現するために使用される例示的なスレッドレジスタのバンク２０を示す。バンク２０は、現在スレッドスケジューラ１６が検討中のそれぞれのスレッドＴ1〜Ｔmに対応する複数組のレジスタを含む。この好ましい例では、各スレッドの状態は、２個の命令レジスタ、４個のアクセスレジスタおよび１２個のオペランドレジスタの合計１８個のレジスタによって表わされる。それらのレジスタは、以下の通りである。
【００７２】
命令レジスタ：
−ＰＣはプログラムカウンタである。
−ＳＲはステータスレジスタである。
アクセスレジスタ：
−ＧＰはグローバルプールポインタである。
−ＤＰはデータポインタである。
−ＳＰはスタックポインタである。
−ＬＲはリンクレジスタである。
オペランドレジスタ：ＯＰ１．．．ＯＰ１２
命令レジスタは、スレッドの状態に関しかつスレッドの実行を制御する際に使用する情報を記憶する。詳細には、スレッドがイベントまたは割り込みを受け入れる能力は、スレッド状態スレジスタＳＲに保持された情報によって制御される。スレッドスケジューラ１８は、少なくとも各スレッドの状態レジスタＳＲにアクセスする。アクセスレジスタは、プロシージャのローカル変数に使用されるスタックポインタと、プロシージャ間で共用されるデータに通常使用されるデータポインタと、大きな定数とプロシージャエントリポイントにアクセスするために使用される一定プールポインタとを含む。オペランドレジスタＯＰ１．．．ＯＰ１２は、算術および論理演算を実行し、データ構造にアクセスし、サブルーチンを呼び出す命令によって使用される。
【００７３】
前述のように、用語「イベント」は、本明細書で使用されるとき、特定のタイプの操作またはその特定タイプの操作に対応するアクティビティを指す。イベントベースの操作は、基本的な入出力操作と少し異なり、以下のように働く。実行ユニット１６からの継続点ベクトルとスレッドスケジューラ１８からのスレッド識別子を、好ましくは直接パス３１および３０を介して、ポート２２と関連付けられたＶＥＣＴＯＲおよびＴＩＤレジスタ３８に送ることによって、最初にイベントがスレッド用に設定される。また、関連した条件および条件データが、ポート２２のＣＴＲＬおよびＤＡＴＡレジスタ３８に書き込まれてもよい。このように、イベントは、ポートにおいて設定されるが、必ずしもイネーブルされない。ポートがイベントの指示を生成することを可能にするために、ポートのイネーブルフラグ３９が、好ましくは直接パス３０を介して、スレッドスケジューラ１８によってアサートされなければならない。さらに、スレッド自体がイベントを受け入れることを可能にするために、スレッドのそれぞれの状態レジスタＳＲ内のスレッドのイベントイネーブル（ＥＥ）フラグが、イベントイネーブル（event-enabled）に設定されなければならない。イベントがそのように設定されイネーブルされた後で、スレッドスケジューラ１８に作用するイベントベースの待機命令を使用して、スレッドをサスペンドしてイベントを待つことができる。この時点で、現在の保留中の命令は、関連命令バッファ１９から廃棄されてもよい。イベントが発生したとき、例えば、何らかのデータがポートに入力されたとき、その発生は、スレッド識別子と継続点ベクトルをポート２２からスレッドスケジューラ１８と実行ユニット１６に戻すことによって知らされ、継続点ベクトルにおける命令をプログラムメモリ２４から命令バッファ１９にフェッチすることができ、実行がコード内の適切な点で再開される。
【００７４】
イベントが発生したとき、それぞれの状態レジスタＳＲ内のスレッドのＥＥフラグが、イベントディスエーブル（event-disabled）されて、発生したすぐ後でスレッドがイベントに反応するのが防止される。イネーブルフラグ３９は、イベントが発生したときのスレッド実行命令の結果としてデアサートされてもよい。
【００７５】
イネーブルフラグ３９は、ポートのうちの１つまたは複数からのイベントを待つためにいくつかのポートをセットアップしている間にアサートされてもよい。また、スレッドのＥＥフラグは、１組のポートイネーブルフラグをイネーブルする前にイベントイネーブルに設定されてもよく、この場合、イネーブルされ準備ができた第１のポートは、継続点ベクトルにおける命令をすぐにフェッチし実行することによって現在の命令を破棄させ実行を進行させるイベントを生成する。
【００７６】
ポートのイネーブルフラグ３９と状態レジスタＥＥフラグの利点は、イベントのイネーブル化とディスエーブル化が、待機命令によってイベントのセットアップとスレッドの停止の両方から分離され、特定のスレッドおよび／または様々な異なるスレッドのために異なる入出力状態を容易に切り換えることができることである。例えば、イベントがディスエーブルされた場合でも、ポート２２ではイベントがセットアップされたままでもよい。したがって、イベントが既に１回生じたことがあるが、スレッド識別子、継続点ベクトルおよび状態は、ポート２２のＴＩＤ、ＶＥＣＴＯＲ、ＣＴＲＬおよびＤＡＴＡレジスタ３８に記憶されたままなので、イベントは、スレッドによって再使用されることがある。従って、スレッドが、イベントを再使用しなければならない場合、ポートのレジスタ３８は、再書き込みされる必要はないが、代わりに、ポートのイネーブルフラグ３９を単純にリアサートすることができかつ／またはスレッドの状態レジスタＳＲ内のＥＥフラグをイベントイネーブルに再設定しすることができる。次に、さらに別の待機命令が、スレッドをサスペンドして同じイベントの再発生を保留にする。
【００７７】
さらに、継続点ベクトルを使用することにより、１スレッド当たり複数のイベントをイネーブルすることができる。すなわち、所定のスレッドは、継続点ベクトルをポート２２ａに送ることによって１つのポート２２ａに１つのイベントをセットアップすることができ、異なる継続点ベクトルを他のポート２２に転送することによって別のポート２２ｂに別のイベントをセットアップすることができる。スレッドは、また、それぞれのポートごとに異なるイネーブルフラグ３９を別々にアサートまたはデアサートすることによって、異なるイベントを個別にイネーブルしディスエーブルすることができる。次に、待機命令により、スレッドがサスペンドされて、任意のイネーブルされたイベントが待機させられる。
【００７８】
イベントおよび割り込みは、基本的入出力とわずかに異なるが、同じレディフラグシステムを使用することができ、その結果、スレッドを空の命令バッファで実行可能にすることができるようになる。状況に対処するために、スレッド識別子を使用してイベント（または、割り込み）を生成したポートにアクセスするために、「フェッチベクトル」要求が出される。次に、ポートは、「フェッチベクトル」要求が休止するメモリアクセス段の間に命令フェッチに使用されるように、時間内に適切なベクトルを提供することができる。ベクトルを提供することができる２つ以上のポートがあってもよく、その場合。単純な優先方式を使用して１つを選択することができる。これは、イベントまたは割り込み後で命令発行の前に２つ以下の仮想サイクルがあるように、ベクトルを処理するために１つ以下の仮想サイクルが使用されることを意味する。ここで、割り込みの場合も、ベクトルをこのように提供できることは明らかである。
【００７９】
基本的入出力操作を使用するイベントと対照的に、スレッドスケジューラ１８は、継続点ベクトルをＶＥＣＴＯＲレジスタに送らず、状態レジスタＳＲにおいてポートのイネーブルフラグ３９またはＥＥフラグを使用しない。代わりに、保留中の命令は、単純に命令バッファ１９内でそのままにされ、必要に応じて、実行が単純に休止されて、レディフラグ３７によって示されたように、入力が保留されるか、出力用のポートの可用性が保留される。実施形態では、基本的入出力に従ったスケジューリングには、ＴＩＤレジスタだけしか必要ない場合がある。基本的入出力は、ＣＴＲＬレジスタとＤＡＴＡレジスタの状態を使用してもよく使用しなくてもよい。そのような状態が使用されない場合、入出力は、単純に、ポートの準備ができしだい完了する。
【００８０】
また、イベントに続いてスレッドの実行が再開された後で、当然ながらスレッドが次に基本的入出力操作が実行する場合があることに注意されたい。これと反対に、基本的入出力に続いてスレッドが再開された後で、次にそのスレッドがイベント操作を含む場合がある。スレッドには、そのようなイベントと入出力の任意のチェーンが含まれてもよい。例えば、イベントがディスエーブルされており（すなわち、ポートのイネーブルフラグ３９および／または状態レジスタのＥＥフラグがデアサートされている）、かつイベントベクトルと状態がレジスタ３８内に設定されたままである間に、基本的入出力操作が、２つのイベントベース待機操作の間に挟まれてもよい。すなわち、イベントは、第１のイベントベース待機操作が完了した後でディスエーブルされ、次に同じポートを使用して基本的入出力が実行され、次に第２のイベントベース待機操作で使用するために同じイベントが再びイネーブル（re-enable）される。前述のように、基本的入出力操作は、スレッドを休止し休止解除（un-pause）するが、状態レジスタ内のポートのイネーブルフラグ３９にもＥＥフラグにも作用せず、制御をイベントベクトルに移しもしない。
【００８１】
次に、図６の流れ図を参照して、スレッドスケジューラと２つの例示的なポートの動作について説明する。ステップ１００で、実行ユニット１６は、スレッドスケジューラ１８の指示で第１および第２のスレッドを実行し始める。ステップ１０２で、スレッドスケジューラは、イベント、例えば、ポート２２ａで特定の信号を受け取ったことを条件とする第１のスレッド内のコード部分に遭遇する。ステップ１０４で、スレッドスケジューラは、ポート２２ａに、第１のスレッドのスレッド識別子（ＴＩＤ）を、イベントを検出した後で継続しなければならないプログラムスレッド実行におけるポイントを指定する継続点ベクトル（ＶＥＣＴＯＲ）、およびまた任意の必要な状態制御情報（ＣＴＲＬ）および関連データ（ＤＡＴＡ）と共に送る。例えば、データは、命令がポートで受け取ることを期待してる信号の値でよい。ステップ１０４で、スレッドスケジューラは、第１のポートのイネーブルフラグ３９をセットし、第１のスレッドの状態レジスタＳＲをイベントイネーブルにセットしてもよい。
【００８２】
ステップ１０６で、ポート２２ａは、スレッドスケジューラ１８からこの情報を得る。ステップ１０８で、スレッドスケジューラ１８は、第１のスレッドの実行をサスペンドする。ステップ１１０で、ポート２２ａは、そのポートのアクティビティを監視し始める。
【００８３】
ステップ１１２で、スレッドスケジューラ１８は、スレッドスケジューラ１８の指揮下で、第２のスレッドがまだ未処理であり、実行ユニット１６が、第２のスレッドを実行し続けていると判定する。ステップ１１４で、スレッドスケジューラ１８は、イベントを条件とするコード部分に遭遇する。ステップ１１６で、スレッドスケジューラ１８は、スレッド識別子を、継続点ベクトルおよび他の必要な状態情報と共にポート２２ｂに送る。ステップ１１６で、スレッドスケジューラは、また、第２のポートのイネーブルフラグ３９をセットし、第２のスレッドの第２の状態レジスタをイベントイネーブルにセットする。ステップ１１８で、ポート２２ｂはこの情報を受け取る。ステップ１２０で、スレッドスケジューラは、第２のスレッドの実行をサスペンドする。ステップ１２２で、ポート２２ｂは、そのポートで生じるアクティビティを監視し始める。
【００８４】
ステップ１２４で、スレッドスケジューラは、スケジューリングすべき未処理のスレッドが現在もうないことを判定し、システムは、ポート２２ａおよび２２ｂを除くすべての構成要素をパワーダウンする。ステップ１２８で、ポート２２ａは、関連イベント、例えば、ＤＡＴＡレジスタに記憶された信号を受け取ったことを検出し、その結果として、スレッド識別子（ＴＩＤ）と継続点ベクトル（ＶＥＣＴＯＲ）を戻す（同様に、第１のスレッドの状態レジスタをイベントディスエーブルにセットする）。ステップ１２６で、スレッドスケジューラ１８は、戻された識別子を受け取る。次に、その実行が継続することができ、ステップ１３０でシステムは再びパワーアップする。ステップ１３４で、実行ユニット１６は、スレッドスケジューラ１８の指揮下で第１のスレッドの実行を完了する。ステップ１３８で、ポート２２ｂは、第２のスレッドの関連イベントを検出し、そのスレッド識別子と継続点ベクトルを戻す（同様に、第２のスレッドの状態レジスタをイベントディスエーブルにセットする）。ステップ１３６で、スレッドスケジューラ１８は、戻された情報を受け取り、ステップ１３８で、実行ユニット１６は、スレッドスケジューラ１８の制御下で第２のスレッドの実行を完了する。ステップ１３４と１３６の間に追加のパワーダウンステップがある可能性があることに注意されたい。
【００８５】
図７に示したように、本発明の原理は、スレッド間の通信、またはより正確にはスレッドを表わす情報を記憶するスレッドレジスタセット２０間の通信に拡張することもできる。説明のために、図７には、それぞれスレッドＴ1〜Ｔ4に関する情報を記憶する４つのスレッドレジスタセット２Ｏ４〜２Ｏ１だけを示す。各スレッドレジスタセットは、相互接続システム４０によって他のセットとそれぞれ接続され、相互接続システム４０は、少なくとも２つのスレッドレジスタセット２０間でデータを直接転送するための少なくとも１つのチャネルを確立する。チャネルは、オペランドレジスタＯＰとの間でデータを移動するために使用されることが好ましいが、原理上は、状態レジスタＳＲなどの他のタイプのレジスタとの間で情報を移動するために使用されてもよい。スレッドスケジューラ１８は、前にポートに関して説明したものと同じように、チャネル上に生じるアクティビティに基づいてスレッドをスケジューリングすることができる。
【００８６】
図７Ａに示したように、各チャネル端４２は、１対のポートと似ており、入力バッファ４４と出力バッファ４６を有する。各チャネルの入力バッファ４４と出力バッファ４６は、ポート２２と同様に、チャネル上に生じるアクティビティを監視し、特定のアクティビティの発生を少なくとも１つのレディフラグ３７’によって知らせるためのアクティビティロジック３６’を有してもよい。チャネル端が検出する可能性のあるアクティビティには、データがチャネルに入力されたこと、またはチャネルが出力に利用可能になったことがある。チャネルが満杯すぎてデータを得ることができないときに出力命令が実行された場合、命令を実行したスレッドは、休止され、命令が首尾良く完了するのに十分な余裕がチャネル内にあるときに再開される。同様に、命令が実行され利用可能な十分なデータがないとき、スレッドは休止され、十分なデータが利用可能になったときに再開される。
【００８７】
この場合もポート２２と同じように、そのようなアクティビティの検出を容易にするために、各チャネル端は、レジスタ３８’と関連付けられる。これらは、関連スレッドの識別を記憶するためのスレッド識別子（ＴＩＤ）レジスタと、イベントが発生したときに実行を再開すべきプログラム内の位置を記憶するための継続点ベクトル（ＶＥＣＴＯＲ）レジスタとを含む。次に、スレッドスケジューラ１８と実行ユニット１６が、これらのＴＩＤおよびＶＥＣＴＯＲレジスタを使用して、ポート２２と同じようにスレッドをスケジューリングすることができる。ＶＥＣＴＯＲレジスタは、チャネルがイベントと割り込みを生成することを可能にする。チャネル端は、また、チャネルがイベントを生成することを可能にするイネーブルフラグ３９’を有する。実施形態では、チャネル端４２にＣＴＲＬレジスタとＤＡＴＡレジスタが提供されなくてもよい。
【００８８】
また、同じチャネル端４２を使用して、ポート２２を介してスレッドレジスタから外部環境にデータを送ってもよい。すなわち、実行ユニット１６は、チャネル端４２を介してレジスタ２０の内容を獲得し、それをポート２２を介して直接出力してもよく、またこれと反対に、実行ユニット１６は、ポート２２から入力を受け取り、それをチャネル端４２を介してレジスタ２０に直接転送してもよい。したがって、本発明による２つ以上のインタフェースプロセッサが、例えば、図２Ａに示したように接続された場合は、プロセッサ間にチャネルを確立することもできる。プロセッサ間システム内で、各プロセッサは、他のプロセッサとの同時接続を可能にするいくつかの双方向物理リンク２０４を介してシステム相互接続とインタフェースをとってもよい。
【００８９】
本明細書でポート、チャネル、およびアクティビティの他のソースを対象として含むように使用される一般的な用語が、「資源」である。
【００９０】
インタフェースプロセッサは、そのスレッドベース構造によりいくつかのプログラミング手法に対応することができる。このインタフェースプロセッサは、標準的な入出力を実行する単一の従来のプロセッサとして扱われてもよく、あるいは数百の通信構成要素の平行配列の一部としてプログラムされてもよい。これらの選択肢を支援する命令セットが提供される。命令セットは、スレッドの初期化、終了、開始および停止を支援し入出力通信を提供する特別な命令を含む。入出力命令は、外部装置とのきわめて高速な通信を可能にする。そのような入出力命令は、高速で低遅延の入出力と、高レベルの並列プログラミング技術とを支援する。ポートアクティビティの処理に対するこれらの応用は、以下でより詳しく考察し、本発明を実施するために使用することができる例示的な命令について述べる。
【００９１】
資源は、最初に、必要な資源のタイプを指定するＧＥＴＲ命令を使用してスレッド用に予約され、ＦＲＥＥＲ命令を使用して再び解放することができる。
【００９２】
ポートは入力または出力モードで使用することができる。入力モードで、条件を使用して、スレッドに渡されるデータをフィルタリングするることができる。後述するようにデータが利用可能になったときに、ポートを使用してイベントまたは割り込みを生成することができる。これにより、スレッドがいくつかのポートを監視し、準備ができているポートだけに要求に応じた処理をさせることができる。次に、レディ状態になった後、入出力命令（ＩＮとＯＵＴ）を使用してポートとの間でデータを転送することができる。この場合、ＩＮ命令は、ｎビットポートからｎ個の最小桁ビットを入力しゼロ拡張し、ＯＵＴ命令は、ｎ個の最小桁ビットを出力する。
【００９３】
さらに２つの命令（ＳＮＳＨＲとＯＵＴＳＨＲ）が、データ転送を最適化する。ＩＮＳＨＲ命令は、レジスタの内容をｎビット右にシフトし、最も左側のｎビットをｎビットポートからの入力されたデータで満たす。ＯＵＴＳＨＲ命令は、データのｎ個の最小桁ビットをｎビットポートに出力し、レジスタの内容をｎビット右にシフトする。
【００９４】
【数１】
0005382735.tif 000002
【００９５】
ポートは、構成された後でなければ使用できない。ポートは、ポートのいくつかの個別の設定を定義するために使用されるＳＥＴＣ命令を使用して構成される。これらの設定はそれぞれ、デフォルトモードを有し、異なるモードが必要な場合に構成されるだけでよい。
【００９６】
SETC port, mode    port[ctrl]←mode     ポート制御を設定する
以下に、ＳＥＴＣモード設定の効果について述べる。各設定の第１のエントリは、デフォルトモードである。
【００９７】
モード      作用
ＯＦＦ ポートがアクティブでない；ピンが高インピーダンス
ＯＮ   アクティブ
ＩＮ   ポートが入力である
ＯＵＴ ポートが出力である（但し、入力は現在のピン値を戻す）
ＥＶＥＮＴ    ポートがイベントを生じさせる
ＩＮＴＥＲＲＵＰＴ   ポートが割り込みを生成する
ＤＲＩＶＥ    ピンがハイとロー両方で駆動される
ＰＵＬＬＤＯＷＮ     ピンが、０ビットの場合にプルダウンされ、他の場合は高インピーダンスである
ＰＵＬＬＵＰ  ピンが、１ビットの場合にプルアップされ、他の場合は高インピーダンスである
ＵＮＣＯＮＤ  ポートが常に準備ができている；入力がすぐに完了する
ＥＱＵＡＬ    値がＤＡＴＡ値と等しいときにポートは準備ができている
ＮＥ   値がＤＡＴＡ値と異なるときにポートは準備ができている
ＴＲＡＮＳＩＴＩＯＮ 値がＤＡＴＡ値の方に変化するときにポートは準備ができている
ＧＲ   値がＤＡＴＡ値より大きいときにポートは準備ができている
ＬＳ   値がＤＡＴＡ値より小さいときにポートは準備ができている
ＤＲＩＶＥ、ＰＵＬＬＤＯＷＮ、およびＰＵＬＬＵＰモードは、ポート方向がＯＵＴのときだけ適切である。ＴＲＡＮＳＩＴＩＯＮ状態は、１ビットポートだけに適切であり、ＧＲおよびＬＳ状態は、複数のビットを有するポートだけに適切である。
【００９８】
各ポートは、ポートを通るデータのフローを制御するために使用されるレディビット３７を有し、ポートが入力命令を完了できるか出力命令を完了できるかを定義する。レディビットは、ポート構成によって違うようにセットされる。レディビットは、ＳＥＴＣ、ＳＥＴＤまたはＳＥＴＶ命令のいずれかが実行されたときにクリアされる。
【００９９】
入力モードのポートは、条件付き入力を実行するように構成することができる。この条件は、条件を満たすデータだけがプログラムに戻されるように入力データをフィルタリングする。条件が設定されたとき、ＩＮおよびＩＮＳＨＲ命令は、ポートが準備ができているときだけ完了する。前述のように、準備ができていないポートで入力命令を実行すると、スレッドが休止される。準備ができているとき、ポートはそのレディビットを設定し、そのレディビットは、スレッドスケジューラに知らされる。スレッドは、入力命令を再開し再実行する。ポートが準備ができているこのとき、データが戻され、レディビット３７がクリアされる。
【０１００】
ポートレディビットが設定されると、条件を満たしたデータ値が取り込まれ、その結果、ソフトウェアは、ポート上の値が後で変化した場合でも条件を満たす値を取得する。ＩＮまたはＩＮＳＨＲ命令が実行され、レディビットが設定されたときは、データが戻され、レディビットがクリアされる。レディビットが設定されない場合は、スレッドは、レディビットが設定されるまで休止する。条件が設定された場合は、データが条件と比較され、レディビットは、条件が満たされた場合だけ設定される。
【０１０１】
レディビットがクリアされた場合にＯＵＴまたはＯＬＪＴＳＨＲ命令が実行されたときは、データはポートによって取得され、レディビットが設定される。レディビットが設定された場合、スレッドは、ポートによってクリアされるまで休止する。
【０１０２】
２つのスレッド間で通信するために、各スレッドにごとに２つのチャネル端を割り当てる必要がある。これは、ＧＥＴＲ  ＣＨＡＮ命令を使用して行われる。次に、２つのスレッドは、資源識別子を使用して、次のような出力命令と入力命令を使用してデータワードを転送することができる。
【０１０３】
【数２】
0005382735.tif 000003
【０１０４】
チャネルが満杯過ぎてデータを取得できないときに出力命令が実行された場合は、命令を実行したスレッドが休止される。このスレッドは、命令が首尾良く完了するのに十分な余裕がチャネルにあるときに再開される。同様に、入力命令が実行され、利用可能なデータが十分にあるときに、スレッドは休止され、十分なデータが利用可能になったときに再開される。チャネルは、不要になったときに、ＦＲＥＥＲ  ＣＨＡＮ命令を使用して解放することができる。他の状況では、この命令を別のメッセージに使用することができる。
【０１０５】
イベントと割り込みは、資源（ポートとチャネル）が、事前定義されたイベントハンドラに制御を自動的に移すことを可能にする。スレッドがイベントまたは割り込みを受け入れる機能は、スレッド状態レジスタＳＲ（図４を参照）内に保持された情報によって制御され、ＴＳＥ命令とＴＳＤ命令を使用して明示的に制御されてもよい。この情報は、イベントイネーブルフラグ（ＥＥ）と割り込みイネーブルフラグ（ＩＥ）を含む。
【０１０６】
【数３】
0005382735.tif 000004
【０１０７】
これらの命令のオペランドは、次のいずれかでなければならない。
【０１０８】
EE   イベントをイネーブルまたはディスエーブルする
IE   割り込みをイネーブルまたはディスエーブルする
イベントは、セットアップされたのと同じ範囲で処理される。従って、イベント時にスレッドの状態はすべて有効であり、スレッドがイベントに対して素早く応答することができる。スレッドは、イベント情報の一部またはすべてを変化させないまま、イベントを発生させたポートを使用して入出力操作を実行することができる。これにより、スレッドは、イベントの処理を完了し、すぐに別の類似のイベントを待つことができる。
【０１０９】
イベントハンドラのプログラム位置は、ＳＥＴＶ命令を使用してイベントをイネーブルする前に設定されなければならない。ポートは、イベントをいつ生成するかを決定する条件を有し、これらの条件は、ＳＥＴＣ命令とＳＥＴＤ命令を使用して設定される。チャネルは、十分なデータを含むか出力用のデータを受け入れる余地ができしだい準備ができたと見なされる。
【０１１０】
特定のポートまたはチャネルによるイベント生成は、イベントイネーブル無条件（ＥＥＵ）命令を使用してイネーブルすることができ、またイベントディスエーブル無条件（ＥＤＵ）命令を使用してディスエーブルすることができる。イベントイネーブル真（ＥＥＴ）命令は、その条件オペランドが真の場合にイベントをイネーブルし、そうでない場合にディスエーブルし、これと反対に、イベントイネーブル偽（ＥＥＦ）命令は、その条件オペランドが偽の場合にイベントをイネーブルし、そうでない場合にそれをディスエーブルする。これらの命令は、ガード付き入力の実施を最適化するために使用される。以下は、ポート上のイベントを構成するためのいくつかの例示的な命令形式であるが、同じ命令をチャネルに対して適用できることが理解されるであろう。
【０１１１】
【数４】
0005382735.tif 000005
【０１１２】
１つまたは複数の資源上のイベントがイネーブルされた後で、スレッドは、ＷＡＩＴＥＵ命令を使用して少なくとも１つのイベントを待つことができる。この結果、対応するイベントベクトルによって指定されたイベントハンドラに制御が移され、ＥＥ（イベントイネーブル）フラグをクリアすることによってイベントがディスエーブルされた状態で、イベントがすぐに生じることができる。あるいは、スレッドは、イベントが生じるまでサスペンドされてもよく、その場合、ＥＥフラグは、イベントが生じたときにクリアされ、スレッドは実行を再開する。
【０１１３】
【数５】
0005382735.tif 000006
【０１１４】
条件に満たされるまで１つまたは複数のイベントを繰り返し待つ一般的なケースを最適化するために、イベント待機命令の条件付き形式が提供される。ＷＡＩＴＥＴ命令は、その状態オペランドが真の場合だけ待ち、ＷＡＩＴＥＦは、その状態オペランドが偽の場合だけ待つ。
【０１１５】
スレッドによってイネーブルされたすべてのイベントは、単一のＣＬＲＥ命令を使用してディスエーブルすることができる。これにより、スレッドによってイベントがイネーブルされたすべてのポートにおけるイベント発生がディスエーブルされる。また、ＣＬＲＥ命令は、スレッドの状態レジスタ内のイベントイネーブル状態をクリアする。
【０１１６】
高い優先順位の資源に対するスレッドの応答を最適化するために、ＴＳＥＥＥ命令を使用して、あるスレッド上のイベントをまずイネーブルし、その後でポートおよび／またはチャネルをイネーブルし始め、イベント待機命令のうちの１つを使用することができる。このように、プロセッサは、資源を優先順位に従って走査することができる。これにより、イベントがイネーブルされるとすぐにそのイベントを処理することができる。
【０１１７】
イベントとは対照的に、割り込みは、現在の範囲内で処理されず、したがって、現在のＰＣおよびＳＲ（および、潜在的に他のレジスタのうちのいくつかまたはすべても）が、割り込みハンドラの実行前に保存されなければならない。資源ｒによって割り込みが生成されたとき、以下のことが自動的に行われる。
SAVEPC←PC;
SAVESR←SR;
SR[EE]←false;
SR[IE]←false;
PC←r[vector]
ハンドラが完了したとき、中断されたスレッドの実行は、ＲＦＩＮＴ命令によって実行することができる。
【０１１８】
RFINTPC←SAVEPC;   割り込みから戻る
SR←SAVESR
サスペンドされイベントを待っている間に割り込みがスレッドを中断する可能性がある。
【０１１９】
以下は、前述のスレッドスケジューリング構成で使用することができる命令の例である。以下で使用されるような短縮形「ｒｅｇ」はレジスタを指し、「op reg」はオペランドレジスタを指し、「ｉｍｍ」は即値オペランドを指し、「ｄｅｓｔ」は宛先オペランドレジスタを指す。
ADDI dest, source, constant ソースを定数に加算する（２つのｏｐ  ｒｅｇと４ビットｉｍｍ)
MUL dest, sourcel, source2  ソース１とソース２を乗算する（３つのｏｐ  ｒｅｇ）
LSU dest, sourcel , source2        符号なし未満（less than unsigned） （３つのｏｐ  ｒｅｇ）
STW data, base offset     データをメモリに格納する（３つのｏｐ  ｒｅｇ）
LDW data, base, offset    メモリからデータをロードする（３つのｏｐ  ｒｅｇ)
LDWSP data, offset スタックからデータをロードする（任意のｒｅｇおよび６ビットｉｍｍ）
LDC data, constant 定数をロードする（任意のｒｅｇおよび６ビットｉｍｍ）
STB data, addrバイトをメモリに格納する（２つのｏｐ  ｒｅｇ）
BRFT flag, offset    フラグが真の場合に順方向に分岐する（ｏｐ  ｒｅｇおよび６ビットｉｍｍ）
BRBF flag, offset    フラグが偽の場合に順方向に分岐する（ｏｐ  ｒｅｇおよびビット−ビット  ｉｍｍ）
BRFU offset   相対順方向無条件に分岐する（６ビットｉｍｍ）
BLRF offset   相対順方向に分岐しリンクする（１０ビットｉｍｍ  サブルーチンコール)
GETR resource, type資源をスレッドに割り振る（２つのｏｐ−ｒｅｇ）
IN resource, data    入力（２つのｏｐ  ｒｅｇ）
OUT resource, data 出力（２つのｏｐ  ｒｅｇ）
INSHR resource, data      入力し右にシフトする（２つのｏｐ  ｒｅｇ）
NOT dest, source     ビット単位でない（２つのｏｐ  ｒｅｇ）
EET flag, resource フラグが真の場合にイベントをイネーブルする（２つのｏｐ  ｒｅｇ）
EEU resource  イベント無条件をイネーブルする（１つのｏｐ  ｒｅｇ）
WAITEU イベント無条件を待つ（オペランドなし）
CLRE   スレッドのイベントをクリアする（オペランドなし）
次に、上記の命令の使用法のいくつかの例を示す。最初の例は、２つのアレイａおよびｂの乗加算を実行する。
MACC:
LDW x, a, i
LSU go, i, limit 
LDW y, b, i
ADD i, i, 1
MUL prod, x, y
ADD sum, sum, prod
BRBF go, MACC
次の２つは、ＤＭＡ（直接メモリアクセス）コントローラによって通常実行されるのと同じ入出力機能を実行する。これらは、次のように、メモリ内のアドレス基底で始まるチャネルｃを使用してワードのブロックを転送する。
DMAI:
LSU go, i.limit
IN c, x
STW x, base, i
ADDI i. i, 1
BRBF go, DMAI
DMAO:
LDW x, base, i
LSU go, i, limit
ADDI i,i,1
OUT c,x
BRBF go DMAO
以上の実施形態が、単に例として説明されたことを理解されよう。他の実施形態では、チップの所望の仕様により異なる組のレジスタと命令が提供されてもよい。いくつかの実施形態では、スレッド識別子は、ポートに送られなくてもよいが、スレッドスケジューラの役割を維持してもよく、他の場所に記憶されてもよい。あるいは、各スレッドは、ポートに個別のレディフラグが提供されてもよく、その結果、スレッド識別子がポートに渡されて適正なレディ信号が選択されるが、アクティビティの検出時にスレッド識別子をスレッドスケジューラに戻す必要がなくなる。さらに、条件および／または条件データをポートに送らなくてもよい。代わりに、ポートで条件を予め設定してもよくかつ／またはスレッドスケジューラや他の場所で条件を評価してもよい。スレッドは、ポートとチャネル以外の他のソースからのアクティビティに基づいてスケジューリングされてもよい。プロセッサの様々な構成要素間に異なる相互接続が提供されてもよい。また、本発明は、モバイルアプリケーションプロセッサを有する移動端末での使用に限定されない。当業者には他の用途および構成は明らかであろう。本発明の範囲は、示した実施形態によって限定されず、添付の特許請求の範囲のみにより限定される。
【図１】
0005382735.tif 000007
【図２】
0005382735.tif 000008
【図２ａ】
0005382735.tif 000009
【図３】
0005382735.tif 000010
【図３Ａ】
0005382735.tif 000011
【図３Ｂ】
0005382735.tif 000012
【図３Ｃ】
0005382735.tif 000013
【図３Ｄ】
0005382735.tif 000014
【図４】
0005382735.tif 000015
【図５】
0005382735.tif 000016
【図６】
0005382735.tif 000017
【図７】
0005382735.tif 000018
【図７Ａ】
0005382735.tif 000019