図1は、本実施形態による演算処理システム100の構成例を示す図である。演算処理システム100は、複数の中央演算処理装置(CPU:Central Processing Unit)101a〜101dと、複数のメモリ102a〜102dと、ネットワーク103とを有する。メモリ102aは、中央演算処理装置101aに接続される。メモリ102bは、中央演算処理装置101bに接続される。メモリ102cは、中央演算処理装置101cに接続される。メモリ102dは、中央演算処理装置101dに接続される。メモリ102a〜102dは、例えば、ランダムアクセスメモリ(RAM:Random Access Memory)である。メモリ102a〜102dの各々は、コア部111の数と同じである必要がない。中央演算処理装置101a〜101dは、相互に、ネットワーク103を介して接続される。
中央演算処理装置101a〜101dは、それぞれ、複数のコア部111と、制御部112と、ネットワークコントローラ113とを有する。複数のコア111の各々は、コア121及び1次キャッシュ122を有する。制御部112は、2次/3次キャッシュ131と、システムコントローラ132と、メモリアクセスコントローラ133とを有する。コア121は、演算処理を行う。中央演算処理装置101aの1次キャッシュ122は、メモリ102aの一部のデータを記憶する。中央演算処理装置101aの2次/3次キャッシュ131は、メモリ102aの一部のデータを記憶する。中央演算処理装置101aのシステムコントローラ132は、中央演算処理装置101aの全体を制御する。中央演算処理装置101aのメモリアクセスコントローラ133は、メモリ102aに対する読み出し及び書き込みを制御する。中央演算処理装置101b〜101dは、中央演算処理装置101aと同様の構成を有する。
ネットワークコントローラ113は、メモリ102a〜102d間のリモートダイレクトメモリアクセス(RDMA)のデータ転送を行うデータ転送装置である。RDMA転送は、メモリ102a〜102d間のデータ転送を高速に行うことができる。例えば、中央演算処理装置101aのネットワークコントローラ113は、メモリ102aからメモリ102b〜102dのいずれかへデータを転送することができる。
次に、中央演算処理装置101aのネットワークコントローラ113が、メモリ102aからメモリ102bへデータを転送する例を説明する。中央演算処理装置101aでは、コア121は、制御部112を介して、メモリ102aの命令領域にデータ転送要求(データ転送命令)を書き込み、ネットワークコントローラ113に対して起動信号を出力する。ネットワークコントローラ113は、起動信号を入力すると、制御部112を介して、メモリ102の命令領域からデータ転送要求を読み出す。また、コア121は、ネットワークコントローラ113に対して、直接、データ転送要求を出力してもよい。データ転送要求は、転送元のメモリ102aのアドレス、転送先の中央演算処理装置101bの識別子、転送先のメモリ102bのアドレス、及び転送データ長の情報を有する。ネットワークコントローラ113は、データ転送要求を基に、制御部112を介して転送元のメモリ102aからデータを読み出し、その読み出したデータを基に1個又は複数のパケット(書き込み要求を含む)を生成する。そして、ネットワークコントローラ113は、その1個又は複数のパケットを、ネットワーク103を介して転送先の中央演算処理装置101bに出力する。中央演算処理装置101bでは、ネットワークコントローラ113は、その1個又は複数のパケットを入力すると、その1個又は複数のパケットのペイロードを、制御部112を介して、メモリ102bに書き込む。
図2は、基本技術によるネットワークコントローラ113の構成例を示す図である。ネットワークコントローラ113は、コントロールマネージャ201と、第1のパケットコントローラ202aと、第1のパケットバッファ203aと、第2のパケットコントローラ202bと、第2のパケットバッファ203bと、第3のパケットコントローラ202cと、第3のパケットバッファ203cと、第4のパケットコントローラ202dと、第4のパケットバッファ203dと、セレクタ204a〜204dと、ダイレクトメモリアクセス(DMA)コントローラ205と、アービタ206と、パケットレシーバ207とを有する。
図3は、図2のネットワークコントローラ113のデータ転送方法を説明するための図である。転送元のメモリ102aは、読み出し単位ブロック(アクセス単位ブロック)301〜307の境界を示すアライン310を有する。読み出し単位ブロック301〜307のサイズは、それぞれ、キャッシュラインのサイズと同じである。中央演算処理装置101aは、キャッシュコヒーレンスの管理を効率的に行うために、メモリアクセスの粒度はキャッシュラインサイズのアライン310で制限される。例えば、キャッシュラインサイズが256バイトである場合、転送元のメモリ102aの読み出し単位ブロック301〜307は、それぞれ、256バイトとなる。転送元のメモリ102aは、読み出し単位ブロック301〜307毎に読み出しを行う。読み出し単位ブロック301内の一部のデータのみを読み出すことができない。
同様に、転送先のメモリ102bは、書き込み単位ブロック(アクセス単位ブロック)321〜327の境界を示すアライン320を有する。書き込み単位ブロック321〜327のサイズは、それぞれ、キャッシュラインのサイズと同じである。例えば、キャッシュラインサイズが256バイトである場合、書き込み単位ブロック321〜327は、それぞれ、256バイトとなる。転送先のメモリ102bは、書き込み単位ブロック321〜327毎に書き込みを行う。書き込み単位ブロック321内の一部のデータのみを書き込むことができない。
コントロールマネージャ201は、コア121が生成したデータ転送要求を入力する。データ転送要求は、転送元のメモリ102aのアドレス、転送先の中央演算処理装置101bの識別子、転送先のメモリ102bのアドレス、及び転送データ長の情報を有する。例えば、データ転送要求は、転送元のメモリ102aのペイロード(データ)311を転送先のメモリ102bに転送するための要求である。
コントロールマネージャ201は、データ転送要求を解析し、データ転送要求をパケット単位のパケットa〜gの7個のパケット転送要求に分割する。パケットa〜gの各々のペイロード長312は、それぞれ、転送先のメモリ102bの書き込み単位ブロック321の長さと同じである。ペイロード311は、ペイロード長312単位で分割される。コントロールマネージャ201は、パケットaのパケット転送要求を第1のパケットコントローラ202aに出力し、パケットbのパケット転送要求を第2のパケットコントローラ202bに出力し、パケットcのパケット転送要求を第3のパケットコントローラ202cに出力し、パケットdのパケット転送要求を第4のパケットコントローラ202dに出力する。そして、コントロールマネージャ201は、パケットeのパケット転送要求を第1のパケットコントローラ202aに出力し、パケットfのパケット転送要求を第2のパケットコントローラ202bに出力し、パケットgのパケット転送要求を第3のパケットコントローラ202cに出力する。
第1のパケットコントローラ202aは、パケットaのパケット転送要求を基に、DMAコントローラ205及び制御部112を介して、転送元のメモリ102aの読み出し単位ブロック301を読み出し、その後、転送元のメモリ102aの読み出し単位ブロック302を読み出す。次に、第1のパケットコントローラ202aは、読み出し単位ブロック301及び302を第1のパケットバッファ203aに書き込み、読み出し単位ブロック301の一部のデータと読み出し単位ブロック302の一部のデータを基にパケットaを生成する。次に、第1のパケットコントローラ202aは、セレクタ204aを介して、パケット送信要求信号をアービタ206に出力する。アービタ206は、第1〜第4のパケットコントローラ202a〜202dの複数のパケット送信要求信号が競合した場合、調停を行い、第1〜第4のパケットコントローラ202a〜202dのうちのいずれか1個に許可信号を出力する。第1のパケットコントローラ202aは、許可信号を入力すると、パケットa(書き込み要求を含む)をアービタ206及びネットワーク103を介して、転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、DMAコントローラ205及び制御部112を介して、パケットaのペイロードを転送先のメモリ102bの書き込み単位ブロック321として書き込む。
同様に、第2のパケットコントローラ202bは、パケットbのパケット転送要求を基に、DMAコントローラ205及び制御部112を介して、転送元のメモリ102aの読み出し単位ブロック302を読み出し、その後、転送元のメモリ102aの読み出し単位ブロック303を読み出す。次に、第2のパケットコントローラ202bは、読み出し単位ブロック302及び303を第2のパケットバッファ203bに書き込み、読み出し単位ブロック302の一部のデータと読み出し単位ブロック303の一部のデータを基にパケットbを生成する。次に、第2のパケットコントローラ202bは、セレクタ204bを介して、パケット送信要求信号をアービタ206に出力する。第2のパケットコントローラ202bは、アービタ206から許可信号を入力すると、パケットb(書き込み要求を含む)をアービタ206及びネットワーク103を介して、転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、DMAコントローラ205及び制御部112を介して、パケットbのペイロードを転送先のメモリ102bの書き込み単位ブロック322として書き込む。
同様に、第3のパケットコントローラ202cは、パケットcのパケット転送要求を基に、DMAコントローラ205及び制御部112を介して、転送元のメモリ102aの読み出し単位ブロック303を読み出し、その後、転送元のメモリ102aの読み出し単位ブロック304を読み出す。次に、第3のパケットコントローラ202cは、読み出し単位ブロック303及び304を第3のパケットバッファ203cに書き込み、読み出し単位ブロック303の一部のデータと読み出し単位ブロック304の一部のデータを基にパケットcを生成する。次に、第3のパケットコントローラ202cは、セレクタ204cを介して、パケット送信要求信号をアービタ206に出力する。第3のパケットコントローラ202cは、アービタ206から許可信号を入力すると、パケットc(書き込み要求を含む)をアービタ206及びネットワーク103を介して、転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、DMAコントローラ205及び制御部112を介して、パケットcのペイロードを転送先のメモリ102bの書き込み単位ブロック323として書き込む。
同様に、第4のパケットコントローラ202dは、パケットdのパケット転送要求を基に、DMAコントローラ205及び制御部112を介して、転送元のメモリ102aの読み出し単位ブロック304を読み出し、その後、転送元のメモリ102aの読み出し単位ブロック305を読み出す。次に、第4のパケットコントローラ202dは、読み出し単位ブロック304及び305を第4のパケットバッファ203dに書き込み、読み出し単位ブロック304の一部のデータと読み出し単位ブロック305の一部のデータを基にパケットdを生成する。次に、第4のパケットコントローラ202dは、セレクタ204dを介して、パケット送信要求信号をアービタ206に出力する。第4のパケットコントローラ202dは、アービタ206から許可信号を入力すると、パケットd(書き込み要求を含む)をアービタ206及びネットワーク103を介して、転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、DMAコントローラ205及び制御部112を介して、パケットdのペイロードを転送先のメモリ102bの書き込み単位ブロック324として書き込む。
同様に、第1のパケットコントローラ202aは、パケットeのパケット転送要求を基に、転送元のメモリ102aの読み出し単位ブロック305及び306を読み出し、パケットeを生成する。次に、第1のパケットコントローラ202aは、パケットe(書き込み要求を含む)を転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、パケットeのペイロードを転送先のメモリ102bの書き込み単位ブロック325として書き込む。
同様に、第2のパケットコントローラ202bは、パケットfのパケット転送要求を基に、転送元のメモリ102aの読み出し単位ブロック306及び307を読み出し、パケットfを生成する。次に、第2のパケットコントローラ202bは、パケットf(書き込み要求を含む)を転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、パケットfのペイロードを転送先のメモリ102bの書き込み単位ブロック326として書き込む。
同様に、第3のパケットコントローラ202cは、パケットgのパケット転送要求を基に、転送元のメモリ102aの読み出し単位ブロック307を読み出し、パケットgを生成する。次に、第3のパケットコントローラ202cは、パケットg(書き込み要求を含む)を転送先の中央演算処理装置101bに出力する。中央演算処理装置101bのパケットレシーバ207は、パケットgのペイロードを転送先のメモリ102bの書き込み単位ブロック327として書き込む。
上記のように、読み出し単位ブロック302〜307は、それぞれ、転送元のメモリ102aから2回ずつ読み出されている。そのため、メモリ102aのスループットが低下し、データ転送効率が低下する。
図4は、図2のネットワークコントローラ113の他のデータ転送方法を説明するための図である。図4は、図3に対して、各パケットのペイロード長412が異なる。図4の各パケットのペイロード長412は、図3の各パケットのペイロード長312と異なる。各パケットのペイロード長412は、最大転送可能ペイロード長(MTU)であり、例えば1792バイトである。ネットワークコントローラ113は、図3の場合と同様に、転送元のメモリ102aから転送先のメモリ102bにペイロード311を転送することができる。各パケットのペイロード長412を長くすることにより、パケットの数を減らすことができる。しかし、この場合も、読み出し単位ブロック302、303、306及び307は、それぞれ、転送元のメモリ102aから2回ずつ読み出され、データ転送効率が低下している。また、書き込み単位ブロック322、323、324及び327は、それぞれ、転送先のメモリ102bに2回ずつ書き込まれる。
次に、転送元のメモリ102aの読み出し効率の低下の例について説明する。例えば、ペイロード311は、2Mバイト(2097152バイト)である。読み出し単位ブロック301〜307の各々のサイズは、256バイトである。各パケットのペイロード長(MTU)412は、1792バイトである。この場合、2097152/1792≒1170.3である。したがって、2097152バイトのペイロード311は、(1792バイト×1170パケット+512バイト×1パケット)の1171パケットに分割される。2回読み出される読み出し単位ブロックの数は、例えば(パケット数−1)である。パケット数は1171パケットであるので、1171+1170回のメモリアクセスが必要になる。結果的に、2097152バイトのペイロード311を転送するため、2396672バイト(=2097152+1170×256バイト)を読み出している。メモリ102aの読み出し効率は、14%余分なデータを読み出していることになり、メモリアクセスのスループットが低下する。
図5(A)は、本実施形態によるネットワークコントローラ113の構成例を示す図である。図5(A)のネットワークコントローラ113は、図2のネットワークコントローラ113に対して、第1のジョイントバッファ501aと、第2のジョイントバッファ501bと、第3のジョイントバッファ501cと、第4のジョイントバッファ501dと、セレクタ502a〜502dと、セレクタ503a〜503dとを追加したものである。
セレクタ502aは、第1及び第2のジョイントバッファ501a及び501bが出力する読み出し要求を選択的にDMAコントローラ205に出力する。セレクタ502bは、第2及び第3のジョイントバッファ501b及び501cが出力する読み出し要求を選択的にDMAコントローラ205に出力する。セレクタ502cは、第3及び第4のジョイントバッファ501c及び501dが出力する読み出し要求を選択的にDMAコントローラ205に出力する。セレクタ502dは、第4及び第1のジョイントバッファ501d及び501aが出力する読み出し要求を選択的にDMAコントローラ205に出力する。
セレクタ503aは、第1及び第2のジョイントバッファ501a及び501bが出力する読み出し単位ブロックを選択的に第2のパケットバッファ203bに出力する。セレクタ503bは、第2及び第3のジョイントバッファ501b及び501cが出力する読み出し単位ブロックを選択的に第3のパケットバッファ203cに出力する。セレクタ503cは、第3及び第4のジョイントバッファ501c及び501dが出力する読み出し単位ブロックを選択的に第4のパケットバッファ203dに出力する。セレクタ503dは、第4及び第1のジョイントバッファ501d及び501aが出力する読み出し単位ブロックを選択的に第1のパケットバッファ203aに出力する。
図5(B)は、ジョイントID510の構成例を示す図である。コントロールマネージャ201は、第1〜第4のパケットコントローラ202a〜202dに各パケットに応じたジョイントID510を出力する。ジョイントID510は、先頭隣接フラグVF(F)と、先頭識別子ID(F)と、末尾隣接フラグVF(L)と、末尾識別子ID(L)とを有する。先頭隣接フラグVF(F)は先頭隣接情報であり、末尾隣接フラグVF(L)は末尾隣接情報である。
図6(A)は、第1のジョイントバッファ501aの構成例を示す図である。第2〜第4のジョイントバッファ501b〜501dも、第1のジョイントバッファ501aと同様の構成を有する。第1のジョイントバッファ501aは、セレクタSEL0〜SEL3と、記憶部601〜603と、バッファ604とを有する。記憶部601は、第1のジョイントバッファ501aの状態Joint_STATUSを記憶する。記憶部602は、識別子Joint_IDを記憶する。記憶部603は、隣接フラグ(隣接情報)Joint_Valid(0/1)を記憶する。バッファ604は、例えば256バイトの容量を有し、メモリ102aの読み出し単位ブロックを記憶する。
セレクタSEL0は、第1の制御信号に応じて、第1のパケットコントローラ202aからの読み出し要求をDMAコントローラ205に出力する。セレクタSEL1は、第2の制御信号に応じて、第2のパケットコントローラ202bからの読み出し要求をDMAコントローラ205に出力する。セレクタSEL2は、第3の制御信号に応じて、DMAコントローラ205又はバッファ604からの読み出し単位ブロックを第1のパケットバッファ203aに出力する。セレクタSEL3は、第4の制御信号に応じて、DMAコントローラ205又はバッファ604からの読み出し単位ブロックを第2のパケットバッファ203bに出力する。
図6(B)は、図6(A)の状態Joint_STATUSの状態遷移図である。状態Joint_STATUSは、IDLEと、DMA_WAITと、DMA_HOLDと、DMA_SENDとを有する。IDLEは、初期のアイドル状態である。DMA_WAITは、メモリ102aに対する読み出し要求の応答の待機状態である。DMA_HOLDは、バッファ604が読み出し単位ブロックを保持している状態である。DMA_SENDは、バッファ604に保持されている読み出し単位ブロックを送信可能な状態である。
図7は、本実施形態によるネットワークコントローラ113のデータ転送方法を説明するための図である。以下、図7が図3と異なる点を説明する。コントロールマネージャ201は、分割部であり、データ転送要求を解析し、データ転送要求をパケット単位のパケットa〜gの7個のパケット転送要求に分割する。パケットa〜gの各々のペイロード長312は、それぞれ、転送先のメモリ102bの書き込み単位ブロック321の長さと同じである。ペイロード311は、ペイロード長312単位で分割される。
コントロールマネージャ201は、パケットaのパケット転送要求に基づく読み出し末尾アドレスがメモリ102aの読み出し単位ブロック302内で次のパケットbのパケット転送要求に基づく読み出し先頭アドレスと隣接する場合、パケットaのパケット転送要求に対して末尾隣接フラグVF(L)及び第1の識別子ID(L)を設定し、パケットbのパケット転送要求に対して先頭隣接フラグVF(F)及び第1の識別子ID(F)を設定する。
同様に、コントロールマネージャ201は、パケットbのパケット転送要求に基づく読み出し末尾アドレスがメモリ102aの読み出し単位ブロック303内で次のパケットcのパケット転送要求に基づく読み出し先頭アドレスと隣接する場合、パケットbのパケット転送要求に対して末尾隣接フラグVF(L)及び第2の識別子ID(L)を設定し、パケットcのパケット転送要求に対して先頭隣接フラグVF(F)及び第2の識別子ID(F)を設定する。他のパケットも同様である。
パケットaのパケット転送要求は、先頭隣接フラグVF(F)が設定されず、末尾隣接フラグVF(L)が設定される。パケットb〜fのパケット転送要求は、先頭隣接フラグVF(F)及び末尾隣接フラグVF(L)が設定される。パケットgのパケット転送要求は、先頭隣接フラグVF(F)が設定され、末尾隣接フラグVF(L)が設定されない。
コントロールマネージャ201は、パケットaのパケット転送要求を第1のパケットコントローラ202aに出力し、パケットbのパケット転送要求を第2のパケットコントローラ202bに出力し、パケットcのパケット転送要求を第3のパケットコントローラ202cに出力し、パケットdのパケット転送要求を第4のパケットコントローラ202dに出力する。そして、コントロールマネージャ201は、パケットeのパケット転送要求を第1のパケットコントローラ202aに出力し、パケットfのパケット転送要求を第2のパケットコントローラ202bに出力し、パケットgのパケット転送要求を第3のパケットコントローラ202cに出力する。
第1のパケットコントローラ202aは、パケットaのパケット転送要求に先頭隣接フラグVF(F)が設定されていない場合、パケットaのパケット転送要求に基づく読み出し先頭アドレスを含むメモリ102aの読み出し単位ブロック301の第1の読み出し要求に対して先頭隣接フラグVF(F)を設定せず、読み出し要求を出力する。DMAコントローラ205は、読み出し要求に応答して、制御部112を介してメモリ102aから、先頭アドレスを含む読み出し単位ブロック301を読み出し、第1のパケットバッファ203aに出力する。
次に、第1のパケットコントローラ202aは、パケットaのパケット転送要求に末尾隣接フラグVF(L)及び第1の識別子ID(L)が設定されている場合、パケットaのパケット転送要求に基づく読み出し末尾アドレスを含むメモリ102aの読み出し単位ブロック302の読み出し要求に対して末尾隣接フラグVF(L)及び第1の識別子ID(L)を設定し、末尾隣接フラグVF(L)及び第1の識別子ID(L)が設定された読み出し要求を第1のジョイントバッファ501aに出力する。
第1のジョイントバッファ501aは、読み出し要求を入力し、読み出し要求に末尾隣接フラグVF(L)及び第1の識別子ID(L)が設定されている場合、記憶部603に隣接フラグJoint_Valid(0)として1を登録し、第1の識別子ID(L)を記憶部602に識別子Joint_IDとして登録し、読み出し要求をDMAコントローラ205に出力する。DMAコントローラ205は、読み出し要求に応答して、制御部112を介してメモリ102aから、末尾アドレスを含む読み出し単位ブロック302を読み出し、第1のジョイントバッファ501aに出力する。第1のジョイントバッファ501aは、末尾アドレスを含む読み出し単位ブロック302をバッファ604に保持すると共に、第1のパケットバッファ203aに出力する。
第1のパケットコントローラ202aは、第1のパケットバッファ203a内の先頭アドレスを含む読み出し単位ブロック301の一部と末尾アドレスを含む読み出し単位ブロック302の一部を基にパケットaを生成し、パケットaを転送先の中央演算処理装置101bのメモリ102bに出力する。中央演算処理装置101bは、パケットaのペイロードをメモリ102bの書き込み単位ブロック321として書き込む。
次に、第2のパケットコントローラ202bは、パケットbのパケット転送要求に先頭隣接フラグVF(F)及び第2の識別子ID(F)が設定されている場合、パケットbのパケット転送要求に基づく読み出し先頭アドレスを含むメモリ102aの読み出し単位ブロック302の読み出し要求に対して先頭隣接フラグVF(F)及び第1の識別子ID(F)を設定し、先頭隣接フラグVF(F)及び第1の識別子ID(F)が設定された読み出し要求を第1のジョイントバッファ501aに出力する。
第1のジョイントバッファ501aは、読み出し要求を入力し、読み出し要求に先頭隣接フラグVF(F)及び第1の識別子ID(F)が設定されており、記憶部603の隣接フラグJoint_Valid(0)に1が登録され、入力された第1の識別子ID(F)が記憶部602の識別子Joint_IDと一致する場合、バッファ604に保持されている読み出し単位ブロック302を第2のパケットバッファ203bに出力する。この際、第1のジョイントバッファ501aは、入力した読み出し要求をDMAコントローラ205に出力しない。これにより、読み出し単位ブロック302は、メモリ102aから1回だけ読み出される。
次に、第2のパケットコントローラ202bは、パケットbのパケット転送要求に末尾隣接フラグVF(L)及び第2の識別子ID(L)が設定されている場合、パケットbのパケット転送要求に基づく読み出し末尾アドレスを含むメモリ102aの読み出し単位ブロック303の読み出し要求に対して末尾隣接フラグVF(L)及び第2の識別子ID(L)を設定し、末尾隣接フラグVF(L)及び第2の識別子ID(L)が設定された読み出し要求を第2のジョイントバッファ501bに出力する。
第2のジョイントバッファ501bは、読み出し要求を入力し、読み出し要求に末尾隣接フラグVF(L)及び第2の識別子ID(L)が設定されている場合、記憶部603に隣接フラグJoint_Valid(0)として1を登録し、第2の識別子ID(L)を記憶部602に識別子Joint_IDとして登録し、読み出し要求をDMAコントローラ205に出力する。DMAコントローラ205は、読み出し要求に応答して、制御部112を介してメモリ102aから、末尾アドレスを含む読み出し単位ブロック303を読み出し、第2のジョイントバッファ501bに出力する。第2のジョイントバッファ501bは、末尾アドレスを含む読み出し単位ブロック303をバッファ604に保持すると共に、第2のパケットバッファ203bに出力する。
第2のパケットコントローラ202bは、第2のパケットバッファ203b内の先頭アドレスを含む読み出し単位ブロック302の一部と末尾アドレスを含む読み出し単位ブロック303の一部を基にパケットbを生成し、パケットbを転送先の中央演算処理装置101bのメモリ102bに出力する。中央演算処理装置101bは、パケットbのペイロードをメモリ102bの書き込み単位ブロック322として書き込む。
次に、第3のパケットコントローラ202cは、パケットcのパケット転送要求に先頭隣接フラグVF(F)及び第2の識別子ID(F)が設定されている場合、パケットcのパケット転送要求に基づく読み出し先頭アドレスを含むメモリ102aの読み出し単位ブロック303の読み出し要求に対して先頭隣接フラグVF(F)及び第2の識別子ID(F)を設定し、先頭隣接フラグVF(F)及び第2の識別子ID(F)が設定された読み出し要求を第2のジョイントバッファ501bに出力する。
第2のジョイントバッファ501bは、読み出し要求を入力し、読み出し要求に先頭隣接フラグVF(F)及び第2の識別子ID(F)が設定されており、記憶部603の隣接フラグJoint_Valid(0)に1が登録され、入力された第2の識別子ID(F)が記憶部602の識別子Joint_IDと一致する場合、バッファ604に保持されている読み出し単位ブロック303を第3のパケットバッファ203cに出力する。この際、第2のジョイントバッファ501bは、入力した読み出し要求をDMAコントローラ205に出力しない。これにより、読み出し単位ブロック303は、メモリ102aから1回だけ読み出される。他のパケットも同様である。
以上のように、読み出し単位ブロック302は、転送元のメモリ102aから1回だけ読み出され、第1のジョイントバッファ501aに保持される。第1のジョイントバッファ501aは、読み出し単位ブロック302を第1及び第2のパケットバッファ203a及び203bに出力する。
読み出し単位ブロック303は、転送元のメモリ102aから1回だけ読み出され、第2のジョイントバッファ501bに保持される。第2のジョイントバッファ501bは、読み出し単位ブロック303を第2及び第3のパケットバッファ203b及び203cに出力する。
読み出し単位ブロック304は、転送元のメモリ102aから1回だけ読み出され、第3のジョイントバッファ501cに保持される。第3のジョイントバッファ501cは、読み出し単位ブロック304を第3及び第4のパケットバッファ203c及び203dに出力する。
読み出し単位ブロック305は、転送元のメモリ102aから1回だけ読み出され、第4のジョイントバッファ501dに保持される。第4のジョイントバッファ501dは、読み出し単位ブロック305を第4及び第1のパケットバッファ203d及び203aに出力する。
読み出し単位ブロック306は、転送元のメモリ102aから1回だけ読み出され、第1のジョイントバッファ501aに保持される。第1のジョイントバッファ501aは、読み出し単位ブロック306を第1及び第2のパケットバッファ203a及び203bに出力する。
読み出し単位ブロック307は、転送元のメモリ102aから1回だけ読み出され、第2のジョイントバッファ501bに保持される。第2のジョイントバッファ501bは、読み出し単位ブロック307を第2及び第3のパケットバッファ203b及び203cに出力する。
上記のように、読み出し単位ブロック301〜307は、それぞれ、転送元のメモリ102aから1回ずつ読み出されている。そのため、メモリ102aのスループットが向上し、データ転送効率が向上する。
図8は、本実施形態によるネットワークコントローラ113の他のデータ転送方法を説明するための図である。図8は、図7に対して、各パケットのペイロード長412が異なる。図8の各パケットのペイロード長412は、図7の各パケットのペイロード長312と異なる。各パケットのペイロード長412は、最大転送可能ペイロード長(MTU)であり、例えば1792バイトである。ネットワークコントローラ113は、図7の場合と同様に、転送元のメモリ102aから転送先のメモリ102bにペイロード311を転送することができる。各パケットのペイロード長412を長くすることにより、パケットの数を減らすことができる。この場合も、読み出し単位ブロック301〜307は、それぞれ、転送元のメモリ102aから1回ずつ読み出されている。そのため、メモリ102aのスループットが向上し、データ転送効率が向上する。
次に、転送元のメモリ102aの読み出し効率の向上の例について説明する。例えば、ペイロード311は、2Mバイト(2097152バイト)である。図8では、2Mバイトのペイロード311を転送するため、2Mバイトをメモリ102aから読み出している。図8のメモリ102aの読み出し効率は、図4の場合に比べ、14%向上する。
図9は、コントロールマネージャ201の処理例を示すフローチャートである。以下、図7の処理例を説明する。ステップS901において、コントロールマネージャ201は、データ転送要求(ペイロード送信要求)を受信(入力)したか否かをチェックする。コントロールマネージャ201は、データ転送要求を受信した場合にはステップS902に進み、データ転送要求を受信していない場合には処理を終了する。
ステップS902において、コントロールマネージャ201は、パケットaのサイズを決定する。次に、ステップS903において、コントロールマネージャ201は、パケットaが先頭パケットであるので、パケットaのパケット転送要求に対して先頭隣接フラグVF(F)に0を設定し、先頭識別子ID(F)に0を設定する。そして、コントロールマネージャ201は、パケットaのパケット転送要求に基づく読み出し末尾アドレスがメモリ102aの読み出し単位ブロック302内でパケットbのパケット転送要求に基づく読み出し先頭アドレスと隣接する場合、パケットaのパケット転送要求に対して末尾隣接フラグVF(L)に1を設定し、識別子ID(L)に1を設定する。
次に、ステップS904において、コントロールマネージャ201は、第n+1のパケットコントローラ内のバッファが空くのを待って、パケットaのパケット転送要求を第n+1のパケットコントローラに出力する。nの初期値は、0である。したがって、コントロールマネージャ201は、第1のパケットコントローラ202a内のバッファが空くのを待って、パケットaのパケット転送要求を第1のパケットコントローラ202aに出力する。コントロールマネージャ201は、残ペイロード長からパケットaのサイズを減算する。残ペイロード長の初期値は、全パケットサイズである。コントロールマネージャ201は、n+1を4で割った余りを新たなnとする。例えば、nは、1になる。
次に、ステップS905において、コントロールマネージャ201は、残ペイロード長が0でない場合にはステップS902に戻り、次のパケットの処理を繰り返す。
次に、ステップS902において、コントロールマネージャ201は、パケットbのサイズを決定する。次に、ステップS903において、コントロールマネージャ201は、パケットbのパケット転送要求に基づく読み出し先頭アドレスがメモリ102aの読み出し単位ブロック302内でパケットaのパケット転送要求に基づく読み出し末尾アドレスと隣接する場合、パケットbのパケット転送要求に対して先頭隣接フラグVF(F)に1を設定し、識別子ID(F)に1を設定する。そして、コントロールマネージャ201は、パケットbのパケット転送要求に基づく読み出し末尾アドレスがメモリ102aの読み出し単位ブロック303内でパケットcのパケット転送要求に基づく読み出し先頭アドレスと隣接する場合、パケットbのパケット転送要求に対して末尾隣接フラグVF(L)に1を設定し、識別子ID(L)に2を設定する。
次に、ステップS904において、コントロールマネージャ201は、第2のパケットコントローラ202b内のバッファが空くのを待って、パケットbのパケット転送要求を第2のパケットコントローラ202bに出力する。コントロールマネージャ201は、残ペイロード長からパケットbのサイズを減算する。コントロールマネージャ201は、nを2に更新する。その後、ステップS902に戻る。
次に、ステップS902において、コントロールマネージャ201は、パケットcのサイズを決定する。次に、ステップS903において、コントロールマネージャ201は、パケットcのパケット転送要求に基づく読み出し先頭アドレスがメモリ102aの読み出し単位ブロック303内でパケットbのパケット転送要求に基づく読み出し末尾アドレスと隣接する場合、パケットcのパケット転送要求に対して先頭隣接フラグVF(F)に1を設定し、識別子ID(F)に2を設定する。そして、コントロールマネージャ201は、パケットcのパケット転送要求に基づく読み出し末尾アドレスがメモリ102aの読み出し単位ブロック304内でパケットdのパケット転送要求に基づく読み出し先頭アドレスと隣接する場合、パケットcのパケット転送要求に対して末尾隣接フラグVF(L)に1を設定し、識別子ID(L)に3を設定する。
次に、ステップS904において、コントロールマネージャ201は、第3のパケットコントローラ202c内のバッファが空くのを待って、パケットcのパケット転送要求を第3のパケットコントローラ202cに出力する。コントロールマネージャ201は、残ペイロード長からパケットcのサイズを減算する。コントロールマネージャ201は、nを3に更新する。
コントロールマネージャ201は、全てのパケットに対して、上記の処理を行う。ステップS905において、コントロールマネージャ201は、残ペイロード長が0である場合、処理を終了する。
図10は、第1のパケットコントローラ202aの処理例を示すフローチャートである。第2〜第4のパケットコントローラ202b〜202dも、第1のパケットコントローラ202aと同様である。
ステップS1001において、第1のパケットコントローラ202aは、パケット転送要求(パケット生成要求)を受信した場合にはステップS1002に進み、パケット転送要求を受信していない場合には処理を終了する。
ステップS1002において、第1のパケットコントローラ202aは、パケットaの読み出し先頭アドレスを含むメモリ102aの読み出し単位ブロック301の読み出し要求と、パケットaの読み出し末尾アドレスを含むメモリ102aの読み出し単位ブロック302の読み出し要求とを生成する。第1のパケットコントローラ202aは、パケットaのパケット転送要求に0の先頭隣接フラグVF(F)が設定されている場合、パケットaのパケット転送要求に基づく読み出し先頭アドレスを含む読み出し単位ブロック301の読み出し要求に対して0の先頭隣接フラグVF(F)を設定する。
そして、第1のパケットコントローラ202aは、パケットaのパケット転送要求に1の末尾隣接フラグVF(L)及び1の末尾識別子ID(L)が設定されている場合、パケットaのパケット転送要求に基づく読み出し末尾アドレスを含む読み出し単位ブロック302の読み出し要求に対して1の末尾隣接フラグVF(L)及び1の末尾識別子ID(L)を設定する。
また、第2のパケットコントローラ202bは、パケットbの読み出し先頭アドレスを含むメモリ102aの読み出し単位ブロック302の読み出し要求と、パケットbの読み出し末尾アドレスを含むメモリ102aの読み出し単位ブロック303の読み出し要求とを生成する。第2のパケットコントローラ202bは、パケットbのパケット転送要求に1の先頭隣接フラグVF(F)及び1の先頭識別子ID(F)が設定されている場合、パケットbのパケット転送要求に基づく読み出し先頭アドレスを含む読み出し単位ブロック302の読み出し要求に対して1の先頭隣接フラグVF(F)及び1の先頭識別子ID(F)を設定する。
そして、第2のパケットコントローラ202bは、パケットbのパケット転送要求に1の末尾隣接フラグVF(L)及び2の末尾識別子ID(L)が設定されている場合、パケットbのパケット転送要求に基づく読み出し末尾アドレスを含む読み出し単位ブロック303の読み出し要求に対して1の末尾隣接フラグVF(L)及び2の末尾識別子ID(L)を設定する。第3及び第4のパケットコントローラ202c及び202dも同様である。
次に、ステップS1003において、第1のパケットコントローラ202aは、全読み出し要求の出力を完了していない場合にはステップS1004に進み、全読み出し要求の出力を完了した場合にはステップS1005に進む。
ステップS1004において、第1のパケットコントローラ202aは、上記の読み出し単位ブロック301の読み出し要求を第4のジョイントバッファ501dに出力し、読み出し単位ブロック302の読み出し要求を第1のジョイントバッファ501aに出力する。第2のパケットコントローラ202bは、上記の読み出し単位ブロック302の読み出し要求を第1のジョイントバッファ501aに出力し、読み出し単位ブロック303の読み出し要求を第2のジョイントバッファ501bに出力する。第3及び第4のパケットコントローラ202c及び202dも同様である。
次に、ステップS1005において、第1のパケットコントローラ202aは、全読み出し要求の応答(読み出し単位ブロック301及び302)を受信していない場合にはステップS1003に戻り、全読み出し要求の応答を受信した場合にはステップS1006に進む。第2〜第4のパケットコントローラ202b〜202dも同様である。
ステップS1006において、第1のパケットコントローラ202aは、上記の読み出し要求に応答して読み出された読み出し単位ブロック301の一部と読み出し単位ブロック302の一部を含むペイロードのパケットaを生成する。そして、第1のパケットコントローラ202aは、パケットaをアービタ206及びネットワーク103を介して、転送先の中央演算処理装置101bのメモリ102bに送信する。
第2のパケットコントローラ202bは、上記の読み出し要求に応答して読み出された読み出し単位ブロック302の一部と読み出し単位ブロック303の一部を含むペイロードのパケットbを生成する。そして、第2のパケットコントローラ202bは、パケットbをアービタ206及びネットワーク103を介して、転送先の中央演算処理装置101bのメモリ102bに送信する。第3及び第4のパケットコントローラ202c及び202dも同様である。
図11は、第1のジョイントバッファ501aの読み出し要求受信処理を示すフローチャートである。第2〜第4のジョイントバッファ501b〜501dの処理も、第1のジョイントバッファ501aの処理と同様である。
ステップS1101において、第1のジョイントバッファ501aは、第1又は第2のパケットコントローラ202a又は202bから読み出し要求を受信した場合にはステップS1002に進み、読み出し要求を受信していない場合には処理を終了する。
ステップS1102において、第1のジョイントバッファ501aは、第1のパケットコントローラ202aからの読み出し要求の末尾隣接フラグVF(L)又は第2のパケットコントローラ202bからの読み出し要求の先頭隣接フラグVF(F)が1であるか否かを判定する。第1のジョイントバッファ501aは、隣接フラグVF(L)又はVF(F)が1である場合にはステップS1103に進み、隣接フラグVF(L)又はVF(F)が1でない場合にはステップS1106に進む。
ステップS1006において、第1のジョイントバッファ501aが第1のパケットコントローラ202aから読み出し要求を受信した場合、セレクタSEL0は、第1のパケットコントローラ202aからの読み出し要求を、DAMコントローラ205及び制御部112を介して、メモリ102aに出力する。
第1のジョイントバッファ501aが第2のパケットコントローラ202bから読み出し要求を受信した場合、セレクタSEL1は、第2のパケットコントローラ202bからの読み出し要求を、DAMコントローラ205及び制御部112を介して、メモリ102aに出力する。例えば、第4のジョイントバッファ501dのセレクタSEL1は、第1のパケットコントローラ202aからの読み出し単位ブロック301の読み出し要求を、DAMコントローラ205及び制御部112を介して、メモリ102aに出力する。
ステップS1003において、第1のジョイントバッファ501aは、記憶部601に記憶されている状態Joint_STATUSがIDLEであるか否かを判定する。状態Joint_STATUSの初期値は、IDLEである。第1のジョイントバッファ501aは、状態Joint_STATUSがIDLEである場合にはステップS1107に進み、状態Joint_STATUSがIDLEでない場合にはステップS1104に進む。
ステップS1107において、セレクタSEL0は、第1のパケットコントローラ202aからの読み出し単位ブロック302の読み出し要求を、DAMコントローラ205及び制御部112を介して、メモリ102aに出力する。第1のジョイントバッファ501aは、記憶部601に記憶されている状態Joint_STATUSをDMA_WAITに更新する。第1のジョイントバッファ501aは、第1のパケットコントローラ202aからの読み出し単位ブロック302の読み出し要求に設定されている末尾識別子ID(L)を、識別子Joint_IDとして記憶部602に登録する。第1のジョイントバッファ501aは、隣接フラグJoint_Valid(0)として1を記憶部603に登録する。これにより、第1のジョイントバッファ501aは、読み出し要求に対する応答(読み出し単位ブロック302)の待機状態になる。
ステップS1104において、第1のジョイントバッファ501aは、記憶部601の状態Joint_STATUSがDMA_WAITであり、かつ、記憶部602の識別子Joint_IDが受信読み出し要求の先頭隣接フラグVF(F)と一致している条件を満たすか否かを判定する。第1のジョイントバッファ501aは、上記の条件を満たす場合にはステップS1108に進み、上記の条件を満たさない場合にはステップS1105に進む。
ステップS1108において、第1のジョイントバッファ501aは、受信した読み出し要求をDMAコントローラ205に出力しない。例えば、第1のジョイントバッファ501aにおいて、セレクタSEL1は、第2のパケットコントローラ202bからの読み出し単位ブロック302の読み出し要求をDMAコントローラ205に出力しない。第1のジョイントバッファ501aは、隣接フラグJoint_Valid(1)として1を記憶部603に登録する。これにより、第1のジョイントバッファ501aは、読み出し要求に対する応答(読み出し単位ブロック302)の待機状態を維持する。
ステップS1105において、第1のジョイントバッファ501aは、記憶部601の状態Joint_STATUSがDMA_HOLDであり、かつ、記憶部602の識別子Joint_IDが受信読み出し要求の識別子ID(F)と一致している条件を満たすか否かを判定する。第1のジョイントバッファ501aは、上記の条件を満たす場合にはステップS1109に進み、上記の条件を満たさない場合にはステップS1110に進む。
ステップS1109において、第1のジョイントバッファ501aは、受信した読み出し要求をDMAコントローラ205に出力しない。例えば、第1のジョイントバッファ501aにおいて、セレクタSEL1は、第2のパケットコントローラ202bからの読み出し単位ブロック302の読み出し要求をDMAコントローラ205に出力しない。第1のジョイントバッファ501aは、隣接フラグJoint_Valid(1)として1を記憶部603に登録する。第1のジョイントバッファ501aは、記憶部601に記憶されている状態Joint_STATUSをDMA_SENDに更新する。これにより、第1のジョイントバッファ501aは、バッファ604に保持されている読み出し単位ブロック302を第2のパケットバッファ203bに送信可能な状態になる。
ステップS1110において、第1のジョイントバッファ501aが第1のパケットコントローラ202aから読み出し要求を受信した場合、セレクタSEL0は、第1のパケットコントローラ202aからの読み出し要求を、DAMコントローラ205及び制御部112を介して、メモリ102aに出力する。
第1のジョイントバッファ501aが第2のパケットコントローラ202bから読み出し要求を受信した場合、セレクタSEL1は、第2のパケットコントローラ202bからの読み出し要求を、DAMコントローラ205及び制御部112を介して、メモリ102aに出力する。
例えば、第1のジョイントバッファ501aは、読み出し単位ブロック306の読み出し要求を受信しているが、その前の読み出しブロック302の処理が終了していない状態である。その場合、第1のジョイントバッファ501aは、読み出し単位ブロック306を保持することができないので、受信した読み出し要求をDMAコントローラ205に出力する。
図12は、第1のジョイントバッファ501aの読み出し要求の応答受信処理を示すフローチャートである。第2〜第4のジョイントバッファ501b〜501dの処理も、第1のジョイントバッファ501aの処理と同様である。
ステップS1201において、第1のジョイントバッファ501aは、DMAコントローラ205及び制御部112を介してメモリ102aから、読み出し要求に応答して読み出された読み出し単位ブロックを受信したか否かを判定する。第1のジョイントバッファ501aは、読み出し単位ブロックを受信した場合にはステップS1204に進み、読み出し単位ブロックを受信していない場合にはステップS1202に進む。
ステップS1202において、第1のジョイントバッファ501aは、記憶部601の状態Joint_STATUSがDMA_SENDである場合にはステップS1203に進み、状態Joint_STATUSがDMA_SENDでない場合には処理を終了する。
ステップS1203において、第1のジョイントバッファ501aは、バッファ604に保持されている読み出し単位ブロックを読み出す。隣接フラグJoint_Valid(0)が1である場合、セレクタSEL2は、バッファ604から読み出された読み出し単位ブロックを第1のパケットバッファ203aに出力する。隣接フラグJoint_Valid(1)が1である場合、セレクタSEL3は、バッファ604から読み出された読み出し単位ブロックを第2のパケットバッファ203bに出力する。例えば、セレクタSEL3は、バッファ604から読み出された読み出し単位ブロック302を第2のパケットバッファ203bに出力する。第1のジョイントバッファ501aは、隣接フラグJoint_Valid(0)及びJoint_Valid(1)を0にリセットし、状態Joint_STATUSをIDLEに更新する。
ステップS1204において、第1のジョイントバッファ501aは、記憶部603の隣接フラグJoint_Valid(0)又はJoint_Valid(1)が1であり、かつ、記憶部602の識別子Joint_IDが受信読み出し要求の識別子ID(F)又はID(L)と一致し、かつ、状態Joint_STATUSがDMA_WAITであることの条件を満たすか否かを判定する。第1のジョイントバッファ501aは、上記の条件を満たしている場合にはステップS1206に進み、上記の条件を満たしていない場合にはステップS1205に進む。
ステップS1205において、第1のジョイントバッファ501aが第1のパケットコントローラ202aから読み出し要求を受信した場合、セレクタSEL2は、DMAコントローラ205及び制御部112を介してメモリ102aから読み出された読み出し単位ブロックを、第1のパケットバッファ203aに出力する。
第1のジョイントバッファ501aが第2のパケットコントローラ202bから読み出し要求を受信した場合、セレクタSEL3は、DMAコントローラ205及び制御部112を介してメモリ102aから読み出された読み出し単位ブロックを、第2のパケットバッファ203bに出力する。
ステップS1206において、第1のジョイントバッファ501aは、DMAコントローラ205及び制御部112を介してメモリ102aから読み出された読み出し単位ブロックを、バッファ604に書き込む。
記憶部603の隣接フラグJoint_Valid(0)が1である場合、セレクタSEL2は、DMAコントローラ205及び制御部112を介してメモリ102aから読み出された読み出し単位ブロックを、第1のパケットバッファ203aに出力する。
記憶部603の隣接フラグJoint_Valid(1)が1である場合、セレクタSEL3は、DMAコントローラ205及び制御部112を介してメモリ102aから読み出された読み出し単位ブロックを、第2のパケットバッファ203bに出力する。
次に、ステップS1207において、第1のジョイントバッファ501aは、記憶部603の隣接フラグJoint_Valid(0)及びJoint_Valid(1)が共に1であるか否かを判定する。第1のジョイントバッファ501aは、隣接フラグJoint_Valid(0)及びJoint_Valid(1)が共に1である場合にはステップS1208に進み、隣接フラグJoint_Valid(0)及びJoint_Valid(1)が共に1でない場合にはステップS1209に進む。
ステップS1208において、第1のジョイントバッファ501aは、記憶部604の隣接フラグJoint_Valid(0)及びJoint_Valid(1)を0にリセットする。第1のジョイントバッファ501aは、記憶部601の状態Joint_STATUSをIDLEに更新する。例えば、第1のジョイントバッファ501aは、第1のパケットコントローラ202aから読み出し単位ブロック302の読み出し要求を受信し、第2のパケットコントローラ202bから読み出し単位ブロック302の読み出し要求を受信し、その後、DMAコントローラ205から読み出し単位ブロック302を受信した状態である。この場合、ステップS1206において、第1のジョイントバッファ501aは、DMAコントローラ205から受信した読み出し単位ブロック302を第1及び第2のパケットバッファ203a及び203bに出力する。この処理の詳細は、後に図14を参照しながら説明する。
ステップS1209において、第1のジョイントバッファ501aは、記憶部603の隣接フラグJoint_Valid(0)及びJoint_Valid(1)を0にリセットする。第1のジョイントバッファ501aは、記憶部601の状態Joint_STATUSをDMA_HOLDに更新する。例えば、第1のジョイントバッファ501aは、第1のパケットコントローラ202aから読み出し単位ブロック302の読み出し要求を受信し、その後、DMAコントローラ205から読み出し単位ブロック302を受信した状態である。この場合、ステップS1206において、第1のジョイントバッファ501aは、DMAコントローラ205から受信した読み出し単位ブロック302をバッファ604に書き込むと共に、第1のパケットバッファ203aに出力する。この処理の詳細は、後に図13を参照しながら説明する。
図13は、図12のステップS1209に対応するネットワークコントローラ113の処理例を示すタイムチャートである。サイクル0において、第4のジョイントバッファ501dは、第1のパケットコントローラ202aからパケットaの先頭読み出し要求R0−0を受信する。先頭読み出し要求R0−0は、先頭隣接フラグVF(F)が0であり、先頭識別子ID(F)が0である。第4のジョイントバッファ501dのセレクタSEL1は、上記の受信した先頭読み出し要求R0−0をDMAコントローラ205に出力する。
サイクル0の第1のジョイントバッファ501aにおいて、状態Joint_STATUSはIDLEであり、隣接フラグJoint_Valid(0)及びJoint_Valid(1)は0である。
サイクル2において、第1のジョイントバッファ501aは、第1のパケットコントローラ202aからパケットaの末尾読み出し要求R0−1を受信する。末尾読み出し要求R0−1は、末尾隣接フラグVF(L)が1であり、末尾識別子ID(L)が1である。第1のジョイントバッファ501aのセレクタSEL0は、上記の受信した末尾読み出し要求R0−1をDMAコントローラ205に出力する。
サイクル3において、第1のジョイントバッファ501aは、状態Joint_STATUSをDMA_WAITに更新し、識別子Joint_IDとして末尾識別子ID(L)=1を登録し、隣接フラグJoint_Valid(0)を1に設定する。
サイクル5において、第4のジョイントバッファ501dは、先頭読み出し要求R0−0に応答して読み出された読み出し単位ブロック301を、DMAコントローラ205から受信する。第4のジョイントバッファ501dのセレクタSEL3は、その受信した読み出し単位ブロック301を第1のパケットバッファ203aに出力する。
サイクル7において、第1のジョイントバッファ501aは、末尾読み出し要求R0−1に応答して読み出された読み出し単位ブロック302を、DMAコントローラ205から受信する。第1のジョイントバッファ501aのセレクタSEL2は、隣接フラグJoint_Valid(0)が1であるので、その受信した読み出し単位ブロック302を第1のパケットバッファ203aに出力する。
サイクル8において、第1のジョイントバッファ501aは、状態Joint_STATUSがDMA_WAITであり、かつ、末尾識別子ID(L)=1が識別子Joint_ID=1と同じであるので、末尾読み出し要求R0−1に応答して読み出された読み出し単位ブロック302を、バッファ604に書き込む。第1のジョイントバッファ501aは、状態Joint_STATUSをDMA_HOLDに更新し、隣接フラグJoint_Valid(0)を0にリセットする。
サイクル10において、第1のジョイントバッファ501aは、第2のパケットコントローラ202bからパケットbの先頭読み出し要求R1−0を受信する。先頭読み出し要求R1−0は、先頭隣接フラグVF(F)が1であり、先頭識別子ID(F)が1である。第1のジョイントバッファ501aのセレクタSEL1は、状態Joint_STATUSがDMA_HOLDであり、かつ、先頭識別子ID(F)=1が識別子Joint_ID=1と同じであるので、上記の受信した先頭読み出し要求R1−0をDMAコントローラ205に出力しない。
サイクル11において、第1のジョイントバッファ501aは、状態Joint_STATUSをDMA_SENDに更新し、隣接フラグJoint_Valid(1)を1に設定する。第1のジョイントバッファ501aのセレクタSEL3は、状態Joint_STATUSがDMA_SENDであり、かつ、隣接フラグJoint_Valid(1)が1であるので、先頭読み出し要求R1−0に応答し、バッファ604に保持されている読み出し単位バッファ302を第2のパケットバッファ203bに出力する。
サイクル12において、第1のジョイントバッファ501aは、状態Joint_STATUSをIDLEに更新し、隣接フラグJoint_Valid(1)を0にリセットする。
第2のジョイントバッファ501bは、第2のパケットコントローラ202bからパケットbの末尾読み出し要求R1−1を受信する。ここで、末尾読み出し要求R1−1は、末尾隣接フラグVF(F)が0であり、先頭識別子ID(F)が2である場合を説明する。第2のジョイントバッファ501bのセレクタSEL0は、上記の受信した末尾読み出し要求R1−1をDMAコントローラ205に出力する。
サイクル14において、第2のジョイントバッファ501bは、末尾読み出し要求R1−1に応答して読み出された読み出し単位ブロック303を、DMAコントローラ205から受信する。第2のジョイントバッファ501bのセレクタSEL2は、その受信した読み出し単位ブロック303を第2のパケットバッファ203bに出力する。
図14は、図12のステップS1208に対応するネットワークコントローラ113の処理例を示すタイムチャートである。サイクル0において、第4のジョイントバッファ501dは、第1のパケットコントローラ202aからパケットaの先頭読み出し要求R0−0を受信する。先頭読み出し要求R0−0は、先頭隣接フラグVF(F)が0であり、先頭識別子ID(F)が0である。第4のジョイントバッファ501dのセレクタSEL1は、上記の受信した先頭読み出し要求R0−0をDMAコントローラ205に出力する。
サイクル0の第1のジョイントバッファ501aにおいて、状態Joint_STATUSはIDLEであり、隣接フラグJoint_Valid(0)及びJoint_Valid(1)は0である。
サイクル2において、第1のジョイントバッファ501aは、第1のパケットコントローラ202aからパケットaの末尾読み出し要求R0−1を受信する。末尾読み出し要求R0−1は、末尾隣接フラグVF(L)が1であり、末尾識別子ID(L)が1である。第1のジョイントバッファ501aのセレクタSEL0は、上記の受信した末尾読み出し要求R0−1をDMAコントローラ205に出力する。
サイクル3において、第1のジョイントバッファ501aは、状態Joint_STATUSをDMA_WAITに更新し、識別子Joint_IDとして末尾識別子ID(L)=1を登録し、隣接フラグJoint_Valid(0)を1に設定する。
サイクル4において、第1のジョイントバッファ501aは、第2のパケットコントローラ202bからパケットbの先頭読み出し要求R1−0を受信する。先頭読み出し要求R1−0は、先頭隣接フラグVF(F)が1であり、先頭識別子ID(F)が1である。第1のジョイントバッファ501aのセレクタSEL1は、状態Joint_STATUSがDMA_WAITであり、かつ、先頭識別子ID(F)=1が識別子Joint_ID=1と同じであるので、上記の受信した先頭読み出し要求R1−0をDMAコントローラ205に出力しない。
サイクル5において、第1のジョイントバッファ501aは、隣接フラグJoint_Valid(1)を1に設定する。
第4のジョイントバッファ501dは、先頭読み出し要求R0−0に応答して読み出された読み出し単位ブロック301を、DMAコントローラ205から受信する。第4のジョイントバッファ501dのセレクタSEL3は、その受信した読み出し単位ブロック301を第1のパケットバッファ203aに出力する。
サイクル7において、第1のジョイントバッファ501aは、末尾読み出し要求R0−1に応答して読み出された読み出し単位ブロック302を、DMAコントローラ205から受信する。第1のジョイントバッファ501aのセレクタSEL2は、隣接フラグJoint_Valid(0)が1であるので、その受信した読み出し単位ブロック302を第1のパケットバッファ203aに出力する。第1のジョイントバッファ501aのセレクタSEL3は、隣接フラグJoint_Valid(1)が1であるので、その受信した読み出し単位ブロック302を第2のパケットバッファ203bに出力する。
サイクル8において、第1のジョイントバッファ501aは、状態Joint_STATUSがDMA_WAITであり、かつ、末尾識別子ID(L)=1が識別子Joint_ID=1と同じであるので、末尾読み出し要求R0−1に応答して読み出された読み出し単位ブロック302を、バッファ604に書き込む。ただし、バッファ604の読み出し単位ブロック302は、使用されない。第1のジョイントバッファ501aは、状態Joint_STATUSをDMA_IDLEに更新し、隣接フラグJoint_Valid(0)及びJoint_Valid(1)を0にリセットする。
サイクル12において、第2のジョイントバッファ501bは、第2のパケットコントローラ202bからパケットbの末尾読み出し要求R1−1を受信する。ここで、末尾読み出し要求R1−1は、末尾隣接フラグVF(F)が0であり、先頭識別子ID(F)が2である場合を説明する。第2のジョイントバッファ501bのセレクタSEL0は、上記の受信した末尾読み出し要求R1−1をDMAコントローラ205に出力する。
サイクル14において、第2のジョイントバッファ501bは、末尾読み出し要求R1−1に応答して読み出された読み出し単位ブロック303を、DMAコントローラ205から受信する。第2のジョイントバッファ501bのセレクタSEL2は、その受信した読み出し単位ブロック303を第2のパケットバッファ203bに出力する。
以上のように、ネットワークコントローラ113は、メモリ102aの読み出し単位ブロック301〜307をそれぞれ1回ずつ読み出し、第1〜第4のジョイントバッファ501a〜501dに読み出し単位ブロック302〜307を保持させる。第1〜第4のパケットコントローラ202a〜202dは、第1〜第4のジョイントバッファ501a〜501dから必要な読み出し単位ブロック302〜307を得ることができる。これにより、メモリ102aの読み出し効率及びスループットが向上する。
また、第1〜第4のジョイントバッファ501a〜501dは、大容量のキャッシュに比べ、実装面積が小さく、制御が容易である。これにより、中央演算処理装置101a〜101dをそれぞれ高集積化することができる。
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。