(57)【要約】【課題】モジュール間でメモリおよびバスを介したデータ通信を行う際のバス利用効率を改善もしくはその低下を抑制することができる情報処理装置を提供する。【解決手段】通信すべきデータの開始アドレスおよびサイズおよびいずれかもしくは両方がメモリとの通信に使用されるバスの通信単位未満である場合、情報処理装置は、通信単位となるようなパッキングを行う通信制御部を有している。通信単位に関し端数分となる前記通信すべきデータである端数データが、複数のデータの分まとめて前記メモリの連続領域に格納される。【選択図】図４Ａ
2020106869.tif 000002
【特許請求の範囲】
【請求項１】
予め定められた通信単位で通信を行うバスと、
当該バスに接続されたメモリと、
前記メモリに対して前記バスを介してデータを送受する通信装置を備え、
前記通信装置は、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを行なうことを特徴とする情報処理装置。
【請求項２】
前記パッキングは、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位未満の場合、及び前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位よりも大きい場合に実行されることを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記通信装置は、前記データ及び前記メタデータの少なくとも一方が前記バスの通信単位未満である場合、前記通信単位に対して端数分となる端数データを前記通信単位となるように複数のデータセット分まとめて、前記バスを介して、前記メモリの連続領域に格納する送信装置を備えていることを特徴とする請求項１又は２記載の情報処理装置。
【請求項４】
前記通信装置は、通信すべき前記データのうち、前記端数データについて前記連続領域から読み込む受信装置を備えていることを特徴とする請求項１〜３のいずれか一項に記載の情報処理装置。
【請求項５】
前記通信装置は、前記データと、当該データの属性に関するメタデータをも複数のデータセット分まとめることを特徴とする請求項１乃至請求項４のいずれかに記載の情報処理装置。
【請求項６】
請求項１〜５のいずれか一項において、前記メモリはポインタをエントリに用いるリングキュー、当該ポインタにより前記データを間接的に参照できるパケットデータを記憶するパケットバッファ、及び、前記パケットデータに関する前記メタデータをmbuf形式で記憶するmbuf構造体を含むことを特徴とする請求項５記載の情報処理装置。
【請求項７】
予め定められた通信単位で通信を行うバスと、当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備える情報処理装置において、
前記通信装置によって、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを行なう
ことを特徴とする通信方法。
【請求項８】
前記通信装置が複数の前記データに係るポインタを前記メモリの連続領域（ポインタデータ領域）に格納する送信装置を備える場合に、
前記送信装置によって、前記データもしくは前記データの一部である通信すべきデータの開始アドレスおよびサイズおよびいずれかもしくは両方が前記メモリとの通信に使用されるバスの通信単位未満である場合に、前記通信単位に関し端数分となる前記通信すべきデータである端数データを、前記複数のデータセット分まとめて前記メモリの連続領域に格納し、
前記通信装置の受信装置によって、前記通信すべきデータのうち、前記端数データについて前記連続領域から読み込むことを特徴とする請求項７記載の通信方法。
【請求項９】
前記ポインタは前記データへのポインタを少なくとも含むメタデータへのポインタであり、前記送信装置は前記メタデータの一部を前記複数のデータセット分まとめて前記連続領域に格納し、
前記受信装置によって、
前記メタデータの一部を前記連続領域から読み込む、
ことを特徴とする請求項８記載の通信方法。
【請求項１０】
予め定められた通信単位で通信を行うバスと、当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備えるコンピュータに、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを実行させることを特徴とするコンピュータプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、方法、及び、プログラムに関し、特に、モジュール間でメモリおよびバスを介したデータ通信を行って情報を処理する情情報処理装置、方法、及び、プログラムに関する。
【背景技術】
【０００２】
CPU（Central  Processing  Unit）を備える情報処理装置が、例えば、処理性能向上等を目的として、アクセラレータHW（Hardware）をも備える場合がある。CPUおよびアクセラレータHWを備えた情報処理装置のHW構成例を図１に示す。
【０００３】
メモリには、CPUが実行するソフトウェアプログラムと、当該ソフトウェアプログラムおよびアクセラレータHWが処理対象とするデータとが、記憶される。ある処理をソフトウェアプログラムが実行する代わりにアクセラレータHWが実行する場合、すなわち当該処理をCPUからアクセラレータＨＷにオフロードする場合、ソフトウェアプログラムは処理対象データをアクセラレータHWに通知し、アクセラレータＨＷは当該処理対象データを参照して処理を行う。処理結果データがある場合、アクセラレータHWは当該処理結果データをメモリに書き込み、ソフトウェアプログラムに通知する。また、アクセラレータHW自身がデータを生成する場合も同様に、アクセラレータHWは当該データをメモリに書き込み、ソフトウェアプログラムに通知する。
【０００４】
上述したようなソフトウェアプログラムおよびアクセラレータHW間のデータ通信方式の一つとして、主にポインタをエントリに用いるリングキュー（Ring  Queue）がある。このリングキューは、メモリ上に実現されるFIFO（First  In  First  Out）であり、そのエントリとして主に処理対象データへのポインタが格納される。
【０００５】
通信パケットデータを対象としたリングキューの一例としてDPDK（Data  Plane  Development  Kit）リングキューがある。DPDKは通信ソフトウェア向けの高速パケット処理ライブラリであり、パケットを高速に処理するためのデータ構造や関数群を提供している。DPDKでは、パケットをmbuf形式でメモリ上に記憶する。DPDKリングキューおよびmbuf形式を用いてモジュール間（例えばソフトウェアプログラムとアクセラレータHW間）でパケットデータを通信する際のデータ構成例を、図２を用いて説明する。
【０００６】
mbuf形式では、パケットデータそのものを記憶するパケットバッファと、当該パケットデータに関するメタデータを記憶するmbuf構造体と、を用いてパケットをメモリ上に記憶する。mbuf構造体には、パケットバッファの先頭アドレスやバッファ長、パケットバッファ内で実際にパケットデータが記憶されている位置に関する情報（オフセット、パケットデータ長）などが記憶される。パケットデータはパケットバッファ先頭からに記憶されるとは限らず、その途中に記憶される場合がある。
【０００７】
DPDKリングキューは、状態管理用データと例えば８バイトデータの配列とから構成され、FIFOとして機能する。DPDKリングキューを使ってmbuf形式のパケットデータが通信される場合、mbuf構造体のポインタがEnqueueおよびDequeueされる。DPDKリングキューの状態管理用データであるproducer  indexは、次にEnqueueされる要素を格納すべき配列インデックスを示し、同じく状態管理用データであるconsumer  indexは次にDequeueされるべき要素が格納されている配列インデックスを示す。
【０００８】
図２の例においては、３つのmbuf構造体ポインタが配列インデックス１〜３の場所に格納されている状態を示している。ここで、パケットデータを送信するモジュールが、当該パケットデータのmbuf構造体ポインタをDPDKリングキューにEnqueueした場合、当該ポインタは配列インデックス4の位置に格納され、producer  indexは5に更新される。また、パケットデータを受信するモジュールがDPDKリングキューからDequeueする場合、配列インデックス1の位置からmbuf構造体ポインタが読み込まれ当該モジュールに渡される。同時に、consumer  indexは2に更新される。各モジュールは、mbuf構造体ポインタを元にメモリ上のmbuf構造体およびパケットバッファを参照更新することでパケットデータに対する処理を行う。
【０００９】
特許文献１は、周期転送用データと非周期転送用データをそれぞれ第１及び第２のポインタと共に格納するメモリと、当該メモリと通信バスに接続されたデータ転送回路とを備えたシステムを開示している。特許文献１は、非周期転送用データを通信バスに転送する際、第２のポインタで指示するデータ長の転送を完了できなかった場合、制御部でデータ長を更新して、通信バスに転送している。
【００１０】
特許文献２は、DPDK及びmbuf形式を用いた情報処理装置を開示している。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２０１１−１８６９１８号公報
【特許文献２】特開２０１７−０４６２８６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
図１に示したバスによる通信には、サイズや開始アドレスについて制約が課される場合がある。例えば、サイズはある最小単位サイズ（例えば６４バイト、キャッシュラインサイズ）の倍数でなければならない場合がある。また、例えば、通信時の開始アドレス（リードやライトの先頭アドレス）はある最小単位サイズ（例えば６４バイト、キャッシュラインサイズ、前記サイズに関する最小単位サイズとは異なる場合も考えられる）の倍数でなければならない場合がある。
【００１３】
一方、ソフトウェアプログラムおよびアクセラレータHWとの間でやり取りされるデータは、常に上記制約を満たしているとは限らない。制約を満たしていない場合、制約を満たすようにバス上での通信するデータのサイズおよび開始アドレスをバスが調整する必要がある。その結果、バス上で実際に通信されるデータのサイズは、常に当初通信する予定であったデータのサイズより大きくなる。
【００１４】
このことを、サイズおよび開始アドレスの最小単位サイズがいずれも６４バイトである場合、および、パケットデータを通信する場合、を例として図３を用いて説明する。
【００１５】
図３（Ａ）は、パケットデータのサイズおよび開始アドレスがいずれも最小単位サイズの倍数である場合（１２８バイト、６４＊ｎ）を示している。この場合、バスの制約を満たしているため、そのままのサイズおよび開始アドレスにて通信可能である。
【００１６】
図３（Ｂ）は、パケットデータのサイズが最小単位サイズの倍数でない場合（１３６バイト）を示している。この場合、バスのサイズに関する制約を満たしておらず、実際にバス上で通信されるデータは破線の矩形で示した１９２バイトとなる。
【００１７】
図３（Ｃ）は、パケットデータの開始アドレスが最小単位サイズの倍数でない場合（６４＊ｎ＋８）を示している。この場合、バスの開始アドレスに関する制約を満たしておらず、実際にバス上で通信されるデータは破線の矩形で示した１９２バイトとなる。
【００１８】
広く使われている通信方式であるEthernetでは、パケットデータであるフレームのサイズとして６４バイトから１５１８バイト（もしくは１５２２バイト）の間で１バイト単位で設定可能である。そのため、上記制約を満たさないパケットデータは頻繁に発生しうる。
【００１９】
また、パケット処理の過程において、既存パケットデータの前後にデータを追加したり削除したりすることが頻繁に行われる。その際、パケットデータのサイズや開始位置は更新されるため、それらが上記制約を満たさない場合は容易に発生する。
【００２０】
また、前述したDPDKの例のように、パケットデータがメタデータ（mbuf構造体）およびパケットバッファで管理される場合、メタデータもバスによって通信される必要がある。メタデータのサイズや開始位置が上記制約を満たさない場合、パケットデータについて上述した問題がメタデータについても発生することになる。
【００２１】
さらに、メタデータはパケットバッファやその中に位置するパケットデータを参照するために必要な情報を含んでいるが、メタデータ内の全ての情報が受信者（ソフトウェアプログラム、アクセラレータHW）で必要となるとは限らない。その一部のみを通信することで通信量を減らすことが考えられるが、その際に上記制約を満たさなくなる可能性があり、結果として通信量削減効果が得られない、もしくは逆に増えてしまう虞がある。
【００２２】
特許文献１は第２のポインタによって示されるデータ長分の非周期転送用データが転送できなかった場合、データ長を更新することを開示している。しかしながら、特許文献１は通信バスにおける制約及び制約による通信バスの利用効率の低下について何等考慮していない。
【００２３】
一方、特許文献２は、DPDK及びmbuf形式を用いて通信を行う情報処理装置を開示している。しかしながら、特許文献１はバスによる通信に伴う制約及びバスの利用効率の低下について指摘されていない。
【００２４】
本発明の目的は、かかる問題に鑑みてなされたものであり、モジュール間でメモリおよびバスを介したデータ通信を行う際のバス利用効率を改善もしくはその低下を抑制することができる情報処理装置、方法、及び、プログラムを提供することにある。
【課題を解決するための手段】
【００２５】
本発明の第１の態様によれば、予め定められた通信単位で通信を行うバスと、
当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備え、前記通信装置は、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを行なうことを特徴とする情報処理装置が得られる。
【００２６】
本発明の第２の態様によれば、前記パッキングは、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位未満の場合、及び前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位よりも大きい場合に実行されることを特徴とする第１の態様に記載の情報処理装置が得られる。
【００２７】
本発明の第３の態様によれば、前記通信装置は、前記データ及び前記メタデータの少なくとも一方が前記バスの通信単位未満である場合、前記通信単位に対して端数分となる端数データを前記通信単位となるように複数のデータセット分まとめて、前記バスを介して、前記メモリの連続領域に格納する送信装置を備えていることを特徴とする第１又は第２の態様に記載の情報処理装置が得られる。
【００２８】
本発明の第４の態様によれば、前記通信装置は、通信すべき前記データのうち、前記端数データについて前記連続領域から読み込む受信装置を備えていることを特徴とする第１〜第３の態様のいずれか一項に記載の情報処理装置が得られる。
【００２９】
本発明の第５の態様によれば、前記通信装置は、前記データと、当該データの属性に関するメタデータをも複数のデータセット分まとめることを特徴とする第１乃至第４の態様のいずれかに記載の情報処理装置が得られる。
【００３０】
本発明の第６の態様によれば、第１〜第５の態様のいずれか一項において、前記メモリはポインタをエントリに用いるリングキュー、当該ポインタにより前記データを間接的に参照できるパケットデータを記憶するパケットバッファ、及び、前記パケットデータに関する前記メタデータをmbuf形式で記憶するmbuf構造体を含むことを特徴とする第５の態様に記載の情報処理装置が得られる。
【００３１】
本発明の第７の態様によれば、予め定められた通信単位で通信を行うバスと、当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備える情報処理装置において、前記通信装置によって、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを行なうことを特徴とする通信方法が得られる。
【００３２】
本発明の第８の態様によれば、前記通信装置が複数の前記データに係るポインタを前記メモリの連続領域（ポインタデータ領域）に格納する送信装置を備える場合に、前記送信装置によって、前記データもしくは前記データの一部である通信すべきデータの開始アドレスおよびサイズおよびいずれかもしくは両方が前記メモリとの通信に使用されるバスの通信単位未満である場合に、前記通信単位に関し端数分となる前記通信すべきデータである端数データを、前記複数のデータセット分まとめて前記メモリの連続領域に格納し、
前記通信装置の受信装置によって、前記通信すべきデータのうち、前記端数データについて前記連続領域から読み込むことを特徴とする第７の態様に記載の通信方法が得られる。
【００３３】
本発明の第９の態様によれば、前記ポインタは前記データへのポインタを少なくとも含むメタデータへのポインタであり、前記送信装置は前記メタデータの一部を前記複数のデータセット分まとめて前記連続領域に格納し、前記受信装置によって、前記メタデータの一部を前記連続領域から読み込む、
ことを特徴とする第８の態様に記載の通信方法が得られる。
【００３４】
本発明の第１０の態様によれば、予め定められた通信単位で通信を行うバスと、当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備えるコンピュータに、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを実行させることを特徴とするコンピュータプログラムが得られる。
【００３５】
本発明の第１１の態様によれば、前記送信装置および前記受信装置は、前記ポインタデータ領域および前記連続領域として同じメモリ領域を使用する、
ことを特徴とする第７から１０のいずれかの態様に記載の通信方法が得られる。
【発明の効果】
【００３６】
本発明の情報処理装置、方法およびプログラムにより、モジュール間でメモリおよびバスを介したデータ通信を行う際のバス利用効率を改善もしくはその低下を抑制することができる。
【図面の簡単な説明】
【００３７】
【図１】ＣＰＵ、メモリ、およびアクセラレータＨＷを備える一般的な情報処理装置の構成例を示す図である。
【図２】リングキューおよびmbuf形式の一例を示す図である。
【図３】メモリに接続するバスにおける制約の一例を示す図である。
【図４Ａ】本発明の原理を説明するブロック図である。
【図４Ｂ】本発明の第１の実施形態の情報処理装置の構成例を示す図である。
【図５】本発明の第１の実施形態の情報処理装置が用いるPackingデータの一例を示す図である。
【図６】本発明の第１の実施形態の第一送受信処理部の構成例を示す図である。
【図７】本発明の第１の実施形態の第二送受信処理部の構成例を示す図である。
【図８】本発明の第１の実施形態の情報処理装置が用いるリングキューの構成例を示す図である。
【図９】本発明の第１の実施形態の情報処理装置が用いるmbuf構造体の構成例を示す図である。
【図１０】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１１】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１２】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１３】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１４】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１５】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１６】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１７】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１８】本発明の第１の実施形態の情報処理装置の動作例を示す図である。
【図１９】本発明の第２の実施形態の情報処理装置の構成例を示す図である。
【図２０】本発明の第２の実施形態の情報処理装置が用いるPackingデータの一例を示す図である。
【図２１】本発明の第２の実施形態の第一送受信処理部Ｂの構成例を示す図である。
【図２２】本発明の第２の実施形態の第二送受信処理部Ｂの構成例を示す図である。
【図２３】本発明の第２の実施形態の情報処理装置の動作例を示す図である。
【図２４】本発明の第２の実施形態の情報処理装置の動作例を示す図である。
【図２５】本発明の第２の実施形態の情報処理装置の動作例を示す図である。
【図２６】本発明の第２の実施形態の情報処理装置の動作例を示す図である。
【発明を実施するための形態】
【００３８】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００３９】
［第１の実施の形態の構成例］
まず、本実施の形態の構成例について、図４〜図９を用いて説明する。本実施の形態では、パケットを処理するソフトウェアプログラム（後述する第一データ処理部２０）と、パケットを処理するアクセラレータHW（後述する第二データ処理部３０）と、が相互にメモリを介してパケットを通信する例を示す。これらは、パケットの通信にリングキューおよびmbuf形式を用いる。ただし、本発明はこれに限定されるものではない。
【００４０】
まず、図４（Ａ）は本発明に係る情報処理装置の原理を説明する図である。図示された情報処理装置１はメモリ部１０、バス部１１、及び通信制御部１２を備えている。ここで、通信制御部１２はメモリ部１０にバス部１１を介して接続されている。バス部１１は予め定められた通信単位(例えば、６４バイト単位)で通信を行うことができる。図示された通信制御部１２は、データ及び当該データの属性に関するメタデータのうちの少なくとも一方をメモリ部１０に対して、バス部１１を介して送受することができる。
【００４１】
ここで、通信制御部１２は上記したデータ及びメタデータの少なくとも一方がバス部１１の通信単位に合致しない場合、バス部１１の通信単位に合致するような処理を行う。具体的には、通信単位に対して、データ及びメタデータの少なくとも一方が端数分となる端数データを複数のデータセット分にまとめるような処理が通信制御部１２で行われる。通信単位に関し端数分となる前記通信すべきデータである端数データは、複数のデータ分まとめてメモリ部１０の連続領域にバス１１を介して格納される。この処理はデータ及びメタデータの少なくとも一方が通信単位未満の場合だけでなく、通信単位よりも大きい場合にも実行される。
【００４２】
このように、本発明に係る情報処理装置は、バス部１１における通信単位に合致するように、データを処理する通信制御部１２を有している。以下、本発明の原理に基づく情報処理装置をより具体的に説明する。
【００４３】
図４（Ｂ）は、本発明の第１の実施の形態に係る情報処理装置１の構成の一例を示す構成図である。図４（Ｂ）に例示する情報処理装置１は、メモリ部１０と、バス部１１と、第一データ処理部２０と、第二データ処理部３０と、第一送受信処理部４０と、第二送受信処理部６０と、を含んで構成される。図４（Ｂ）に示す構成要素の数や接続関係は一例である。
【００４４】
メモリ部１０は、データを記憶するメモリであり、リングキューやmbuf構造体、パケットデータ等を記憶する。
【００４５】
バス部１１は、メモリ部１０と、例えば第一データ処理部および第一送受信処理部４０を実現するハードウェア（図示されない）や第二送受信処理部６０を実現するハードウェア（図示されない）と、の間でデータ通信（リード、ライト）を仲介するバスである。バス部１１による通信には以下のいずれかもしくは両方の制約が課せられる。 
・通信するサイズはある最小単位サイズの倍数でなければならない。 
・通信する開始アドレス（リードやライトの先頭アドレス）はある最小単位サイズの倍数でなければならない。
【００４６】
リードやライトの要求元からの要求が制約を満たさない場合、バス部１１は制約を満たすようサイズや開始アドレスを調整して実際の通信を行う。本実施の形態の説明においては、バス部１１による通信には上記２つの制約が課され、かつ最小単位サイズはいずれも６４バイトであるとする。
【００４７】
第一データ処理部２０は、パケットデータを処理する。第一データ処理部２０は、メモリ部１０にパケットデータを記憶させる際にmbuf形式を用いる。第一データ処理部２０は、第二データ処理部３０との間でリングキューを用いて、パケットを送受信する際、第一送受信処理部４０に送受信を要求する。第一データ処理部２０は、リングキュー（mbuf構造体ポインタ用）の生成や解放を第一送受信処理部４０に要求する。第一送受信処理部４０は、生成したリングキューに識別子としてキューＩＤを割り当て、後述する第二Enqueue処理部６６および第二Ｄｅqｕｅｕｅ処理部６８に、リングキューのアドレスおよびキューＩＤの組を設定する。
【００４８】
第二データ処理部３０は、パケットデータを処理する。第二データ処理部３０は、第一データ処理部２０との間でリングキューを用いて、パケットを送受信する際、第二送受信処理部６０に送受信を要求する。
【００４９】
第一送受信処理部４０は、リングキューを用いてデータを第二送受信処理部６０との間で通信する。その詳細は後述する。
【００５０】
第二送受信処理部６０は、リングキューを用いてデータを第一送受信処理部４０との間で通信する。その詳細は後述する。
【００５１】
第一送受信処理部４０および第一データ処理部２０は、例えば、CPU（図示されない）によって実行されるソフトウェアプログラムとして実現されてもよい。また、第二送受信処理部６０および第二データ処理部３０は、例えば、アクセラレータHW（図示されない）として実現されてもよい。当該アクセラレータＨＷとして、例えば、FPGA（Field-Programmable  Gate  Array）、ASIC（Application  Specific  Integrated  Circuit）、コプロセッサ、CPU、のいずれかを用いてもよい。
【００５２】
本実施の形態の説明においては、第一送受信処理部４０および第一データ処理部２０はＣＰＵおよびソフトウェアプログラムとして実現され、第二送受信処理部６０および第二データ処理部３０はFPGAとして実現されるものとする。
【００５３】
ここで、本実施の形態が行うPacking(パッキング)処理について説明する。本実施の形態では、第一データ処理部２０および第二データ処理部３０の間でリングキューおよびmbuf形式を用いて通信するデータのうちパケットデータに関し、バス部１１の制約上その通信が非効率となる部分について、別の連続領域にコピーして通信を行う。これをPacking(パッキング)処理又は単にパッキングと呼ぶ。また、コピーされたデータをPackingデータと呼ぶ。第一データ処理部２０および第二データ処理部３０はパッキングのためのプログラムを含み、当該プログラムを実行することによってパッキングを行い、Packingデータを生成する。当該Packingデータはパケットデータの断片(データピース)である。即ち、Packingデータは通信単位に対して端数分となる端数データである。また、パケットデータが通信単位未満の場合だけでなく、通信パケットデータよりも大きい場合にも端数データは生成される。
【００５４】
本実施の形態では、複数パケットデータからのPackingデータがデータセットとして第一および第二データ処理部２０および３０の連続領域に格納され、バス部１１の制約を満たす状態となった段階で通信を行う。これにより、特にメモリ部１０および第二送受信処理部６０の間において、バス部１１で通信されるデータのうち有用なデータが通信される割合を向上させることができ、バス利用効率を改善することができる。
【００５５】
図３の例を用いてパッキングを説明する。図３（Ａ）の場合、バス部１１の制約を満たしているため、パッキングは不要である。図３（Ｂ）の場合、パケットデータサイズが最小単位サイズの倍数でないため、１２９バイト目〜１３６バイト目がパッキングの対象となり、Packingデータとしてコピーされる。図３（Ｃ）の場合、１バイト目〜５６バイト目および１２１バイト目〜１２８バイト目がパッキングの対象となり、Packingデータとしてコピーされる。
【００５６】
図５を用いて、Packingデータの生成例を示す。あるパケットのPackingデータの最初の１バイトは、Packingデータの有無を示すフラグ（パケットデータ先頭側および末尾側で計２Ｂｉｔ）、およびPackingデータのサイズを示すdata_lenフィールド（フィールド長６Ｂｉｔ、値はバイト単位）から構成される。Packing対象が当該パケットデータの先頭側もしくは末尾側のいずれかについてのみ存在する場合、Packingデータの２バイト目以降は当該対象データとなる。Packing対象が当該パケットデータの先頭側および末尾側の両方について存在する場合、Packingデータの２バイト目は末尾側のデータサイズを示すdata_len2フィールドであり、３バイト目以降が当該対象データ（先頭側、末尾側、の順）となる。
【００５７】
例えば、図３（Ｂ）に対応するPackingデータの構成は図５（Ｂ）であり、data_lenは８となる。この場合、パケットデータの１２９バイト目〜１３６バイト目がdata［0］~data［7］に格納される。また、図３（Ｃ）に対応するPackingデータの構成は図５（Ｃ）であり、data_lenは５６となり、data_len2は８となる。この場合、パケットデータの１バイト目〜５６バイト目がdata［0］~data［55］に格納され、パケットデータの１２１バイト目〜１２８バイト目がdata［56］~data［63］に格納される。
【００５８】
次に、本実施の形態における第一送受信処理部４０の構成例について、図６を用いて説明する。図６に例示する第一送受信処理部４０は、第一IF（インタフェース）部４１と、第一管理部４２と、第一Packing送信処理部４３と、第一Enqueue処理部４４と、第一Packing受信処理部４５と、第一Dequeue処理部４６と、を含んで構成される。
【００５９】
第一IF部４１は、第一データ処理部２０に対し、リングキューを操作するためのインタフェースを提供する。第一IF部４１は、リングキューの生成、リングキューの削除、リングキューへのmbuf構造体ポインタのEnqueue、リングキューからのmbuf構造体ポインタのDequeue、を行うIFを提供する。
【００６０】
第一管理部４２は、メモリ部１０に記憶されるリングキューを管理する。第一管理部４２は、リングキューの生成を要求されると、メモリ部１０上にリングキュー用のメモリ領域を割り当て、初期化を行う。第一管理部４２は、リングキューの削除を要求されると、当該リングキュー用に割り当てられていたメモリ領域を解放する。第一管理部４２は、mbuf構造体ポインタ用のリングキューとともに、Packingデータ用のリングキューを生成および解放する。
【００６１】
第一Packing送信処理部４３は、mbuf構造体ポインタのEnqueue要求を受付け、パッキングを実施したあと、第一Enqueue処理部に（mbuf構造体ポインタやPackingデータ）のEnqueueを要求する。
【００６２】
第一Enqueue処理部４４は、リングキューへのデータ（mbuf構造体ポインタやPackingデータ）のEnqueue処理を行う。
【００６３】
第一Packing受信処理部４５は、mbuf構造体ポインタのDequeue要求を受付け、第一Dequeue処理部４６にデータ（mbuf構造体ポインタやPackingデータ）のDequeueを要求し、パッキングを実施したあと、Dequeueされたmbuf構造体ポインタを返す。
【００６４】
第一Dequeue処理部４６は、リングキューからのデータ（mbuf構造体ポインタやPackingデータ）のDequeue処理を行う。
【００６５】
次に、本実施の形態における第二送受信処理部６０の構成例について、図７を用いて説明する。図７に例示する第二送受信処理部６０は、第二IF部６１と、第二Packing送信処理部６３と、第二パケットデータ送信部６４と、第二mbuf送信部６５と、第二Enqueue処理部６６を備えている。更に、第二送受信処理部６０は、第二Dequeue処理部６８と、第二mbuf受信部６９と、第二パケットデータ受信部７０と、第二Packing受信処理部７１と、メモリアクセス部７３と、を含んで構成される。第二パケットデータ送信部６４、第二mbuf送信部６５、第二mbuf受信部６９、および第二パケットデータ受信部７０もメモリアクセス部７３とのやり取りを行うが、図の煩雑化を避けるためその図示は省略している。
【００６６】
第二IF部６１は、第二データ処理部３０に対し、第一データ処理部２０とパケットを送受信するためのインタフェースを提供する。第二IF部６１は、第二データ処理部３０から例えば以下の送信データを受け取り、第一データ処理部２０に送信する。 
・キューID
・mbuf構造体ポインタ
・mbuf構造体
・送信パケットデータ
【００６７】
第二IF部６１は、第一データ処理部２０からの受信データとして例えば以下を第二データ処理部３０に届ける。 
・キューID
・mbuf構造体ポインタ
・mbuf構造体
・受信パケットデータ
【００６８】
第二Packing送信処理部６３は、送信データを第二IF部６１から受け取り、パッキングの要否を判定し、その結果に基づき第二パケットデータ送信部６４および第二mbuf送信部６５にデータの書き込み等の指示を送る。当該指示には、第二IF部６１から受け取った送信データの全部または一部が含まれる。また、第二Packing送信処理部６３は、Packingデータを生成し、第二Enqueue処理部６６に生成したPackingデータのリングキューへのEnqueueを第二Enqueue処理部６６に要求する。第二Packing送信処理部６３は、送信するmbuf構造体ポインタのリングキューへのEnqueueを第二Enqueue処理部６６に要求する。
【００６９】
第二パケットデータ送信部６４は、第二Packing送信処理部６３からの指示に基づき、メモリアクセス部７３を介してメモリ部１０にパケットデータを書き込む。
【００７０】
第二mbuf送信部６５は、第二Packing送信処理部６３からの指示に基づき、メモリアクセス部７３を介してメモリ部１０にmbuf構造体を書き込む。
【００７１】
第二Enqueue処理部６６は、リングキューへのデータ（mbuf構造体ポインタやPackingデータ）のEnqueue処理を行う。第二Enqueue処理部６６は、メモリアクセス部７３を介してメモリ部１０に記憶されているリングキューの参照および更新をする。第二Enqueue処理部６６は、バス部１１の最小単位サイズの倍数を単位としてEnqueueを行う。第二Enqueue処理部６６は、当該単位未満のデータを一時的に記憶するための内部バッファを持つ。第二Enqueue処理部６６は、リングキュー毎にそのアドレスとキューIDの組を保持する（リングキューテーブル）。第二Enqueue処理部６６は、第一データ処理部２０に対しリングキューテーブルを操作するインタフェース（IF）を提供する。第二Enqueue処理部６６は、mbuf構造体ポインタ用のリングキューのp_ring_ptrフィールドを参照し、当該リングキューおよびキューIDとPackingデータ用リングキューのアドレスの対応を記憶する。
【００７２】
第二Dequeue処理部６８は、リングキューからのデータ（mbuf構造体ポインタやPackingデータ）のDequeue処理を行い、第二Packing受信処理部７１にDequeueしたデータを渡す。その際、第二Dequeue処理部６８は、使用されたリングキューのキューＩＤも渡す。第二Dequeue処理部６８は、メモリアクセス部７３を介してメモリ部１０に記憶されているリングキューの参照および更新をする。第二Dequeue処理部６８は、リングキュー毎にそのアドレスとキューIDの組を保持する（リングキューテーブル）。第二Dequeue処理部６８は、第一データ処理部２０に対しリングキューテーブルを操作するIFを提供する。第二Dequeue処理部６８は、mbuf構造体ポインタ用のリングキューのp_ring_ptrフィールドを参照し、当該リングキューおよびキューIDとPackingデータ用リングキューのアドレスの対応を記憶する。
【００７３】
第二Packing受信処理部７１は、第二Dequeue処理部６８からmbuf構造体ポインタPackingデータを受け取り、当該パケットの処理を行う。第二Packing受信処理部７１は、パッキングの利用の有無を判定し、その結果に基づき第二mbuf受信部６９および第二パケットデータ受信部７０にデータの読み込み等の指示を送る。また、第二Packing受信処理部７１は、Packingデータを用いたパケットデータの復元を行う。第二Packing受信処理部７１は、キューID、mbuf構造体ポインタ、mbuf構造体、パケットデータを含む受信データを生成し、第二IF部６１に通知する。
【００７４】
第二mbuf受信部６９は、第二Packing受信処理部７１からの指示に基づき、指定されたmbuf構造体ポインタを使用して、メモリアクセス部７３を介してメモリ部１０からmbuf構造体を読み込む。
【００７５】
第二パケットデータ受信部７０は、第二Packing受信処理部７１からの指示に基づき、メモリアクセス部７３を介してメモリ部１０に記憶されたパケットデータを読み込む。
【００７６】
メモリアクセス部７３は、バス部１１を介しメモリ部１０からの読み込みおよび書き込みを行う。メモリアクセス部７３は、そのためのIFを提供する。
【００７７】
以上で説明した第二データ処理部３０と第二送受信処理部６０との間、および第二送受信処理部６０内の各部間の接続は、例えば第二送受信処理部６０を実現するHW（例えばFPGA）内のメモリを用いたFIFOにより行われてもよい。その場合、例えば、第二Packing受信処理部７１と第二パケットデータ受信部７０との間にFIFOが設けられ、第二Packing受信処理部７１は指示データをＦＩＦＯに書き込むことで第二パケットデータ受信部７０に指示を行い、第二パケットデータ受信部７０は当該FIFOから読み込むことで指示を受け取る。また、第二パケットデータ受信部７０は読み込んだパケットデータをFIFOに書き込み、第二Packing受信処理部７１は当該FIFOから読み込むことでパケットデータを受け取る。
【００７８】
また、第二Dequeue処理部６８は、リングキューからのDequeueを第二Packing受信処理部７１からのDequeue要求前にあらかじめ行っておいてもよい。その場合、Dequeueされたデータは、第二Packing受信処理部７１との間に設けられたＦＩＦＯに蓄積される。この場合、第二Packing受信処理部７１が第二Dequeue処理部６８にDequeue要求するということは、第二Packing受信処理部７１が当該FIFOからデータを読み込むことを意味する。
【００７９】
本実施の形態が使用するリングキューの構成を図８に、mbuf構造体の構成を図９に示す。これらは、説明を簡単にするためにDPDKで使用されるリングキューおよびmbuf構造体を簡易化した上で、一部拡張したものである。
【００８０】
図８に図示される、本実施の形態が使用するリングキューは主に３つの部分から構成される。一つ目は、最初の６４バイトの部分であり、主にリングキューにEnqueueを行うProducerによって更新される。二つ目は、次の６４バイトにあたる部分であり、主にリングキューからDequeueを行うConsumerによって更新される。３つ目は、先頭から１２８バイト目以降にあたる部分であり、リングキューにEnqueueおよびDequeueされるデータ（８バイト）を記憶するFIFO用配列である（図８のring[0]、ring[1]等）。FIFO用配列は、Producerによって更新され、Consumerによって参照される。以下では、Producerに関連するフィールド等にはpが付され、Consumerに関連するフィールド等にはcが付される。
【００８１】
リングキューの最初の１６バイトは、当該リングキューの名前を記憶するnameフィールドである。p＿sizeフィールドおよびc＿sizeフィールドは、FIFO用配列のサイズ（８バイト単位、すなわちエントリ数）である。p＿ring＿ptrおよびc＿ring＿ptrは、当該リングキューがmbuf構造体ポインタ用であった場合に、関連するPackingデータ用リングキューのアドレスが設定される（DPDKには存在しない）。p＿flagおよびc＿flagはリングキューの利用に関するフラグを格納するフィールドである。これらは、リングキュー生成時に値が設定され、以降更新されることはない。
【００８２】
p＿indexフィールドは、producer  indexであり、FIFO用配列において、次にEnqueueされるデータ（８バイト）を格納すべき配列インデックスを示す。初期値は0であり、producerによってデータがEnqueueされる度に更新される。
【００８３】
c＿indexフィールドは、consumer  indexであり、FIFO用配列において、次にDequeueされるデータ（８バイト）を取り出すべき配列インデックスを示す。初期値は0であり、consumerによってデータがDequeueされる度に更新される。
【００８４】
図８においてグレーで示した部分は、パディングである。
【００８５】
図９に示す、本実施の形態が使用するmbuf構造体の先頭１６バイトは、当該mbuf構造体と対を成すパケットバッファの論理アドレスおよび物理アドレスを保持するbuf＿addrフィールドおよびbuf＿physaddrフィールドで構成される。
【００８６】
buf＿lenフィールドは、当該パケットバッファのサイズ（バイト単位）を示す。data＿offフィールドは、当該パケットバッファ内でのパケットデータ開始位置（バイト単位）を示す。data＿lenフィールドは、当該パケットバッファ内のパケットデータのサイズ（バイト単位）を示す。
【００８７】
mbuf構造体は、Linked  Listを構成することが出来る。例えば、一つのパケットバッファで記憶しきれない大きなパケットを記憶する場合、複数のmbuf構造体およびパケットバッファを用い、それらをLinked  Listで繋げて当該パケットを記憶する。pkt＿lenフィールドは、そのようなパケットの全体のサイズ（バイト単位）を示す。また、nextフィールドはLinked  Listにおける次のmbuf構造体へのポインタを示す。
【００８８】
［第１の実施の形態の動作例］
次に、本実施の形態の構成例として図４〜図９に例示した情報処理装置１における以下の各動作（Ａ）、（Ｂ）、（Ｃ）、（Ｄ）、（Ｅ）、および（Ｆ）について、その一例を、図面を参照しながら順に詳細に説明する。 
（Ａ）リングキュー生成処理
（Ｂ）第一データ処理部２０によるパケット送信処理
（Ｃ）第二データ処理部３０によるパケット受信処理
（Ｄ）第二データ処理部３０によるパケット送信処理
（Ｅ）第一データ処理部２０によるパケット受信処理
（Ｆ）リングキュー解放処理
【００８９】
＜（Ａ）リングキュー生成処理＞
図１０のフローチャートを用いて、情報処理装置１（図４）のリングキュー生成処理が説明される。このリングキュー生成処理はリングキューを生成する処理である。当該処理は、例えば、第一データ処理部２０の動作開始時に実行される。第一データ処理部２０は、当該処理を、第二データ処理部３０との間で使用するmbuf構造体ポインタ用のリングキュー毎に実行し、リングキューを生成する。
【００９０】
第一データ処理部２０は、図６に示された第一送受信処理部４０の第一ＩＦ部４１にリングキューの生成を要求する（ステップＳ１００）。その際、パラメタとして、リングキューの名前とサイズを渡す。当該要求は、第一管理部４２に転送される。
【００９１】
第一管理部４２は、生成するリングキュー用メモリ領域をメモリ部１０（図４）上に割り当てるとともに、各フィールドを以下のように初期化する（ステップＳ１０１）。本リングキューはmbuf構造体ポインタ用である。 
・name： パラメタで与えられた名前
・p＿sizeおよびc＿size： パラメタで与えられたサイズ
・その他のフィールド：0
【００９２】
第一管理部４２は、Packingデータのためのリングキュー用メモリ領域をメモリ部１０上に割り当てるとともに各フィールドを初期化する（ステップＳ１０２）。第一管理部４２は、Packingデータのためのリングキューのサイズを例えば自動で決定する。
【００９３】
この場合、第一管理部４２は、当該サイズをステップＳ１００で与えられたサイズに所定の数値（例えばバス部１１の最小単位サイズ）を乗じた値を用いてもよい。もしくは、第一管理部４２は、第一ＩＦ部４１を通じデータ処理部２０からPackingデータ用リングキューのサイズを受け取ってもよい。第一管理部４２は、Packingデータのためのリングキューの名前を例えば自動で決定する。第一管理部４２は、Packingデータ用リングキューの名前を、ステップＳ１００で与えられた名前に所定の文字列（たとえば“_P”）を追加した文字列を名前として使用してよい。第一管理部４２は、ステップＳ１０１で初期化したmbuf構造体ポインタ用リングキューのp_ring_ptrおよびc_ring_ptrフィールドに本ステップで割り当てたリングキューのアドレスを設定する。
【００９４】
第一管理部４２は、ステップＳ１０１で生成したリングキューのアドレスを、第一ＩＦ部４１を介して第一データ処理部２０に通知する（ステップＳ１０３）。
【００９５】
図４に示された第一データ処理部２０は、図７に示された第二送受信処理部６０の第二Enqueue処理部６６（第二データ処理部３０が送信し第一データ処理部２０が受信する場合）もしくは第二Dequeue処理部６８（第一データ処理部２０が送信し第二データ処理部３０が受信する場合）に、ステップＳ１０３で得られたリングキューのアドレスを設定する（ステップＳ１０４）。
【００９６】
＜（Ｂ）第一データ処理部２０によるパケット送信処理＞
図１１および図１２のフローチャートを用いて、情報処理装置１の第一データ処理部２０が第二データ処理部３０に対しパケットを送信する処理について説明する。当該処理は、例えば、第一データ処理部２０がパケットの処理の一部を第二データ処理部３０にオフロードする際に実行される。
【００９７】
第一データ処理部２０は、リングキューのアドレス（mbuf構造体ポインタ用）およびmbuf構造体ポインタをパラメタとして、第一ＩＦ部４１にEnqueueを要求する（ステップＳ１１０）。
【００９８】
当該要求は第一ＩＦ部４１（図６）によって第一Packing送信処理部４３に転送され、第一Packing送信処理部４３は、当該パケットに関しパッキングが必要か否かを判定する（ステップＳ１１１）。第一Packing送信処理部４３はmbuf構造体ポインタを元にmbuf構造体のbuf_addr、data_off、data_lenを参照し、パケットバッファ内でのパケットデータの位置とサイズを確認する。第一Packing送信処理部４３は、その位置およびサイズがバス部１１の制約を満たさない場合にパッキングが必要と判定し、満たす場合に不要と判定する。パッキングが不要と判定された場合は、ステップＳ１１４に移行する。
【００９９】
第一Packing送信処理部４３は、上述したパッキングに従い、Packingデータを生成する（ステップＳ１１２）。
【０１００】
第一Packing送信処理部４３は、リングキューのp_ring_ptrフィールドを参照してPackingデータ用のリングキューのアドレスを取得し、当該アドレスとステップＳ１１２で生成したPackingデータをパラメタとして、第一Enqueue処理部４４にEnqueue処理を要求する（ステップＳ１１３）。第一Enqueue処理部４４によるEnqueue処理の詳細は後述する。リングキューへのEnqueueは８バイト単位で行う。そのため、第一Packing送信処理部４３は、リングキューへのEnqueueに際し８Ｂ未満のPackingデータが生じた場合、当該データのEnqueueを保留し、次もしくはそれ以降に処理するパケットに関するPackingデータとあわせて８バイト以上となったタイミングでEnqueueを行う。
【０１０１】
第一Packing送信処理部４３は、mbuf構造体ポインタ用のリングキューのアドレスおよびmbuf構造体ポインタをパラメタとして、第一Enqueue処理部４４にEnqueue処理を要求する（ステップＳ１１４）。
【０１０２】
次に、第一Enqueue処理部４４が、リングキューにデータをEnqueueする処理について、図１２を用いて説明する。第一Enqueue処理部４４は、リングキューのアドレスと、Enqueueするデータ（８バイトの倍数のサイズ）と、当該データのサイズ（８バイト単位）と、をパラメタとして受け取る。
【０１０３】
第一Enqueue処理部４４は、Enqueue先のリングキューがＦｕｌｌか否かを判定する（ステップＳ１２０）。第一Enqueue処理部４４は、以下の条件が満たされた場合にリングキューがＦｕｌｌであると判定する。第一Enqueue処理部４４は、リングキューがＦｕｌｌであると判定した場合、処理を終了し失敗応答を返す。もしくは、第一Enqueue処理部４４は、リングキューがＦｕｌｌでない状態になるまで、ステップＳ１２０を繰り返し実行してもよい。
【０１０４】
p_index  -  c_index ＋ Enqueueするデータのサイズ（８バイト単位） ≦  p_size （p_indexがc_index以上の場合）。
【０１０５】
p_index  ＋ 2^32  -  c_index + Enqueueするデータのサイズ（８バイト単位） ≦  p_size （p_indexがc_index未満場合）。
【０１０６】
第一Enqueue処理部４４は、FIFO用配列であるringの配列インデックスp_indexの位置（およびそれ以降）にEnqueueするデータを格納する（ステップＳ１２１）。
【０１０７】
第一Enqueue処理部４４は、ｐ＿ｉｎｄｅｘにEnqueueするデータのサイズ（８バイト単位）を加算する（ステップＳ１２２）。
【０１０８】
＜（Ｃ）第二データ処理部３０によるパケット受信処理＞
図１３および図１４のフローチャートを用いて、情報処理装置１の第二データ処理部３０（図４）が第一データ処理部２０からパケットを受信する処理について説明する。当該処理は、例えば、第一データ処理部２０がパケットの処理の一部を第二データ処理部３０にオフロードする際に実行される。
【０１０９】
第二Packing受信処理部７１（図７）は、mbuf構造体ポインタのDequeueを第二Dequeue処理部６８に要求し、第二Dequeue処理部６８はDequeueしたmbuf構造体ポインタをキューIDとともに返す（ステップＳ１３０）。このときの第二Dequeue処理部６８の動作については後述する。上述したように第二Packing受信処理部７１によるDequeueの要求は、第二Packing受信処理部７１および第二Dequeue処理部６８間に設けられたＦＩＦＯへの読み込み要求によって実現されてもよい。第二Dequeue処理部６８は継続的にDequeue処理を行っておき、Dequeueされたデータを当該FIFOに書き込んでおいてもよい。
【０１１０】
第二Packing受信処理部７１は、ステップＳ１３０で得られたmbuf構造体ポインタを元に、第二mbuf受信部６９にmbuf構造体の読み込みを指示し、第二mbuf受信部６９はメモリアクセス部７３を介してメモリ部１０からmbuf構造体を読み込む（ステップＳ１３１）。
【０１１１】
第二Packing受信処理部７１は、当該パケットに関しパッキングが利用されているか否かを判定する（ステップＳ１３２）。第二Packing受信処理部７１は、ステップＳ１１１における第一Packing送信処理部４３と同様の方法で判定を行う。すなわち、第二Packing受信処理部７１はmbuf構造体のbuf_addr、data_off、data_lenを参照し、パケットバッファ内でのパケットデータの位置とサイズを確認する。第二Packing受信処理部７１は、その位置およびサイズがバス部１１の制約を満たす場合にパッキングが利用されていないと判定し、満たさない場合に利用されていると判定する。パッキングが利用されている場合、第二Packing受信処理部７１は、第二パケットデータ受信部７０にパケットデータ（バス部１１の制約を満たす部分のみ）の読み込みを指示する（ステップＳ１３３に移行）。パッキングが利用されていない場合、第二Packing受信処理部７１は、第二パケットデータ受信部７０にパケットデータ全体の読み込みを指示する（ステップＳ１３６に移行）。
【０１１２】
第二パケットデータ受信部７０は、メモリアクセス部７３を介してメモリ部１０からパケットデータの指定された部分を読み込む（ステップＳ１３３、ステップＳ１３６）。
【０１１３】
第二Packing受信処理部７１は、第二Dequeue処理部６８にPackingデータのDequeueを要求し、Packingデータを取得する（ステップＳ１３４）。なお、PackingデータのDequeueはバス部１１の最小単位サイズの倍数を単位として行われる。第二Packing受信処理部７１はDequeueされたPackingデータを内部的に記憶し、必要になった際に都度参照し、必要な分だけ消費する。本ステップにおいて、第二Packing受信処理部７１は、内部的に記憶されたPackingデータが不足となった場合に、PackingデータのDequeueを第二Dequeue処理部６８に要求する。
【０１１４】
第二Packing受信処理部７１は、ステップＳ１３３で読み込んだパケットデータ（バス部１１の制約を満たす部分のみ）に、ステップＳ１３４で得られたPackingデータに含まれるパケットデータの一部（先頭側、末尾側、の一方または両方）を追加し、パケットデータを復元する（ステップＳ１３５）。
【０１１５】
第二パケットデータ受信部７０は、キューＩＤ、mbuf構造体ポインタ、mbuf構造体、パケットデータを含む受信データを作成し、第二ＩＦ部６１を介して当該受信データを第二データ処理部３０（図４）に通知する（ステップＳ１３７）。
【０１１６】
次に、図７に示された第二Dequeue処理部６８が、リングキューからデータをDequeueする処理について、図１４を用いて説明する。第二Dequeue処理部６８は、例えば、リングキューテーブルに登録されているリングキュー（mbuf構造体ポインタ用）、およびそれらに関連付けられたPackingデータ用リングキュー、それぞれについて以下の動作を行う。
【０１１７】
第二Dequeue処理部６８は、Dequeue元のリングキューにデータがあるか否かを判定する（ステップＳ１４０）。第二Dequeue処理部６８は、リングキューのp_indexとc_indexが等しくない場合にデータがあると判定し、等しい場合にデータがない（キューが空）であると判定する。第二Dequeue処理部６８は、リングキューにデータがない場合、処理を終了し失敗応答を返す。もしくは、第二Dequeue処理部６８は、リングキューが空でなくなるまでステップＳ１４０を繰り返し実行してもよい。
【０１１８】
第二Dequeue処理部６８は、FIFO用配列に格納されているデータのサイズを確認し、バス部１１の最小単位サイズ以上か否かを判定する（ステップＳ１４１）。ＦＩＦＯ用配列に格納されているデータのサイズ（バイト単位）は以下により計算する。
（p_index-c_index）*8 （p_indexがc_index以上の場合）
（c_index-p_index）*8 （p_indexがc_index未満の場合）
【０１１９】
第二Dequeue処理部６８は、格納されているデータのサイズがバス部１１の最小単位サイズ未満である場合、処理を終了し失敗応答を返す。もしくは、第二Dequeue処理部６８は、条件が満たされるまでステップＳ１４１を繰り返し実行してもよい。
【０１２０】
第二Dequeue処理部６８は、FIFO用配列であるringの配列インデックスc_indexの位置に格納されているデータ（バス部１１の最小単位サイズの整数倍）を、メモリアクセス部７３を介してメモリ部１０から読み込む（ステップＳ１４２）。
【０１２１】
第二Dequeue処理部６８は、取り出したデータのサイズを８で割った値をc_indexに加算し、メモリアクセス部７３を介してメモリ部１０上のリングキューに書き込む（ステップＳ１４３）。
【０１２２】
＜（Ｄ）第二データ処理部３０によるパケット送信処理＞
図１５および図１６のフローチャートを用いて、情報処理装置１の第二データ処理部３０（図４）が第一データ処理部２０に対しパケットを送信する処理について説明する。当該処理は、例えば、第二データ処理部３０がオフロード処理後のパケット部を第一データ処理部２０に送信する際に実行される。
【０１２３】
第二データ処理部３０は、第二ＩＦ部61に対しパケットの送信を要求する（ステップＳ１５０）。その際、第二データ処理部３０は、キューID、mbuf構造体ポインタ、mbuf構造体、パケットデータを送信データとして渡す。
【０１２４】
第二ＩＦ部６１は送信データを第二Packing送信処理部６３に渡し、第二Packing送信処理部６３は、当該パケットについてパッキングが必要か否かを判定する（ステップＳ１５１）。第二Packing送信処理部６３は、mbuf構造体のbuf_addr、data_off、data_lenを参照し、パケットバッファ内でのパケットデータの位置とサイズを確認する。第二Packing送信処理部６３は、その位置およびサイズがバス部１１の制約を満たさない場合にパッキングが必要と判定し、満たす場合に不要と判定する。パッキングが不要と判定された場合は、第二Packing送信処理部６３はパケットデータの書き込みを第二パケットデータ送信部６４に指示する（ステップＳ１５５に移行）。その際、第二Packing送信処理部６３は、書き込み対象領域としてパケットデータ全体を指定する。
【０１２５】
第二Packing送信処理部６３は、上述したパッキングに従い、Packingデータを生成する（ステップＳ１５２）。
【０１２６】
第二Packing送信処理部６３は、生成したPackingデータのEnqueueを第二Enqueue処理部６６に要求し、第二Enqueue処理部６６はEnqueueを行う（ステップＳ１５３）。第二Enqueue処理部６６によるEnqueue処理については後述する。その後、第二Packing送信処理部６３はパケットデータのうちバス部１１の制約を満たす部分の書き込みを第二パケットデータ送信部６４に指示する。
【０１２７】
第二パケットデータ送信部６４は、メモリアクセス部７３を介してメモリ部１０にパケットデータのうち指定された部分を書き込む（ステップＳ１５４、ステップＳ１５５）。
【０１２８】
第二Packing送信処理部６３は、第二mbuf送信部６５にmbuf構造体の書き込みを指示し、第二mbuf送信部６５は、メモリアクセス部７３を介してメモリ部１０にmbuf構造体を書き込む（ステップＳ１５６）。
【０１２９】
第二Packing送信処理部６３は、mbuf構造体ポインタのリングキューへのEnqueueを第二Enqueue処理部６６に要求し、第二Enqueue処理部６６はEnqueue処理を行う（ステップＳ１５７）。
【０１３０】
次に、第二Enqueue処理部６６が、リングキューにデータをEnqueueする処理について、図１６を用いて説明する。第二Enqueue処理部６６は、リングキューのキューIDと、Enqueueするデータ（８バイトの倍数のサイズ）と、当該データのサイズ（８バイト単位）と、をパラメタとして受け取る。
【０１３１】
第二Enqueue処理部６６は、入力データを内部バッファに追加する（ステップＳ１６０）。
【０１３２】
第二Enqueue処理部６６は、内部バッファに記憶されたデータのサイズがバス部１１の最小単位サイズか確認する（ステップＳ１６１）。最小単位サイズ未満の場合、第二Enqueue処理部６６は本処理を終了する。
【０１３３】
第二Enqueue処理部６６は、Enqueue先のリングキューにバス部１１の最小単位サイズ以上の空きがあるか否かを判定する（ステップＳ１６２）。第二Enqueue処理部６６は、以下の条件が満たされた場合にバス部１１の最小単位サイズ以上の空きがある判定する。なお、MAX（A，B）はAとBの大きい方を意味する。
【０１３４】
p_index  -  c_index + MAX（Enqueueするデータ（内部バッファ内データ）のサイズ（８バイト単位）、最小単位サイズ（バイト単位） ／  ８） ≦  p_size （p_indexがc_index以上の場合）。
【０１３５】
p_index  + 2^32  -  c_index +MAX（Enqueueするデータ（内部バッファ内データ）のサイズ（８バイト単位）、最小単位サイズ（バイト単位） ／  ８） ≦  p_size （p_indexがc_index未満場合）。
【０１３６】
第二Enqueue処理部６６は、リングキューに空きがないと判定した場合、処理を終了する。
【０１３７】
第二Enqueue処理部６６は、メモリアクセス部７３を介し、FIFO用配列であるringの配列インデックスp_indexの位置（およびそれ以降）にEnqueueするデータ（内部バッファ内データ）を書き込む（ステップＳ１６３）。なお、第二Enqueue処理部６６は、バス部１１の最小単位サイズの倍数を単位としてデータを書き込む。
【０１３８】
第二Enqueue処理部６６は、p_indexにステップＳ１６２でEnqueueしたデータのサイズ（８バイト単位）を加算し、メモリアクセス部７３を介しメモリ部１０に記憶されたリングキューのp_indexフィールドに書き込む（ステップＳ１６４）。
【０１３９】
＜（Ｅ）第一データ処理部２０によるパケット受信処理＞
図１７のフローチャートを用いて、情報処理装置１の第一データ処理部２０（図４）が第二データ処理部３０からパケットを受信する処理について説明する。当該処理は、例えば、第一データ処理部２０がオフロード処理後のパケットを第二データ処理部３０から受信する際に実行される。
【０１４０】
第一データ処理部２０は、リングキューのアドレス（mbuf構造体ポインタ用）をパラメタとして、第一IF部４１（図６）にDequeueを要求する（ステップＳ１７０）。
【０１４１】
当該要求は第一IF部４１によって第一Packing受信処理部４５に転送され、第一Packing受信処理部４５は、第一Dequeue処理部４６にmbuf構造体ポインタのDequeueを要求し、第一Dequeue処理部４６は、リングキューからmbuf構造体ポインタをDequeueする（ステップＳ１７１）。第一Dequeue処理部４６によるDequeue処理については後述する。
【０１４２】
第一Packing受信処理部４５は、当該パケットに関しパッキングが利用されているかを判定する（ステップＳ１７２）。第一Packing受信処理部４５は、ステップＳ１５１における第二Packing送信処理部６３と同様の方法で判定を行う。すなわち、第一Packing受信処理部４５は、mbuf構造体ポインタを元にmbuf構造体のbuf_addr、data_off、data_lenを参照し、パケットバッファ内でのパケットデータの位置とサイズを確認する。第一Packing受信処理部４５は、その位置およびサイズがバス部１１の制約を満たさない場合にパッキングが利用されている判定し、満たさない場合に利用されていないと判定する。パッキングが利用されていない場合、ステップＳ１７７に移行する。
【０１４３】
第一Packing受信処理部４５は、PackingデータのDequeueを第一Dequeue処理部４６に要求する（ステップＳ１７３）。
【０１４４】
第一Dequeue処理部４６は、リングキューからPackingデータをDequeueし第一Packing受信処理部４５に通知する（ステップＳ１７４）。第一Dequeue処理部４６によるDequeue処理については後述する。
【０１４５】
第一Packing受信処理部４５は、DequeueされたPackingデータを処理する（ステップＳ１７５）。具体的には、第一Packing受信処理部４５は、Packingデータにパケットデータ先頭側のデータが含まれる場合、当該データを、mbuf構造体のbuf_addrフィールドおよびdata_offフィールドの値を足して得られるアドレスに書き込む。また、第一Packing受信処理部４５は、Packingデータにパケットデータ末尾側のデータが含まれる場合、当該データを、以下により得られるアドレスに書き込む。 
mbuf構造体のbuf_addrフィールド値＋data_offフィールド値＋data_lenフィールド値−当該データのサイズ
【０１４６】
第一Packing受信処理部４５は、ステップＳ１７１で得られたmbuf構造体ポインタを、第一IF部４１を介して第一データ処理部２０に通知する（ステップＳ１７６）。
【０１４７】
ステップＳ１７１およびステップＳ１７４における第一Dequeue処理部４６によるリングキューからのDequeue処理は、基本的に、図１４を用いて説明した第二Dequeue処理部６８によるDequeue処理と同様である。ただし、第一Dequeue処理部４６は、リングキューアドレスを、Dequeue要求者からのパラメタとして取得する。また、第一Dequeue処理部４６は、メモリ部１０上のリングキューの参照および更新にメモリアクセス部７３（図７）を使用しない。また、第一Dequeue処理部４６は、図１４に示されたステップＳ１４１を省略してもよく、ステップＳ１４２およびステップＳ１４３において、バス部１１の最小単位サイズ未満のサイズのデータを取り出してもよい。
【０１４８】
＜（Ｆ）リングキュー解放処理＞
図１８のフローチャートを用いて、情報処理装置１がリングキューを解放する処理について説明する。当該処理は、例えば、第一データ処理部２０の動作終了時に実行される。第一データ処理部２０は、当該処理を、第二データ処理部３０との間で使用するmbuf構造体ポインタ用のリングキュー毎に実行する。
【０１４９】
第一データ処理部２０は、第二Enqueue処理部６６（図７）（第二データ処理部３０が送信し第一データ処理部２０が受信する場合）もしくは第二Dequeue処理部６８（第一データ処理部２０が送信し第二データ処理部３０が受信する場合）に、リングキューのアドレス削除を要求する（ステップＳ１８０）。
【０１５０】
第一データ処理部２０は、第一IF部４１にリングキューの解放を要求する（ステップＳ１８０）。その際、パラメタとして、リングキューのアドレスを渡す。当該要求は、第一管理部４２に転送される。
【０１５１】
第一管理部４２（図６）は、パラメタで与えられたリングキューのp_ring_ptrフィールドを参照してPackingデータ用のリングキューのアドレスを取得し、当該リングキュー用のメモリ領域を解放する（ステップＳ１８２）。
【０１５２】
第一管理部４２は、パラメタ与えられたリングキュー用のメモリ領域を解放する（ステップＳ１８３）。
【０１５３】
以上に詳細に説明したように、本実施の形態においては、次のような効果が得られる。
【０１５４】
まず、図４に示された第一データ処理部２０がリングキューを用いて、mbuf形式でメモリ部１０に記憶されたパケットを第二データ処理部３０に送信する場合について説明する。本実施の形態によれば、第一データ処理部２０が使用するmbuf構造体ポインタ用リングキューを生成する際、第一送受信処理部４０はPackingデータ用のリングキューも生成する。第一データ処理部２０がmbuf構造体ポインタ用リングキューにmbuf構造体ポインタをEnqueueするものとする。この場合、第一送受信処理部４０は、当該パケットのパケットデータのうち、バス部１１の制約を満たさない部分をまとめたPackingデータを生成し、当該PackingデータをPackingデータ用のリングキューにEnqueueする。
【０１５５】
また、第二データ処理部３０が第一データ処理部２０からリングキューを用いてパケットを受信するものとする。この場合、第二送受信処理部６０はmbuf構造体ポインタをリングキューからDequeueするとともに、mbuf構造体を読み込む。第二送受信処理部６は、当該パケットのパケットデータのうちバス部１１の制約に整合する部分(バス部１１の通信単位に合致する部分)についてはパケットバッファから読み込む。一方、第二送受信処理部６０は、パケットデータのうちバス部１１の制約に整合しない部分(バス部１１の通信単位に合致しない部分)についてはPackingデータ用のリングキューからPackingデータ(端数データ)として読み込む。その際、第二送受信処理部６０は、バス部１１の最小単位サイズの倍数を単位としてPackingデータのDequeueを行う。第二送受信処理部６０は、パケットバッファから読み込んだパケットデータを必要に応じPackingデータによって更新した上で、mbuf構造体等とともに第二データ処理部３０に通知する。
【０１５６】
ここで、第二データ処理部３０がリングキューを用いて、mbuf形式でメモリ部１０に記憶されたパケットを第一データ処理部２０に送信する場合について説明する。この場合、本実施の形態によれば、第一データ処理部２０が使用するmbuf構造体ポインタ用リングキューを生成する際、第一送受信処理部４０はPackingデータ用のリングキューも生成する。ここで、第二データ処理部３０がmbuf構造体ポインタ用リングキューにmbuf構造体ポインタをEnqueueするものとする。この場合、第二送受信処理部６０は、当該パケットのパケットデータのうち、バス部１１の制約を満たさない部分をまとめたPackingデータを生成し、当該PackingデータをPackingデータ用のリングキューにEnqueueする。その際、第二送受信処理部６０は、バス部１１の最小単位サイズの倍数を単位としてPackingデータをEnqueueする。また、第二送受信処理部６０は、mbuf構造体をmbuf構造体ポインタで示されるメモリ領域に書き込むとともに、パケットデータのうちバス部１１の制約に整合する部分について、パケットバッファに書き込む。
【０１５７】
また、第一データ処理部２０が第二データ処理部３０からリングキューを用いてパケットを受信する場合について説明する。この場合、第一送受信処理部４０は、mbuf構造体ポインタをリングキューからDequeueし、必要に応じてPackingデータ用のリングキューからPackingデータをDequeueして当該パケットのパケットデータのうちバス部１１の制約に整合しない部分について当該Packingデータを用いて更新する。その後、第一送受信処理部４０は、Dequeueしたmbuf構造体ポインタを第一データ処理部２０に通知する。
【０１５８】
これにより、バス部１１の制約を満たさない部分のパケットデータはPackingデータとしてバス部１１の制約を満たす状態で通信されることとなり、バス利用効率低下を抑制することができる。
【０１５９】
よって、本実施の形態によれば、モジュール間でメモリおよびバスを介したデータ通信を行う際のバス利用効率低下を抑制する効果を得ることができる。
【０１６０】
なお、本実施の形態の説明では、情報処理装置１が、パケットデータの先頭側および末尾側の部分パケットデータの存在を、Packingデータの先頭２Ｂｉｔを使って表す例を示したが、本発明はこれに限定されるものではない。他の例として、情報処理装置１は、当該部分パケットデータの存在を、Packingデータの先頭２Ｂｉｔに代えて、もしくは加えて、mbuf構造体ポインタ用リングキューにEnqueueおよびDequeueするデータ（８バイト）の一部として表してもよい。例えば、当該データ（８バイト）の先頭２Ｂｉｔを部分パケットデータの存在を示す２Ｂｉｔとして用い、残りの６２Ｂｉｔをmbuf構造体ポインタとして用いてもよい。その場合、第一送受信処理部４０および第二送受信処理部６０は、第一データ処理部２０および第二データ処理部３０にリングキューからDequeueしたmbuf構造体ポインタを渡す際、Dequeueされたデータの先頭２Ｂｉｔを０に設定した上で渡す。そのような構成をとることで、Packingデータ用リングキューへのアクセス頻度を下げる効果が得られる。
【０１６１】
また、本実施の形態の説明では、情報処理装置１が、mbuf構造体ポインタ用リングキューとは別にPackingデータ用リングキューを生成しPackingデータの通信に使用する例を示したが、本発明はこれに限定されるものではない。他の例として、情報処理装置１は、mbuf構造体ポインタ用リングキューを用いてPackingデータを通信してもよい。その場合、第一送受信処理部４０および第二送受信処理部６０は、PackingデータのEnqueueを、Packingデータ用のリングキューに対してではなくmbuf構造体用のリングキューに対して行う。また、第一送受信処理部４０および第二送受信処理部６０は、PackingデータのDequeueを、Packingデータ用のリングキューからではなくmbuf構造体用のリングキューから行う。
【０１６２】
第一送受信処理部４０および第二送受信処理部６０は、mbuf構造体ポインタ用のリングキューにEnqueueおよびDequeueするデータがmbuf構造体ポインタであるかPackingデータであるかの区別を、例えば、先頭の１Ｂｉｔを用いて行う。その場合、第一送受信処理部４０および第二送受信処理部６０は、第一データ処理部２０および第二データ処理部３０にリングキューからDequeueしたmbuf構造体ポインタを渡す際、Dequeueされたデータの先頭１Ｂｉｔを０に設定した上で渡す。第一送受信処理部４０および第二送受信処理部６０は、Packingデータのサイズが８バイトの倍数でない場合、パディングを追加して８バイトの倍数のサイズにしたうえで、mbuf構造体ポインタ用のリングキューにEnqueueおよびDequeueしてもよい。第一送受信処理部４０は、第一データ処理部２０の要求によりリングキューを生成する際、Packingデータ用のリングキューを生成しなくてよい。また、第一送受信処理部４０は、リングキューを生成する際、第一データ処理部２０によって与えられたサイズとは異なるサイズのリングキューを生成してもよい。例えば、第一送受信処理部４０は、与えられたサイズにバス部１０の最小単位サイズを乗じた値のサイズのリングキューを生成してもよい。そのような構成をとることで、使用するメモリ領域のサイズを減らしたり、メモリ部１０へのアクセス頻度を下げたりする効果が得られる。
また、情報処理装置１は、mbuf構造体ポインタ用リングキューを用いてPackingデータを通信する場合に、mbuf構造体ポインタとPackingデータとを交互にリングキューを用いて通信する代わりに、所定の数のパケット毎に、mbuf構造体ポインタを連続して通信し、その後それらに関するPackingデータを連続して通信することとしてもよい。そのような構成をとり、さらに、第一Packing受信処理部４５がmbuf構造体ポインタをDequeueした際に（ステップＳ１７１）、当該mbuf構造体ポインタに対してプリフェッチ命令（先読み命令）を実行することで、CPUキャッシュミスを抑制することが出来る。
【０１６３】
また、本実施の形態の説明では、情報処理装置１が、パッキングの要否を、パケットデータの位置やサイズがバス部１１の制約を満たしているか否かによってのみ判定する例を示したが本発明はこれに限定されるものではない。他の例として、情報処理装置１は、パケットサイズが所定の値より小さい場合にのみパッキングを使用する、という条件を追加で用いてもよい。そのような構成をとることで、パッキングによる負荷を下げる効果が得られる。また、他の例として、情報処理装置１は、パケット毎に当該パケットに対しパッキングを使用するか否かの情報を第一データ処理部２０もしくは第二データ処理部３０から受け取り、当該情報に基づきパッキングの利用有無を切り替えてもよい。
【０１６４】
パケットデータの位置およびサイズ以外の情報をも使用してパッキングの利用有無を切り替える場合について説明する。この場合、第一送受信処理部４０および第二送受信処理部６０は、処理するパケット毎に当該パケットに関しパッキングを利用するかしないかを示すフラグを設け、当該フラグを参照して当該パケットに関しパッキングを行うか行わないかを切り替える。第一送受信処理部４０および第二送受信処理部６０は、例えば、当該フラグをmbuf構造体ポインタもしくはmbuf構造体のいずれかの場所に記録する。
【０１６５】
また、本実施の形態の説明では、情報処理装置１が、パケットの通信にリングキューおよびmbuf形式を用いる例を示したが本発明はこれに限定されるものではない。他の例として、情報処理装置１は、例えば、仮想化技術で用いられるVirtioをパケットの通信に用いてもよい。その場合、情報処理装置１は、mbuf構造体ポインタ用リングキューの代わりにVirtioキューを用いる。更に、情報処理装置１は、パケットバッファの位置およびサイズを管理するデータ構造として、mbuf構造体の代わりに、virtio  ring  descriptor（vring_deSc構造体）を使用する。情報処理装置１は、図８に示したリングキューのデータ構造の代わりに、vring_avail構造体およびvring_used構造体を使用する。情報処理装置１は、mbuf構造体ポインタの代わりに、vring構造体のdescフィールドで示されるvring_desc構造体配列へのインデックスを使用する。情報処理装置１は、Packingデータの通信にリングキューを使用する。
また、本実施の形態では、例えばCPUによって実行されるソフトウェアプログラムとして実現される第一送受信処理部４０および第一データ処理部２０と、例えば、FPGAによって実現される第二送受信処理部６０および第二データ処理部３０とが、通信する例を示したが、本発明はこれに限定されるものではない。例えば、他の例として、例えばCPUによって実行されるソフトウェアプログラムとして実現される第一送受信処理部４０および第一データ処理部２０と、別の第一送受信処理部４０および第一データ処理部２０と、が通信してもよい。同様に、例えば、FPGAによって実現される第二送受信処理部６０および第二データ処理部３０と、別の第二送受信処理部６０および第二データ処理部３０と、が通信してもよい。
【０１６６】
［第２の実施の形態の説明］
第１の実施の形態では、パケットデータのうちバス部１１の制約に整合しない部分をPackingデータとする例を示したが、本発明はこれに限定されるものではない。他の例として、mbuf構造体の一部をPackingデータに含め、第二送受信処理部６０はメモリ部１０に記憶されたmbuf構造体を直接参照もしくは更新しない構成としてもよい。
【０１６７】
以降、本発明の第２の実施の形態について図面を参照して詳細に説明する。なお、本実施の形態の説明において参照する各図面において、本発明の第１の実施の形態と同一の構成および同様に動作するステップには同一の符号を付して本実施の形態における詳細な説明を省略する。
【０１６８】
［第２の実施の形態の構成例］
本実施の形態の構成例について、図１９〜図２２を用いて説明する。
【０１６９】
図１９は、本発明の第２の実施の形態に係る情報処理装置２の構成の一例を示す構成図である。図１９に例示する情報処理装置２は、メモリ部１０と、バス部１１と、第一データ処理部２０と、第二データ処理部３０と、第一送受信処理部４０Ｂと、第二送受信処理部６０Ｂと、を含んで構成される。即ち、第一送受信処理部４０Ｂと、第二送受信処理部６０Ｂの構成が図４に示された第一送受信処理部４０と、第二送受信処理部６０と異なっている。尚、図１９示す構成要素の数や接続関係は一例である。
【０１７０】
第一送受信処理部４０Ｂは、リングキューを用いてデータを第二送受信処理部６０Ｂとの間で通信する。その詳細は後述する。
【０１７１】
第二送受信処理部６０Ｂは、リングキューを用いてデータを第一送受信処理部４０Ｂとの間で通信する。その詳細は後述する。
【０１７２】
ここで、本実施の形態が行うパッキングについて説明する。本実施の形態では、第１の実施の形態で説明したパッキングに加え、mbuf構造体もパッキングで扱う。本実施の形態におけるパッキングでは、mbuf構造体のフィールドの内、第二データ処理部３０および第二送受信処理部６０が必要とする情報のみを含むPackingデータを生成する。第二データ処理部３０および第二送受信処理部６０Ｂが必要とする情報が図２０に示されている。即ち、図２０は、mbuf構造体のbuf_physaddrフィールド、data_offフィールド、data_lenフィールドである場合の、mbuf構造体に関するPackingデータの構成例である。一般的なパケットサイズを考えた場合、data_offフィールド、data_lenフィールドのフィールド長は１５Ｂｉｔ以下で十分である。本実施の形態では、Packingデータのdata_offフィールドの最初の２Ｂｉｔは常に０であるとする。これにより、図５に示したパケットデータに関するPackingデータと、mbuf構造体に関するPackingデータを区別することが出来る。図２０の例では、当該２Ｂｉｔの後に、１５Ｂｉｔ長のdata_offフィールド、および１５Ｂｉｔ長のdata_lenフィールドが続く。
【０１７３】
次に、本実施の形態における第一送受信処理部４０Ｂの構成例について、図２１を用いて説明する。図２１に例示する第一送受信処理部４０Ｂは、第一ＩＦ部４１と、第一管理部４２と、第一Packing送信処理部４３Ｂと、第一Enqueue処理部４４と、第一Packing受信処理部４５Ｂと、第一Dequeue処理部４６と、を含んで構成される。
【０１７４】
第一Packing送信処理部４３Ｂは、mbuf構造体ポインタのEnqueue要求を受付け、上述したパッキングを実施したあと、第一Enqueue処理部にmbuf構造体ポインタおよびPackingデータのEnqueueを要求する。
【０１７５】
第一Packing受信処理部４５Ｂは、mbuf構造体ポインタのDequeue要求を受付け、第一Dequeue処理部４６にmbuf構造体ポインタおよびPackingデータのDequeueを要求し、上述したパッキングに基づくmbuf構造体およびパケットデータの更新を実施したあと、Dequeueされたmbuf構造体ポインタを返す。
【０１７６】
次に、本実施の形態における第二送受信処理部６０Ｂの構成例について、図２２を用いて説明する。図２２に例示する第二送受信処理部６０Ｂは、第二IF部６１と、第二Packing送信処理部６３Ｂと、第二パケットデータ送信部６４と、第二mbuf送信部６５と、第二Enqueue処理部６６と、第二Dequeue処理部６８と、第二mbuf受信部６９と、第二パケットデータ受信部７０と、第二Packing受信処理部７１Ｂと、メモリアクセス部７３と、を含んで構成される。
【０１７７】
第二Packing送信処理部６３Ｂは、送信データを第二IF部６１から受け取り、パッキングの要否を判定し、その結果に基づき第二パケットデータ送信部６４および第二mbuf送信部６５に指示を送る。当該指示には、第二IF部６１から受け取った送信データの全部または一部が含まれる。また、第二Packing送信処理部６３Ｂは、Packingデータを生成し、第二Enqueue処理部６６に生成したPackingデータのリングキューへのEnqueueを要求する。また、第二Packing送信処理部６３Ｂは、第二Enqueue処理部６６にmbuf構造体ポインタのリングキューへのEnqueueを要求する。
【０１７８】
第二Packing受信処理部７１Ｂは、第二Dequeue処理部６８からDequeueされたmbuf構造体ポインタおよびPackingデータをキューIDとともに受け取り、それらの処理方法を決定する。第二Packing受信処理部７１Ｂは、必要に応じ、第二mbuf受信部６９にmbuf構造体の読み込みを指示する。第二Packing受信処理部７１Ｂは、Packingデータにmbuf構造体の一部が含まれている場合、当該データを用いてmbuf構造体を生成する。第二Packing受信処理部７１Ｂは、第二パケットデータ受信部７０にパケットデータの読み込みを指示する。第二Packing受信処理部７１Ｂは、mbuf構造体ポインタ、キューID（mbuf構造体ポインタ用リングキュー）、mbuf構造体ポインタ、mbuf構造体、Packingデータ、を含む受信データを生成し、第二IF部６１へ通知する。
【０１７９】
［第２の実施の形態の動作例］
次に、本実施の形態の構成例として図１９〜図２２に例示した情報処理装置２における以下の各動作（Ｂ）、（Ｃ）、（Ｄ）、および（Ｅ）について、その一例を、図面を参照しながら詳細に説明する。 
（Ｂ）第一データ処理部２０によるパケット送信処理
（Ｃ）第二データ処理部３０によるパケット受信処理
（Ｄ）第二データ処理部３０によるパケット送信処理
（Ｅ）第一データ処理部２０によるパケット受信処理
【０１８０】
＜（Ｂ）第一データ処理部２０によるパケット送信処理＞
図２３のフローチャートを用いて、情報処理装置２の第一データ処理部２０が第二データ処理部３０に対しパケットを送信する処理について説明する。
【０１８１】
第一データ処理部２０は、リングキューのアドレス（mbuf構造体ポインタ用）およびmbuf構造体ポインタをパラメタとして、第一IF部４１にEnqueueを要求する（ステップＳ１１０）。
【０１８２】
当該要求は第一IF部４１によって第一Packing送信処理部４３Ｂに転送され、第一Packing送信処理部４３Ｂは、当該パケットに関しパッキングが必要か否かを判定する（ステップＳ１１１Ｂ）。本実施の形態においては、常にパッキングが必要と判定する。
【０１８３】
第一Packing送信処理部４３Ｂは、上述したパッキングに従い、mbuf構造体に関するPackingデータおよびパケットデータに関するPackingデータを生成する（ステップＳ１１２Ｂ）。ただし、第一Packing送信処理部４３Ｂは、パケットデータがバス部１１の制約を満たす場合、パケットデータに関するPackingデータを生成しなくてよい。
【０１８４】
第一Packing送信処理部４３Ｂは、リングキューのp_ring_ptrフィールドを参照してPackingデータ用のリングキューのアドレスを取得し、当該アドレスとステップＳ１１２Ｂで生成したPackingデータをパラメタとして、第一Enqueue処理部４４にEnqueue処理を要求する（mbuf構造体、パケットデータ、の順）（ステップＳ１１３Ｂ）。
【０１８５】
第一Packing送信処理部４３Ｂは、mbuf構造体ポインタ用のリングキューのアドレスおよびmbuf構造体ポインタをパラメタとして、第一Enqueue処理部４４にEnqueue処理を要求する（ステップＳ１１４Ｂ）。
【０１８６】
＜（Ｃ）第二データ処理部３０によるパケット受信処理＞
図２４のフローチャートを用いて、情報処理装置２の第二データ処理部３０が第一データ処理部２０からパケットを受信する処理について説明する。
【０１８７】
第二Packing受信処理部７１Ｂ（図２２）は、mbuf構造体ポインタのDequeueを第二Dequeue処理部６８に要求し、第二Dequeue処理部６８はDequeueしたmbuf構造体ポインタをキューIDとともに返す（ステップＳ２００）。
【０１８８】
第二Packing受信処理部７１Ｂは、PackingデータのDequeueを第二Dequeue処理部６８に要求し、第二Dequeue処理部６８はDequeueしたPackingデータをキューIDとともに返す（ステップＳ２０１）。なお、PackingデータのDequeueはバス部１１の最小単位サイズの倍数を単位して行われる。第二Packing受信処理部７１ＢはDequeueされたPackingデータを内部的に記憶し、必要になった際に都度参照し、必要な分だけ消費する。本ステップにおいて、第二Packing受信処理部７１Ｂは、内部的に記憶されたPackingデータが不足となった場合に、PackingデータのDequeueを第二Dequeue処理部６８に要求する。
【０１８９】
第二Packing受信処理部７１Ｂは、DequeueされたPackingデータがmbuf構造体に関するものか否かを判定する（ステップ２０２）。第二Packing受信処理部７１Ｂは、最初の２Ｂｉｔがいずれも０である場合に、当該Packingデータがmbuf構造体に関するものであると判定する。
【０１９０】
Packingデータがmbuf構造体に関するものであった場合、第二Packing受信処理部７１Ｂは、当該Packingデータからmbuf構造体を生成する（ステップＳ２０３）。具体的には、第二Packing受信処理部７１Ｂは、mbuf構造体の各フィールドのうち、Packingデータに含まれるフィールドの値はPackingデータから取得して設定し、それ以外のフィールドを、例えば、0に設定する。
【０１９１】
ステップＳ２０２において、Packingデータがmbuf構造体に関するものでなかった場合、第二Packing受信処理部７１Ｂは第二mbuf受信部６９にmbuf構造体ポインタを渡して読み込みを指示し、第二mbuf受信部６９は、当該ポインタを元にメモリアクセス部７３を介してメモリ部１０からmbuf構造体を読み込む（ステップＳ２０４）。
【０１９２】
第二Packing受信処理部７１Ｂは、当該パケットのパケットデータに関しパッキングが利用されているか否かを判定する（ステップＳ２０５）。第二Packing受信処理部７１Ｂは、ステップＳ１１１における第一Packing送信処理部４３と同様の方法で判定を行う。パッキングが利用されている場合、第二Packing受信処理部７１Ｂは、第二パケットデータ受信部７０にパケットデータ（バス部１１の制約を満たす部分のみ）の読み込みを指示する（ステップＳ２０６に移行）。パッキングが利用されていない場合、第二Packing受信処理部７１Ｂは、第二パケットデータ受信部７０にパケットデータ全体の読み込みを指示する（ステップＳ２０９に移行）。
【０１９３】
第二パケットデータ受信部７０は、メモリアクセス部７３を介してメモリ部１０からパケットデータの指定された部分を読み込む（ステップＳ２０６、ステップＳ２０９）。
【０１９４】
第二Packing受信処理部７１Ｂは、パケットデータに関するPackingデータをDequeueする（ステップＳ２０７）。なお、本ステップは、ステップＳ２０１においてDequeueされたPackingデータがmbuf構造体に関するものであった場合にのみ行う。
【０１９５】
第二Packing受信処理部７１Ｂは、ステップＳ２０６で読み込んだパケットデータ（バス部１１の制約を満たす部分のみ）に、ステップＳ２０７で得られたPackingデータに含まれるパケットデータの一部（先頭側、末尾側、の一方または両方）を追加し、パケットデータを復元する（ステップＳ２０８）。
【０１９６】
第二Packing受信処理部７１Ｂは、キューＩＤ（mbuf構造体ポインタ用）、mbuf構造体ポインタ、mbuf構造体、パケットデータを含む受信データを生成し、第二ＩＦ部６１を介して当該受信データを第二データ処理部３０に通知する（ステップＳ２１０）。
【０１９７】
＜（Ｄ）第二データ処理部３０によるパケット送信処理＞
図２５のフローチャートを用いて、情報処理装置２の第二データ処理部３０が第一データ処理部２０に対しパケットを送信する処理について説明する。
【０１９８】
第二データ処理部３０は、第二ＩＦ部６１に対しパケットの送信を要求する（ステップＳ２２０）。その際、第二データ処理部３０は、キューID、mbuf構造体ポインタ、mbuf構造体、パケットデータを送信データとして渡す。
【０１９９】
第二ＩＦ部６１は送信データを第二Packing送信処理部６３Ｂに渡し、第二Packing送信処理部６３Ｂは、当該パケットのmbuf構造体およびパケットデータのそれぞれについてパッキングが必要か否かを判定する（ステップＳ２２１）。本実施の形態では、第二Packing送信処理部６３Ｂは、mbuf構造体について常に必要と判定する。パケットデータのPackingに関し、第二Packing送信処理部６３Ｂは、mbuf構造体のbuf_physaddr、data_off、data_lenを参照し、パケットバッファ内でのパケットデータの位置とサイズを確認する。第二Packing送信処理部６３Ｂは、その位置およびサイズがバス部１１の制約を満たさない場合にパッキングが必要と判定し、満たす場合に不要と判定する。パッキングが不要と判定された場合は、第二Packing送信処理部６３Ｂはパケットデータの書き込みを第二パケットデータ送信部６４に指示する（ステップＳ２２４に移行）。その際、第二Packing送信処理部６３は、書き込み対象領域としてパケットデータ全体を指定する。
【０２００】
第二Packing送信処理部６３Ｂは、上述したパッキングに従い、mbuf構造体およびパケットデータに関し必要に応じてPackingデータを生成する（ステップＳ２２２）。
【０２０１】
第二Packing送信処理部６３Ｂは、生成したPackingデータのEnqueueを第二Enqueue処理部６６に要求し（mbuf構造体、パケットデータの順）、第二Enqueue処理部６６はEnqueueを行う（ステップＳ２２３）。その後、第二Packing送信処理部６３Ｂはパケットデータ（バス部１１の制約を満たす部分のみ）の書き込みを第二パケットデータ送信部６４に指示する。
【０２０２】
第二パケットデータ送信部６４は、メモリアクセス部７３を介してメモリ部１０に指定されたパケットデータを書き込む（ステップＳ２２４）。
【０２０３】
ステップＳ２２１において、mbuf構造体に関しパッキングを行わないとした場合、第二Packing送信処理部６３Ｂは、mbuf構造体の書き込みが必要と判定し、第二mbuf送信部６５にmbuf構造体ポインタおよびmbuf構造体を渡して書き込みを指示する（ステップＳ２２５）。
【０２０４】
第二mbuf送信部６５は、メモリアクセス部７３を介してメモリ部１０にmbuf構造体を書き込む（ステップＳ２２６）。
【０２０５】
第二Packing送信処理部６３Ｂは、mbuf構造体ポインタのリングキューへのEnqueueを第二Enqueue処理部６６に要求し、第二Enqueue処理部６６はEnqueue処理を行う（ステップＳ２２７）。
【０２０６】
＜（Ｅ）第一データ処理部２０によるパケット受信処理＞
図２６のフローチャートを用いて、情報処理装置２の第一データ処理部２０が第二データ処理部３０からパケットを受信する処理について説明する。
【０２０７】
第一データ処理部２０は、リングキューのアドレス（mbuf構造体ポインタ用）をパラメタとして、第一IF部４１にDequeueを要求する（ステップＳ２３１）。
【０２０８】
当該要求は第一IF部４１によって第一Packing受信処理部４５Ｂに転送され、第一Packing受信処理部４５Ｂは、第一Dequeue処理部４６にmbuf構造体ポインタのDequeueを要求し、第一Dequeue処理部４６は、リングキューからmbuf構造体ポインタをDequeueする（ステップＳ２３２）。
【０２０９】
第一Packing受信処理部４５Ｂは、第一Dequeue処理部４６にPackingデータのDequeueを要求し、第一Dequeue処理部４６は、リングキューからPackingデータをDequeueする（ステップＳ２３３）。なお、第一Packing受信処理部４５Ｂは、Packingデータ用のリングキューのアドレスを、mbuf構造体ポインタ用リングキューのp_ring_ptrフィールドから取得する。
【０２１０】
第一Packing受信処理部４５Ｂは、DequeueされたPackingデータがmbuf構造体に関するものか否かを判定する（ステップ２２３）。第一Packing受信処理部４５Ｂは、最初の２Ｂｉｔがいずれも0である場合に、当該Packingデータがmbuf構造体に関するものであると判定する。
【０２１１】
Packingデータがmbuf構造体に関するものであった場合、第一Packing受信処理部４５Ｂは、当該Packingデータからmbuf構造体を更新する（ステップＳ２３５）。具体的には、第一Packing受信処理部４５Ｂは、mbuf構造体の各フィールドのうち、Packingデータに含まれるフィールドについて、Packingデータに含まれる値で更新する。
【０２１２】
第一Packing受信処理部４５Ｂは、当該パケットデータに関しパッキングが利用されているかを判定する（ステップＳ２３６）。第一Packing受信処理部４５Ｂは、ステップＳ１５１における第二Packing送信処理部６３と同様の方法で判定を行う。パケットデータにパッキングが利用されていない場合、本処理を終了し、ステップＳ２３２でmbuf構造体ポインタを、第1IF部４１を介して第一データ処理部２０に通知する。
【０２１３】
パケットデータにパッキングが利用されている場合、第一Packing受信処理部４５Ｂは、第一Dequeue処理部４６に依頼して、パケットデータに関するPackingデータをDequeueする（ステップＳ２３７）。なお、本ステップは、ステップＳ２３３においてDequeueされたPackingデータがmbuf構造体に関するものであった場合にのみ行う。
【０２１４】
第一Packing受信処理部４５Ｂは、DequeueされたPackingデータを用いてパケットデータを更新する（ステップＳ２３８）。具体的には、第一Packing受信処理部４５は、Packingデータにパケットデータ先頭側のデータが含まれる場合、当該データを、mbuf構造体のbuf_addrフィールドおよびdata_offフィールドの値を足して得られるアドレスに書き込む。また、第一Packing受信処理部４５は、Packingデータにパケットデータ末尾側のデータが含まれる場合、当該データを、以下により得られるアドレスに書き込む。 
mbuf構造体のbuf_addrフィールド値＋data_offフィールド値＋data_lenフィールド値−当該データのサイズ
【０２１５】
第一Packing受信処理部４５は、本処理を終了し、ステップＳ２３２で得られたmbuf構造体ポインタを、第一IF部４１を介して第一データ処理部２０に通知する。
【０２１６】
以上に詳細に説明したように、本実施の形態においては、次のような効果が得られる。
【０２１７】
本実施の形態によれば、第１の実施の形態に加え、mbuf構造体をもPackingデータに含める。第一送受信処理部４０Ｂは、mbuf構造体の一部を含むPackingデータを生成し第二送受信処理部６０Ｂにリングキューを介して送る。また、第一送受信処理部４０Ｂは、第二送受信処理部６０Ｂからリングキューを介して受け取ったPackingデータに含まれる情報を元にメモリ部１０に記憶されているmbuf構造体を更新する。第二送受信処理部６０Ｂは、リングキューを介して第一送受信処理部４０Ｂから受け取ったPackingデータに含まれる情報からmbuf構造体を生成し、メモリ部１０に記憶されているmbuf構造体を直接参照しない。また、第二送受信処理部６０Ｂは、mbuf構造体の一部を含むPackingデータを生成し第一送受信処理部４０Ｂにリングキューを介して送る。
【０２１８】
これにより、バス部１１上で通信するデータ量を削減でき、かつ、バス部１１の制約を満たさない部分のパケットデータおよびmbuf構造体の一部はPackingデータとしてバス部１１の制約を満たす状態で通信されることとなり、バス利用効率を改善もしくはその低下を抑制することができる。
【０２１９】
よって、本実施の形態によれば、モジュール間でメモリおよびバスを介したデータ通信を行う際のバス利用効率を改善もしくはその低下を抑制する効果を得ることができる。
【０２２０】
また、本実施の形態の説明では、情報処理装置２が、mbuf構造体に関するパッキングを常に行う例を示したが本発明はこれに限定されるものではない。他の例として、情報処理装置２は、パケットサイズが所定の値より小さい場合にのみmbuf構造体に関するパッキングが使用されてもよい。また、更なるほかの例として、情報処理装置２は、パケットデータに関しパッキングを行う場合にのみmbuf構造体に関するパッキングを使用してもよい。そのような構成をとることで、パッキングによる負荷を下げる効果が得られる。その場合、第一送受信処理部４０Ｂおよび第二送受信処理部６０Ｂは、処理するパケット毎に当該パケットに関しmbuf構造体に関するパッキングを利用するかしないかを示すフラグを設ける。当該フラグを参照して当該パケットに関しパッキングを行うか行わないかを切り替えればよい。第一送受信処理部４０Ｂおよび第二送受信処理部６０Ｂは、例えば、当該フラグをmbuf構造体ポインタもしくはmbuf構造体のいずれかの場所に記録する。
また、本実施の形態の説明では、情報処理装置２が、mbuf構造体ポインタ用リングキューとは別にPackingデータ用リングキューを生成しPackingデータの通信に使用する例を示したが、本発明はこれに限定されるものではない。他の例として、情報処理装置２は、mbuf構造体ポインタ用リングキューを用いてPackingデータを通信してもよい。その場合、第一送受信処理部４０Ｂおよび第二送受信処理部６０Ｂは、PackingデータのEnqueueを、Packingデータ用のリングキューに対してではなくmbuf構造体用のリングキューに対して行う。また、第一送受信処理部４０Ｂおよび第二送受信処理部６０Ｂは、PackingデータのDequeueを、Packingデータ用のリングキューからではなくmbuf構造体用のリングキューから行う。
また、情報処理装置２は、mbuf構造体ポインタ用リングキューを用いてPackingデータを通信する場合に、mbuf構造体ポインタとPackingデータとを交互にリングキューを用いて通信する代わりに、所定の数のパケット毎に、mbuf構造体ポインタを連続して通信しても良い。この場合、その後、それらに関するPackingデータ（mbuf構造体の一部）を連続して通信し、その後それらに関するPackingデータ（パケットデータ）を連続して通信することとしてもよい。そのような構成をとり、さらに、第一Packing受信処理部４５Ｂがmbuf構造体ポインタをDequeueした際に（ステップＳ２３２）、当該mbuf構造体ポインタに対してプリフェッチ命令（先読み命令）を実行し、第一Packing受信処理部４５ＢがPackingデータ（mbuf構造体の一部）をDequeueした際に（ステップＳ２３３）、当該パケットデータに対してプリフェッチ命令（先読み命令）を実行する。これによって、CPUキャッシュミスを抑制することが出来る。
【０２２１】
上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限らない。
［付記１］
予め定められた通信単位で通信を行うバスと、
当該バスに接続されたメモリと、
前記メモリに対して前記バスを介してデータを送受する通信装置を備え、
前記通信装置は、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを行なうことを特徴とする情報処理装置。
この場合、前記パッキングは、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位未満の場合、及び前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位よりも大きい場合に実行される。
【０２２２】
［付記２］
前記パッキングは、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位未満の場合、及び前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位よりも大きい場合に実行されることを特徴とする付記１に記載の情報処理装置。
【０２２３】
［付記３］
前記通信装置は、前記データ及び前記メタデータの少なくとも一方が前記バスの通信単位未満である場合、前記通信単位に対して端数分となる端数データを前記通信単位となるように複数のデータセット分まとめて、前記バスを介して、前記メモリの連続領域に格納する送信装置を備えていることを特徴とする付記１又は２記載の情報処理装置。
【０２２４】
［付記４］
前記通信装置は、通信すべき前記データのうち、前記端数データについて前記連続領域から読み込む受信装置を備えていることを特徴とする付記１〜３のいずれか一項に記載の情報処理装置。
【０２２５】
［付記５］
前記通信装置は、前記データと、当該データの属性に関するメタデータをも複数のデータセット分まとめることを特徴とする付記１乃至４のいずれかに記載の情報処理装置。
【０２２６】
［付記６］
付記１〜５のいずれか一項において、前記メモリはポインタをエントリに用いるリングキュー、当該ポインタにより前記データを間接的に参照できるパケットデータを記憶するパケットバッファ、及び、前記パケットデータに関する前記メタデータをmbuf形式で記憶するmbuf構造体を含むことを特徴とする請求項５記載の情報処理装置。
【０２２７】
［付記７］
予め定められた通信単位で通信を行うバスと、当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備える情報処理装置において、
前記通信装置によって、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを行なう
ことを特徴とする通信方法。
【０２２８】
［付記８］
前記通信装置が複数の前記データに係るポインタを前記メモリの連続領域（ポインタデータ領域）に格納する送信装置を備える場合に、
前記送信装置によって、前記データもしくは前記データの一部である通信すべきデータの開始アドレスおよびサイズおよびいずれかもしくは両方が前記メモリとの通信に使用されるバスの通信単位未満である場合に、前記通信単位に関し端数分となる前記通信すべきデータである端数データを、前記複数のデータセット分まとめて前記メモリの連続領域に格納し、
前記通信装置の受信装置によって、前記通信すべきデータのうち、前記端数データについて前記連続領域から読み込むことを特徴とする請求項７記載の通信方法。
【０２２９】
［付記９］
前記ポインタは前記データへのポインタを少なくとも含むメタデータへのポインタであり、前記送信装置は前記メタデータの一部を前記複数のデータセット分まとめて前記連続領域に格納し、
前記受信装置によって、
前記メタデータの一部を前記連続領域から読み込む、
ことを特徴とする付記８記載の通信方法。
【０２３０】
［付記１０］
前記送信装置は、所定の条件が満たされるデータについてのみ前記端数データおよび前記メタデータの一部のいずれかもしくは両方を前記連続領域に格納する、
ことを特徴とする付記７記載の通信方法。
【０２３１】
［付記１１］
前記所定の条件は、前記通信すべきデータのサイズが所定の値より小さい場合であることを特徴とする付記１０記載の通信方法。
【０２３２】
［付記１２］
前記送信装置および前記受信装置は、前記ポインタデータ領域および前記連続領域として同じメモリ領域を使用する、
ことを特徴とする付記７から１１のいずれか一項記載の通信方法。
【０２３３】
［付記１３］
予め定められた通信単位で通信を行うバスと、当該バスに接続されたメモリと、前記メモリに対して前記バスを介してデータを送受する通信装置を備えるコンピュータに、前記データ及びその属性に関するメタデータの少なくとも一方が前記バスの通信単位に合致しない場合に、前記バスの通信単位に合致するように、合致しないデータを複数のデータセット分まとめるパッキングを実行させることを特徴とするコンピュータプログラム。
【産業上の利用可能性】
【０２３４】
本発明は、複数のCPUと、通信単位において制約のあるバス或いは媒体を備えた通信システムにおいて、バス或いは媒体の利用効率を向上させることができる。
【符号の説明】
【０２３５】
１    情報処理装置
２    情報処理装置
１０  メモリ部
１１  バス部
２０  第一データ処理部
３０  第二データ処理部
４０  第一送受信処理部
４０Ｂ  第一送受信処理部
４１  第一IF部
４２  第一管理部
４３  第一Packing送信処理部
４３Ｂ  第一Packing送信処理部
４４  第一Enqueue処理部
４５  第一Packing受信処理部
４５Ｂ  第一Packing受信処理部
４６  第一Dequeue処理部
６０  第二送受信処理部
６０Ｂ  第二送受信処理部
６１  第二IF部
６３  第二Packing送信処理部
６３Ｂ  第二Packing送信処理部
６４  第二パケットデータ送信部
６５  第二mbuf送信部
６６  第二Enqueue処理部
６８  第二Dequeue処理部
６９  第二mbuf受信部
７０  第二パケットデータ受信部
７１  第二Packing受信処理部
７１Ｂ  第二Packing受信処理部
７３  メモリアクセス部
【図１】
2020106869.tif 000003
【図２】
2020106869.tif 000004
【図３】
2020106869.tif 000005
【図４Ａ】
2020106869.tif 000006
【図４Ｂ】
2020106869.tif 000007
【図５】
2020106869.tif 000008
【図６】
2020106869.tif 000009
【図７】
2020106869.tif 000010
【図８】
2020106869.tif 000011
【図９】
2020106869.tif 000012
【図１０】
2020106869.tif 000013
【図１１】
2020106869.tif 000014
【図１２】
2020106869.tif 000015
【図１３】
2020106869.tif 000016
【図１４】
2020106869.tif 000017
【図１５】
2020106869.tif 000018
【図１６】
2020106869.tif 000019
【図１７】
2020106869.tif 000020
【図１８】
2020106869.tif 000021
【図１９】
2020106869.tif 000022
【図２０】
2020106869.tif 000023
【図２１】
2020106869.tif 000024
【図２２】
2020106869.tif 000025
【図２３】
2020106869.tif 000026
【図２４】
2020106869.tif 000027
【図２５】
2020106869.tif 000028
【図２６】
2020106869.tif 000029