(57)【要約】【課題】信頼性の高い処理を高速に実行する情報処理装置、情報処理方法及び情報処理プログラムを提供する。【解決手段】リクエスト取得部１０１は、リクエストキュー２００に格納された処理要求を格納順に取得し連番で番号を割り当てる処理を排他的に行う複数のＣＰＵコアを有する。並替部１０３は、ＣＰＵコアにより取得された処理要求を番号順に並び替える。ソフトリクエストキュー管理部１０４は、並替部１０３により並び替えられた順に処理要求をソフトリクエストキュー３００に格納する。処理実行部３０は、ソフトリクエストキュー管理部１０４により格納された順に処理要求をソフトリクエストキュー３００から取得し、取得した処理要求にしたがって処理を行う。【選択図】図２
2018180985.tif 000002
【特許請求の範囲】
【請求項１】
第１格納部に格納された処理要求を格納順に取得し連番で番号を割り当てる処理を排他的に行う複数の処理部を有する処理要求取得部と、
前記処理要求取得部により取得された前記処理要求を番号順に並び替える並替部と、
前記並替部により並び替えられた順に前記処理要求を第２格納部に格納する格納処理部と、
前記格納処理部により格納された順に前記処理要求を前記第２格納部から取得し、取得した前記処理要求にしたがって処理を行う処理実行部と
を備えたことを特徴とする情報処理装置。
【請求項２】
前記処理要求を取得した各前記処理部毎に管理する管理部をさらに備え、
前記並替部は、前記管理部に管理された前記処理要求を基に、前記処理要求の並び替えを実行することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
管理部は、各前記処理部毎に前記番号の若い順に前記処理要求を管理し、
前記並替部は、番号順に各前記処理要求を取得した前記処理部の情報を並べ、
前記格納処理部は、前記並替部により並べられた前記処理部の情報を番号順に取得し、前記管理部により管理される、取得した情報が示す前記処理部に対応する前記処理要求のうちの先頭の前記処理要求を取得し、前記第２格納部へ格納する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記並替部及び前記格納処理部は、前記処理実行部が前記第２格納部から前記処理要求を取得しようとした際に前記第２格納部に前記処理要求が存在しない場合に、前記処理要求の並び替えを行い、前記第２格納部に前記処理要求を格納することを特徴とする請求項１〜３のいずれか一つに記載の情報処理装置。
【請求項５】
複数の演算処理装置のそれぞれが行う第１リクエストキューに格納された処理要求を格納順に取得し連番で番号を割り当てる処理を前記演算処理装置の間で排他的に行わせ、
取得された前記処理要求を番号順に並び替え、
並び替えられた順に前記処理要求を第２リクエストキューに格納し、
格納された順に前記処理要求を前記第２リクエストキューから取得し、
取得した前記処理要求にしたがって処理を行う
ことを特徴とする情報処理方法。
【請求項６】
複数の演算処理装置のそれぞれが行う第１リクエストキューに格納された処理要求を格納順に取得し連番で番号を割り当てる処理を前記演算処理装置の間で排他的に行わせ、
取得された前記処理要求を番号順に並び替え、
並び替えられた順に前記処理要求を第２リクエストキューに格納し、
格納された順に前記処理要求を前記第２リクエストキューから取得し、
取得した前記処理要求にしたがって処理を行う
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、情報処理方法及び情報処理プログラムに関する。
【背景技術】
【０００２】
情報処理装置において、インフィニバンドやＮＶＭｅ（Non  Volatile  Memory  Express）などのデバイスに対するリクエストをＣＰＵ（Central  Processing  Unit）が取得する方法として、ポーリング処理及び割り込み処理という２つの方式が存在する。リクエストとは、例えば、データの読み出し、書き込み、受信又は送信といったＩ／Ｏ要求である。ポーリング処理は、各デバイスが有するリクエストをＣＰＵが定期的に検索し取得する方法である。また、割り込み処理は、リクエストを取得したデバイスが、ＣＰＵに対してリクエストの発生を通知し、通知を受けたＣＰＵがそのリクエストを取得する方法である。
【０００３】
ＣＰＵの処理速度がデバイスに比べて早い場合、割り込み処理を用いてリクエストを取得することが効率的であった。これに対して、近年、デバイスの処理速度の向上が目覚ましく、ＣＰＵがポーリングを行ってリクエストを取得する情報処理装置が増えている。
【０００４】
また、ストレージ装置などの情報処理装置では、複数のＣＰＵ又は複数のコアを有するＣＰＵを搭載することが増えている。以下では、各ＣＰＵを動作主体とする場合を例に説明を行うが、１つのＣＰＵに搭載されたコアを動作主体としても同様である。複数のＣＰＵを有する情報処理装置は、デバイスに対するポーリングを全てのＣＰＵが実行することで、各ＣＰＵの間でポーリング処理の平準化を実現する。
【０００５】
各デバイスは、リクエストを格納するバッファであるリクエストキュー及び各リクエストに対する応答結果を格納するバッファであるレスポンスキューを有する。例えば、インフィニバンドの受信処理では、インフィニバンドのデバイスが、インターコネクトから受信したリクエストをリクエストキューに格納する。そして、ＣＰＵは、そのインフィニバンドのデバイスが有するリクエストキューからリクエストを読み出す。
【０００６】
そして、ポーリング対象のデバイスでは、リクエストはそのデバイスが管理するリクエストキューに受信した順番に並んで格納される。この場合、リクエストキューにおいては、リクエストの送信元の情報処理装置から見て送信順序が守られる。そして、ポーリングを行うＣＰＵは、デバイスが有するリクエストキューから順番にリクエストを取得し、アプリケーションなどの上位ソフトスタックが有するソフトリクエストキューへ格納する。上位ソフトスタックは、ソフトリクエストキューに格納された順番で各リクエストにより指定された処理を実行する。
【０００７】
ここで、単に複数のＣＰＵが並行してポーリングを行う構成では、ＣＰＵがリクエストキューから取得したリクエストをソフトリクエストキューに格納する際に、リクエストの順序が入れ替わるおそれがある。アプリケーションの中には、リクエストの順序が入れ替わると適切な処理の実行が困難となるものが存在する。そこで、情報処理装置では、ＣＰＵがリクエストキューから取得したリクエストをソフトリクエストキューに格納する際に、リクエストの順序の入れ替わりを回避するための構成を備えることで信頼性を確保することが望ましい。
【０００８】
このようなリクエストの順序を維持するための技術として、あるプロセッサが資源を確保する際に、競合を検出すると大域的ロックを実行し、大域的ロックが成功すれば資源確保を実行する従来技術がある。また、リクエストに付加された順序番号の順に排他的に処理を実行する従来技術がある。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開２０００−１４８５１６号公報
【特許文献２】特開平７−１９１９４４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
しかしながら、リクエストを取得する受信処理を排他処理で行う場合、あるＣＰＵが特定のリクエストキューに対する受信処理を行っている間、他のＣＰＵはそのリクエストキューに対する受信処理を待機することになる。したがって、ＣＰＵは、実際にはそれぞれが直列的に処理を行うことになり、処理に時間がかかってしまう。また、ポーリングの場合、ロックを掛けてからリクエストの読み出しを行うため、リクエストが未到着であっても排他制御は行われる。ポーリングを行うにあたって実施する排他制御はメカニズム的に重い処理であり、リクエストが未到着でポーリングが無駄な場合にも情報処理装置に大きな負荷をかけることになり、性能が低下するおそれがある。
【００１１】
また、競合を検出すると大域的ロックを実行する従来技術や順序番号の順に排他的に処理を実行する従来技術を用いても、リクエストを取得する間は排他制御が行われるため、迅速に処理を行うことは困難である。
【００１２】
開示の技術は、上記に鑑みてなされたものであって、信頼性の高い処理を高速に実行する情報処理装置、情報処理方法及び情報処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１３】
本願の開示する情報処理装置、情報処理方法及び情報処理プログラムの一つの態様において、処理要求取得部は、第１格納部に格納された処理要求を格納順に取得し連番で番号を割り当てる処理を排他的に行う複数の処理部を有する。並替部は、前記処理要求取得部により取得された前記処理要求を番号順に並び替える。格納処理部は、前記並替部により並び替えられた順に前記処理要求を第２格納部に格納する。処理実行部は、前記格納処理部により格納された順に前記処理要求を前記第２格納部から取得し、取得した前記処理要求にしたがって処理を行う。
【発明の効果】
【００１４】
１つの側面では、本発明は、信頼性の高い処理を高速に実行することができる。
【図面の簡単な説明】
【００１５】
【図１】図１は、情報処理システムの一例を表すシステム構成図である。
【図２】図２は、実施例１に係る情報処理装置のブロック図である。
【図３】図３は、リクエストキューとリクエストとの関係を表す図である。
【図４】図４は、リクエストリストの一例を表す図である。
【図５】図５は、登録情報及びリクエストのそれぞれの関係を模式的に表した図である。
【図６】図６は、未処理リクエストテーブルの一例を表す図である。
【図７】図７は、リクエスト受信時の個別リクエストリストの遷移を表す図である。
【図８】図８は、リクエスト並替テーブルの一例を表す図である。
【図９】図９は、リクエスト受信時のリクエスト並替テーブルの遷移を表す図である。
【図１０】図１０は、各テーブル及び個別リクエストリストの登録情報の関係を模式的に表した図である。
【図１１】図１１は、リクエストの受信を繰り返した場合の各テーブル及びリクエストリストの状態の一例を表す図である。
【図１２】図１２は、実施例１に係る情報処理装置によるリクエスト受信時の全体的な処理を表すフローチャートである。
【図１３】図１３は、排他制御を用いたリクエストの取得処理のフローチャートである。
【図１４】図１４は、未処理リクエストテーブル、リクエストリスト及びリクエスト並替テーブルの作成処理のフローチャートである。
【図１５】図１５は、ソフトリクエストキューへのリクエスト格納後の、未処理リクエストテーブル、リクエストリスト及びリクエスト並替テーブルの変更処理のフローチャートである。
【図１６】図１６は、実施例２に係る情報処理装置のブロック図である。
【図１７】図１７は、遅延コア管理テーブルの一例を表す図である。
【図１８】図１８は、アプリケーションによるリクエストの取得を契機としたリクエストの並び替え処理のフローチャートである。
【図１９】図１９は、遅延コア集合生成処理のフローチャートである。
【図２０】図２０は、実施例３に係るシーケンスカウンタの一例の図である。
【図２１】図２１は、実施例３に係る未処理リクエストテーブルの一例の図である。
【図２２】図２２は、実施例３に係るリクエスト並替テーブルの一例の図である。
【図２３】図２３は、実施例３に係る情報処理装置による排他制御を用いたリクエストの取得処理のフローチャートである。
【図２４】図２４は、情報処理装置のハードウェア構成図である。
【発明を実施するための形態】
【００１６】
以下に、本願の開示する情報処理装置、情報処理方法及び情報処理プログラムの実施例を図面に基づいて詳細に説明する。なお、以下の実施例により本願の開示する情報処理装置、情報処理方法及び情報処理プログラムが限定されるものではない。
【実施例１】
【００１７】
図１は、情報処理システムの一例を表すシステム構成図である。本実施例に係る情報処理システムは、例えば、図１に示すように複数の情報処理装置１〜４がインフィニバンドのインターコネクト５によって接続される。
【００１８】
情報処理装置１は、例えば、ストレージ装置である。また、情報処理装置２〜４は、例えば、サーバである。情報処理装置１は、情報処理装置２〜４とインターコネクト５を介して通信可能である。
【００１９】
情報処理装置１は、インフィニバンドデバイス２０、ＮＶＭｅデバイス２１及びその他デバイス２２を有する。また、情報処理装置１は、マルチコアＣＰＵ１００を有する。
【００２０】
インフィニバンドデバイス２０は、インターコネクト５を介してデータの送受信を行うインフィニバンド用のインタフェース機能を有する装置である。インフィニバンドデバイス２０は、１つ又は複数のリクエストキュー２００を有する。また、インフィニバンドデバイス２０は、各リクエストキュー２００に対応するレスポンスキューを有するが、図１では図示しない。インフィニバンドデバイス２０のリクエストキュー２００は、例えば、情報処理装置２〜４から情報処理装置１へ向けて送信されたリクエストを格納する。リクエストキュー２００は、各情報処理装置２〜４のそれぞれから送信されたリクエストの送信順を守って各リクエストを格納する。このリクエストキュー２００が、「第１格納部」の一例にあたる。
【００２１】
ＮＶＭｅデバイス２１は、例えば、ＳＳＤ（Solid  State  Drive）が多数搭載された補助規則装置である。ＮＶＭｅデバイス２１も、１つ又は複数のリクエストキュー２００を有する。また、ＮＶＭｅデバイス２１も、各リクエストキュー２００に対応するレスポンスキューを有するが、図１では図示しない。ＮＶＭｅデバイス２１のリクエストキュー２００は、例えば、ＣＰＵコア＃０〜＃（Ｎ−１）のうちの所定のアプリケーションを実行するいずれかから送信されたリクエストを格納する。
【００２２】
その他デバイス２２も、１つ又は複数のリクエストキュー２００を有する。その他デバイス２２は、ＣＰＵコア＃０〜＃（Ｎ−１）との間でリクエストの送受信を行う装置であればよく、例えば、イーサネット（登録商標）デバイスなどである。その他デバイス２２も、各リクエストキュー２００に対応するレスポンスキューを有するが、図１では図示しない。
【００２３】
マルチコアＣＰＵ１００は、ＣＰＵコア＃０〜＃（Ｎ−１）を有する。ＣＰＵコア＃０〜＃（Ｎ−１）のそれぞれは同じ機能を有するので、以下では、ＣＰＵコア＃０〜＃（Ｎ−１）のそれぞれを区別しない場合、ＣＰＵコア＃１００と表す場合がある。
【００２４】
ＣＰＵコア＃１００は、インフィニバンドデバイス２０、ＮＶＭｅデバイス２１又はその他デバイス２２の何れかに対してポーリングを行う。そして、ＣＰＵコア＃１００は、リクエストキュー２００に格納されたリクエストを取得し、取得したリクエストにしたがって処理を実行する。ＣＰＵコア＃０〜＃（Ｎ−１）の内のいくつかが、重なるタイミングで同じリクエストキュー２００に対してポーリングを実行する場合がある。例えば、図１は、ＣＰＵコア＃０〜＃２がインフィニバンドデバイス２０の１つのリクエストキュー２００に対して同時にポーリングを行う状態を表す。
【００２５】
次に、図２を参照して、情報処理装置１におけるリクエストキュー２００からソフトリクエストキュー３００へのリクエストの移動について説明する。図２は、実施例１に係る情報処理装置のブロック図である。ここでは、インフィニバンドデバイス２０が有するリクエストキュー２００を例に説明する。
【００２６】
情報処理装置１は、図２に示すように、ポーリング制御部１０、インフィニバンドデバイス２０、未処理リクエスト格納部２５、処理実行部３０、順序保証済リクエスト格納部３５及びソフトリクエストキュー３００を有する。
【００２７】
インフィニバンドデバイス２０は、リクエストキュー２００、リクエスト受信部２０１、シーケンスカウンタ２０２、排他フラグ２０３を有する。ここで、図２では、１つのリクエストキュー２００を記載したが、複数のリクエストキュー２００が存在する場合、シーケンスカウンタ２０２及び排他フラグ２０３は、各リクエストキュー２００に対して１つずつが設けられる。
【００２８】
リクエスト受信部２０１は、インターコネクト５を介してリクエストを受信する。そして、リクエスト受信部２０１は、受信したリクエストを未処理リクエスト格納部２５に格納し、リクエストの格納先を表すポインタをリクエストキュー２００に格納する。
【００２９】
図３は、リクエストキューとリクエストとの関係を表す図である。図３に示すリクエストキュー２００は、分かり易いように各リスクエストを示すポインタを格納する領域を分けて示した。リクエストキュー２００の各領域に格納されたポインタは、未処理リクエスト格納部２５に格納されたリクエストを示す情報を有する。すなわち、リクエストキュー２００に格納されたポインタは、未処理リクエスト格納部２５に格納されたリクエストに１対１で対応する。そして、リクエストキュー２００は、格納された順番にポインタが読み出される。このことから、リクエストキュー２００に格納されたポインタの順番が、未処理リクエスト格納部２５に格納されたリクエストの順番に対応する。
【００３０】
図２に戻って説明を続ける。シーケンスカウンタ２０２は、連番の番号を順次保持していくカウンタである。シーケンスカウンタ２０２は、後述するリクエスト取得部１０１によりカウンタがインクリメントされる。
【００３１】
排他フラグ２０３は、リクエストキュー２００に対して排他制御が行われている状態か否かを表す値を有する。排他フラグ２０３は、後述するリクエスト取得部１０１により値が変更される。以下では、排他制御が行われている状態を「使用中」といい、排他制御が行われていない状態を「未使用」という。
【００３２】
ソフトリクエストキュー３００は、アプリケーションが処理を行うために用いるリクエストキューである。ソフトリクエストキュー３００には、後述するソフトリクエストキュー管理部１０４により順序保証済リクエスト格納部３５に格納されたリクエストを示すポインタが格納される。このソフトリクエストキュー３００が、「第２格納部」の一例にあたる。
【００３３】
順序保証済リクエスト格納部３５は、ソフトリクエストキュー３００に格納されたポインタが示すリクエストが、後述するソフトリクエストキュー管理部１０４により格納される。
【００３４】
ソフトリクエストキュー３００と順序保証済リクエスト格納部３５に格納されたリクエストとの関係は、図２に示したリクエストキュー２００と未処理リクエスト格納部２５に格納されたリクエストの関係と同様である。すなわち、ソフトリクエストキュー３００に格納されたポインタは順序保証済リクエスト格納部３５に格納されたリクエストに１対１で対応する。そして、ソフトリクエストキュー３００は、格納された順番にポインタが読み出される。このことから、ソフトリクエストキュー３００に格納されたポインタの順番が、順序保証済リクエスト格納部３５に格納されたリクエストのアプリケーションにより処理される順番に対応する。ここで、実際にはリクエストは順序保証済リクエスト格納部３５に格納されるが、順序を維持した状態でリクエストを格納することを表すため、ソフトリクエストキュー３００へのポインタの格納と順序保証済リクエスト格納部３５へのリクエストの格納をまとめて、ソフトリクエストキュー３００への格納という場合がある。
【００３５】
処理実行部３０は、アプリケーションを実行する。処理実行部３０は、ソフトリクエストキュー３００に格納されたポインタを格納された順に読み出す。そして、処理実行部３０は、読み出したポインタが示す順序保証済リクエスト格納部３５に格納されたリクエストを取得する。そして、処理実行部３０は、取得したリクエストに応じた処理を実行する。すなわち、処理実行部３０は、ソフトリクエストキュー３００に格納されたポインタの順にしたがって順序保証済リクエスト格納部３５に格納されたリクエストを実行していく。
【００３６】
ポーリング制御部１０は、リクエスト取得部１０１、リスト作成部１０２、並替部１０３、ソフトリクエストキュー管理部１０４を有する。さらに、ポーリング制御部１０は、未処理リクエストテーブル１０５、リクエスト並替テーブル１０６、リクエストリスト１０７及び一時格納部１０８を有する。
【００３７】
リクエスト取得部１０１のリクエストを取得する機能は、ＣＰＵコア＃０〜＃（Ｎ−１）により実現される。以下の処理は、ＣＰＵコア＃０〜＃（Ｎ−１）の何れかにより実行される。以下では、ＣＰＵコア＃０〜＃（Ｎ−１）のそれぞれをコア番号＃０〜＃（Ｎ−１）という番号で区別する場合がある。リクエスト取得部１０１は、ポーリングを実行するタイミングを予め有する。そして、ポーリングを実行するタイミングが到来すると、リクエスト取得部１０１は、排他フラグ２０３を確認する。排他フラグ２０３の値が使用中の場合、リクエスト取得部１０１は、ポーリングを行わずに処理を終了する。
【００３８】
これに対して、排他フラグ２０３の値が未使用の場合、リクエスト取得部１０１は、排他フラグ２０３の値を使用中に変更する。これにより、リクエストキュー２００にロックが掛かる。すなわち、ＣＰＵコア＃０が排他フラグ２０３の値を使用中に変更した場合、ＣＰＵコア＃０以外のＣＰＵコア＃１〜＃（Ｎ−１）によるリクエストキュー２００へのアクセスが待機させられる。
【００３９】
リクエストキュー２００をロックした後、リクエスト取得部１０１は、リクエストキュー２００の中で最も古く格納されたポインタを読み出して読み出したポインタに対応するリクエストを未処理リクエスト格納部２５から取得する処理を実行する。ここで、リクエストが取得されない場合、リクエスト取得部１０１は、処理を終了し排他フラグ２０３の値を未使用に再設定する。
【００４０】
これに対して、リクエストを取得した場合、リクエスト取得部１０１は、シーケンスカウンタ２０２の値を１つインクリメントする。そして、リクエスト取得部１０１は、取得したリクエストをリスト作成部１０２へ出力する。その後、リクエスト取得部１０１は、排他フラグ２０３の値を未使用に再設定する。
【００４１】
このように、リクエスト取得部１０１の内の各ＣＰＵ＃０〜＃（Ｎ−１）は、リクエストを取得し取得したリクエストに対応する番号を設定する間に排他制御を行う。このリクエスト取得部１０１による排他制御は、トライロックと呼ばれる場合があり、ロックに失敗した場合に処理をスキップする制御である。ＣＰＵ＃０〜＃（Ｎ−１）が、処理部の一例にあたる。また、リクエスト取得部１０１が、「処理要求取得部」の一例にあたる。
【００４２】
リスト作成部１０２は、リクエストの入力をリクエスト取得部１０１から受ける。そして、リスト作成部１０２は、シーケンスカウンタ２０２の値を取得し、取得した値を取得したリクエストの順序番号とする。
【００４３】
次に、リスト作成部１０２は、取得したリクエストを一時格納部１０８へ格納する。次に、リスト作成部１０２は、順序番号にリクエストの格納先の情報を含む登録情報をリクエストリスト１０７の中のリクエストを読み出したＣＰＵコア＃０に対応するリストに登録する。以下に、リスト作成部１０２によるリストの作成について詳細に説明する。
【００４４】
図４は、リクエストリストの一例を表す図である。リクエストリスト１０７は、各ＣＰＵコア＃０〜＃（Ｎ−１）用のリストを有する。すなわち、リクエストリスト１０７は、図４に示すように、コア番号＃０用リクエストリスト７１、コア番号＃１用リクエストリスト７２、コア番号＃２用リクエストリスト７３、コア番号＃（Ｎ−１）用リクエストリスト７９などを有する。以下では、各ＣＰＵコア＃０〜＃（Ｎ―１）用のリストを区別しない場合、「個別リクエストリスト７０」という。
【００４５】
リスト作成部１０２は、個別リクエストリスト７０に対して登録情報７００を登録する。登録情報７００には、順序番号、リクエストポインタ及びネクストポインタが含まれる。順序番号は、リスト作成部１０２が、リクエスト取得部１０１に割り当てた順序番号にあたる。リクエストポインタは、順序番号に対応するリクエストの一時格納部１０８における格納先を示す情報である。また、ネクストポインタは、同じ個別リクエストリスト７０における次に登録された登録情報７００を表す情報である。
【００４６】
すなわち、リスト作成部１０２は、リクエスト取得部１０１から取得したリクエストを一時格納部１０８へ格納し、格納したリクエストの順序番号及び格納先を示すリクエストポインタを有する登録情報７００を生成する。さらに、リスト作成部１０２は、ネクストポインタとして終端を表す情報を生成した登録情報７００に付加する。その後、リスト作成部１０２は、リクエストの読み出し元に対応する個別リクエストリスト７０に生成した登録情報７００を登録する。さらに、その個別リクエストリスト７０が既に登録情報７００を有する場合、リスト作成部１０２は、既に登録された登録情報７００のうちの最も古い登録情報７００のネクストポインタを今回登録した登録情報７００を示す値に変更する。これにより、個別リクエストリスト７０は、読み出したリクエストを順番に示すように並ぶ登録情報７００のリストをＣＰＵ＃０〜＃（Ｎ−１）毎に作成する。例えば、図４において、コア番号＃０用リクエストリスト７１には、登録情報７００が３つ存在する。すなわち、ＣＰＵ＃０が３つのリクエストを読み出した状態である。また、コア番号＃１用リクエストリスト７２には、登録情報７００が１つ存在する。すなわち、ＣＰＵ＃１が１つのリクエストを読み出した状態である。また、コア番号＃２用リクエストリスト７３には、登録情報７００が存在しない。すなわち、ＣＰＵ＃２がリクエストを読み出していない状態である。
【００４７】
図５は、登録情報及びリクエストのそれぞれの関係を模式的に表した図である。この場合、登録情報７０１が最も古く個別リクエストリスト７０に登録された登録情報７００である。登録情報７０１のリクエストポインタは、一時格納部１０８に格納されたリクエスト７１１を示す。また、登録情報７０１のネクストポインタで示される登録情報７０２が登録情報７０１の次に個別リクエストリスト７０に登録された登録情報７００である。登録情報７０２のリクエストポインタは、一時格納部１０８に格納されたリクエスト７１２を示す。そして、登録情報７０２のネクストポインタで示される登録情報７０３が個別リクエストリスト７０に登録された最新の登録情報７００である。登録情報７０３のリクエストポインタは、一時格納部１０８に格納されたリクエスト７１３を示す。このように、登録情報７００は、ネクストポインタにより鎖のように連結され、各リクエストポインタが読み出された順番でリクエストを示すように並んだリストとなる。これにより、ある順序番号を有する登録情報７００がそれよりも古い順序番号を有する登録情報７００の前に並ぶことはない。
【００４８】
次に、リスト作成部１０２は、格納したリクエストを読み出したＣＰＵ＃１００に対応する未処理リクエストテーブル１０５の項目に個別リクエストリスト７０へのポインタを登録する。図６は、未処理リクエストテーブルの一例を表す図である。
【００４９】
図６に示すように、未処理リクエストテーブル１０５には、ＣＰＵコア＃０〜＃（Ｎ−１）を表すコア番号＃０〜＃（Ｎ−１）に対応させてリクエストリストポインタが登録される。リクエストリストポインタは、対応するＣＰＵコア＃１００の個別リクエストリスト７０に登録された登録情報の中の先頭の登録情報、すなわち、最も古い登録情報を示す。以下に、リスト作成部１０２による未処理リクエストテーブル１０５へのリクエストリストポインタの登録の詳細を説明する。
【００５０】
リスト作成部１０２は、未処理リクエストテーブル１０５における格納したリクエストを読み出したＣＰＵ＃１００に対応するリクエストリストポインタが登録されているか否かを確認する。格納したリクエストを読み出したＣＰＵ＃１００の個別リクエストリスト７０に既に登録情報が登録されている場合、先頭の登録情報を示す情報が未処理リクエストテーブル１０５のリクエストリストポインタとして登録済みである。
【００５１】
これに対して、リクエストリストポインタが登録されていない場合は、格納したリクエストを読み出したＣＰＵ＃１００の個別リクエストリスト７０に初めて登録情報７００が登録された場合にあたる。この場合、リスト作成部１０２は、格納したリクエストの順序番号及びリクエストを読み出したＣＰＵコア＃１００の情報を並替部１０３に通知する。
【００５２】
さらに、リスト作成部１０２は、格納したリクエストを示す登録情報７００を示す情報を、格納したリクエストを読み出したＣＰＵ＃１００に対応するリクエストリストポインタとして未処理リクエストテーブル１０５に登録する。
【００５３】
例えば、リクエストリストポインタ５１は、図４に示すコア番号＃０用リクエストリスト７１の先頭の登録情報を示す。また、図４に示すコア番号＃２用リクエストリストには、登録情報７００が登録されていない。その場合、リクエストポインタ５２は空である。本実施例では、リクエストポインタ５２には、空であることを表す情報としてＮＵＬＬが登録される。
【００５４】
図７は、リクエスト受信時の個別リクエストリストの遷移を表す図である。例えば、ＣＰＵコア＃ｉがリクエスト７１５を読み出した場合で説明する。図７では、未処理リクエストテーブル１０５のコア番号＃ｉの項を取り出して表した。状態４１は、リクエスト受信前の状態を表す。すなわち、リクエストの受信前は、コア番号＃ｉの項のリクエストリストポインタによりコア番号＃ｉ用リクエストリスト７４に登録情報７０４を表す情報が格納された状態である。そして、登録情報７０４のリクエストポインタは、一時格納部１０８に格納されたリクエスト７１４を示す。そして、リスト作成部１０２は、状態４２に示すように、ＣＰＵコア＃ｉが読み出したリクエスト７１５を一時格納部１０８へ格納する。そして、コア番号＃ｉ用リクエストリスト７４に登録情報７０５を登録し、登録情報７０４のネクストポインタで登録情報７０５を表す。これにより、未処理リクエストテーブル１０５のコア番号＃ｉの項に、登録情報７０４及び登録情報７０５が順番に紐付けられる。
【００５５】
また、一時格納部１０８に格納されたリクエストに対してソフトリクエストキュー３００への格納処理が後述するソフトリクエストキュー管理部１０４により行われた場合、リスト作成部１０２は、以下の処理を実行する。リスト作成部１０２は、ソフトリクエストキュー３００への格納が行われたリクエストを示す登録情報７００を格納する個別リクエストリスト７０の情報をソフトリクエストキュー管理部１０４から取得する。次に、リスト作成部１０２は、取得した情報が示す個別リクエストリスト７０に対応するＣＰＵコア＃１００を特定する。この特定したＣＰＵコア＃１００を対象ＣＰＵコア＃１００という。
【００５６】
次に、リスト作成部１０２は、その個別リクエストリスト７０における先頭の登録情報７００のネクストポインタを確認する。ネクストポインタが終端を表す値でなければ、リスト作成部１０２は、ネクストポインタが指す登録情報７００を特定する。そして、リスト作成部１０２は、未処理リクエストテーブル１０５における対象ＣＰＵコア＃１００の項のリクエストリストポインタが、特定した登録情報７００を指すように変更する。
【００５７】
これに対して、ネクストポインタが終端を表す値の場合、リスト作成部１０２は、未処理リクエストテーブル１０５における対象ＣＰＵコア＃１００の項のリクエストリストポインタの値として空を表すＮＵＬＬに設定する。
【００５８】
その後、リスト作成部１０２は、その個別リクエストリスト７０の中の先頭の登録情報７００を削除する。さらに、リスト作成部１０２は、対象ＣＰＵコア＃１００の情報及び削除した対象ＣＰＵコア＃１００の個別リクエストリスト７０の先頭の登録情報７００の情報を並替部１０３に通知する。このリスト作成部１０２が、「管理部」の一例にあたる。
【００５９】
次に、リクエスト並替テーブル１０６について説明する。図８は、リクエスト並替テーブルの一例を表す図である。リクエスト並替テーブル１０６は、順序番号を表す巡回番号に対応させて、その巡回番号で表される順序番号を有するリクエストを読み出したＣＰＵ＃１００を表すコア番号が読出コアとして登録される。例えば、巡回番号Ｃ１に対応する読出コア６１としてコア番号＃ｉが登録される。
【００６０】
また、特定の巡回番号で表される順序番号を有するリクエストがまだ登録されていない場合、特定の巡回番号の項の読出コアとして−１が登録される。特定の巡回番号で表される順序番号を有するリクエストがまだ登録されていない場合とは、例えば、未だリクエストキュー２００からリクエスト取得部１０１が読み出しを行っていない場合が考えられる。また、他にも、既にリクエスト取得部１０１は読み出しを行ったが、並替部１０３による登録が遅延している場合などが考えられる。例えば、巡回番号Ｃ２に対応する読出コア６２として、−１が登録される。
【００６１】
ここで、本実施例では、リクエスト並替テーブル１０６における巡回番号を表す項目として、ＣＰＵコア＃０〜＃（Ｎ−１）と同じ数の項目を設定する。そして、リクエスト並替テーブル１０６における巡回番号は、先頭から順に移動して最後の巡回番号の項まで到達すると、先頭の項に戻る。そして、先頭に戻った巡回番号は、戻る前の最後の巡回番号に対応する順序番号の次の順序番号から連続する番号を表す項となるように循環的に対応する順序番号が変化する。例えば、図８のリクエスト並替テーブル１０６には、巡回番号Ｃ０〜Ｃ（Ｎ−１）にあたる項目が存在する。そして、それぞれの巡回番号は、１周目は順序番号＃＃０〜＃＃（Ｎ−１）の項を表し、２周目は順序番号＃＃Ｎ〜＃＃（２Ｎ−１）の項を表し、３周目は順序番号＃＃３Ｎ〜＃＃（３Ｎ−１）の項を表す。
【００６２】
さらに、リクエスト並替テーブル１０６は、最小未処理順序番号６３及び先頭インデックス６４を有する。最小未処理順序番号６３は、未だソフトリクエストキュー３００への格納処理が完了していないリクエストの中で最小の順序番号を有するリクエストの順序番号である。すなわち、既に順序番号＃＃（Ｎ−１）までソフトリクエストキュー３００への格納処理が完了している場合、最小未処理順序番号６３は、順序番号＃＃Ｎとなる。また、先頭インデックス６４は、次に処理を行うリクエスト並替テーブル１０６上の巡回番号を表す。すなわち、先頭インデックス６４は、最小未処理順序番号６３が表す順序番号に対応する巡回番号を表す。
【００６３】
ここで、本実施例では、リクエスト並替テーブル１０６の読出コアとして登録されるＣＰＵコア＃１００は、同じものはリクエスト並替テーブル１０６上に１つ登録される。そのため、本実施例では、リクエスト並替テーブル１０６の項数をＣＰＵコア＃０〜＃（Ｎ−１）と同じ数とした。しかし、リクエスト並替テーブル１０６の項数には特に制限がない。また、記憶領域などの資源が許せば、巡回番号を用いずにリクエスト並替テーブル１０６の項数を順序番号が振られたリクエストの数と同じ数にして、読出コアの重複を許して全ての順序番号に対応する読出コアを登録してもよい。
【００６４】
並替部１０３は、図８に示すリクエスト並替テーブル１０６における最初のリクエストの順序番号にあたる項目に先頭を表すインデックス６４をセットする。そして、最小未処理順序番号６３の値を最初のリクエストの順序番号を示す値とする。さらに、先頭インデックス６４を、先頭を表すインデックスをセットした巡回番号を表す値とする。ここでは、最初のリクエストの順序番号を＃＃０とする。その後、並替部１０３は、以下に説明する処理を繰り返す。
【００６５】
並替部１０３は、格納されたリクエストの順序番号及びリクエストを読み出したＣＰＵコア＃１００の情報をリスト作成部１０２から取得する。ここで、並替部１０３が、リクエストの読み出し元としてＣＰＵ＃ｉの情報を取得し、リクエストの順序番号としてｎを取得した場合で説明する。並替部１０３は、最小未処理順序番号６３の値を取得する。次に、並替部１０３は、最小未処理順序番号６３にリクエスト並替テーブル１０６の項目数を加算する。そして、並替部１０３は、加算結果が格納されたリクエストの順序番号であるｎを超えるか否かを判定する。加算結果がｎを超える場合、並替部１０３は、格納されたリクエストの順序番号がリクエスト並替テーブル１０６の登録範囲内にあると判定する。これは、リクエスト並替テーブル１０６が、循環的に順序番号に対応する巡回番号を有するため、最小未処理順序番号６３からリクエスト並替テーブル１０６の項目数から１つ少ない値までの順序番号が登録可能であるからである。
【００６６】
格納されたリクエストの順序番号がリクエスト並替テーブル１０６の登録範囲外の場合、並替部１０３は、並び替え処理を終了する。
【００６７】
これに対して、格納されたリクエストの順序番号がリクエスト並替テーブル１０６の登録範囲内である場合、並替部１０３は、格納されたリクエストの順序番号から最小未処理順序番号６３を減算した値を先頭インデックス６４に加算する。次に、並替部１０３は、加算結果がリクエスト並替テーブル１０６の項目数であるＮを超えているか否かを判定する。加算結果がＮを超えていない場合、並替部１０３は、その値の巡回番号の項に読出コアとしてコア番号＃ｉを登録する。これに対して、加算結果がＮを超えている場合、並替部１０３は、加算結果からリクエスト並替テーブル１０６の項目数であるＮを減算した巡回番号の項に読出コアとしてコア番号＃ｉを登録する。
【００６８】
図９は、リクエスト受信時のリクエスト並替テーブルの遷移を表す図である。状態４３は、リクエスト受信前の状態を表す。また、状態４４は、リクエスト受信後の状態を表す。状態４３に示すように、リクエスト受信前は、リクエスト並替テーブル１０６の巡回番号ＣＰの項に読出コアは登録されていない。
【００６９】
その後、並替部１０３は、巡回番号ＣＰに対応する順序番号とその順序番号を有するリクエストをＣＰＵ＃ｉが読み出したという情報をリスト作成部１０２から取得する。そして、並替部１０３は、取得した順序番号に対応するリクエスト並替テーブル１０６の巡回番号の項の読出コアとしてコア番号＃ｉを登録する。これにより、リクエスト並替テーブル１０６は、状態４４に遷移する。
【００７０】
図１０は、各テーブル及び個別リクエストリストの登録情報の関係を模式的に表した図である。リクエスト並替テーブル１０６において巡回番号に対応させて並替部１０３により登録された読出コアの情報は、未処理リクエストテーブル１０５における各項のコア番号の何れかに対応する。そして、未処理リクエストテーブル１０５においてコア番号に対応させてリスト作成部１０２により登録されたリクエストポインタの情報は、いずれかの個別リクエストリスト７０の先頭の登録情報７００に対応する。
【００７１】
例えば、図１０に示すように、リクエスト並替テーブル１０６において巡回番号Ｃ１に対応する読出コアとしてコア番号＃ｉが登録された場合、この項目は、未処理リクエストテーブル１０５におけるコア番号＃ｉの項に対応する。そして、未処理リクエストテーブル１０５におけるコア番号＃ｉに対応するリクエストポインタは、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報７００に対応する。すなわち、順序番号が分かり、その順序番号がリクエスト並替テーブル１０６に登録されていれば、その順序番号を有するリクエストの取得が可能である。このようにリクエスト並替テーブル１０６への登録を行うことで、並替部１０３は、順序番号順にリクエストが取得できるようにする。順序番号順にリクエストが取得できるようにリクエスト並替テーブル１０６への登録を行うので、並替部１０３は、順序番号順にリクエストを並び替えているといえる。
【００７２】
リスト作成部１０２及び並替部１０３は、リクエスト取得部１０１によるリクエストの取得に応じて、リクエストリスト１０７の作成、未処理リクエストテーブル１０５の登録及びリクエスト並替テーブル１０６によるリクエストの並び替えを繰り返す。リクエストの受信に応じてこれらの処理を繰り返すことで、リスト作成部１０２及び並替部１０３により、図１１に示す状態が生成される。図１１は、リクエストの受信を繰り返した場合の各テーブル及びリクエストリストの状態の一例を表す図である。
【００７３】
リクエスト並替テーブル１０６の読出コアには、個別リクエストリスト７０に登録情報７００が未登録であることを表す−１を除いて、同じ値は２回以上登録されない。なぜなら、各ＣＰＵコア＃０〜＃（Ｎ−１）に対応する個別リクエストリスト７０の先頭の登録情報７００が示すリクエストの順序番号に対応する巡回番号に対して読出コアが登録されるからである。
【００７４】
そして、リクエスト並替テーブル１０６の読み出しコアとして登録されたコア番号＃ｋ、＃ｊ及び＃ｉに対応する未処理リクエストテーブル１０５の項におけるリクエストリストポインタがそれぞれの個別リクエストリスト７０の先頭の登録情報７００を指す。例えば、図１１では、コア番号＃ｉの項のリクエストリストポインタが、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報７００を指し、その先頭の登録情報７００に一列に繋がるように３つの登録情報７００が登録されている。また、コア番号＃ｊの項のリクエストリストポインタが、コア番号＃ｊ用リクエストリスト７５の先頭の登録情報７００を指し、その先頭の登録情報７００に一列に繋がるように２つの登録情報７００が登録されている。また、コア番号＃ｋの項のリクエストリストポインタが、コア番号＃ｋ用リクエストリスト７６の先頭の登録情報７００を指し、その先頭の登録情報７００に一列に繋がるように３つの登録情報７００が登録されている。
【００７５】
さらに、未処理リクエストテーブル１０５には、リクエスト並替テーブル１０６の読出コアには登録されていないが、リクエストリストポインタが登録されるコア番号＃ｍも存在する。これは、例えば、ＣＰＵコア＃ｍが、順序番号がその時点でのリクエスト並替テーブル１０６の範囲外となる遅いリクエストを読み出した場合などである。図１１では、リクエスト並替テーブル１０６の読出コアとして登録されていないコア番号＃ｍに対応するリクエストポインタが、コア番号＃ｍ用リクエストリスト７７の先頭の登録情報７００を指している。そして、コア番号＃ｍ用リクエストリスト７７の先頭の登録情報７００に一列に繋がるように４つの登録情報７００が登録されている。このように、ＣＰＵコア＃１００の中には、対応する個別リクエストリスト７０には既に登録情報７００が登録されているが、未だリクエスト並替テーブル１０６には読出コアとして登録されていないものも存在する。
【００７６】
図２に戻って説明を続ける。一時格納部１０８に格納されたリクエストに対してソフトリクエストキュー３００への格納処理が行われた場合、並替部１０３は、そのリクエストの読出コアである対象ＣＰＵコア＃１００の情報をリスト作成部１０２から受信する。さらに、並替部１０３は、対象ＣＰＵコア＃１００の個別リクエストリスト７０の先頭の登録情報７００の情報をリスト作成部１０２から受信する。
【００７７】
並替部１０３は、リクエスト並替テーブル１０６におけるその時点での先頭インデックス６４が示す巡回番号の項の読み出しコアの値を−１に変更する。次に、並替部１０３は、例えば、先頭インデックス６４の値に１を加算して、その時点での先頭インデックス６４が示す巡回番号の項の次の項を示す値を算出する。そして、並替部１０３は、算出した値がリクエスト並替テーブル１０６の項数を超えるか否かを判定する。リクエスト並替テーブル１０６の項数を超えない場合、並替部１０３は、算出した値を先頭インデックス６４の値とする。また、リクエスト並替テーブル１０６の項数を超える場合、並替部１０３は、リクエスト並替テーブル１０６の先頭の巡回番号を先頭インデックス６４の値とする。
【００７８】
また、並替部１０３は、最小未処理順序番号６３に１を加算して、最小未処理順序番号６３をソフトリクエストキュー３００へ格納したリクエストの次のリクエストの順序番号を示す値に変更する。
【００７９】
次に、並替部１０３は、未処理リクエストテーブル１０５における対象ＣＰＵコア＃１００の項のリクエストリストポインタの値がＮＵＬＬか否かにより、対象ＣＰＵコア＃１００の個別リクエストリスト７０が空か否かを判定する。個別リクエストリスト７０が空の場合、並替部１０３は、リクエストのソフトリクエストキュー３００への格納時の未処理リクエストテーブル１０５、リクエスト並替テーブル１０６及び個別リクエストリスト７０の変更処理を終了する。
【００８０】
これに対して、対象ＣＰＵコア＃１００の個別リクエストリスト７０が空でない場合、並替部１０３は、個別リクエストリスト７０の先頭の登録情報７００に格納された順序番号を取得する。そして、並替部１０３は、最小未処理順序番号６３の値にリクエスト並替テーブル１０６の項数を加算した加算結果が取得した順序番号より大きいか否かを判定する。加算結果が取得した順序番号より小さい場合、順序番号はリクエスト並替テーブル１０６の登録範囲外にあるので、並替部１０３は、リクエスト並替テーブル１０６の変更処理を終了する。
【００８１】
これに対して、加算結果が取得した順序番号以下の場合、並替部１０３は、取得した順序番号から最小未処理順序番号６３の値を減算した値を先頭インデックス６４の値に加算する。次に、並替部１０３は、加算結果がリクエスト並替テーブル１０６の項目数であるＮを超えているか否かを判定する。加算結果がＮを超えていない場合、並替部１０３は、その値の巡回番号の項に読出コアとして対象ＣＰＵコア＃１００を登録する。これに対して、加算結果がＮを超えている場合、並替部１０３は、加算結果からリクエスト並替テーブル１０６の項目数であるＮを減算した巡回番号の項に読出コアとして対象ＣＰＵコア＃１００を登録する。
【００８２】
ソフトリクエストキュー管理部１０４は、所定間隔又は処理実行部３０からのリクエスト取得要求を契機として場合に、リクエスト並替テーブル１０６の先頭インデックス６４を取得する。そして、ソフトリクエストキュー管理部１０４は、先頭インデックス６４が示す巡回番号の項の読出コアを取得する。
【００８３】
次に、ソフトリクエストキュー管理部１０４は、取得した読出コアに対応する未処理リクエストテーブル１０５の項からリクエストリストポインタを取得する。そして、ソフトリクエストキュー管理部１０４は、取得したリクエストリストポインタが示す個別リクエストリスト７０の先頭の登録情報７００を読み出す。その後、ソフトリクエストキュー管理部１０４は、読み出した登録情報７００のリクエストポインタが示すリクエストを一時格納部１０８から取得する。そして、ソフトリクエストキュー管理部１０４は、取得したリクエストを順序保証済リクエスト格納部３５に格納する。さらに、ソフトリクエストキュー管理部１０４は、順序保証済リクエスト格納部３５に格納したリクエストを示すポインタをソフトリクエストキュー３００に格納されたポインタの最後尾に格納する。これにより、順序保証済リクエスト格納部３５に格納されたリクエストは、ソフトリクエストキュー３００に格納されたポインタの順番で処理実行部３０により読み出されることになる。すなわち、順序保証済リクエスト格納部３５に格納されたリクエストが読み出される順序は、リクエストキュー２００に格納された状態のリクエストの順序と同じ順序となる。
【００８４】
その後、ソフトリクエストキュー管理部１０４は、読み出したリクエストが格納された個別リクエストリスト７０の情報をリスト作成部１０２に通知する。
【００８５】
次に、図１２を参照して、本実施例に係るリクエスト受信時の処理の全体的な流れについて説明する。図１２は、実施例１に係る情報処理装置によるリクエスト受信時の全体的な処理を表すフローチャートである。
【００８６】
リクエスト取得部１０１は、リクエストキュー２００をロックして排他制御を用いたポーリングを行い、リクエストキュー２００に格納されたポインタで示されるリクエストを未処理リクエスト格納部２５から取得する。さらに、リクエスト取得部１０１は、シーケンスカウンタ２０２を用いて取得したリクエストの順序番号を設定する（ステップＳ１）。その後、リクエスト取得部１０１は、取得したリクエストをリスト作成部１０２へ出力する。
【００８７】
リスト作成部１０２は、リクエストの入力をリクエスト取得部１０１から受ける。さらに、リスト作成部１０２は、シーケンスカウンタ２０２から順序番号を取得しリクエストに割り当てる。そして、リスト作成部１０２は、取得したリクエストを一時格納部１０８に格納する。また、リスト作成部１０２は、未処理リクエストテーブル１０５に対応付けてリクエストを読み出したＣＰＵコア＃１００毎の個別リクエストリスト７０を作成する（ステップＳ２）。そして、リスト作成部１０２は、格納したリクエストの順序番号及びリクエストを読み出したＣＰＵコア＃１００の情報を並替部１０３へ出力する。
【００８８】
並替部１０３は、格納したリクエストの順序番号及びリクエストを読み出したＣＰＵコア＃１００の情報の入力をリスト作成部１０２から受ける。そして、並替部１０３は、リクエスト並替テーブル１０６を用いて各個別リクエストリスト７０の先頭の登録情報が示すリクエストの順序番号と読出コアのコア番号とを対応付けることでリクエストの並び替えを行う（ステップＳ３）。
【００８９】
その後、ソフトリクエストキュー管理部１０４は、順序番号にしたがって一時格納部１０８に格納されたリクエストをソフトリクエストキュー３００に格納する（ステップＳ４）。
【００９０】
リクエストのソフトリクエストキュー３００への格納に応じて、リスト作成部１０２は、未処理リクエストテーブル１０５及びリクエストリスト１０７を変更する。また、未処理リクエストテーブル１０５及びリクエストリスト１０７の変更に応じて、並替部１０３は、リクエスト並替テーブル１０６を変更する（ステップＳ５）。
【００９１】
次に、図１３を参照して、排他制御を用いたリクエストの取得処理の流れについて説明する。図１３は、排他制御を用いたリクエストの取得処理のフローチャートである。図１３のフローチャートで示した処理は、図１２のステップＳ１の処理の一例にあたる。
【００９２】
リクエスト取得部１０１は、排他フラグ２０３を確認し、リクエストキュー２００が使用中か否かを判定する（ステップＳ１０１）。リクエストキュー２００が使用中の場合（ステップＳ１０１：肯定）、リクエスト取得部１０１は、リクエストキュー２００が未使用になるまで待機する。
【００９３】
これに対して、リクエストキュー２００が未使用の場合（ステップＳ１０１：否定）、リクエスト取得部１０１は、排他フラグ２０３の値を使用中に変更して、リクエストキュー２００をロックする（ステップＳ１０２）。
【００９４】
次に、リクエスト取得部１０１は、リクエストキュー２００に対してポーリングを実行する（ステップＳ１０３）。
【００９５】
そして、リクエスト取得部１０１は、リクエストを取得したか否かを判定する（ステップＳ１０４）。リクエストを取得しなかった場合（ステップＳ１０４：否定）、リクエスト取得部１０１は、ステップＳ１０６へ進む。
【００９６】
これに対して、リクエストを取得した場合（ステップＳ１０４：肯定）、リクエスト取得部１０１は、シーケンスカウンタ２０２を１つインクリメントする（ステップＳ１０５）。
【００９７】
その後、リクエスト取得部１０１は、排他フラグ２０３の値を未使用に再設定して、リクエストキュー２００のロックを解除する（ステップＳ１０６）。
【００９８】
次に、図１４を参照して、未処理リクエストテーブル１０５、リクエストリスト１０７及びリクエスト並替テーブル１０６の作成処理の流れについて説明する。図１４は、未処理リクエストテーブル、リクエストリスト及びリクエスト並替テーブルの作成処理のフローチャートである。図１４のフローチャートで示した処理は、図１２のステップＳ２及びＳ３の処理の一例にあたる。ここでは、ＣＰＵコア＃ｉが順序番号ｎのリクエストを読み出した場合で説明する。
【００９９】
リスト作成部１０２は、未処理リクエストテーブル１０５におけるコア番号＃ｉに対応するリクエストリストポインタの値がＮＵＬＬか否か、すなわちコア番号＃ｉ用リクエストリスト７４が空か否かを判定する（ステップＳ２０１）。コア番号＃ｉ用リクエストリスト７４が空でない場合（ステップＳ２０１：否定）、リスト作成部１０２は、ステップＳ２０４へ進む。
【０１００】
これに対して、コア番号＃ｉ用リクエストリスト７４が空の場合（ステップＳ２０１：肯定）、リスト作成部１０２は、格納したリクエストの順序番号ｎ及びリクエストを読み出したＣＰＵコア＃ｉの情報を並替部１０３へ出力する。並替部１０３は、格納されたリクエストの順序番号ｎ及びリクエストを読み出したＣＰＵコア＃ｉの情報の入力をリスト作成部１０２から受ける。次に、並替部１０３は、最小未処理順序番号６３を取得する。そして、並替部１０３は、順序番号ｎが最小未処理順序番号６３とリクエスト並び替えテーブルの項数との加算結果未満か否かを判定する（ステップＳ２０２）。順序番号ｎが加算結果以上の場合（ステップＳ２０２：否定）、処理は、ステップＳ２０４へ進む。
【０１０１】
これに対して、順序番号ｎが加算結果未満の場合（ステップＳ２０２：肯定）、並替部１０３は、順序番号ｎに対応するリクエスト並替テーブル１０６の巡回番号の項にコア番号＃ｉを登録する（ステップＳ２０３）。
【０１０２】
リスト作成部１０２は、コア番号＃ｉ用リクエストリスト７４の一列に繋がる登録情報７００の最後尾に格納したリクエストを示す登録情報７００を配置する（ステップＳ２０４）。
【０１０３】
次に、図１５を参照して、ソフトリクエストキュー３００へのリクエスト格納後の、未処理リクエストテーブル１０５、リクエストリスト１０７及びリクエスト並替テーブル１０６の変更処理の流れについて説明する。図１５は、ソフトリクエストキューへのリクエスト格納後の、未処理リクエストテーブル、リクエストリスト及びリクエスト並替テーブルの変更処理のフローチャートである。図１５のフローチャートで示した処理は、図１２のステップＳ５の処理の一例にあたる。ここでは、ＣＰＵコア＃ｉが読み出した順序番号ｎのリクエストがソフトリクエストキュー３００に格納された場合で説明する。
【０１０４】
リスト作成部１０２は、ソフトリクエストキュー管理部１０４から、リクエストを読み出したコア番号＃ｉ用リクエストリスト７４の情報の入力を受ける。そして、リスト作成部１０２は、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報７００が示す登録情報のネクストポインタが終端を表すか否か、すなわち次の登録情報７００があるか否かを判定する（ステップＳ３０１）。
【０１０５】
ネクストポインタが終端を表す場合（ステップＳ３０１：肯定）、リスト作成部１０２は、未処理リクエストテーブル１０５におけるコア番号＃ｉの項のリクエストリストポインタの値をＮＵＬＬに設定する（ステップＳ３０２）。
【０１０６】
これに対して、ネクストポインタが次の登録情報７００を示す場合（ステップＳ３０１：否定）、リスト作成部１０２は、ネクストポインタが示す登録情報７００を示す値に、未処理リクエストテーブル１０５におけるコア番号＃ｉの項のリクエストリストポインタを設定する（ステップＳ３０３）。
【０１０７】
次に、リスト作成部１０２は、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報７００を削除する（ステップＳ３０４）。そして、リスト作成部１０２は、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報７００の削除を並替部１０３に通知する。
【０１０８】
並替部１０３は、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報７００の削除の通知をリスト作成部１０２から受ける。そして、並替部１０３は、リクエスト並替テーブル１０６における先頭インデックス６４を次の項に移動する。また、並替部１０３は、移動前の先頭インデックス６４が示す項の読出コアの値を−１に変更する。さらに、並替部１０３は、最小未処理順序番号６３を１つインクリメントする（ステップＳ３０５）。
【０１０９】
次に、並替部１０３は、未処理リクエストテーブル１０５のコア番号＃ｉの項のリクエストリストポインタの値がＮＵＬＬか否かにより、ＣＰＵコア＃ｉの個別リクエストリスト７０に登録情報７００が存在するか否か判定する（ステップＳ３０６）。ＣＰＵコア＃ｉの個別リクエストリスト７０に登録情報７００が存在しない場合（ステップＳ３０６：否定）、並替部１０３は、リクエスト並替テーブル１０６の変更処理を終了する。
【０１１０】
これに対して、ＣＰＵコア＃ｉの個別リクエストリスト７０に登録情報７００が存在する場合（ステップＳ３０６：肯定）、並替部１０３は、コア番号＃ｉ用リクエストリスト７４の先頭の登録情報の順序番号ｎを取得する。次に、並替部１０３は、順序番号ｎが、最小未処理順序番号６３とリクエスト並替テーブル１０６の項数との加算結果未満か否かを判定する（ステップＳ３０７）。順序番号ｎが加算結果以上の場合（ステップＳ３０７：否定）、並替部１０３は、リクエスト並替テーブル１０６の変更処理を終了する。
【０１１１】
これに対して、順序番号ｎが加算結果未満の場合（ステップＳ３０７：肯定）、並替部１０３は、順序番号ｎに対応するリクエスト並替テーブル１０６の巡回番号の項にコア番号＃ｉを登録する（ステップＳ３０８）。
【０１１２】
以上に説明したように、本実施例に係る情報処理装置は、排他制御を用いて、デバイスのリクエストキューに格納された順にリクエストを読み出し、読み出したリクエストに対して読み出し順になるように連番で順序番号を割り当てる。そして、本実施例に係る情報処理装置は、読み出したＣＰＵコア毎にリクエストを読み出し順に並べたリストを作成し、作成したリストを用いてリクエストを順序番号順に並び替え、並び替えた順にリクエストを取得してソフトリクエストキューに格納する。
【０１１３】
これにより、デバイスのリクエストキューに格納された順番を守って、ソフトリクエストキューにリクエストを格納することができる。また、排他制御を行う期間が短縮でき、デバイスのリクエストキューからリクエストを読み出してソフトリクエストキューへ格納する処理を並列で行うことで時間を短縮することができる。また、リクエストの読み出し及び順序番号の設定の期間に排他制御を制限することで、リクエストが読み出せなかった場合、すなわちポーリングが失敗した場合にも無駄な処理を抑えることができる。
【０１１４】
また、インフィニバンドを用いた通信の場合、パケットの配送遅延とネットワーク上でのパケットロスとを区別することが極めて困難である。そのため、送信側でリクエストの順序番号を割り当てる構成では、パケットが配送されていない場合に、同じ順序番号のリクエストを送信したり、順序番号を飛ばしてリクエストを送信したりしてしまうおそれがある。送信側でリクエストの順序番号を割り当てる構成でこの問題を解決するには、複雑な送信制御を行うことになり実現が困難である。これに対して、本実施例に係る情報処理装置はインフィニバンドデバイスにおいてリクエストの受信側で順序番号を割り当てるため、送信側で順序番号を割り当てる場合に比べて信頼性が向上する。
【実施例２】
【０１１５】
図１６は、実施例２に係る情報処理装置のブロック図である。本実施例に係る情報処理装置１は、ソフトリクエストキュー３００を用いてリクエストを読み出す際にリクエストが存在しない場合に、リクエストの並び替えを実行してリクエストを取得可能にすることが実施例１と異なる。本実施例に係る情報処理装置１は、実施例１で説明した各部に加えて遅延コア管理テーブル１０９を有する。以下では、実施例１と同じ各部の機能については説明を省略する。
【０１１６】
処理実行部３０は、リクエストを取得するためにソフトリクエストキュー３００のポインタの読み出しを行う。この時、既にリクエストが順序保証済リクエスト格納部３５に格納されている場合、ソフトリクエストキュー３００にはそのリクエストを示すポインタが格納されている。そこで、処理実行部３０は、ソフトリクエストキュー３００からポインタを読み出し、読み出したポインタが示すリクエストを順序保証済リクエスト格納部３５から取得する。
【０１１７】
これに対して、未だリクエストが順序保証済リクエスト格納部３５に格納されていない場合、ソフトリクエストキュー３００にはそのリクエストを示すポインタが格納されていない。そのため、処理実行部３０は、ポインタのソフトリクエストキュー３００からの読み出しに失敗する。そこで、処理実行部３０は、ソフトリクエストキュー管理部１０４にソフトリクエストキュー３００へのリクエストの格納を要求する。
【０１１８】
その後、ソフトリクエストキュー３００にリクエストが格納されると、処理実行部３０は、格納されたリクエストを取得して処理を行う。
【０１１９】
ソフトリクエストキュー管理部１０４は、ソフトリクエストキュー３００へのリクエストの格納要求を処理実行部３０から取得する。そして、ソフトリクエストキュー管理部１０４は、リクエスト並替テーブル１０６の先頭インデックス６４を取得する。そして、ソフトリクエストキュー管理部１０４は、先頭インデックス６４が示す巡回番号の項の読出コアの値が−１か否かを判定する。
【０１２０】
読出コアとしてコア番号＃０〜＃（Ｎ−１）の何れかが登録されている場合、ソフトリクエストキュー管理部１０４は、読出コアを取得する。次に、ソフトリクエストキュー管理部１０４は、取得した読出コアに対応する未処理リクエストテーブル１０５の項からリクエストリストポインタを取得する。そして、ソフトリクエストキュー管理部１０４は、取得したリクエストリストポインタが示す個別リクエストリスト７０の先頭の登録情報７００を読み出す。その後、ソフトリクエストキュー管理部１０４は、読み出した登録情報７００のリクエストポインタが示すリクエストを一時格納部１０８から取得する。
【０１２１】
そして、ソフトリクエストキュー管理部１０４は、取得したリクエストを順序保証済リクエスト格納部３５に格納する。さらに、ソフトリクエストキュー管理部１０４は、順序保証済リクエスト格納部３５に格納したリクエストを示すポインタをソフトリクエストキュー３００の最後尾に格納する。その後、ソフトリクエストキュー管理部１０４は、読み出したリクエストが格納された個別リクエストリスト７０の情報をリスト作成部１０２に通知する。
【０１２２】
これに対して、読出コアの値が−１の場合、ソフトリクエストキュー管理部１０４は、リクエストの更新処理の実施を並替部１０３に指示する。その後、先頭インデックス６４が示す巡回番号の項の読出コアの値が設定されると、ソフトリクエストキュー管理部１０４は、リクエストのソフトリクエストキュー３００への格納を実行する。その後、ソフトリクエストキュー管理部１０４は、読み出したリクエストが格納された個別リクエストリスト７０の情報をリスト作成部１０２に通知する。
【０１２３】
図１７は、遅延コア管理テーブルの一例を表す図である。遅延コア管理テーブル１０９は、並替部１０３がリクエスト並替テーブル１０６への読出コアの情報の反映が遅れているＣＰＵコア＃１００を検出する際に用いるテーブルである。遅延コア管理テーブル１０９は、コア番号＃０〜＃（Ｎ−１）のそれぞれに対応する未出現フラグの情報を有する。
【０１２４】
並替部１０３は、リクエストの更新処理の実施の指示をソフトリクエストキュー管理部１０４から受ける。次に、並替部１０３は、遅延コア管理テーブル１０９の未出現フラグの値を全て１にセットする。
【０１２５】
次に、並替部１０３は、コア番号＃０から順番に番号を増やしながら１つずつ選択する。ここで、並替部１０３がコア番号＃ｉを選択した場合で説明する。並替部１０３は、リクエスト並替テーブル１０６におけるコア番号＃ｉの項の読出コアの値が−１か否かを判定する。読出コアの値が−１の場合、並替部１０３は、次のコア番号＃ｉ＋１の選択に進む。
【０１２６】
これに対して、読出コアの値が−１の場合、並替部１０３は、遅延コア管理テーブル１０９におけるコア番号＃ｉの項の未出現フラグの値を０に設定する。そして、並替部１０３は、次のコア番号＃ｉ＋１の選択に進む。並替部１０３は、コア番号＃（Ｎ−１）まで選択を繰り返し判定を行う。この処理により、遅延コア管理テーブル１０９において未出現フラグの値が０となったＣＰＵコア＃１００の集合は、リクエスト並替テーブル１０６に出現していないＣＰＵコア＃１００の集合となる。
【０１２７】
次に、並替部１０３は、遅延コア管理テーブル１０９において未出現フラグの値が０のＣＰＵコア＃１００を１つ選択する。そして、並替部１０３は、選択したＣＰＵコア＃１００の個別リクエストリスト７０が空か否かを判定する。個別リクエストリスト７０が空の場合、並替部１０３は、選択したＣＰＵコア＃１００についてのリクエスト並替テーブル１０６の変更処理を終了する。
【０１２８】
これに対して、対象ＣＰＵコア＃１００の個別リクエストリスト７０が空でない場合、並替部１０３は、個別リクエストリスト７０の先頭の登録情報７００に格納された順序番号を取得する。そして、並替部１０３は、最小未処理順序番号６３の値にリクエスト並替テーブル１０６の項数を加算した加算結果が取得した順序番号より大きいか否かを判定する。加算結果が取得した順序番号より小さい場合、順序番号はリクエスト並替テーブル１０６の登録範囲外にあるので、並替部１０３は、選択したＣＰＵコア＃１００についてのリクエスト並替テーブル１０６の変更処理を終了する。
【０１２９】
これに対して、加算結果が取得した順序番号以下の場合、並替部１０３は、取得した順序番号から最小未処理順序番号６３の値を減算した値を先頭インデックス６４の値に加算する。次に、並替部１０３は、加算結果がリクエスト並替テーブル１０６の項目数であるＮを超えているか否かを判定する。加算結果がＮを超えていない場合、並替部１０３は、その値の巡回番号の項に読出コアとして選択したＣＰＵコア＃１００を登録する。これに対して、加算結果がＮを超えている場合、並替部１０３は、加算結果からリクエスト並替テーブル１０６の項目数であるＮを減算した巡回番号の項に読出コアとして選択したＣＰＵコア＃１００を登録する。
【０１３０】
並替部１０３は、リクエスト並替テーブル１０６における先頭インデックス６４が示す巡回番号の項の読出コアが登録されるまで又は全て選択し終わるまでＣＰＵコア＃１００の選択及びリクエスト並替テーブル１０６の変更処理を繰り返す。
【０１３１】
リクエスト並替テーブル１０６における先頭インデックス６４が示す巡回番号の項の読出コアが登録されない場合、並替部１０３は、処理実行部３０が要求したリクエストが未到着又はリクエストリスト１０７への登録処理などの処理遅延が発生していると判定する。この場合、並替部１０３は、リクエストの未着を処理実行部３０に通知する。
【０１３２】
次に、図１８を参照して、アプリケーションによるリクエストの取得を契機としたリクエストの並び替え処理の流れについて説明する。図１８は、アプリケーションによるリクエストの取得を契機としたリクエストの並び替え処理のフローチャートである。
【０１３３】
処理実行部３０は、リクエストを取得時にソフトリクエストキュー３００からのポインタの読み出しに失敗したことで、リクエストの不存在を検出する（ステップＳ４０１）。そして、処理実行部３０は、ソフトリクエストキュー３００へのリクエストの格納をソフトリクエストキュー管理部１０４に要求する。
【０１３４】
ソフトリクエストキュー管理部１０４は、ソフトリクエストキュー３００へのリクエストの格納の要求を処理実行部３０から受ける。そして、ソフトリクエストキュー管理部１０４は、先頭インデックス６４が示す項の読出コアの値が−１か否かを判定する（ステップＳ４０２）。
【０１３５】
先頭インデックス６４が示す項の読出コアの値が−１でない場合（ステップＳ４０２：否定）、ソフトリクエストキュー管理部１０４は、先頭インデックス６４が示す項の読出コアに対応する個別リクエストリスト７０の先頭の登録情報７００を取得する。そして、ソフトリクエストキュー管理部１０４は、取得した登録情報７００が示す一時格納部１０８に格納されたリクエストを取得し、ソフトリクエストキュー３００に格納する（ステップＳ４０３）。そして、ソフトリクエストキュー管理部１０４は、ソフトリクエストキュー３００への格納が行われたリクエストを示す登録情報７００を格納する個別リクエストリスト７０の情報をリスト作成部１０２へ通知する。
【０１３６】
次に、リスト作成部１０２及び並替部１０３は、未処理リクエストテーブル１０５、リクエスト並替テーブル１０６及びリクエストリスト１０７の更新処理を実行する（ステップＳ４０４）。図１５のフローチャートで示される処理が、このステップＳ４０４で行われる処理の一例にあたる。
【０１３７】
一方、先頭インデックス６４が示す項の読出コアの値が−１の場合（ステップＳ４０２：肯定）、並替部１０３は、遅延コア管理テーブル１０９を用いて遅延コア集合を生成する（ステップＳ４０５）。
【０１３８】
次に、並替部１０３は、コア番号＃ｕのｕを０に設定する（ステップＳ４０６）。そして、並替部１０３は、ｕがコア数以下か否かを判定する（ステップＳ４０７）。ｕがコア数より大きい場合（ステップＳ４０７：否定）、並替部１０３は、リクエストの並び替え処理を終了する。
【０１３９】
これに対して、ｕがコア数以下の場合（ステップＳ４０７：肯定）、並替部１０３は、先頭インデックス６４が示す項の読出コアの値が−１か否かを判定する（ステップＳ４０８）。先頭インデックス６４が示す項の読出コアの値が−１でない場合（ステップＳ４０８：否定）、処理実行部３０が要求したリクエストは既にソフトリクエストキュー３００へ格納されているので、処理はステップＳ４０２へ戻る。
【０１４０】
一方、先頭インデックス６４が示す項の読出コアの値が−１の場合（ステップＳ４０８：肯定）、並替部１０３は、遅延コア管理テーブル１０９におけるコア番号＃ｕの未出現フラグを確認する。そして、並替部１０３は、ＣＰＵコア＃ｕが遅延コア集合に含まれるか否かを判定する（ステップＳ４０９）。ＣＰＵコア＃ｕが遅延コア集合に含まれてない場合（ステップＳ４０９：否定）、並替部１０３は、ステップＳ４１３へ進む。
【０１４１】
これに対して、ＣＰＵコア＃ｕが遅延コア集合に含まれる場合（ステップＳ４０９：肯定）、並替部１０３は、未処理リクエストテーブル１０５におけるリクエストリストポインタを確認する。そして、並替部１０３は、コア番号＃ｕ用リクエストリストが空か否かを判定する（ステップＳ４１０）。コア番号＃ｕ用リクエストリストが空でない場合（ステップＳ４１０：否定）、並替部１０３は、ステップＳ４１３へ進む。
【０１４２】
これに対して、コア番号＃ｕ用リクエストリストが空の場合（ステップＳ４１０：肯定）、並替部１０３は、コア番号＃ｕ用リクエストリストの先頭の登録番号の順序番号を取得する。そして、並替部１０３は、取得した順序番号が、最小未処理順序番号６３とリクエスト並替テーブル１０６の項数との加算結果未満か否かを判定する（ステップＳ４１１）。順序番号が加算結果以上の場合（ステップＳ４１１：否定）、並替部１０３は、ステップＳ４１３へ進む。
【０１４３】
これに対して、順序番号が加算結果未満の場合（ステップＳ４１１：肯定）、並替部１０３は、リクエスト並替テーブル１０６における取得した順序番号に対応する巡回番号の項の読出コアにコア番号＃ｕを登録する（ステップＳ４１２）。
【０１４４】
その後、並替部１０３は、ｕを１つインクリメントし（ステップＳ４１３）、ステップＳ４０７へ戻る。
【０１４５】
次に、図１９を参照して、並替部１０３による遅延コア集合生成処理の流れについて説明する。図１９は、遅延コア集合生成処理のフローチャートである。図１９のフローチャートで表される処理は、図１８におけるステップＳ４０５の処理の一例にあたる。
【０１４６】
並替部１０３は、遅延コア管理テーブル１０９におけるコア番号＃０〜＃（Ｎ−１）の全てに対応する未出現フラグを「１」に設定する（ステップＳ５０１）。
【０１４７】
次に、並替部１０３は、リクエスト並替テーブル１０６の任意の項ｉにおけるｉを０に設定する（ステップＳ５０２）。
【０１４８】
次に、並替部１０３は、ｉがリクエスト並替テーブル１０６の項数Ｎより小さいか否かを判定する（ステップＳ５０３）。ｉがリクエスト並替テーブル１０６の項数Ｎ以上の場合（ステップＳ５０３：否定）、並替部１０３は、遅延コア集合生成処理を終了する。
【０１４９】
これに対して、ｉがリクエスト並替テーブル１０６の項数Ｎより小さい場合（ステップＳ５０３：肯定）、並替部１０３は、リクエスト並替テーブル１０６におけるコア番号＃ｉに対応する読出コアの値が「−１」か否かを判定する（ステップＳ５０４）。読み出しコアの値が「−１」の場合（ステップＳ５０４：肯定）、並替部１０３は、ステップＳ５０６へ進む。
【０１５０】
これに対して、読出コアの値が「−１」でない場合（ステップＳ５０４：否定）、並替部１０３は、リクエスト並替テーブル１０６の項ｉに対応する読出コアの欄に登録されたコア番号を取得する。そして、並替部１０３は、遅延コア管理テーブル１０９における、取得したコア番号を有するＣＰＵコア＃１００の未出現フラグを「０」に設定する（ステップＳ５０５）。
【０１５１】
その後、並替部１０３は、ｉを１つインクリメントし（ステップＳ５０６）、ステップＳ５０３へ戻る。
【０１５２】
以上に説明したように、本実施例に係る情報処理装置は、アプリケーションがソフトリクエストキューを用いてリクエスト読み出す際にリクエストが存在しない場合に、リクエスト並替テーブルの更新を行う。具体的には、情報処理装置は、デバイスが有するリクエストキューからの受信が、リクエスト並替テーブルに反映されていないリクエストを検出して反映させ、その後、ソフトリクエストキューへの格納を行う。これにより、アプリケーションによるリクエストの使用に応じて、リクエスト取得の準備をすることができ、アプリケーションを効率的に動作させることができる。
【０１５３】
ここで、実施例１では、情報処理装置は、デバイスが有するリクエストキューからのリクエストの受信時を契機としてリクエスト並替テーブルの更新を行った。また、実施例２では、アプリケーションによるソフトリクエストキューからのリクエストの読み出しを契機としてリクエスト並替テーブルの更新を行った。そして、リクエスト並替テーブルの更新は、何れか一方を契機として用いてもよいし、双方を並行して行ってもよい。
【実施例３】
【０１５４】
次に、実施例３について説明する。本実施例に係る情報処理装置も図２のブロック図で表される。本実施例に係る情報処理装置１は、インフィニバンドの場合に送信元のノード毎にリクエストの順序を保証することが実施例１と異なる。以下では、実施例１と同じ各部の機能については説明を省略する。
【０１５５】
本実施例に係る情報処理装置１は、図２０に示すようなシーケンスカウンタ２０２を有する。図２０は、実施例３に係るシーケンスカウンタの一例の図である。本実施例に係るシーケンスカウンタ２０２は、インフィニバンドのインターコネクト５に接続された情報処理装置２〜４毎にカウンタ２２１〜２２３を有する。例えば、カウンタ２２１は情報処理装置２に対応し、カウンタ２２２は情報処理装置３に対応し、カウンタ２２３は情報処理装置４に対応する。
【０１５６】
リクエスト受信部２０１は、情報処理装置２〜４の何れかからインターコネクト５を介してリクエストを受信すると、受信したリクエストの送信元の情報を付加してリクエストを未処理リクエスト格納部２５に格納する。
【０１５７】
図２１は、実施例３に係る未処理リクエストテーブルの一例の図である。本実施例に係る未処理リクエストテーブル１０５は、図２１に示すように、情報処理装置２〜４毎にコア番号＃１〜＃（Ｎ−１）に対応させてリクエストポインタが登録される。さらに、本実施例に係る未処理リクエストテーブル１０５は、情報処理装置２〜４毎に最小未処理順序番号６３１〜６３３及び先頭インデックス６４１〜６４３を有する。
【０１５８】
また、図２２は、実施例３に係るリクエスト並替テーブルの一例の図である。本実施例に係るリクエスト並替テーブル１０６は、図２２に示すように、情報処理装置２〜４毎に巡回番号Ｃ０〜Ｃ（Ｎ−１）に対応させて読出コアが登録される。
【０１５９】
リクエスト取得部１０１は、排他フラグ２０３を確認してリクエストキュー２００が排他制御中か否かを判定する。リクエストキュー２００が排他制御中でなければ、リクエスト取得部１０１は、排他フラグ２０３の値を使用中に変更し、リクエストキュー２００にロックを掛ける。
【０１６０】
次に、リクエスト取得部１０１は、リクエストキュー２００に対してポーリングを実行する。リクエスト取得部１０１は、リクエストキュー２００に格納されたポインタが示すリクエストを未処理リクエスト格納部２５から取得する。次に、リクエスト取得部１０１は、取得したリクエストに付加された送信元の情報を取得する。
【０１６１】
そして、リクエスト取得部１０１は、シーケンスカウンタ２０２における送信元に対応するカウンタ２２１〜２２３のいずれかのカウンタを１つインクリメントする。例えば、リクエストの送信元が情報処理装置２の場合、リクエスト取得部１０１は、カウンタ２２１のカウンタを１つ増やす。その後、リクエスト取得部１０１は、送信元の情報とともに取得したリクエストをリスト作成部１０２へ出力する。その後、リクエスト取得部１０１は、シーケンスカウンタ２０２のロックを解除する。
【０１６２】
リスト作成部１０２は、送信元の情報とともにリクエストの入力をリクエスト取得部１０１から受ける。そして、リスト作成部１０２は、送信元に対応するカウンタ２２１〜２２３のいずれかから値を取得する。そして、リスト作成部１０２は、取得した値を取得したリクエストの順序番号とする。これにより、リスト作成部１０２は、情報処理装置２〜４毎に連番となる順序番号をリクエストに割り当てることができる。
【０１６３】
その後、リスト作成部１０２は、一時格納部１０８に取得したリクエストを格納し、リクエストの送信元のＣＰＵコア＃１００の個別リクエストリスト７０に登録情報７００を登録する。さらに、リスト作成部１０２は、図２１に示す未処理リクエストテーブル１０５における取得したリクエストの送信元に対応する列を用いてＣＰＵコア＃１００に対応させてリクエストポインタを登録する。
【０１６４】
並替部１０３は、図２２に示すリクエスト並替テーブル１０６を用いて情報処理装置２〜４毎にリクエストの並び替えを行う。
【０１６５】
ソフトリクエストキュー管理部１０４は、図２２に示すリクエスト並替テーブル１０６及び図２１に未処理リクエストテーブル１０５を用いて、情報処理装置２〜４毎に順序番号順にリクエストを取得し、ソフトリクエストキュー３００に格納する。これにより、ソフトリクエストキュー３００に格納されたリクエストは、情報処理装置２〜４毎に順番が保証される。
【０１６６】
次に、図２３を参照して、本実施例に係る情報処理装置１によるポーリング処理について説明する。図２３は、実施例３に係る情報処理装置による排他制御を用いたリクエストの取得処理のフローチャートである。
【０１６７】
リクエスト取得部１０１は、排他フラグ２０３を確認し、リクエストキュー２００が使用中か否かを判定する（ステップＳ６０１）。リクエストキュー２００が使用中の場合（ステップＳ６０１：肯定）、リクエスト取得部１０１は、リクエストキュー２００が未使用になるまで待機する。
【０１６８】
これに対して、リクエストキュー２００が未使用の場合（ステップＳ６０１：否定）、リクエスト取得部１０１は、排他フラグ２０３の値を使用中に変更して、リクエストキュー２００をロックする（ステップＳ６０２）。
【０１６９】
次に、リクエスト取得部１０１は、リクエストキュー２００に対してポーリングを実行する（ステップＳ６０３）。
【０１７０】
そして、リクエスト取得部１０１は、リクエストを取得したか否かを判定する（ステップＳ６０４）。リクエストを取得しなかった場合（ステップＳ６０４：否定）、リクエスト取得部１０１は、ステップＳ６０７へ進む。
【０１７１】
これに対して、リクエストを取得した場合（ステップＳ６０４：肯定）、リクエスト取得部１０１は、取得したリクエストの送信元の情報を取得する（ステップＳ６０５）。
【０１７２】
次に、リクエスト取得部１０１は、シーケンスカウンタ２０２におけるリクエストの送信元である情報処理装置２〜４の何れかに対応するカウンタ２２１〜２２３の何れかを１つインクリメントする（ステップＳ６０６）。
【０１７３】
その後、リクエスト取得部１０１は、排他フラグ２０３の値を未使用に再設定して、リクエストキュー２００のロックを解除する（ステップＳ６０７）。
【０１７４】
以上に説明したように、本実施例に係る情報処理装置は、インフィニバンドを用いた通信におけるノード毎にリクエスト順序を保証してソフトリクエストキューにリクエストを格納する。これにより、デバイスのリクエストキューに格納された順番をノード毎に守って、ソフトリクエストキューにリクエストを格納することができる。この場合、異なるノードのリクエスト間におけるリクエストの順序は保証しない。
【０１７５】
アプリケーションの中には、ノード毎に処理を行うアプリケーションのようにノード間でのリクエストの順序を守らなくても処理が行えるものがある。そのため、アプリケーションによっては、ノード毎のリクエストの順序さえ守れば十分である場合がある。この場合、各ノードのリクエストのソフトリクエストキューへの移動において、他のノードのリクエストの到着を待つ時間を削減させることができ、ソフトリクエストキューへのリクエストの格納の時間を短縮することができる。
【０１７６】
（ハードウェア構成）
図２４は、情報処理装置のハードウェア構成図である。情報処理装置１は、図１に示すように、プロセッサ９０、メモリ９１、ストレージデバイス９２、ネットワークデバイス９３、ドライブ装置９４及び表示装置９５を有する。
【０１７７】
プロセッサ９０は、図１に例示したマルチコアＣＰＵ１００を含む。プロセッサ９０は、バスを介してメモリ９１、ストレージデバイス９２、ネットワークデバイス９３、ドライブ装置９４及び表示装置９５と接続される。
【０１７８】
ストレージデバイス９２は、ＳＳＤ９２１及びＳＡＳ（Serial  Attached  Small  computer  system  interface）−ＨＤＤ（Hard  Disc  Drive）９２２を有する。ストレージデバイス９２は、図１に例示したＮＶＭｅデバイス２１を含む。ネットワークデバイス９３は、図１に例示したインフィニバンドデバイス２０を含む。
【０１７９】
ドライブ装置９４は、ＣＤ（Compact  Disk）ドライブやＤＶＤ（Digital  Versatile  Disc）ドライブなどである。ドライブ装置９４は、ＣＤやＤＶＤである記録媒体９０４に対してデータの読み出しや書き込みを行う。表示装置９５は、例えばモニタである。
【０１８０】
メモリ９１は、図２に例示した一時格納部１０８、順序保証済リクエスト格納部３５及びソフトリクエストキュー３００の機能を実現する。また、メモリ９１は、リスト作成部１０２、並替部１０３、ソフトリクエストキュー管理部１０４及び処理実行部３０の機能を実現するためのプログラムを含む各種プログラムを格納する。また、メモリ９１は、図１に例示した未処理リクエストテーブル１０５、リクエスト並替テーブル１０６及びリクエストリスト１０７を記憶する。
【０１８１】
プロセッサ９０は、リクエスト取得部１０１、リスト作成部１０２、並替部１０３、ソフトリクエストキュー管理部１０４及び処理実行部３０の機能を実現するためのプログラムを含む各種プログラムをメモリ９１から読み出し展開して実行する。これにより、プロセッサ９０及びメモリ９１は、リクエスト取得部１０１、リスト作成部１０２、並替部１０３、ソフトリクエストキュー管理部１０４及び処理実行部３０の機能を実現する。
【符号の説明】
【０１８２】
１〜４  情報処理装置
１０  ポーリング制御部
２０  インフィニバンドデバイス
２１  ＮＶＭｅデバイス
２２  その他デバイス
２５  未処理リクエスト格納部
３０  処理実行部
３５  順序保証済リクエスト格納部
７０  個別リクエストリスト
１００  マルチコアＣＰＵ
１０１  リクエスト取得部
１０２  リスト作成部
１０３  並替部
１０４  ソフトリクエストキュー管理部
１０５  未処理リクエストテーブル
１０６  リクエスト並替テーブル
１０７  リクエストリスト
１０８  一時格納部
１０９  遅延コア管理テーブル
２００  リクエストキュー
２０１  リクエスト受信部
２０２  シーケンスカウンタ
２０３  排他フラグ
２２１〜２２３  カウンタ
３００  ソフトリクエストキュー
【図１】
2018180985.tif 000003
【図２】
2018180985.tif 000004
【図３】
2018180985.tif 000005
【図４】
2018180985.tif 000006
【図５】
2018180985.tif 000007
【図６】
2018180985.tif 000008
【図７】
2018180985.tif 000009
【図８】
2018180985.tif 000010
【図９】
2018180985.tif 000011
【図１０】
2018180985.tif 000012
【図１１】
2018180985.tif 000013
【図１２】
2018180985.tif 000014
【図１３】
2018180985.tif 000015
【図１４】
2018180985.tif 000016
【図１５】
2018180985.tif 000017
【図１６】
2018180985.tif 000018
【図１７】
2018180985.tif 000019
【図１８】
2018180985.tif 000020
【図１９】
2018180985.tif 000021
【図２０】
2018180985.tif 000022
【図２１】
2018180985.tif 000023
【図２２】
2018180985.tif 000024
【図２３】
2018180985.tif 000025
【図２４】
2018180985.tif 000026
【手続補正書】
【提出日】平成30年7月4日(2018.7.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
受信した処理要求が第１格納部に格納されていることを確認する処理と、確認した前記処理要求に対して前記第１格納部への格納順に基づく番号を割り当てる処理とを排他的に行う複数の処理部を有する処理要求取得部と、
前記処理要求取得部によって前記番号が割り当てられた前記処理要求を前記番号の順に基づき第２格納部に格納する格納処理部と、
前記第２格納部に格納された前記処理要求を、前記第２格納部への格納順に基づき処理する処理実行部と
を備えたことを特徴とする情報処理装置。
【請求項２】
前記処理要求を取得した前記処理部毎に管理する管理部をさらに備え、
前記格納処理部は、前記管理部に管理された前記処理要求を基に、前記処理要求の前記第２格納部への格納を実行することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
管理部は、前記処理部毎に前記番号の若い順に前記処理要求を管理し、
前記格納処理部は、各前記処理要求を取得した前記処理部の情報を前記番号の順に取得し、前記管理部により管理される、取得した情報が示す前記処理部に対応する前記処理要求を前記番号の順に取得し、前記第２格納部へ格納する
ことを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記格納処理部は、前記処理実行部が前記第２格納部から前記処理要求を取得しようとした際に前記第２格納部に前記処理要求が存在しない場合に、次に続く前記番号の順に基づき前記処理要求の前記第２格納部への格納を実行することを特徴とする請求項１〜３のいずれか一つに記載の情報処理装置。
【請求項５】
複数の演算処理装置のそれぞれが行う処理要求が第１格納部に格納されていることを確認する処理と、確認した前記処理要求に対して前記第１格納部への格納順に基づく番号を割り当てる処理とを前記演算処理装置の間で排他的に行わせ、
前記番号が割り当てられた前記処理要求を前記番号の順に基づき第２格納部に格納し、
前記第２格納部に格納された前記処理要求を、前記第２格納部への格納順に基づき処理する
ことを特徴とする情報処理方法。
【請求項６】
複数の演算処理装置のそれぞれが行う処理要求が第１格納部に格納されていることを確認する処理と、確認した前記処理要求に対して前記第１格納部への格納順に基づく番号を割り当てる処理とを前記演算処理装置の間で排他的に行わせ、
前記番号が割り当てられた前記処理要求を前記番号の順に基づき第２格納部に格納し、
前記第２格納部に格納された前記処理要求を、前記第２格納部への格納順に基づき処理する
処理をコンピュータに実行させることを特徴とする情報処理プログラム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００１３
【補正方法】変更
【補正の内容】
【００１３】
本願の開示する情報処理装置、情報処理方法及び情報処理プログラムの一つの態様において、処理要求取得部は、受信した処理要求が第１格納部に格納されていることを確認する処理と、確認した前記処理要求に対して前記第１格納部への格納順に基づく番号を割り当てる処理とを排他的に行う複数の処理部を有する。格納処理部は、前記処理要求取得部によって前記番号が割り当てられた前記処理要求を前記番号の順に基づき第２格納部に格納する。処理実行部は、前記第２格納部に格納された前記処理要求を、前記第２格納部への格納順に基づき処理する。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００４３
【補正方法】変更
【補正の内容】
【００４３】
次に、リスト作成部１０２は、取得したリクエストを一時格納部１０８へ格納する。次に、リスト作成部１０２は、順序番号及びリクエストの格納先の情報を含む登録情報をリクエストリスト１０７の中のリクエストを読み出したＣＰＵコア＃０に対応するリストに登録する。以下に、リスト作成部１０２によるリストの作成について詳細に説明する。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００４５
【補正方法】変更
【補正の内容】
【００４５】
リスト作成部１０２は、個別リクエストリスト７０に対して登録情報７００を登録する。登録情報７００には、順序番号、リクエストポインタ及びネクストポインタが含まれる。順序番号は、リスト作成部１０２が、リクエストに割り当てた順序番号にあたる。リクエストポインタは、順序番号に対応するリクエストの一時格納部１０８における格納先を示す情報である。また、ネクストポインタは、同じ個別リクエストリスト７０における次に登録された登録情報７００を表す情報である。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】００４６
【補正方法】変更
【補正の内容】
【００４６】
すなわち、リスト作成部１０２は、リクエスト取得部１０１から取得したリクエストを一時格納部１０８へ格納し、格納したリクエストの順序番号及び格納先を示すリクエストポインタを有する登録情報７００を生成する。さらに、リスト作成部１０２は、ネクストポインタとして終端を表す情報を生成した登録情報７００に付加する。その後、リスト作成部１０２は、リクエストの読み出し元に対応する個別リクエストリスト７０に生成した登録情報７００を登録する。さらに、その個別リクエストリスト７０が既に登録情報７００を有する場合、リスト作成部１０２は、既に登録された登録情報７００のうちの最も新しい登録情報７００のネクストポインタを今回登録した登録情報７００を示す値に変更する。これにより、個別リクエストリスト７０は、読み出したリクエストを順番に示すように並ぶ登録情報７００のリストをＣＰＵ＃０〜＃（Ｎ−１）毎に作成する。例えば、図４において、コア番号＃０用リクエストリスト７１には、登録情報７００が３つ存在する。すなわち、ＣＰＵ＃０が３つのリクエストを読み出した状態である。また、コア番号＃１用リクエストリスト７２には、登録情報７００が１つ存在する。すなわち、ＣＰＵ＃１が１つのリクエストを読み出した状態である。また、コア番号＃２用リクエストリスト７３には、登録情報７００が存在しない。すなわち、ＣＰＵ＃２がリクエストを読み出していない状態である。