説明

動的キャッシングエンジン命令

全般的には、1つの側面において、この開示は、少なくとも1つのプログラムの少なくとも一部の複数の命令を記憶する1つの命令記憶装置と、当該命令記憶装置に結合された複数のエンジンの組とを備える1つのプロセッサを示す。エンジンは、1つのエンジン命令キャッシュと、少なくとも1つのプログラムの少なくとも一部のサブセットを要求する回路とを有する。

【発明の詳細な説明】
【技術分野】
【0001】
これは本出願と同日に出願された以下の出願に関連する出願である。
a.代理人整理番号P16851 − "SERVICING ENGINE CACHE REQUESTS"
b.代理人整理番号P16852 − "THREAD-BASED ENGINE CACHE PARTITIONING"
【背景技術】
【0002】
ネットワークは複数のコンピュータ及び他の複数のデバイスが通信することを可能にする。例えば、ネットワークは、ビデオ、オーディオ、電子メール等を表すデータを運ぶことができる。典型的には、ネットワークをわたって送られるデータは、パケットとして知られる小さな複数のメッセージに分割される。類推によって、1つのパケットは、メールボックスに投函した1つの封筒によく似ている。1つのパケットは、典型的には"ペイロード"及び1つの"ヘッダ"を含む。パケットの"ペイロード"は、封筒内のレターに似ている。パケットの"ヘッダ"は、封筒自体に書かれた情報によく似ている。ヘッダは、ネットワークデバイスがパケットを適切に処理することを助ける情報を含んでよい。例えば、ヘッダは、パケットの宛先を特定するアドレスを含むことができる。
【0003】
1つの任意のパケットは、その宛先に到達する前に、多くの異なる中間ネットワークデバイス(例えば、" 複数のルータ"、" 複数のブリッジ"、及び"複数のスイッチ")をわたって"ホップ"してよい。これらの中間デバイスは、様々なパケット処理オペレーションを頻繁に実行する。例えば、中間デバイスは、パケットをその宛先に向けてさらにどのように転送するかを決定したり、そのパケットを処理で用いるサービスのクオリティを決定したりするオペレーションを頻繁に実行する。
【0004】
ネットワーク接続速度が増大するにつれて、1つの中間デバイスが1つのパケットを処理するための時間の量は小さくなり続けている。高速なパケット処理を実現すべく、多くのデバイスは、特定用途向け集積回路(ASIC)のような、専用の、"ハードウェアに組み込まれた"設計を特徴として持つ。これらの設計は、しかしながら、出現してくる複数のネットワーク技術及び通信プロトコルに適合させることが、多くの場合困難となる。
【0005】
ASICに多くの場合付随する速度と柔軟性とを両立すべく、いくつかのネットワークデバイスは複数のプログラマブルネットワークプロセッサを特徴として持つ。ネットワークプロセッサは、ネットワークプロセッサの動作をソフトウェア技術者に速やかに再プログラムさせることを可能にする。
【0006】
繰り返すと、多くの場合、ネットワーク接続の速度が増大することによって、1つのパケットを処理するために要する時間は、複数のパケットが到着する速度を著しく超えている。したがって、いくつかのネットワークプロセッサのアーキテクチャは、複数のパケットを同時に処理する複数のプロセッシングエンジンを特徴として持つ。例えば、1つのエンジンが1つのパケットをどのように転送するか決定している間に、他の1つのエンジンが異なる1つのパケットをどのように転送するかを決定する。1つの任意のパケットを処理するための時間は同じままであるが、複数のパケットを同時に処理することは、ネットワークプロセッサが到着するパケットの殺到に遅れないことを可能にする。
【図面の簡単な説明】
【0007】
【図1】1つのネットワークプロセッサの複数の命令キャッシュを示す図である。
【0008】
【図2】エンジンの命令キャッシュに複数の命令をフェッチするための1つの命令のオペレーションを示す図である。
【0009】
【図3】ネットワークプロセッサエンジンによって実行される命令処理を示すフローチャートである。
【0010】
【図4】複数の命令のキャッシングを示すフロー図である。
【0011】
【図5】キャッシュされた複数の命令をサーチするエンジンの回路を示す図である。
【0012】
【図6】ネットワークプロセッサエンジンの異なるスレッドにアロケートされた命令キャッシュメモリのマップを示す図である。
【0013】
【図7】ネットワークプロセッサエンジンを示す図である。
【0014】
【図8】ネットワークプロセッサを示す図である。
【0015】
【図9】ネットワークデバイスを示す図である。
【発明を実施するための最良の形態】
【0016】
図1は、複数のプロセッシングエンジン102を有するネットワークプロセッサ100を示す。プロセッシングエンジン102は、パケットの次ホップの決定、サービス品質(QoS)の適用、パケットトラフィックの計測等、種々のパケット処理オペレーションを実行すべくプログラムされている。示されたアーキテクチャでは、エンジン102は、エンジン102の高速ローカルメモリ104に記憶された複数のプログラム命令108を実行する。サイズ及びコスト制限によって、エンジン102によって提供される命令メモリ104の量は多くの場合限られている。エンジンメモリ104の限られた記憶容量が、プログラム108の全体のサイズ及び複雑さに厳し過ぎる制限を課すことを防ぐべく、図1は、1つのエンジン102におけるプログラム108の実行が進むにつれて、大きなプログラム108の複数のセグメント(例えば108b)を1つのエンジン102に直接的にダウンロードする命令キャッシングスキームの一例を示す。
【0017】
図1に示された例において、それぞれのエンジン102は、プログラム108の複数の命令のサブセットを記憶する命令キャッシュ104を有する。例えば、パケットエンジン102aの命令キャッシュ104aは、プログラム108のセグメント108bを持つ。プログラム108の残りは、複数のエンジン102によって共有される1つの命令記憶装置106に記憶されている。
【0018】
最終的には、エンジン102aは、セグメント108b以外のプログラムセグメントにアクセスする必要があるかもしれない。例えば、プログラムはセグメント108b外のプログラム108内のポイントに分岐する又は連続的に進む場合がある。エンジン102にプログラム108の実行を継続させることを可能にすべく、ネットワークプロセッサ100は、要求された/必要とされた(複数の)セグメントをエンジン102aのキャッシュ104aにダウンロードしてよい。したがって、キャッシュに記憶される(複数の)セグメントは、プログラムの実行が進行するにつれて動的に変化する。
【0019】
図1に示されるように、複数のエンジン102は、命令記憶装置106からキャッシュする複数の命令を受け取る。共有の命令記憶装置106は、更には、プロセッサ100の内部又は外部にある階層的により高い命令記憶装置110から複数の命令をキャッシュしてよい。言い換えると、命令記憶装置104、106、及び110は、エンジンのL1命令キャッシュ104及び異なる複数のエンジンによって共有されるL2命令キャッシュ106を含むキャッシュヒエラルキーを形成する。
【0020】
図1は、全ての複数のエンジン102に働く命令記憶装置106を示すが、ネットワークプロセッサ100は、それに代えて、異なる複数のエンジン102の組に働く複数の共有された記憶装置106を有してよい。例えば、1つの共有された命令記憶装置106がエンジン#1から#4用の複数のプログラム命令を記憶するのに対し、他の1つの記憶装置がエンジン#5から#8用の複数のプログラム命令を記憶してよい。さらに、図1は、1つのプログラム108の複数の命令を記憶するエンジンキャッシュ104及び命令記憶装置106を示すが、それに代えて、エンジンキャッシュ104及び命令記憶装置106は、異なる複数のプログラムに属する複数の命令の複数の組を記憶してもよい。例えば、共有された命令記憶装置106は、それぞれのエンジン102用の、さらにはエンジン102の異なる複数のスレッド用の、複数の異なるプログラム命令を記憶してよい。
【0021】
図1は、説明をし易くすべく、複数の命令108をソースコードで示す。共有された記憶装置106によって記憶されて複数のエンジンに配布される実際の命令は、典型的にはエンジンによって提供される命令セットで表される実行可能な複数の命令であってよい。
【0022】
場合によっては、プログラム実行を継続すべくエンジン102によって必要とされる1つのプログラムセグメントは、"オンデマンド"原理で提供されてよい。すなわち、エンジン102は、実行を要する命令がキャッシュ104a内になくなるまで、命令キャッシュ104a内に記憶されている命令108bを実行し続けてよい。これが発生すると、エンジン102は、実行されるべき次の命令を含むプログラムセグメントを配送するよう、共有された記憶装置106に知らせる。この"オンデマンド"シナリオは、一方で、エンジン102のプログラム実行に遅延を発生させる。すなわち、"オンデマンド"シーケンスでは、エンジン102(又はエンジン102のスレッド)は必要とされる命令がロードされるまでアイドルでいつづける。この遅延は、必要とされる命令をエンジン102のL1キャッシュ104にダウンロードすることに伴うオペレーションだけでなく、共有された記憶装置106へのアクセスに対するエンジン102b−102n間の競合によっても生じ得る。
【0023】
この遅延を可能性として避けるべく、図2は、プログラムの実行を継続するために命令が要求される時刻より前に、エンジンのキャッシュ104内へのプログラム命令の"プリフェッチ"をプログラムに開始させるフェッチ命令122を含む、プログラムソースコードリストの一部を示す。例えば、図2に示されるように、フェッチ命令122は、次のセグメント108b内のポイントに実行が進む前に、エンジン102nに、共有された命令記憶装置106に必要とされる次のセグメント180bを求めて要求を発行("1")させる。エンジン102が、フェッチ命令122に続いて命令124を処理し続けている間に、要求されたセグメント108bがエンジン102の命令キャッシュ104n内にロードされる。言い換えると、プログラムセグメントを取得する("2")ために使用される期間は、エンジンのプリフェッチ命令122の実行と、現在キャッシュされている(複数の)プログラムセグメント内にエンジン102が実効すべき命令が"無くなる"時間との間の期間に重なる。
【0024】
図2に示される例では、複数のプログラム命令を取得する時間は、そのフェッチ命令に続く命令122を実行している期間によって隠匿された。フェッチ遅延は、完了するのにいくらかの時間を要する命令120(例えば、メモリオペレーション)の後に当該フェッチ命令を実行することによっても"隠匿"され得る。
【0025】
図2に示されたフェッチ命令の例は、以下の構文を持つ。
【0026】
Prefetch (SegmentAddress,SegmentCount)[, optional_token]
【0027】
SegmentAddressは、共有記憶装置106から取得するプログラムの開始アドレスを表し、SegmentCountは、それに続くフェッチすべきセグメントの数を表す。場合によっては、SegmentAddressは、プログラムセグメントの開始アドレスを特定すべく限定されてよい。
【0028】
optional_tokenは以下の構文を持つ。
【0029】
optional_token = [ctx_swap[signal],][sig_done[signal]]
【0030】
ctx_swapパラメータは、プログラムセグメントのフェッチの完了をシグナルが示すまで、他のエンジン実行スレッドにスワップするようエンジン102に命令する。sig_doneパラメータもフェッチの完了おいてセットされるステータスシグナルを示すが、エンジン102に複数のコンテクストをスワップするようには命令しない。
【0031】
図2に示された命令構文は単なる一例であり、複数のプログラム命令をフェッチする他の複数の命令は、異なる複数のパラメータ、複数のキーワード、及び異なる複数のオプションを有してよい。さらに、命令は複数の異なるレベルにあってよい。例えば、命令は、エンジンの命令セットの一部であってよい。他にも、命令は、フェッチ命令に対応する複数のターゲット命令(例えば、エンジンが実行可能な複数の命令)を生成すべく1つのコンパイラによって処理されるソースコード命令であってよい。そのようなコンパイラは、ソースコードのテキスト文字を" 複数のトークン"にグループ化する語彙解析、そのトークンを文法的フレーズにグループ化する構文解析、ソースコードをより抽象的に表す中間言語コード生成、最適化等の、他の従来のコンパイラオペレーションを実行する。
【0032】
フェッチ命令は、コード開発中にプログラマによって手動で挿入されてよい。例えば、初期のパケット分類に基づいて、そのパケットに対する残りのプログラムフローは知られている。したがって、フェッチ命令は、当該分類の後に、パケットを処理するのに必要な複数のセグメントを取得する。例えば、高レベル言語で書かれたプログラムは、以下の命令を含む。
【0033】
switch(classify(packet.header)) {
case DropPacket: {
prefetch(DropCounterInstructions);
}
case ForwardPacket {
prefetch(RoutingLookupInstructions)
prefetch(PacketEnqueueInstructions);
} }
【0034】
これは、パケットの分類に基づいて、適切な(複数の)プログラムセグメントをエンジン102の命令キャッシュ104にロードする。
【0035】
プログラマが手動でフェッチ命令をコードに挿入してもよいが、フェッチ命令は、コンパイラ、アナライザ、プロファイラ、及び/又はプリプロセッサのようなソフトウェア開発ツールによってコードに挿入されてもよい。例えば、コードフロー解析が、異なるプログラムセグメントがいつロードされるべきかを特定してよい。例えば、コンパイラが、メモリアクセス命令の後、又は実行するのにいくらか時間を要する複数の命令のセットの前に、フェッチ命令を挿入してよい。
【0036】
図3は、"オンデマンド"及び"フェッチ"命令に応答して複数の命令を取得する1つのエンジンのオペレーションを表すフローチャートを示す。図3に示されるように、実行すべき次のプログラム命令を特定するプログラムカウンタ130が更新される。例ば、次の連続する命令アドレスに進めるべくプログラムカウンタ130がインクリメントされるか、又は分岐命令に応答してカウンタ130がある他の命令アドレスにセットされてよい。示されるように、エンジンは、エンジンの命令キャッシュがプログラムカウンタによって特定される命令を現在保持しているか否かを判断132する。保持していない場合には、保持していない命令を共有された記憶装置からフェッチ136が取得するまで、エンジンスレッドはストール134する(例えば、命令を要求するスレッドがエンジンからスワップアウトされる)。
【0037】
実行されるべき1つの命令がエンジンの命令キャッシュにあれば、エンジンは実行すべき次の命令がフェッチ命令であるか否かを判断140する。そうであれば、エンジンは、要求された(複数の)プログラムセグメントのフェッチ142を開始することができる。そうでなければ、エンジンは、通常通り命令を処理144することができる。
【0038】
図4は、共有される命令キャッシュ106のアーキテクチャの一例を示す。命令キャッシュ106は、例えばネットワークプロセッサのスタートアップの間に、複数のエンジンで共有する複数の命令("1")を取得する。その後、共有された命令キャッシュ106は、複数の命令108の複数の部分を、必要に応じて及び/又は要求に応じて、複数のエンジンに配布する。
【0039】
図4のアーキテクチャ例において示されるように、異なる2つのバス150、152が、共有されたキャッシュ106を複数のエンジン102に接続する。バス150は、複数のフェッチ要求を共有されたキャッシュ106に運ぶ("2")。これらの要求は、フェッチすべき(複数の)プログラムセグメント及び要求しているエンジンを特定する。複数の要求は、その要求がプリフェッチであるか"オンデマンド"であるかを特定してもよい。高バンド幅のバス152は、要求された(複数の)プログラムセグメントの中の複数の命令を、要求しているエンジン102に戻す("4")。バス152のバンド幅は、共有キャッシュ106が要求された複数の命令を複数のエンジンに同時に配布することを可能にする。例えば、バス152は、複数のエンジンに直接アロケートされたn本のラインに分割されてよい。例えば、4個のエンジンが複数のセグメントを要求した場合、それぞれはバスバンド幅の25%がアロケートされる。
【0040】
示されるように、共有されたキャッシュ106は、複数の要求が到着すると、例えばシーケンシャルサービスのための(ファーストインファーストアウト)FIFOキュー154に複数の要求をキューしてよい。一方で、上記のように、実行されるべき命令がエンジンの命令キャッシュ104にロードされていない場合、スレッドはストールする。このように、実際にストールをもたらす"オンデマンド"要求に応えることは、ストールしないかもしれない結果になる"プリフェッチ"要求に応えることより切迫していることを意味する。示されるように、共有キャッシュ106は、複数のプリフェッチ要求を越えて複数のデマンド要求にプライオリティを与えることができる1つのアービタ156を含む。アービタ156は、専用回路を含んでよいし、プログラム可能であってもよい。
【0041】
アービタ156は、様々な方法で複数のデマンド要求に優先順位をつけることができる。例えば、アービタ156は、デマンド要求をキュー154に加えず、代わりにその要求を速やかなサービス("3")のために提供する。複数の"デマンド"要求の間で優先順位をつけるべく、アービタ156は、キュー154内の複数の要求を超えてアービタ156によってプライオリティが与えられる、独立した"デマンド"FIFOキューを管理してもよい。アービタ156は、デマンド要求をサービスすべく、進行中の複数の命令ダウンロードを速やかにサスペンドしてもよい。さらに、アービタ156は、"オンデマンド"要求を発行しているエンジンへの複数のセグメント命令の配布に、バス152のバンド幅の、100%でない場合には、大部分をアロケートしてよい。
【0042】
図5は、エンジンの命令キャッシュのアーキテクチャ例を示す。示されるように、キャッシュ記憶装置は、バス164を通じて共有された命令記憶装置106から受け取った命令を記憶する複数のメモリデバイス166xの集合によって提供される。個々のメモリ要素166aは、1つのプログラムセグメントを保持するサイズであってよい。示されるように、それぞれのメモリ166xはアドレスデコーダと関連しており、アドレスデコーダは処理されるべき1つの命令のアドレスをエンジンから受け取り、その命令が関連するメモリ166内にあるか否かを判断するする。異なる複数のデコーダは、1つのアドレス上でパラレルに動作する。すなわち、それぞれのデコーダは、その関連するメモリを同時に検索する。メモリ166xの1つの中に発見されると、メモリ166xユニットは、エンジンによる処理のための要求された命令を出力168する。複数のメモリ166のいずれの中にも命令アドレスが発見されない場合、"ミス"信号168が生成される。
【0043】
前述のように、1つのエンジンは複数の実行スレッドを提供してよい。実行中に、これらの複数の異なるスレッドは、複数の異なるプログラムセグメントをエンジンの命令キャッシュにロードする。キャッシュが満たされたとき、セグメントをキャッシュにロードすることは、ある他のセグメントがキャッシュから削除されることを要求する("犠牲")。何らかの保護なしでは、あるスレッドが他のスレッドによって現在使用されているセグメントを犠牲にする場合がある。他のスレッドが処理を再開したとき、最近犠牲にされたセグメントが共有されるキャッシュ106から再びフェッチされるかもしれない。命令キャッシュ104のこのスレッド内のスラッシングは、何度も繰り返される場合があり、システムのパフォーマンスを著しく低下させる。なぜなら、複数のセグメントは1つのスレッドによってキャッシュにロードされ、別のスレッドによって早々に犠牲にされ、短い時間の後に再びロードされるからである。
【0044】
そのようなスラッシングに対処することを目的として、種々のメカニズムが、セグメントを犠牲にするスレッドの機能に制限を課すことができる。例えば、図6は、それぞれのエンジンスレッドがキャッシュ104の一部に排他的にアロケートされている1つのエンジンの命令キャッシュ104の、メモリマップを示す。例えば、スレッド0 172は、N個のプログラムセグメント172a、172b、172n用にメモリがアロケートされている。1つのスレッドのためにフェッチされた複数の命令セグメントは、キャッシュ104のスレッドのアロケーション内に存在することができる。スラッシングを防ぐことを目的として、ロジックが、他の複数のスレッドにアロケートされた複数のキャッシュパーティションから、1つのスレッドが複数のセグメントを犠牲にすることを制限してよい。
【0045】
キャッシュされたセグメントに速やかにアクセスすることを目的として、1つのスレッドに関連する制御レジスタ及び状態レジスタ(CSR)が、アロケートされたキャッシュ部分の開始アドレスを記憶してよい。このアドレスは、例えばスレッドの数に基づいて計算されてよい(例えば、アロケーション開始アドレス=ベースアドレス+(スレッド#×1スレッド当たりにアロケートされたメモリ))。それぞれのパーティションは、例えばキャッシュエンジンへの共有される記憶装置106からのバーストフェッチサイズ又は共有記憶装置106からの転送の他の粒度に対応する、複数のセグメントにさらに分割されてよい。LRU(最長時間未使用)情報が、1つのスレッドのアロケートされたキャッシュ部分の中の異なるセグメントに対して管理される。したがって、LRUスキームでは、与えられたスレッドのキャッシュの中で最も長期間使用されていないセグメントが最初に犠牲にされる。
【0046】
示されたマップはまた、異なる複数のスレッド間で分割された領域に加えて"ロックダウン"部分170を有する。ロックダウン領域内の複数の命令は、イニシャライズ時にロードされ、犠牲から保護される。全スレッドは、この領域に記憶された複数の命令にアクセスして、実行することができる。
【0047】
図6に示されたスキームのようなメモリアロケーションスキームは、スレッド間のスラッシングを防ぐことができる。一方で、他のアプローチも使用することができる。例えば、アクセスカウントが、現在セグメントを使用している複数のスレッドに関連づけられてよい。当該カウントが零に到達すると、当該セグメントが犠牲にされる。他にも、キャッシュ犠牲スキームは、異なる複数のルールを適用し得る。例えば、そのスキームは、いずれのスレッドによってもアクセスされていないロードされたセグメントを犠牲にすることを避けようとしてもよい。
【0048】
図7は、エンジン102のアーキテクチャの一例を示す。エンジン102は、パケット処理用に適合された縮小命令セットコンピューティング(RISC)プロセッサであってよい。例えば、エンジン102は、汎用プロセッサの命令セットによって通常提供される浮動小数命令又は整数除算命令を提供しない。
【0049】
エンジン102は、他のコンポーネントに送信する又は他のコンポーネントから受信したデータをバッファリングする転送レジスタ192a、192bを介して、他のネットワークプロセッサコンポーネント(例えば、共有メモリ)と通信してよい。エンジン102は、他の(複数の)エンジンに組み込まれた"隣接"レジスタ194a、194bを介して、他の複数のエンジン102と通信してよい。
【0050】
示されたエンジン102の例は、複数の実行スレッドを提供する。複数のスレッドをサポートすべく、エンジン102は、スレッドのそれぞれに対して1つのプログラムコンテクスト182を記憶する。コンテクスト182は、プログラムカウンタのようなスレッド状態データを含むことができる。スレッドアービタ182は、実行すべき1つのスレッドのプログラムコンテクスト182xを選択する。選択されたコンテクストに対するプログラムカウンタは、1つの命令キャッシュ104に供給される。キャッシュ104は、プログラムカウンタによって特定される命令が現在キャッシュされていない(例えば、セグメントがロックダウンキャッシュ領域又は現在実行しているスレッドにアロケートされた領域の中にそのセグメントがない)場合に、プログラムセグメントのフェッチを開始することができる。そうでなければ、キャッシュ104は、キャッシュされた命令を命令デコードユニット186に送ることができる。場合によっては、命令デコードユニット190は、当該命令を"フェッチ"命令とみなしてよく、セグメントのフェッチを開始してよい。そうでなければ、デコード190ユニットは、処理のために1つの実行ユニット(例えば、ALU)に命令を供給して、異なる複数のエンジンによって共有されるリソース(例えば、メモリコントローラ)に、コマンドキュー188により要求を開始する。
【0051】
フェッチコントロールユニット184は、共有されたメモリ106からのプログラムセグメントの取得を処理する。例えば、フェッチコントロールユニット184は、共有キャッシュ要求バスへのアクセスをネゴシエートして、要求を発行して、返された複数の命令を命令キャッシュ104の中に記憶することができる。フェッチコントロールユニット184は、以前にキャッシュされた複数の命令の犠牲を処理してもよい。
【0052】
エンジン102の命令キャッシュ104及びデコーダ186は、1つの命令処理パイプラインの一部を形成する。すなわち、複数のクロックサイクルにわたって、1つの命令は、キャッシュ104からロードされ、デコード186され、(例えば、複数の汎用レジスタ196、複数の次の隣接レジスタ194a、複数の転送レジスタ192a、及びローカルメモリ198から)複数の命令オペランドがロードされ、実行データパス190によって実行される。最後に、オペレーションの結果が、(例えば、複数の汎用レジスタ196、ローカルメモリ198、複数の隣接レジスタ194b、又は複数の転送レジスタ192bに)書き込まれる。多くの命令がパイプライン内に同時に存在し得る。すなわち、1つがデコードされている間に、他の1つがL1命令キャッシュ104からロードされている。
【0053】
図8はネットワークプロセッサ200の一例を示す。示されたネットワークプロセッサ200は、Intel(登録商標)Internet eXchange network Processor (IXP)である。他のネットワークプロセッサは異なる設計を有する。
【0054】
示されたネットワークプロセッサ200は、1つのダイ上に集積された複数のパケットエンジン204の1つの集合を有する。上記のように、個々のパケットエンジン204は複数のスレッドを提供する。プロセッサ200は、ネットワークオペレーションに含まれる"制御プレーン"タスクを実行すべく多くの場合プログラムされたコアプロセッサ210(例えば、StrongARM(登録商標) XScale(登録商標))を有してもよい。コアプロセッサ210は、一方で、"データプレーン"タスクを処理してもよく、追加のパケット処理スレッドを提供してよい。
【0055】
示されるように、ネットワークプロセッサ200は、プロセッサ200と他の複数のネットワークコンポーネントとの間でパケットを運ぶことができるインタフェース202を特徴として有してもよい。例えば、プロセッサ200は、スイッチファブリックに接続された他の(複数の)プロセッサ又は回路にプロセッサ200がパケットを送ることを可能にするスイッチファブリックインタフェース202(例えば、Common Switch Interface(CSIX)インタフェース)を有してよい。プロセッサ200は、プロセッサ200が物理層(PHY)及び/又は複数のリンク層デバイスと通信することを可能にするインタフェース202(例えば、System Packet Interface (SPI)インタフェース)を有してよい。プロセッサ200は、例えばホストと通信するためのインタフェース208(例えば、Peripheral Component Interconnect (PCI)バスインタフェース)を有してもよい。示されるように、プロセッサ200は、複数のメモリコントローラ206、212、1つのハッシュエンジン、及びスクラッチパッドメモリのような、複数のエンジンによって共有される他の複数のコンポーネントを有する。
【0056】
上記のパケット処理技術は、IXPのような1つのネットワークプロセッサ上に種々の方法で実装されてよい。例えば、コアプロセッサ210は、ネットワークプロセッサの立ち上げの間に、共有される命令キャッシュ106に複数のプログラム命令を送ってよい。さらに、例えばプロセッサが非常に多数のエンジンを有している場合には、プロセッサ200は、"2層の"命令キャッシュ階層に代えて、N層の命令キャッシュ階層を有してよい。
【0057】
図9は、上記の技術が組み込まれたネットワークデバイスを示す。示されるように、デバイスは、スイッチファブリック310(例えば、クロスバ又は共有メモリスイッチファブリック)によって相互に接続されたラインカード300("複数のブレード")の集合を持つ。スイッチファブリックは、例えば、CSIX、或いはハイパートランスポート、インフィニバンド、Peripheral Component Interconnect - Express (PCI−X)等のような他のファブリック技術に準拠してよい。
【0058】
個々のラインカード(例えば、300a)は、ネットワーク接続を通じて通信を処理する1以上の物理層(PHY)デバイス302(例えば、光、有線、及び無線PHY)を含んでよい。複数のPHYは、異なるネットワークメディアから運ばれた複数の物理信号と、デジタルシステムによって使用される複数のビット(例えば、複数の"0"及び複数の"1")との間で変換する。ラインカード300は、複数のフレームに対してエラー検出及び/又はエラー訂正のようなオペレーションを実行することが可能なフレーマデバイス304(例えば、イーサネット(登録商標)、同期光ネットワーク(SONET)、高レベルデータリンク(HDLC)フレーマ、又は他の複数のレイヤ2デバイス)を含んでもよい。示されたラインカード300は、上記の命令キャッシング技術を用いる1以上のネットワークプロセッサ306を含んでよい。ネットワークプロセッサ306は、(複数の)PHY300より受け取った複数のパケットに対して複数のパケット処理オペレーションを実行し、当該複数のパケットを、スイッチファブリック310を通じて、選択された出力インタフェースを提供するラインカードに導くようプログラムされている。場合によっては、(複数の)ネットワークプロセッサ306は、複数のフレーマデバイス304に代わって、"レイヤ2"動作を実行してよい。
【0059】
図8及び9は、1つのエンジン、ネットワークプロセッサ、及び複数のネットワークプロセッサが組み込まれたデバイスのアーキテクチャ例を示すが、この技術は、他のエンジン、ネットワークプロセッサ、及びデバイスの設計に実装され得る。さらに、この技術は、種々のネットワークデバイス(例えば、ルータ、スイッチ、ブリッジ、ハブ、トラフィックジェネレータ等)に使用され得る。
【0060】
ここで使用されている回路という用語は、ハードウェア組み込み回路、デジタル回路、アナログ回路、プログラマブル回路等を含む。プログラマブル回路はコンピュータプログラムで動作してよい。
【0061】
そのようなコンピュータプログラムは、高レベル手続き型又はオブジェクト指向のプログラミング言語で書かれてよい。一方で、(複数の)プログラムは、必要に応じて、アセンブリ又はマシン言語で実装されることができる。その言語は、コンパイル又はインタープリトされてよい。さらに、これらの技術は、種々のネットワーク環境で使用され得る。
【0062】
他の複数の実施形態は、以下の複数の請求項の範囲内にある。

【特許請求の範囲】
【請求項1】
少なくとも1つのプログラムの少なくとも一部の複数の命令を記憶する1つの命令記憶装置と、
前記命令記憶装置に結合された複数のエンジンの組であって、エンジンの個々は、エンジン命令キャッシュ、及び前記少なくとも1つのプログラムの少なくとも一部のサブセットを要求する回路を有する、複数のエンジンの組と
を備えるプロセッサ。
【請求項2】
前記エンジン命令キャッシュはL1キャッシュを有し、
前記命令記憶装置はL2キャッシュを有する
請求項1に記載のプロセッサ。
【請求項3】
複数のエンジンの第2の組に結合された第2命令記憶装置
さらに備える請求項1に記載のプロセッサ。
【請求項4】
前記複数のエンジンは、マルチスレッド化された複数のエンジンを有する
請求項1に記載のプロセッサ。
【請求項5】
要求する前記回路は、
前記エンジンの命令キャッシュに1つの命令が記憶されていない旨の決定に応答して要求する回路
を有する請求項1に記載のプロセッサ。
【請求項6】
要求する前記回路は、
1つのフェッチ命令に応答して要求する回路
を有する請求項1に記載のプロセッサ。
【請求項7】
前記フェッチ命令は、異なるスレッドにスイッチするよう前記エンジンに命令する
請求項6に記載のプロセッサ。
【請求項8】
前記フェッチ命令は、前記フェッチの状態に関する1つのシグナルを特定する
請求項6に記載のプロセッサ。
【請求項9】
前記フェッチ命令は、前記命令記憶装置がキャッシュすべき量を特定する
請求項6に記載のプロセッサ。
【請求項10】
前記フェッチ命令は、前記プログラムの複数の命令をグルーピングする複数のセグメントの数として、前記量を特定する
請求項9に記載のプロセッサ。
【請求項11】
前記エンジンは、
犠牲にすべき複数の命令を、前記エンジン命令キャッシュから選択する回路
を有する請求項1に記載のプロセッサ。
【請求項12】
スイッチファブリックへの1つのインタフェース、メディアアクセスコントローラ(MAC)への1つのインタフェース、及び物理層(PHY)デバイスへの1つのインタフェースの少なくとも1つ
をさらに備える請求項1に記載のプロセッサ。
【請求項13】
1つのダイに集積された複数のエンジンによって共有される1つの命令記憶装置に記憶された複数の命令のサブセットを要求する段階と、
複数の命令の前記サブセットを、前記サブセットを要求している前記複数のエンジンの1つで受け取る段階と、
前記受け取った複数の命令のサブセットを、前記複数のエンジンの1つの命令キャッシュに記憶する段階と
を備える方法。
【請求項14】
前記命令記憶装置はL2キャッシュを有し、
前記複数のエンジンの1つの前記命令キャッシュはL1キャッシュを有する
請求項13に記載の方法。
【請求項15】
前記命令記憶装置は複数の命令記憶装置の組の1つを有し、前記複数の命令記憶装置のうちの異なる命令記憶装置は、複数のエンジンの異なる組によって共有される
請求項13に記載の方法。
【請求項16】
前記複数のエンジンは、マルチスレッド化された複数のエンジンを有する
請求項13に記載の方法。
【請求項17】
要求する段階は、
前記エンジンの命令キャッシュに1つの命令がキャッシュされていない旨の決定に応答して要求する段階
を有する請求項13に記載の方法。
【請求項18】
要求する段階は、
1つのフェッチ命令に応答して要求する段階
を有する請求項13に記載の方法。
【請求項19】
前記フェッチ命令に応答して異なるエンジンスレッドにスイッチする段階
をさらに備える請求項13に記載の方法。
【請求項20】
犠牲にすべき複数の命令を、前記エンジンの命令キャッシュから選択する段階
をさらに備える請求項13に記載の方法。
【請求項21】
1つのネットワークを通じて受け取った1つのパケットを処理するための前記複数の命令の前記サブセットを実行する段階
をさらに備える請求項14に記載の方法。
【請求項22】
1つのコンピュータ可読媒体に配置されたコンピュータプログラム製品であって、前記製品は、1つのプロセッサに、
ソースコードにアクセスさせ、
アクセスされたソースコードに基づいてターゲットコードを生成させる
複数の命令を備えており、
前記コンピュータプログラム製品の複数の命令は、前記プロセッサに、
複数のエンジンによって共有される1つの命令記憶装置によって記憶された複数のプログラム命令のサブセットへの要求に対応する、ソースコード命令に対するターゲットコードを生成させる複数の命令
を有する製品。
【請求項23】
前記ソース命令は、フェッチすべき複数のプログラムセグメントの数を特定する
請求項22に記載の製品。
【請求項24】
前記ソース命令は、1つのコンテクストスイッチを指定する
請求項22に記載の製品。
【請求項25】
前記ターゲットコードは、前記複数のエンジンの1つの命令セットで表されるターゲットコード有する
請求項22に記載の製品。
【請求項26】
前記複数のエンジンの前記命令セットは、浮動小数オペレーションのためのいかなる命令も有していない
請求項25に記載の製品。
【請求項27】
1つのスイッチファブリックと、
前記スイッチファブリックによって相互に接続された複数のラインカードの組であって、複数のラインカードの前記組の少なくとも1つは、少なくとも1つのPHY及び少なくとも1つのネットワークプロセッサを有する、複数のラインカードの組と
を備え、
前記ネットワークプロセッサは、
1つの命令記憶装置と、
前記命令記憶装置に機能的に結合された、マルチスレッド化された複数のエンジンの組と
を含み、
複数のエンジンの前記組の個々は、
前記エンジンによって実行される複数の命令を記憶する1つのキャッシュと、
前記命令記憶装置から、前記命令記憶装置によって記憶された複数の命令のサブセットを要求する回路と
を持つネットワーク転送デバイス。
【請求項28】
複数の命令の前記サブセットを要求する前記回路は、実行されるべき1つの命令が前記エンジンの命令キャッシュに発見されない場合に実行される回路を持つ
請求項27に記載のネットワーク転送デバイス。
【請求項29】
複数の命令の前記サブセットを要求する前記回路は、前記エンジンによって実行される1つの命令に応答する回路を持つ
請求項27に記載のネットワーク転送デバイス。
【請求項30】
1つの第2命令記憶装置と
前記第2命令記憶装置に結合された、マルチスレッド化された複数のエンジンの第2の組
をさらに含む請求項27に記載のネットワーク転送デバイス。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公表番号】特表2007−510989(P2007−510989A)
【公表日】平成19年4月26日(2007.4.26)
【国際特許分類】
【出願番号】特願2006−538286(P2006−538286)
【出願日】平成16年10月29日(2004.10.29)
【国際出願番号】PCT/US2004/035923
【国際公開番号】WO2005/048113
【国際公開日】平成17年5月26日(2005.5.26)
【出願人】(591003943)インテル・コーポレーション (1,101)
【Fターム(参考)】