(57)【要約】【課題】アクセラレータが記憶デバイスを特定して、アクセラレータが記憶デバイスからデータを読み出し、アクセラレータがプロセッサの処理の一部を実行する情報処理装置を提供する。【解決手段】プロセッサとメモリを有し、１以上のアクセラレータと、１以上の記憶デバイスを含む情報処理装置であって、前記情報処理装置は、前記プロセッサと前記アクセラレータ及び前記記憶デバイスを接続するひとつのネットワークを有し、前記記憶デバイスは、前記プロセッサから初期化の命令を受け付ける初期設定インタフェースと、Ｉ／Ｏコマンドを発行するＩ／Ｏ発行インタフェースと、を有し、前記プロセッサが、前記初期設定インタフェースのアドレス、または前記Ｉ／Ｏ発行インタフェースのアドレスを、前記アクセラレータに対して通知する。【選択図】図２
2018113075.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサとメモリを有し、１以上のアクセラレータと、１以上の記憶デバイスを含む情報処理装置であって、
前記情報処理装置は、前記プロセッサと前記アクセラレータ及び前記記憶デバイスを接続するひとつのネットワークを有し、
前記記憶デバイスは、
前記プロセッサから初期化の命令を受け付ける初期設定インタフェースと、
Ｉ／Ｏコマンドを発行するＩ／Ｏ発行インタフェースと、を有し、
前記プロセッサが、前記初期設定インタフェースのアドレス、または前記Ｉ／Ｏ発行インタフェースのアドレスを、前記アクセラレータに対して通知することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、Ｉ／Ｏコマンドを処理する情報処理装置に関する。
【背景技術】
【０００２】
近年、ビジネスへの活用を目的として、大量のデータを高速に解析する技術が注目されている。一般に、サーバのホストプロセッサ(以下、プロセッサ)が、ＨＤＤ（Hard disk drive）等の記憶デバイスからデータを読み出し、データの解析や演算を行っている。
【０００３】
記憶デバイスとしては、ＨＤＤと比べて高速にアクセスすることが可能な、フラッシュメモリを記憶媒体とするＳＳＤ（Solid State Drive）の普及が進んでいる。さらに、ＲｅＲＡＭ（Resistance Random Access Memory）やＰＣＭ（Phase Change Memory）等のフラッシュメモリよりも高速にアクセス可能な半導体記憶媒体の実用化が進んでいる。
【０００４】
このような記憶デバイスの登場により、高速に大量のデータを読み出すことが可能になった。しかし、プロセッサの処理負荷が高いことや、プロセッサに接続されるバスの帯域がボトルネックとなってデータ転送に時間がかかることにより、高速な記憶デバイスの性能を活かすことができず、情報処理装置として高速化できなかった。
【０００５】
従来、情報処理装置に、演算機能を有する装置（以下アクセラレータと呼ぶ）を付加することで、本来プロセッサが実行する処理の一部をそのアクセラレータに分散させる技術が知られている。例えば、プロセッサを持つサーバに、アクセラレータとしてＧＰＵ（Graphics Processing Unit）を付加して、プロセッサが実行するプログラム処理の一部をＧＰＵが処理することで処理速度の向上を図るという技術がある。
【０００６】
この技術は、プロセッサが記憶デバイスから、プロセッサに接続されたシステムメモリに処理対象データを転送し、さらにプロセッサがシステムメモリからアクセラレータにデータを転送することで、ＧＰＵがデータを処理できるようになる、というデータ転送の多い技術であった。特にプロセッサに接続されるバスをデータが往復するため、そのバスの帯域が性能向上のボトルネックとなることがあった。
【０００７】
特許文献１には、このデータ転送ボトルネックを解消するために、アクセラレータと記憶デバイスが、プロセッサを介さずに直接通信することで、さらなる処理速度の向上を目的とする情報処理装置が記載されている。
【０００８】
特許文献１の技術では、プロセッサとシステムメモリを有する情報処理装置に、ＧＰＵと不揮発メモリアレイが一対になって搭載された基板が接続され、ＧＰＵと不揮発メモリアレイ間で直接データ転送を行う。不揮発メモリアレイのデータはＧＰＵに転送され、そのＧＰＵの処理結果のみがプロセッサに接続されたバスに転送されるため、バスの帯域がシステムメモリへのアクセスで圧迫されるのを解消できる。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】米国特許出願公開第２０１４／１２９７５３号明細書
【発明の概要】
【発明が解決しようとする課題】
【００１０】
特許文献１には、情報処理装置の初期化の際に、ＧＰＵがどのようにしてアクセス先となる不揮発メモリアレイを特定するかについては記載されていない。ＰＣＩ−Ｅｘｐｒｅｓｓ（以下、ＰＣＩｅ）のエンドポイントとして記憶デバイス及びアクセラレータが接続されると、アクセラレータはアクセス先となる記憶デバイスのコマンドインタフェースのアドレスを特定することができないという課題がある。アクセラレータが記憶デバイスのコマンドインタフェースのアドレスを特定できないと、そもそも記憶デバイスにアクセスしてデータを読み出し、プロセッサの処理の一部を実行することもできない、という課題があった。
【００１１】
そこで本発明は、アクセラレータが記憶デバイスを特定して、アクセラレータが記憶デバイスからデータを読み出し、アクセラレータがプロセッサの処理の一部を実行する情報処理装置を提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明は、プロセッサとメモリを有し、１以上のアクセラレータと、１以上の記憶デバイスを含む情報処理装置であって、前記情報処理装置は、前記プロセッサと前記アクセラレータ及び前記記憶デバイスを接続するひとつのネットワークを有し、前記記憶デバイスは、前記プロセッサから初期化の命令を受け付ける初期設定インタフェースと、Ｉ／Ｏコマンドを発行するＩ／Ｏ発行インタフェースと、を有し、前記プロセッサが、前記初期設定インタフェースのアドレス、または前記Ｉ／Ｏ発行インタフェースのアドレスを、前記アクセラレータに対して通知する。
【発明の効果】
【００１３】
本発明によれば、アクセラレータが記憶デバイスのコマンドインタフェースのアドレスを特定して、記憶デバイスからデータを読み出し、プロセッサの処理の一部を実行することができるようになり、情報処理装置の処理を高速化できる。
【図面の簡単な説明】
【００１４】
【図１】本発明の第１の実施例を示し、情報処理装置がデータベースのフィルタ処理をアクセラレータボードにオフロードする概念を示す図である。
【図２】本発明の第１の実施例を示し、情報処理装置の構成の一例を示すブロック図である。
【図３】本発明の第１の実施例を示し、情報処理装置でＩ／Ｏ発行処理を行った場合の説明図である。
【図４】本発明の第１の実施例を示し、情報処理装置で行われる初期化処理の一例を示すシーケンス図である。
【図５】本発明の第１の実施例を示し、情報処理装置がデータベースのフィルタ処理をＦＰＧＡに実行させる例のシーケンス図である。
【図６】本発明の第１の実施例を示し、ホストプロセッサのＩ／Ｏと、アクセラレータボードのＩ／Ｏが混在するときの処理の一例を示すシーケンス図である。
【図７】本発明の第１の実施例の変形例を示し、記憶デバイス及びアクセラレータボードを１つのＰＣＩｅスイッチに複数接続した構成の一例を示すブロック図である。
【図８】本発明の第１の実施例の変形例を示し、記憶デバイスとアクセラレータボードの間のホップ数を表すテーブルである。
【図９Ａ】本発明の第１の実施例の変形例を示し、アクセラレータボードの処理性能を表すテーブルである。
【図９Ｂ】本発明の第１の実施例の変形例を示し、記憶デバイスの性能を表すテーブルである。
【図１０】本発明の第１の実施例を示し、記憶デバイスに障害が発生した際に情報処理装置で行われる処理の一例を示すシーケンス図である。
【図１１】本発明の第１の実施例を示し、アクセラレータボードに障害が発生した際に情報処理装置で行われる処理の一例を示すシーケンス図である。
【図１２】本発明の第１の実施例を示し、アクセラレータボードに障害が発生した際に情報処理装置で行われる再割り当て処理の一例を示すシーケンス図である。
【図１３】本発明の第１の実施例を示し、初期化済みの状態で、新たに記憶デバイスまたはアクセラレータボードを追加する情報処理装置の一例を示すブロック図である。
【図１４】本発明の第１の実施例を示し、情報処理装置が初期化完了後に、新たな記憶デバイスが追加されたときの処理の一例を示すシーケンス図である。
【図１５】本発明の第１の実施例を示し、情報処理装置が初期化完了後に、新たなアクセラレータボードが追加されたときの処理の一例を示すシーケンス図である。
【図１６】本発明の第１の実施例の変形例を示し、情報処理装置の一例を示すブロック図である。
【図１７】本発明の第２の実施例を示し、情報処理装置の一例を示すブロック図である。
【図１８】本発明の第２の実施例を示し、情報処理装置で行われるデータベース処理の一例を示すシーケンス図である。
【図１９】本発明の第３の実施例を示し、情報処理装置の一例を示すブロック図である。
【図２０】本発明の第３の実施例を示し、情報処理装置で行われる初期化処理の一例を示すシーケンス図である。
【図２１】本発明の第１の実施例を示し、情報処理装置の一例を示すブロック図である。
【発明を実施するための形態】
【００１５】
以下、本発明の実施形態について添付図面を用いて説明する。
【００１６】
初めに、本発明の概要として、データベース処理（以下、ＤＢ処理）を行う情報処理装置１０について説明する。
【００１７】
図１は、本発明のコンセプトを示すブロック図である。図１は、データベース処理のフィルタ処理をオフロードすることを前提にしたアクセラレータボード５０を搭載した情報処理装置１０と、情報処理装置１０を利用するクライアントサーバ１１、１２を含む計算機システムである。
【００１８】
フィルタ処理とは、対象となるデータベース（以下、ＤＢ）と条件式を比較し、条件式に一致するものだけを抽出するという処理であり、特に前記条件式が複雑な場合や、前記対象となるＤＢのデータ量が多い場合には情報処理装置１０のホストプロセッサ２００に高い負荷をかけるため、アクセラレータボード５０へのオフロードが有効な処理である。
【００１９】
アクセラレータボード５０には、例えば、Field Programmable Gate Array（以下ＦＰＧＡ）や、Graphics Processing Unit（以下ＧＰＵ）や、サブプロセッサなどが搭載される。アクセラレータボード５０は、通常、ＰＣＩｅインタフェースを持つ基板などに搭載されて、アクセラレータとして情報処理装置１０に利用される。
【００２０】
図１の情報処理装置１０には、データベース処理を行うホストプロセッサ２００（以下、プロセッサ）を持つデータベースサーバ２０（以下、ＤＢサーバ）と、データベース（以下、ＤＢ）４５０が格納されている記憶デバイス４００と、ホストプロセッサ２００の処理をオフロード可能なＦＰＧＡ５００を搭載したアクセラレータボード５０が含まれる。なお、データベース処理は、例えば、ＤＢＭＳ（DataBase Management System）が行う処理である。
【００２１】
ホストプロセッサ２００と、記憶デバイス４００と、アクセラレータボード５０及びＦＰＧＡ５００は、ＰＣＩｅバス３００、３０３によってＰＣＩｅスイッチ３１０と相互に接続される。なお、アクセラレータボード５０及びＦＰＧＡ５００は、ＤＢサーバ２０（ホストプロセッサ２００）のメモリ空間上にマッピングされており、このメモリマッピング上のアドレスを用いて相互に通信可能であり、これをひとつのネットワークと呼ぶ。
【００２２】
ＦＰＧＡ５００にはホストプロセッサ２００からのアクセスを受け付ける機能及びＦＰＧＡ５００からのＩ／Ｏ発行を行う機能（具体的には、ＰＣＩｅエンドポイント機能とＰＣＩｅエンドポイントの制御機能）を持つＩ／Ｏ処理回路５０１と、フィルタ処理を高速に実行可能なフィルタ処理回路５０２と、ＤＢ４５０のデータを一時的に格納するバッファメモリ５０３を有し、内部バスによって相互に接続される。
【００２３】
Ｉ／Ｏ処理回路５０１やフィルタ処理回路５０２は、両方ともＦＰＧＡ５００のハードウェア回路として実装しても良いし、ＦＰＧＡ５００内部の組込プロセッサにより、一部またはすべての機能を実装しても良い。また、本実施例では、アクセラレータボード５０としてＦＰＧＡ５００を用いて説明するが、ＧＰＵやサブプロセッサを採用しても良い。
【００２４】
クライアントサーバ１１及び１２は、情報処理装置１０が管理するＤＢ４５０を利用するアプリケーションが動作しているサーバであり、ＤＢ処理をＤＢサーバ２０に要求する。
【００２５】
クライアントサーバ１１、１２からフィルタ処理を使用する命令をＤＢサーバ２０が受信し、ＤＢサーバ２０がフィルタ処理をＦＰＧＡ５００にオフロードする手順として、Ａ〜Ｃを説明する。
【００２６】
ＤＢサーバ２０のホストプロセッサ２００は、ＦＰＧＡ５００に対し、フィルタ処理の実行を指示するコマンドを発行する（Ａ）。コマンドを受信したＦＰＧＡ５００のＩ／Ｏ処理回路５０１は、記憶デバイス４００に対してリード命令を発行し、フィルタ処理の対象となるＤＢ４５０のデータを取得して、ＦＰＧＡ５００のバッファメモリ５０３へ格納する（Ｂ）。
【００２７】
次に、フィルタ処理回路５０２は、Ｉ／Ｏ処理回路５０１がリードしたＤＢ４５０のデータをバッファメモリ５０３から読み出して、フィルタ処理を行い、そのフィルタ処理結果を、結果データとしてＤＢサーバ２０に送信する（Ｃ）。
【００２８】
このような手順でフィルタ処理をすることで、ＤＢサーバ２０に接続されるバス３００には、ＤＢ４５０のデータそのものが流れることはなく、コマンド及び結果データのみが流れるため、前記従来例の手順に比べ、バス３００に流れるデータ量を減らすことができる。
【００２９】
また、情報処理装置１０には、複数のクライアントサーバ１１、１２を接続できるため、例えば、クライアントサーバ１１がフィルタ処理を要求している間に、他のクライアントサーバ１２がフィルタ処理以外のＤＢ処理（例えば、更新処理）を要求する可能性がある。
【００３０】
この場合、ホストプロセッサ２００は記憶デバイス４００に対してＩ／Ｏアクセスを行う必要があるが、情報処理装置１０は、ＦＰＧＡ５００がフィルタ処理を実行中にも、ホストプロセッサ２００が記憶デバイス４００に対してＩ／Ｏを発行することが可能であり、複数の処理を並列に実行し、クライアントサーバ１１、１２に要求された処理の結果を送信することができる。
【実施例１】
【００３１】
次に、図２〜６を用いて、本発明の実施例１を詳細に説明する。
【００３２】
図２は、本発明が適用される情報処理装置１０の構成の一例を示すブロック図である。
【００３３】
情報処理装置１０は、ＤＢサーバ２０とエクスパンダ３０を含む。ＤＢサーバ２０は、プロセッサ２００とシステムメモリ２１０とチップセット２２０を有し、これらは内部バス２３０で接続される。チップセット２２０ではＰＣＩｅルートコンプレックス２２１が機能しており、ＰＣＩｅバス２３００を介してＰＣＩｅスイッチ２３１０に接続される。
【００３４】
チップセット２２０には、入力装置と出力装置（例えば、ディスプレイ）を有する端末１８０が接続される。システムメモリ２１０には、ＯＳ１１０と、ＰＣＩｅドライバ１３０と、ＤＢＭＳ１２０がロードされてホストプロセッサ２００で実行される。
【００３５】
ＰＣＩｅドライバ１３０は、ＰＣＩｅネットワーク上に接続された記憶デバイスまたはアクセラレータを制御する。なお、ＰＣＩｅドライバ１３０は、ＯＳ１１０に含まれても良い。ＤＢＭＳ１２０は、ＰＣＩｅバス２３００に接続された装置にアクセスする際には、ＰＣＩｅドライバ１３０を介して各装置にアクセスする。
【００３６】
エクスパンダ３０は、２つの記憶デバイス４００、４１０と、２つのアクセラレータボード５０、５１と、ＰＣＩｅスイッチ２３１０、２３２０、２３３０を含み、それぞれＰＣＩｅバス２３００〜２３０４を介してＤＢサーバ２０と接続されている。
【００３７】
記憶デバイス４００とアクセラレータボード５０はＰＣＩｅバス２３０３を介してＰＣＩｅスイッチ２３２０に接続される。ＰＣＩｅスイッチ２３２０はＰＣＩｅバス２３０１を介してＰＣＩｅスイッチ２３１０に接続される。
【００３８】
同様に、記憶デバイス４１０とアクセラレータボード５１はＰＣＩｅバス２３０４を介してＰＣＩｅスイッチ２３３０に接続される。ＰＣＩｅスイッチ２３３０はＰＣＩｅバス２３０２を介してＰＣＩｅスイッチ２３１０に接続される。
【００３９】
図２のような構成も、アクセラレータボード５０、５１と記憶デバイス４００、４１０は、ＤＢサーバ２０のメモリ空間上にマッピングされているため、ひとつのネットワークである。本実施例ではＰＣＩｅバスを用いているため、ＰＣＩｅネットワークと呼ぶ。このように、ひとつのネットワークは、図１の記憶デバイス４００とアクセラレータボード５０のようにＰＣＩｅスイッチ３１０を一段しか挟まない構成のみに限定するものではない。図２のＰＣＩｅスイッチ２３１０、２３２０、２３３０のようにスイッチを複数挟む構成でも、ＤＢサーバ２０（ホストプロセッサ２００）のメモリ空間上にマッピングされていれば良い。
【００４０】
アクセラレータボード５０、５１は、それぞれＦＰＧＡ５００、５１０を搭載する。ＦＰＧＡ５００には、Ｉ／Ｏ処理回路５０１、フィルタ処理回路５０２、バッファメモリ５０３があり、相互に接続される。図示はしないが、ＦＰＧＡ５１０もＦＰＧＡ５００と同様に構成される。
【００４１】
記憶デバイス４００は、ＮＶＭ（Non Volatile Memory）  Ｅｘｐｒｅｓｓプロトコル（以下、ＮＶＭｅ）を用いて通信可能な記憶デバイスであり、Ｉ／Ｏコントローラ４０１とデータベース格納領域４０４を有する。データベース格納領域４０４には、ＤＢ４５０が格納される。データベース格納領域４０４は、例えば、フラッシュメモリ、ＲｅＲＡＭ（Resistance Random Access Memory）、ＰＣＭ（Phase Change random access Memory）などの不揮発記憶媒体で構成することができる。なお、図示はしないが、記憶デバイス４１０も記憶デバイス４００と同様に構成される。
【００４２】
記憶デバイス４００のデータベース格納領域４０４は、直接ＤＢサーバ２０（ホストプロセッサ２００）のメモリ空間上にはマッピングされておらず、コマンドインタフェースのみがマッピングされている。ホストプロセッサ２００やＦＰＧＡ５００が、ＰＣＩｅバス２３００〜２３０４を用いて直接データベース格納領域４０４にアクセスすることはできない。このため、ホストプロセッサ２００やアクセラレータボード５０はＩ／Ｏコマンド（リードコマンド／ライトコマンド）を記憶デバイス４００に発行することで、データベース格納領域へのリードライトを実施する。
【００４３】
すなわち、システムメモリ２１０ではＯＳ１１０がアドレス空間に、システムメモリ２１０の記憶素子を割り当てることでアクセスを管理する。これに対して、ＮＶＭｅやＳＡＴＡでは、データベース格納領域４０４をブロック単位で管理するが、全てのブロックをシステムメモリ２１０のアドレス空間（論理ブロック）に割り当てず、コマンドのやり取りでアクセスを実現している。
【００４４】
Ｉ／Ｏコントローラ４０１は、記憶デバイス４００、４１０外部からのＩ／Ｏコマンドを受けとり、コマンドに応じて以下の処理を行う。リードコマンドの場合は対応したリードアドレスのデータをデータベース格納領域４０４から読み出して、リードデータの要求先アドレスにライトする。ライトコマンドの場合は、ライトデータをライトデータ送信元のアドレスからリードして、ライトアドレスに対応するデータベース格納領域４０４に格納する。
【００４５】
Ｉ／Ｏコントローラ４０１は、演算処理を行うプロセッサ４０２と、複数のキューを含むコマンドインタフェース４０５と、処理を行うための情報を格納する管理情報格納領域４０３とを含む。
【００４６】
コマンドインタフェース４０５は、主に初期化（ＮＶＭｅではＩ／Ｏ発行キューを生成（または有効化）する機能など）やエラー時に使用するＡｄｍｉｎコマンドを受け付けるためのＡｄｍｉｎキュー４０６と、ホストプロセッサ２００からのＩ／Ｏコマンドを受け付けるためのホストプロセッサ用Ｉ／Ｏ発行キュー４０７（以下、プロセッサキュー）と、ＦＰＧＡ５００からのＩ／Ｏコマンドを受け付けるためのＦＰＧＡ用Ｉ／Ｏ発行キュー４０８（以下、ＦＰＧＡキュー）を持つ。なお、以下では、プロセッサキュー４０７と、ＦＰＧＡキュー４０８の総称をＩ／Ｏ発行キューとする。
【００４７】
これらのＩ／Ｏ発行キューは、記憶デバイス４００の管理用レジスタなどとまとめて、コマンドインタフェース４０５としてＰＣＩｅネットワークのアドレス空間（ＭＭＩＯ空間）にマッピングされる。
【００４８】
なお、Ａｄｍｉｎキュー４０６と、プロセッサキュー４０７と、ＦＰＧＡキュー４０８は、それぞれ異なるアドレスが割り当てられた独立したキューである。これらのＡｄｍｉｎキュー４０６と、プロセッサキュー４０７と、ＦＰＧＡキュー４０８のアドレスは、ＰＣＩｅネットワークのアドレス空間において記憶デバイスのコマンドインタフェース４０５内に割り当てられる。ＰＣＩｅネットワークのアドレス空間は、ＤＢサーバ２０で稼働するＯＳ１１０あるいはＰＣＩｅドライバ１３０が割り当てることができる。
【００４９】
ＤＢサーバ２０のホストプロセッサ２００や、ＦＰＧＡ５００が、これらのＩ／Ｏ発行キューを用いてＩ／Ｏコマンドを発行すると、Ｉ／Ｏコマンドを検知した記憶デバイス４００のプロセッサ４０２が、ライトやリードといったＩ／Ｏコマンド処理を行う。
【００５０】
電源起動時の記憶デバイス４００においては、Ｉ／Ｏ発行キューは有効になっておらず、Ａｄｍｉｎキュー４０６のみが有効となっている。ホストプロセッサ２００がこのＡｄｍｉｎキュー４０６にＩ／Ｏ発行キューの生成（または有効化）命令（または初期化の命令）を発行することで、当該命令を受けたプロセッサ４０２が、例えば、プロセッサキュー４０７を有効にする。
【００５１】
そして、プロセッサ４０２は、ＤＢサーバ２０のホストプロセッサ２００にホストプロセッサキュー４０７を生成（または有効化）した通知を送信し、ホストプロセッサ２００がプロセッサキュー４０７を使用することが可能となる。
【００５２】
ここでは、このＡｄｍｉｎキュー４０６を用いたＩ／Ｏ発行キュー４０７〜４０８の有効化を、Ｉ／Ｏ発行キューを生成する、と言う。Ｉ／Ｏ発行キューは記憶デバイス４００に複数用意されており、その有効か無効かの情報は、Ｉ／Ｏコントローラ４０１の管理情報格納領域（例えば、ＤＲＡＭなどの揮発記憶媒体や、フラッシュメモリ、ＲｅＲＡＭ、ＰＣＭなどの不揮発記憶媒体）４０３に格納されている。
【００５３】
なお、Ａｄｍｉｎキュー４０６は、ホストプロセッサ２００からの初期化の命令を受け付けて、Ｉ／Ｏ発行キュー４０７、４０８を生成及び管理するための初期設定インタフェースとして機能する。また、Ｉ／Ｏ発行キュー４０７、４０８はホストプロセッサ２００とＦＰＧＡ５００からのＩ／Ｏコマンドを受け付けるＩ／Ｏ発行インタフェースとして機能する。
【００５４】
図２では、記憶デバイス４００が、３つのＩ／Ｏ発行キュー４０７〜４０９を持ち、そのうち、ホストプロセッサ２００にプロセッサキュー４０７を、ＦＰＧＡ５００にＦＰＧＡキュー４０８を割り当てて有効化し、Ｉ／Ｏ発行キュー４０９は無効となっている。
【００５５】
無効となっているＩ／Ｏ発行キュー４０９は、他のプロセッサやＦＰＧＡに割り当てることが可能である。例えば、ホストプロセッサ２００をデュアルコアプロセッサにし、その片方のコアをプロセッサキュー４０７に割り当て、もう一方のコアをＩ／Ｏ発行キュー４０９に割り当てて、コア間の排他処理を行わずに各コアがＩ／Ｏ発行可能な状態にしても良い。または、ＦＰＧＡ５００にＦＰＧＡキュー４０８を割り当て、ＦＰＧＡ５１０にＩ／Ｏ発行キュー４０９を割り当てて、複数のＦＰＧＡからひとつの記憶デバイス４００にＩ／Ｏ命令の発行が可能な状態にしても良い。
【００５６】
図２では、記憶デバイス４００は３つのＩ／Ｏ発行キューを持っているが、この個数は３つに限るものではなく、何個でも良い。
【００５７】
図３は、情報処理装置１０でＩ／Ｏ発行処理を行った場合の説明図である。ここで、Ｉ／Ｏ発行キューを、ホストプロセッサ２００用とＦＰＧＡ５００用を独立して用意することの必要性について、図３を用いて説明する。
【００５８】
例えば、ＮＶＭｅの技術では、記憶デバイス４００のプロセッサキュー４０７は、ホストプロセッサ２００が書き込むレジスタで構成され、ホストプロセッサ２００がＩ／Ｏコマンドを発行した累計個数を記入する。
【００５９】
ホストプロセッサ２００が発行したＩ／Ｏコマンドは、Ｉ／Ｏコントローラ４０１の管理情報格納領域４０３に格納することができる。あるいは、ホストプロセッサ２００が発行したＩ／Ｏコマンドを、システムメモリ２１０の所定の領域に格納しても良い。ホストプロセッサ２００が発行したＩ／Ｏコマンドの格納先については、周知または公知の技術を用いればよいので、本実施例では詳述しない。
【００６０】
一方、記憶デバイス４００のプロセッサ２００は、過去に処理したコマンド数を管理情報格納領域４０３に記憶している。例えば、プロセッサキュー４０７の値と、管理情報格納領域４０３の値が、どちらの値も４となっていれば、過去にホストプロセッサ２００が４つのコマンドを発行し、記憶デバイス４００はその４つのコマンドを全て処理し終えたことを示す。
【００６１】
新たにホストプロセッサ２００から記憶デバイス４００に１つのＩ／Ｏコマンドを発行する処理を、図３のＡ〜Ｃを用いて説明する。まず、ホストプロセッサ２００は、Ｉ／Ｏコマンドをシステムメモリ２１０の所定のアドレスに生成する（Ａ）。
【００６２】
次に、ホストプロセッサ２００が、プロセッサキュー４０７に、現状の値＝「４」に１を足した値＝「５」をライトする（Ｂ）。
【００６３】
これに対し、Ｉ／Ｏコントローラ４０１のプロセッサ４０２は、プロセッサキュー４０７の値「５」と、管理情報格納領域４０３に記憶した、過去に処理したコマンド数＝「４」の値に差があることを検知し、新たなコマンドがあると判定し、システムメモリ２１０からコマンドを取得する（Ｃ）。
【００６４】
ホストプロセッサ２００は、自身がプロセッサキュー４０７にライトした値を記憶しておくことができるので、次のＩ／Ｏ発行時にプロセッサキュー４０７をリードすることなく、過去の値に１を足した値を容易に書き込むことができ、高速にコマンドを発行できる。
【００６５】
この場合、ＦＰＧＡ５００が、ホストプロセッサ２００とプロセッサキュー４０７を共有して新たにＩ／Ｏコマンドを発行しようとすると、まず、プロセッサキュー４０７を一度リードしなくては、現在の値を知ることができない。
【００６６】
また、ＦＰＧＡ５００が、ホストプロセッサ２００に対してプロセッサキュー４０７を更新しないように指示するなど、ホストプロセッサ２００との排他処理を行う必要がある。これらは通常のホストプロセッサ２００からのＩ／Ｏ発行に比べて時間のかかる上に、ホストプロセッサ２００がＩ／Ｏコマンドを発行できない時間も生まれ、情報処理装置１０の全体の性能が下がる、という問題があった。
【００６７】
一方、本実施例１の記憶デバイス４００では、ホストプロセッサ２００用にプロセッサキュー４０７を生成し、ＦＰＧＡ５００用にＦＰＧＡキュー４０８を生成する。このように、Ｉ／Ｏコントローラ４０１が、ホストプロセッサ２００とＦＰＧＡ５００毎に独立したＩ／Ｏ発行キューを有する場合は、プロセッサ２００とＦＰＧＡ５００の間で、排他処理や余分なＩ／Ｏ発行キューのリードを行わなくて良いため、ホストプロセッサ２００とＦＰＧＡ５００は共に高速にＩ／Ｏコマンドを発行できる。
【００６８】
図４は、情報処理装置１０で行われる初期化処理の一例を示すシーケンス図である。
【００６９】
ホストプロセッサ２００は情報処理装置１０の初期化開始時に、自身が接続されているＰＣＩｅネットワークの構成情報をシステムメモリ２１０から取得する（１０００）。また、本実施例の初期化処理は、システムメモリ２１０にロードされたＯＳ１１０とＰＣＩｅドライバ１３０によって実行される。以下では、ＯＳ１１０またはＰＣＩｅドライバ１３０の処理を行う主体がホストプロセッサ２００として説明する。
【００７０】
ＰＣＩｅネットワークでは、ＰＣＩｅルートコンプレックス２２１を持つチップセット２２０が、起動時に当該チップセット２２０に接続されたＰＣＩｅエンドポイントデバイスのネットワーク構成を検出し、検出結果（ＰＣＩデバイスツリーなど）をシステムメモリ２１０の所定の領域に格納する。ホストプロセッサ２００は、システムメモリ２１０の所定の領域にアクセスすることで、格納されているＰＣＩｅネットワーク（あるいはバス）の構成情報を取得できる。
【００７１】
ＰＣＩｅネットワークの構成情報としては、ネットワーク（またはバス）上のデバイスの位置や、デバイスの性能や、デバイスの容量等を含むことができる。ＰＣＩｅネットワークの構成情報は、ＯＳ１１０あるいはＰＣＩｅドライバ１３０の起動時に、ホストプロセッサ２００が収集して、システムメモリ２１０の所定の領域に格納する。
【００７２】
次に、ホストプロセッサ２００は、取得したＰＣＩｅネットワークの構成情報を用いて、記憶デバイス４００、４１０にアクセスするアクセラレータボード５０、５１を割り当てる（１００１）。割り当てに用いる情報は、例えば、記憶デバイス４００、４１０とアクセラレータボード５０、５１の間の距離の情報を用いる。なお、アクセラレータボード５０に記憶デバイス４００、４１０を割り当てる処理は、ＰＣＩｅドライバ１３０あるいはＯＳ１１０が主体となって行うことができる。以下では、ＰＣＩｅドライバ１３０またはＯＳ１１０を実行するホストプロセッサ２００が割り当ての主体として説明する。
【００７３】
距離の情報としては、例えば、ＰＣＩｅネットワークのホップ数を用いることができる。本実施例では、ＰＣＩｅスイッチ２３１０、２３２０、２３３０を通過する個数（または回数）をホップ数とする。
【００７４】
ＦＰＧＡ５００と記憶デバイス４００の通信には、ひとつのＰＣＩｅスイッチ２３２０を通過するので、ホップ数＝１である。一方、ＦＰＧＡ５１０と記憶デバイス４００の間はＰＣＩｅスイッチ２３１０、２３２０、２３３０を通過し、ホップ数＝３である。したがって、図２の構成では、ホップ数の少ないＦＰＧＡ５００を、記憶デバイス４００に割り当てる。同様の距離の情報の比較により、記憶デバイス４１０にはＦＰＧＡ５１０を割り当てる。
【００７５】
なお、記憶デバイス４００とアクセラレータボード５０の割り当ては一対一に限定されるものではない。例えば、ホストプロセッサ２００が、記憶デバイス４００にＦＰＧＡ５００とＦＰＧＡ５１０の両方を割り当てる、または、記憶デバイス４００と記憶デバイス４１０両方にＦＰＧＡ５００を割り当てることもできる。
【００７６】
次に、ホストプロセッサ２００は、記憶デバイス４００にＩ／Ｏ発行キューを生成する指令を送信する（１００２）。ここで、ＰＣＩｅルートコンプレックス２２１に接続しているホストプロセッサ２００は、記憶デバイス４００のＩ／Ｏコントローラ４０１が有する、Ａｄｍｉｎキュー４０６のアドレスを取得することができる。一方、前記課題でも述べたように、ＰＣＩｅエンドポイントであるＦＰＧＡ５００は、同じくＰＣＩｅエンドポイントであるＡｄｍｉｎキュー４０６のアドレスを取得することができない。
【００７７】
そのため、ホストプロセッサ２００が、記憶デバイス４００のＡｄｍｉｎキュー４０６を用いて、自身が記憶デバイス４００にＩ／Ｏコマンドを発行するためのプロセッサキュー４０７及び、ＦＰＧＡ５００が記憶デバイス４００にＩ／Ｏコマンドを発行するためのＦＰＧＡキュー４０８の２つを生成する（１００２）。
【００７８】
続いて、ホストプロセッサ２００は、ＦＰＧＡキュー４０８のキュー情報（ＦＰＧＡキュー４０８のアドレスと最大同時発行コマンド数（キューの深さ））をＦＰＧＡ５００に通知する（１００３）。
【００７９】
このように最低限ＦＰＧＡキュー４０８のアドレスとキューの深さがあれば、ＦＰＧＡ５００は記憶デバイス４００にＩ／Ｏコマンドを発行可能となる。さらに、キュー情報として、記憶デバイス４００のＰＣＩｅ（またはＰＣＩ）コンフィグレジスタ（図示省略）のアドレスや、アクセス可能なＬＢＡ（Logical block Address）の範囲（アクセス可能な先頭ＬＢＡと容量など）などの情報を含んでもよい。
【００８０】
例えば、ＦＰＧＡ５００が、記憶デバイス４００のＰＣＩｅコンフィグレジスタのアドレスを取得できると、記憶デバイス４００のＮＶＭｅレジスタ（図示省略）のアドレスも取得できる。ＦＰＧＡ５００は、これらのアドレスからアクセス可能なＬＢＡの範囲を算出できる。ＦＰＧＡ５００は、アクセス可能なＬＢＡの範囲を用いて、例えば一台のアクセラレータボード５０に記憶デバイス４００、４１０が複数割り当てられた場合に、どちらの記憶デバイスにＩ／Ｏコマンドを発行すれば良いかを、ＦＰＧＡ５００が判定することが可能となる。
【００８１】
なお、ＮＶＭｅレジスタは、例えば、「NVM Express」（Revision 1.1b July 2, 2014、NVM Express Workgroup刊）の第３７頁〜第４５頁等に記載されるレジスタである。
【００８２】
さらに、ホストプロセッサ２００は記憶デバイス４１０にも同様に、Ａｄｍｉｎキューを用いてプロセッサキューとＦＰＧＡキューを生成し（１００４）、ＦＰＧＡキューの情報をＦＰＧＡ５１０に通知する（１００５）。
【００８３】
以上図４の処理によって、ＦＰＧＡ５００は、記憶デバイス４００へのＩ／Ｏコマンドを発行できるようになり、また、ＦＰＧＡ５１０は、記憶デバイス４１０へのＩ／Ｏコマンドを発行できるようになる。
【００８４】
なお、ホストプロセッサ２００がＡｄｍｉｎキュー４０６を用いてプロセッサキュー４０７とＦＰＧＡキュー４０８を生成する手順を例として説明したが、ホストプロセッサ２００がＡｄｍｉｎキュー４０６のアドレスをＦＰＧＡ５００に通知し、ＦＰＧＡ５００がプロセッサキュー４０７とＦＰＧＡキュー４０８を生成しても良い。
【００８５】
以上図３、図４の処理によって、ＰＣＩｅネットワークのエンドポイントとして接続されたアクセラレータボード５０のＦＰＧＡ５００は、ホストプロセッサ２００からＦＰＧＡキュー４０８のキュー情報を取得することができる。これにより、ＰＣＩｅエンドポイントのＦＰＧＡ５００から同じくＰＣＩｅエンドポイントの記憶デバイス４００にＩ／Ｏコマンドを発行することが可能となって、アクセラレータボード５０は記憶デバイス４００に格納されたＤＢ４５０のデータにアクセスすることが可能となるのである。
【００８６】
図５は、情報処理装置１０の初期化が完了した後に、ホストプロセッサ２００がデータベース４５０のフィルタ処理をＦＰＧＡ５００に実行させる例を示すシーケンス図である。
【００８７】
ＤＢＭＳ１２０を実行するホストプロセッサ２００はまず、ＦＰＧＡ５００に対して、フィルタ処理を指示するフィルタ処理コマンドを発行する（１１０１）。このフィルタ処理コマンドには、少なくとも、フィルタ処理を実行するデータベース４５０のテーブルの先頭が、記憶デバイス４００のＤＢ格納領域４０４のアドレスのどこにあるかを示す情報と、フィルタ処理を実行するＤＢ４５０のサイズの情報、フィルタ処理の条件式＝Ａを含む。なお、フィルタ処理コマンドには、その他に、フィルタ処理の結果データを格納するシステムメモリ２１０のアドレスを含んでも良い。
【００８８】
フィルタ処理コマンドは、例えば、テーブルの先頭が、記憶デバイス４００のＬＢＡ＝０ｘ１０００とし、１Ｍ  Ｂｙｔｅのデータにフィルタ条件式＝Ａのフィルタ処理を実行する、といった情報を含むコマンドである。
【００８９】
また、フィルタ処理コマンドの発行先（ＦＰＧＡ５００またはＦＰＧＡ５１０）は、ＤＢＭＳ１２０または、ＰＣＩｅドライバ１３０のどちらが決定するようにしてもよい。ＰＣＩｅドライバ１３０が決定する場合は、ＤＢＭＳ１２０がフィルタ処理コマンドを発行すると、ＰＣＩｅドライバ１３０が発行先（ＦＰＧＡ５００またはＦＰＧＡ５１０）を決定してフィルタ処理コマンドを送信する。
【００９０】
ＤＢＭＳ１２０を実行するホストプロセッサ２００からフィルタ処理コマンドを受信したＦＰＧＡ５００のＩ／Ｏ処理回路５０１は、フィルタ処理コマンドの情報に従い、記憶デバイス４００に対してリードコマンドを発行する（１１０２）。このリードコマンドは１回でも良いし、複数回でも良い。図示の例では、ＦＰＧＡ５００が、１Ｍ  Ｂｙｔｅのリードを、４回に分割して２５６ＫＢｙｔｅ毎の４つのリードコマンドを発行する例を示す。
【００９１】
４つのリードコマンドは、例えば、ＬＢＡ＝０ｘ１０００、０ｘ１２００、０ｘ１４００、０ｘ１６００に対する４回の２５６Ｋ  Ｂｙｔｅリードコマンドによって、ＦＰＧＡ５００は、ＬＢＡ＝０ｘ１０００を先頭とする１Ｍ  Ｂｙｔｅのデータをリードする。
【００９２】
記憶デバイス４００のＤＢ格納領域４０４からリードされたデータは、ＦＰＧＡ５００のバッファメモリ５０３に格納される（１１０３）。４回のリード完了通知を受け取ったＩ／Ｏ処理回路５０１は、フィルタ処理回路５０２に対して、バッファメモリ５０３のデータについて所定のフィルタ処理を実行するよう指示する（１１０４）。
【００９３】
指示を受け付けたフィルタ処理回路５０２は、フィルタ条件式＝Ａのフィルタ処理を実行する。
【００９４】
次に、フィルタ処理回路５０２は、フィルタ処理の結果をＤＢサーバ２０のシステムメモリ２１０に送信する（１１０５）。送信先のアドレスは、フィルタ処理コマンドによって指定しても良いし、予め設定した固定のアドレスとしても良い。
【００９５】
フィルタ処理の完了後、フィルタ処理回路５０２は完了通知をＩ／Ｏ処理回路５０１に送信する（１１０６）。完了通知を受信したＩ／Ｏ処理回路５０１は、フィルタ処理の完了をホストプロセッサ２００に通知し、ホストプロセッサ２００が当該完了通知を受け取ることで、一連のフィルタ処理が完了する（１１０７）。
【００９６】
なお、図５では、フィルタ処理の結果データを格納するアドレスとして、システムメモリ２１０のアドレスを使用する例を説明したが、フィルタ処理の結果データの格納先アドレスはこれに限定されるものではない。例えば、記憶デバイス４００のアドレスを示す情報であれば、記憶デバイス４００にフィルタ処理の結果データをライトすれば良いし、アクセラレータボード５１のアドレスを示す情報であれば、アクセラレータボード５１にフィルタ処理の結果データをライトすれば良いし、アクセラレータボード５０のアドレスを示す情報であれば、アクセラレータボード５０のメモリ上に保存しておけば良い。
【００９７】
また、フィルタ処理コマンドの中に、フィルタ条件式＝Ａを直接入れる例を示したが、これに限定されず、フィルタ条件式を得るための情報であれば良い。例えば、システムメモリ２１０上にフィルタ条件式を格納し、そのフィルタ条件式の格納アドレスをフィルタ処理コマンドの中に入れるとしても良い。
【００９８】
上記図５の処理によって、ＰＣＩｅバスのエンドポイントに接続されたアクセラレータボード５０から、同じくエンドポイントの記憶デバイス４００に直接アクセスすることで、ＤＢサーバ２０の負荷を低減できる。また、ＤＢ４５０のデータは、ＰＣＩｅバス２３００を通過することなく、ＰＣＩｅスイッチ２３２０を介してＦＰＧＡ５００に読み込まれる。このため、ＰＣＩｅバス２３００の性能（転送速度など）がネックにならず、ＦＰＧＡ５００が高速にフィルタ処理を実行することが可能となる。特に、図２１のようにＰＣＩｅスイッチ９０００〜９００６がツリー状のように構成され、その先に記憶デバイス９３００、９４００、９５００、９６００と、アクセラレータ９３０１、９４０１、９５０１、９６０１が接続されているようなツリー状の構成で数の多い記憶デバイスとアクセラレータの組みを接続したときに本発明は特に効果を発揮する。このとき、アクセラレータ９０３１がアクセスする記憶デバイスは、全てホップ数１の記憶デバイスとした場合、各記憶デバイス９３００、９４００、９５００、９６００からリードしたデータは、ＰＣＩｅスイッチ９００３〜９００６で閉じるため、記憶デバイスとアクセラレータの組を増やしてもツリー状の上位のＰＣＩｅスイッチ（９０００、９００１、９００２）の帯域を使用しない。よって、フィルタ処理性能をスケールアウトすることが可能となる。
【００９９】
図６は、ホストプロセッサ２００のＩ／Ｏと、アクセラレータボード５０のＩ／Ｏが混在するときの処理の一例を示すシーケンス図である。図６の例は、ＦＰＧＡ５００がフィルタ処理を実行しているときに、ホストプロセッサ２００が記憶デバイス４００にリードを行うシーケンス図である。
【０１００】
上記図５のフィルタ処理のシーケンス図と同様に、ＤＢＭＳ１２０を実行するホストプロセッサ２００はまず、ＦＰＧＡ５００に対して、フィルタ処理を指示するフィルタ処理コマンドを発行する（１１１１）。
【０１０１】
ホストプロセッサ２００からフィルタ処理コマンドを受信したＦＰＧＡ５００のＩ／Ｏ処理回路５０１は、フィルタ処理コマンドの情報に従い、記憶デバイス４００に対してリードコマンドを発行する（１１１２）。この場合、ＦＰＧＡ５００は、上述の初期化時にホストプロセッサ２００からアドレスを通知されたＦＰＧＡキュー４０８を使用する。また同時に、ホストプロセッサ２００も、記憶デバイス４００にリードコマンドを発行したとする（１１１３）。この場合、ホストプロセッサ２００は、プロセッサキュー４０７を使用する。
【０１０２】
図示の例では、記憶デバイス４００が、ＦＰＧＡキュー４０８の１つ目のリードコマンドを実行し、ＤＢ格納領域４０４から読み込んだデータを、ＦＰＧＡ５００のバッファメモリ５０３に格納する（１１１４）。記憶デバイス４００は、１つ目のリードコマンドのリード完了通知をＦＰＧＡ５００に送信する（１１１５）。
【０１０３】
次に、記憶デバイス４００は、プロセッサキュー４０７のリードコマンドを実行し、ＤＢ格納領域４０４から読み込んだデータを、システムメモリ２１０に格納する（１１１６）。記憶デバイス４００は、リードコマンドのリード完了通知をホストプロセッサ２００に送信する（１１１７）。
【０１０４】
ホストプロセッサ２００のＩ／Ｏ処理を完了した記憶デバイス４００は、ＦＰＧＡキュー４０８の２つ目以降のリードコマンドを順次実行し、ＤＢ格納領域４０４から読み込んだデータを、ＦＰＧＡ５００のバッファメモリ５０３に格納する（１１１８）。記憶デバイス４００は、各リードコマンドのリード完了通知をＦＰＧＡ５００にそれぞれ送信する（１１１９）。
【０１０５】
４回のリード完了通知を受け取ったＩ／Ｏ処理回路５０１は、フィルタ処理回路５０２に対して、バッファメモリ５０３のデータについて所定のフィルタ処理を実行するよう指示する（１１２０）。指示を受け付けたフィルタ処理回路５０２は、所定のフィルタ処理を実行する。
【０１０６】
次に、フィルタ処理回路５０２は、フィルタ処理の結果をＤＢサーバ２０のシステムメモリ２１０に送信する（１１２１）。フィルタ処理の完了後、フィルタ処理回路５０２は完了通知をＩ／Ｏ処理回路５０１に送信する。完了通知を受信したＩ／Ｏ処理回路５０１は、フィルタ処理の完了をホストプロセッサ２００に通知し、ホストプロセッサ２００が当該完了通知を受け取ることで、一連のフィルタ処理が完了する（１１２２）。
【０１０７】
以上図５の処理のように、記憶デバイス４００は初期化処理（図４）によって、プロセッサキュー４０７とＦＰＧＡキュー４０８を独立して設けており、どちらのキューを使用してもＤＢ格納領域４０４のデータをリードやライトすることが可能である。そのため、これらのリード要求はホストプロセッサ２００とＦＰＧＡ５００が排他処理を行わなくても、正しく処理される。
【０１０８】
例えば、図６では、記憶デバイス４００に、ＦＰＧＡ５００から４つのリードコマンドを発行されている最中に、ホストプロセッサ２００からもリードコマンドが発行された例を示しているが、Ｉ／Ｏコントローラ４０１は、ＦＰＧＡ５００とホストプロセッサ２００がリードコマンドを書き込むキューがそれぞれ独立しているため、ＦＰＧＡ５００とホストプロセッサ２００の排他制御を行う必要はない。よって、情報処理装置１０は、処理性能を落とすことなくＦＰＧＡ５００とホストプロセッサ２００から並列的にＩ／Ｏコマンドを発行できる。
【０１０９】
次に、本実施例１において、記憶デバイス４００及びアクセラレータボード５０が、同一のＰＣＩｅスイッチに複数接続されている場合の割り当て方法について、図７〜図９を用いて説明する。
【０１１０】
図７は、記憶デバイス及びアクセラレータボードの組を１つのＰＣＩｅスイッチ３３２０に複数接続した構成の一例を示すブロック図である。図７の情報処理装置１０は、図２に示したＰＣＩｅスイッチ２３２０に代わってＰＣＩｅスイッチ３３２０及びＰＣＩｅバス３３０３に、記憶デバイス４１０、４２０と、アクセラレータボード５２を加え、さらにＰＣＩｅドライバ１３０にテーブル１４０〜１６０を加えたものである。その他の構成については、前記図２と同様である。
【０１１１】
図８は、記憶デバイス４００、４１０、４２０とアクセラレータボード５０〜５２の間のホップ数を表すホップ数テーブル１４０である。ホップ数テーブル１４０は、図７における記憶デバイス４００、４１０、４３０と、ＦＰＧＡ５００、５１０、５２０の間のホップ数を表すものである。ホップ数テーブル１４０は、情報処理装置１０の管理者などによって予め設定されてＰＣＩｅドライバ１３０が管理し、システムメモリ２１０に格納される。
【０１１２】
ＰＣＩｅスイッチ３３３０に接続された記憶デバイス４１０に関しては、ホップ数が最少となるアクセラレータボード５１は、ＦＰＧＡ５１０のみであるため、ホップ数のみでＦＰＧＡ５１０に記憶デバイス４１０を割り当てることが可能となる。
【０１１３】
一方、記憶デバイス４００、４２０、４３０に関しては、ホップ数が最少となるアクセラレータボード５０、５２が複数存在する。このような場合は、ＰＣＩｅネットワーク構成で距離情報が近いものを選択しても良い。この場合、図７の構成では、ＦＰＧＡ５００には、記憶デバイス４００と記憶デバイス４１０を割り当てる。また、ＦＰＧＡ５２０には記憶デバイス４３０を割り当てる。なお、ＰＣＩｅネットワーク構成の距離情報としては、ＰＣＩｅスイッチ３３２０のポート番号が近ければ、距離が近いと定義することができる。
【０１１４】
また、ＯＳ１１０あるいはＰＣＩｅドライバ１３０は、ホップ数等の距離情報以外の情報を用いて記憶デバイス４００とアクセラレータボード５０の割り当てを決定しても良い。この情報は、記憶デバイスやアクセラレータボード５０から取得できるものであり、例えば、図９Ａ、図９Ｂに示すような、アクセラレータボード５０のフィルタ処理性能、記憶デバイスの容量、記憶デバイスのリード性能などがある。
【０１１５】
図９Ａは、ＦＰＧＡのフィルタ処理性能を示すＦＰＧＡ性能テーブル１５０である。ＦＰＧＡ性能テーブル１５０は、ＦＰＧＡの識別子１５１１と、フィルタ処理性能１５１２で構成される。ＦＰＧＡ性能テーブル１５０は、情報処理装置１０の管理者などによって予め設定されてＰＣＩｅドライバ１３０が管理し、システムメモリ２１０に格納するとしても良いし、ＰＣＩｅドライバ１３０がアクセラレータ認識時に問い合わせて、その結果をシステムメモリ２１０に格納するとしても良い。
【０１１６】
図９Ｂは、記憶デバイスの性能を示す記憶デバイス性能テーブル１６０である。記憶デバイス性能テーブル１６０は、記憶デバイスの識別子１６０１と、容量１６０２と、リード性能１６０３で構成される。記憶デバイス性能テーブル１６０は、情報処理装置１０の管理者などによって予め設定されてＰＣＩｅドライバ１３０が管理し、システムメモリ２１０に格納するとしても良いし、ＰＣＩｅドライバ１３０が記憶デバイス認識時に記憶デバイスの性能を問い合わせて、その結果をシステムメモリ２１０に格納するとしても良い。
【０１１７】
図９Ａ、図９Ｂの例では、ＯＳ１１０あるいはＰＣＩｅドライバ１３０が、記憶デバイスの容量が大きいもの物を、処理性能が高いデバイスに割り当てる、という論理で、ＦＰＧＡ５００に記憶デバイス４２０を割り当て、ＦＰＧＡ５１０に記憶デバイス４００と記憶デバイス４３０を割り当てても良い。
【０１１８】
あるいは、ＯＳ１１０またはＰＣＩｅドライバ１３０が、アクセラレータボードのフィルタ性能と記憶デバイスのリード性能が釣り合うように、ＦＰＧＡ５００に記憶デバイス４２０を割り当てて、ＦＰＧＡ５２０に記憶デバイス４００と４１０を割り当てても良い。
【０１１９】
または、ＦＰＧＡ５００に記憶デバイス４００と記憶デバイス４２０と記憶デバイス４３０を割り当て、ＦＰＧＡ５１０にも記憶デバイス４００と記憶デバイス４２０と記憶デバイス４３０を割り当てても良い。この場合、記憶デバイス４００、４２０、４３０のＩ／Ｏコントローラ４０１は、それぞれホストプロセッサ２００用のプロセッサキュー４０７に加え、ＦＰＧＡ５００用のＦＰＧＡキュー４０８と、ＦＰＧＡ５１０用のＦＰＧＡキュー４０９の２つを加えた数のＩ／Ｏ発行キューを生成する。ホストプロセッサ２００は記憶デバイス４００、４１０、４２０、４３０のデータベース４５０を用いたフィルタ処理に、ＦＰＧＡ５００とＦＰＧＡ５１０両方を平行して使うことができる。
【０１２０】
情報処理装置１０では、このようなＦＰＧＡと記憶デバイスの割り当てを行うことで、例えば、記憶デバイスのリード性能の合計と、アクセラレータボードのフィルタ性能が釣り合うように割り当てることができ、高負荷時に記憶デバイスとアクセラレータボードがどちらも最大の性能を発揮できる構成にするなど、情報処理装置１０全体の性能の最適化を図ることが可能となる。
【０１２１】
次に、本実施例１において、記憶デバイス４００に障害が発生した場合の処理の一例を説明する。図１０は、記憶デバイス４００に障害が発生した際に情報処理装置１０で行われる処理の一例を示すシーケンス図である。
【０１２２】
記憶デバイス４００がＦＰＧＡ５００に割り当てられているとき、ＤＢＭＳ１２０を実行売るホストプロセッサ２００は、ＦＰＧＡ５００にフィルタ処理コマンドを発行して、記憶デバイス４００のＤＢ４５０に対するフィルタ処理を実行する（１２０１）。
【０１２３】
ＦＰＧＡ５００は、フィルタ処理コマンドを受信して、処理対象となるＤＢ４５０をリードするために、リードコマンドを記憶デバイス４００に発行する（１２０２）。
【０１２４】
しかし、この時点で記憶デバイス４００に障害が発生した場合（１２０３）、例えば、記憶デバイス４００が自身の障害を検知して、ＰＣＩｅルートコンプレックス２２１を介して、ホストプロセッサ２００に障害を通知する（１２０４）。
【０１２５】
障害通知を受け付けたホストプロセッサ２００は、記憶デバイス４００の障害を検知し、当該障害をＦＰＧＡ５００に通知する（１２０５）。障害の通知を受信したＦＰＧＡ５００は、フィルタ処理が完了していないため、障害によってフィルタ処理が失敗したことをホストプロセッサ２００に通知する。
【０１２６】
上記図１０の例では、記憶デバイス４００自身が障害を検知し、ホストプロセッサ２００に通知する例を説明したが、ホストプロセッサ２００が記憶デバイス４００の状態を監視し、障害を検知し、ＦＰＧＡ５００に記憶デバイス４００の障害を通知しても良い。
【０１２７】
また、記憶デバイス４００に障害が発生したことを、ＦＰＧＡ５００が、ポーリングなどにより検出してもよい。例えば、ＦＰＧＡ５００から記憶デバイス４００に発行したリードのタイムアウトなどで、検知しても良い。障害を検知したＦＰＧＡ５００は、その障害及びフィルタ処理が失敗したことを、ホストプロセッサ２００に通知する。
【０１２８】
このようにして記憶デバイス４００の障害を検知したホストプロセッサ２００は、記憶デバイス４００に障害が発生したことをＤＢサーバ２０に通知し、交換を促すことができる。例えば、ＤＢサーバ２０の管理画面に、障害発生を伝えるメッセージを表示するなどの方法がある。また、ミラーリングなどの方法で保護され、記憶デバイス４００のバックアップデバイスがあるときには、記憶デバイス４００の代わりにそのデバイスを使用することができる。
【０１２９】
次に、本実施例１において、アクセラレータボード５０に障害が発生した場合の処理の一例を説明する。図１１は、アクセラレータボード５０に障害が発生した際に情報処理装置１０で行われる処理の一例を示すシーケンス図である。
【０１３０】
記憶デバイス４００がＦＰＧＡ５００に割り当てられている場合、ＤＢＭＳ１２０を実行するホストプロセッサ２００は、記憶デバイス４００のＤＢ４５０に対するフィルタ処理を、ＦＰＧＡ５００に指示する（１２１１）。
【０１３１】
しかし、この時点で、ＦＰＧＡ５００に障害が発生した場合（１２１２）、ＦＰＧＡ５００はＰＣＩｅルートコンプレックス２２１を介して、ホストプロセッサ２００に障害を通知する（１２１３）。障害の通知を受け付けたホストプロセッサ２００は、ＦＰＧＡ５００の障害を検知する。なお、ホストプロセッサ２００がＦＰＧＡ５００を監視して、障害を検知しても良い。
【０１３２】
ホストプロセッサ２００は、フィルタ処理に必要なＤＢ４５０を、記憶デバイス４００からリードし（１２１４）、システムメモリ２１０に格納する（１２１５）。リード完了後（１２１６）、ＤＢＭＳ１２０を実行するホストプロセッサ２００は、ＦＰＧＡ５００を使用することなく自身でＤＢ４５０のフィルタ処理を行う（１２１７）。
【０１３３】
また、ホストプロセッサ２００は、ＦＰＧＡ５００に割り当てられていた記憶デバイス４００を、ＦＰＧＡ５１０など他のアクセラレータボード５１に再度割り当てても良い。この処理について、以下の図１２で説明する。
【０１３４】
図１２は、アクセラレータボード５０に障害が発生した際に情報処理装置１０で行われる再割り当て処理の一例を示すシーケンス図である。
【０１３５】
記憶デバイス４００がＦＰＧＡ５００に割り当てられている場合、ＤＢＭＳ１２０を実行するホストプロセッサ２００は、記憶デバイス４００のＤＢ４５０に対するフィルタ処理を、ＦＰＧＡ５００に指示する（１２２１）。
【０１３６】
しかし、この時点で、ＦＰＧＡ５００に障害が発生した場合（１２２２）、ＦＰＧＡ５００はＰＣＩｅルートコンプレックス２２１を介して、ホストプロセッサ２００に障害を通知する（１２２３）。障害の通知を受け付けたホストプロセッサ２００は、ＦＰＧＡ５００の障害を検知する。なお、ホストプロセッサ２００がＦＰＧＡ５００を監視して、障害を検知しても良い。
【０１３７】
ホストプロセッサ２００は、新たなアクセラレータボード５１に記憶デバイス４００を割り当てる決定をする。ホストプロセッサ２００は、ＦＰＧＡ５１０用のＦＰＧＡキュー４０８の生成を、記憶デバイス４００に指示する（１２２４）。ホストプロセッサ２００は、記憶デバイス４００のＦＰＧＡ５１０用のＦＰＧＡキュー４０８のアドレスを含む情報を、ＦＰＧＡ５１０に通知する（１２２５）。
【０１３８】
次に、ＤＢＭＳ１２０を実行するホストプロセッサ２００は、新たなＦＰＧＡ５１０に記憶デバイス４００に格納されたＤＢ４５０を使用するフィルタ処理を指示するフィルタ処理コマンドを再発行する（１２２６）。
【０１３９】
ホストプロセッサ２００からフィルタ処理コマンドを受信したＦＰＧＡ５１０は、フィルタ処理コマンドの情報に従い、記憶デバイス４００に対してリードコマンドを発行する（１２２７）。記憶デバイス４００のＤＢ格納領域４０４からリードされたデータは、ＦＰＧＡ５１０のバッファメモリに格納される（１２２８）。
【０１４０】
記憶デバイス４００は、要求されたデータの読み出しが完了すると、リード完了通知をＦＰＧＡ５１０に送信する（１２２９）。リード完了通知を受信したＦＰＧＡ５１０は、フィルタ処理回コマンドに基づいてフィルタ処理を実行する（１２３０）。
【０１４１】
次に、ＦＰＧＡ５１０は、フィルタ処理の結果をＤＢサーバ２０のシステムメモリ２１０に送信する（１２３１）。フィルタ処理の完了後、ＦＰＧＡ５００はフィルタ処理の完了通知をホストプロセッサ２００に送信し（１２３２）、一連のフィルタ処理を終了する。
【０１４２】
なお、記憶デバイス４００に新たなＦＰＧＡ５１０用のＦＰＧＡキュー４０８を生成する例を説明したが、ＦＰＧＡ５００が使用していたＦＰＧＡキュー４０８を、ＦＰＧＡ５１０が流用しても良い。その場合、ホストプロセッサ２００は、ＦＰＧＡ５００が使用していたＦＰＧＡキュー４０８のアドレスと、ＦＰＧＡキュー４０８の値など、ＦＰＧＡキュー４０８を流用するための引き継ぎ情報を、ＦＰＧＡ５１０に通知する。
【０１４３】
以上図１２のように、ＦＰＧＡ５００に障害が発生した場合には、他のＦＰＧＡ５１０を記憶デバイス４００に割り当てることで、ＦＰＧＡ５００の障害発生時にも処理能力を保つことができ、情報処理装置１０の運用を継続することが可能となる。
【０１４４】
図１３は、記憶デバイス及びアクセラレータボードを１つのＰＣＩｅスイッチ４３２０に追加した構成の一例を示すブロック図である。図１３の情報処理装置１０は、図２に示したＰＣＩｅスイッチ２３２０に代わって、ＰＣＩｅバス４３００を介してＤＢサーバ２０に接続されたＰＣＩｅスイッチ４３１０に、ＰＣＩｅバス４３０３を介してアクセラレータボード５０と記憶デバイス４００が接続されている。そして、このＰＣＩｅスイッチ４３１０に記憶デバイス４４０と、アクセラレータボード５３をホットプラグするものである。その他の構成については、前記図２と同様である。
【０１４５】
図１４は、情報処理装置１０の初期化完了後に、新たな記憶デバイス４４０が追加されたときの処理の一例を示すシーケンス図である。
【０１４６】
ＦＰＧＡ５００が記憶デバイス４００に割り当てられている情報処理装置１０に、新たに記憶デバイス４４０が挿入されたとき（１３０１）、記憶デバイス４４０からホストプロセッサ２００に割り込みが発行される（１３０２）。
【０１４７】
ホットプラグによる割り込みを検知し、記憶デバイス４４０の追加を検知したホストプロセッサ２００は、記憶デバイス４４０とＦＰＧＡ５００の再割り当てを行う。例えば、記憶デバイス４４０をＦＰＧＡ５００に追加で割り当てる例を示す。
【０１４８】
ホストプロセッサ２００は、記憶デバイス４４０に対して、ホストプロセッサ２００用のプロセッサキュー４０７とＦＰＧＡ５００用のＦＰＧＡキュー４０８を生成するよう指示する（１３０３）。
【０１４９】
ホストプロセッサ２００は、ＦＰＧＡ５１０用のＦＰＧＡキュー４０８のアドレスを含むキュー情報をＦＰＧＡ５１０に通知する（１３０４）。
【０１５０】
このような再割り当てを行うことで、情報処理装置１０の初期化完了後でも、記憶デバイス４４０の追加後に、ＦＰＧＡ５００に新たな記憶デバイスの情報を処理する機能を与えることができる。
【０１５１】
図１５は、情報処理装置１０の初期化完了後に、新たなアクセラレータボード５３が追加されたときの処理の一例を示すシーケンス図である。
【０１５２】
図１３において、ＦＰＧＡ５００が記憶デバイス４００に割り当てられている情報処理装置１０に、新たにアクセラレータボード５３（ＦＰＧＡ５３０）が追加されたとき（１３１１）、ＦＰＧＡ５３０からホストプロセッサ２００に割り込みが発行される（１３１２）。
【０１５３】
ホットプラグによる割り込みを検知し、ＦＰＧＡ５３０の追加を検知したホストプロセッサ２００は、記憶デバイス４００、４４０、ＦＰＧＡ５００、５３０に関して再び割り当てを行う。例えば、記憶デバイス４００はそのままＦＰＧＡ５００に割り当てられ、記憶デバイス４４０は新たに追加されたＦＰＧＡ５３０に割り当てる場合、ホストプロセッサ２００はＦＰＧＡ５００に記憶デバイス４４０の割り当て解除を通知する（１３１３）。
【０１５４】
次に、ホストプロセッサ２００は、ＦＰＧＡ５３０用のＦＰＧＡキュー４０８の生成を、記憶デバイス４４０に指示する（１３１４）。その後、ホストプロセッサ２００は、記憶デバイス４４０のＦＰＧＡ５３０用のＦＰＧＡキュー４０８のアドレスを含むキュー情報をＦＰＧＡ５３０に通知する（１３１５）。以降、ＤＢＭＳ１２０を実行するホストプロセッサ２００は、記憶デバイス４４０のＤＢを使用するフィルタ処理については、ＦＰＧＡ５３０で実行するよう指示する。
【０１５５】
なお、記憶デバイス４４０に新たなＦＰＧＡ５３０用のＦＰＧＡキュー４０８を生成する例を説明したが、ＦＰＧＡ５００が使用していたＦＰＧＡキュー４０８を、ＦＰＧＡ５３０が流用しても良い。この場合、ホストプロセッサ２００は、ＦＰＧＡ５００が使用していたＦＰＧＡキュー４０８のアドレスと、ＦＰＧＡキュー４０８の値など、ＦＰＧＡキュー４０８を流用するための引き継ぎ情報を、ＦＰＧＡ５３０に通知する。
【０１５６】
このような再割り当てを行うことで、情報処理装置１０の初期化完了後でも、アクセラレータボード５３の追加後に、アクセラレータボード５３を使用可能にして、情報処理装置１０の性能を向上させることができる。
【０１５７】
以上、本実施例１によれば、ＤＢサーバ２０のホストプロセッサ２００が、ＰＣＩｅバス２３００〜２３０４のエンドポイントに接続された記憶デバイス４００のキューの情報を、同じくエンドポイントのアクセラレータとしてのＦＰＧＡ５００に通知する。これにより、ＰＣＩｅバス２３００〜２３０４のエンドポイントのＦＰＧＡ５００が、同じくエンドポイントの記憶デバイス４００にアクセスすることが可能となる。そして、ＦＰＧＡ５００が直接記憶デバイス４００からデータを読み出して、ホストプロセッサ２００の処理の一部を実行することができるようになり、情報処理装置１０を高速化できる。
【０１５８】
なお、本実施例１は、データベース４５０のフィルタ処理を用いて説明したが、本発明が適用される処理は、データベース４５０のフィルタ処理に限定されるものではなく、ホストプロセッサ２００の負荷をアクセラレータボード５０にオフロードできる処理であれば良い。例えば、データの圧縮処理などでも良い。
【０１５９】
また、本実施例１では、ＮＶＭｅのＡｄｍｉｎキュー４０６のアドレスや、Ｉ／Ｏ発行キュー４０７〜４０９のアドレスを、ホストプロセッサ２００がアクセラレータボード５０に通知する例を説明したが、本発明は、ＮＶＭｅやキューインタフェースに限定するものではない。Ｉ／Ｏコマンド発行を可能にするための初期設定インタフェースのアドレスや、他のデバイスから記憶デバイスへのＩ／Ｏ発行インタフェースのアドレスを、プロセッサがアクセラレータボード５０に通知するものであれば良い。
【０１６０】
また、本実施例１では、図２のように、ＤＢサーバ２０の外部に記憶デバイス４００やアクセラレータボード５０を接続した構成で、ＤＢ４５０のフィルタ処理を実行する例を説明した。しかし、本発明はこの構成に限定されるものではなく、ホストプロセッサ２００と記憶デバイス４００とアクセラレータボード５０がネットワークによって接続された構成であれば良い。
【０１６１】
例えば、ＤＢサーバ２０の内部のＰＣＩｅスロットに記憶デバイス４００やアクセラレータボード５０を搭載した構成や、図１６の情報処理装置１０のような構成であってもよい。
【０１６２】
図１６は、実施例１の変形例を示し、情報処理装置１０Ａの一例を示すブロック図である。情報処理装置１０Ａは、ＤＢサーバ２０にサーバ−ストレージ間ネットワーク７００（例えば、ファイバチャネルやＩｎｆｉｎｉＢａｎｄなど）で接続されたストレージ装置６０を有する。ストレージ装置６０の内部には、ストレージプロセッサ６００やキャッシュメモリ６１０やストレージチップセット６２０を持つストレージコントローラ６１が含まれる。
【０１６３】
ストレージコントローラ６１のストレージチップセット６２０は、ＰＣＩｅルートコンプレックス６２１を含む。ＰＣＩｅルートコンプレックス６２１は、ＰＣＩｅバス５３０１を介してＰＣＩｅスイッチ５３１０が接続される。
【０１６４】
ＰＣＩｅスイッチ５３１０には、ＦＰＧＡ５００、５１０を含むアクセラレータボード５０、５１と記憶デバイス４００、４１０、４２０、４３０がＰＣＩｅバス５３０３を介して接続される。
【０１６５】
また、本実施例１では、ホストプロセッサ２００と記憶デバイス４００とアクセラレータボード５０を接続するバスとしてＰＣＩｅバスを用いて説明したが、本発明で使用するバスはＰＣＩｅに限定されるものではない。例えば、ＰＣＩｅバスに代わってＳＡＳ（Serial Attached SCSI）を用いても良い。
【実施例２】
【０１６６】
図１７は、本発明の第２の実施例を示し、情報処理装置１０の一例を示すブロック図である。本実施例２では、アクセラレータボード５０に代わって、アクセラレータボード５４を採用し、ＰＣＩｅスイッチ２３１０のみとしたもので、その他の構成は前記実施例１と同様である。
【０１６７】
前記実施例１では、記憶素子を持たないアクセラレータボード５０が、記憶デバイス４００に対してＩ／Ｏコマンドを発行する例を説明したが、本発明では、アクセラレータボード５０を搭載したデバイスが記憶素子を持っていても良い。
【０１６８】
例えば、図１７の情報処理装置１０は、アクセラレータであるＦＰＧＡ５４０と、不揮発メモリであるＤＢ格納領域５４５を両方搭載したアクセラレータボード５４と、記憶デバイス４００を有する構成である。
【０１６９】
ＤＢサーバ２０は、前記実施例１と同様に、ホストプロセッサ２００が、記憶デバイス４００のＩ／Ｏコントローラ４０１にＦＰＧＡ用Ｉ／Ｏ発行キュー４０９を生成し、生成したキュー情報をＦＰＧＡ５４０に通知する。これにより、ＦＰＧＡ５４０はキュー情報を用いて記憶デバイス４００にＩ／Ｏコマンドを発行することが可能となる。
【０１７０】
このアクセラレータボード５４にフィルタ処理コマンドを発行したときの処理を以下に説明する。
【０１７１】
図１８は、情報処理装置１０で行われるデータベース処理の一例を示すシーケンス図である。
【０１７２】
ＤＢＭＳ１２０を実行するホストプロセッサ２００が、前記実施例１の図５と同様に、フィルタ処理コマンドをＦＰＧＡ５４０に発行する（１４０１）。フィルタ処理コマンドには、少なくとも、フィルタ処理を実行するデータベース４５０のテーブルの先頭が、記憶デバイス４００のＤＢ格納領域４０４のアドレスのどこにあるかを示す情報と、フィルタ処理を実行するＤＢ４５０のサイズの情報、フィルタ処理の条件式＝Ａを含む。フィルタ処理コマンドを受け取ったＩ／Ｏ処理回路５４１は、自身のＤＢ格納領域５４５に無いＬＢＡ領域のデータについて、記憶デバイス４００にリードコマンドを発行する（１４０２）。記憶デバイス４００は、要求されたデータを読み出してバッファメモリ５４３に書き込み（１４０４、１４０８）、Ｉ／Ｏ処理回路５４１にリード完了通知を発行する（１４０６、１４１０）。
【０１７３】
一方、ＦＰＧＡ５４０自身のＤＢ格納領域５４５に格納されているＬＢＡ領域のデータについては、不揮発メモリ制御回路５４４に対してリードコマンドを発行する（１４０３）。ＤＢ格納領域５４５は、要求されたデータを読み出してバッファメモリ５４３に書き込み（１４０５、１４０９）、Ｉ／Ｏ処理回路５４１にリード完了通知を発行する（１４０７、１４１１）。
【０１７４】
Ｉ／Ｏ処理回路５４１は、フィルタ処理に必要なすべてのデータがバッファメモリ５４３に書き込まれると、受信した条件式＝Ａに基づいてフィルタ処理回路５４２へフィルタ処理の実行を指令する（１４１２）。フィルタ処理回路５４２は、バッファメモリ５４３のデータを用いてフィルタ処理を実行し、ＤＢサーバ２０のシステムメモリ２１０にフィルタ処理結果を書き込む（１４１３）。そして、フィルタ処理回路５４２が、フィルタ処理の完了通知をＩ／Ｏ処理回路５４１に発行する（１４１４）。Ｉ／Ｏ処理回路５４１は、フィルタ処理の完了通知をＤＢサーバ２０のホストプロセッサ２００に通知して（１４１５）、処理を終了する。
【０１７５】
このような処理で、ＤＢサーバ２０は、アクセラレータボード５４に対して、記憶デバイス４００のＤＢ格納領域４０４と、アクセラレータボード５４のＤＢ格納領域５４５に格納されたＤＢのフィルタ処理を、アクセラレータであるＦＰＧＡ５４０にオフロードすることができる。
【実施例３】
【０１７６】
図１９は、本発明の第３の実施例を示し、情報処理装置１０の一例を示すブロック図である。本実施例３では、アクセラレータボード５０と記憶デバイス４００に代わって、複数のアクセラレータ搭載記憶デバイス８００、８１０をＰＣＩｅスイッチ３１０に接続したもので、その他の構成は前記実施例１と同様である。
【０１７７】
前記実施例１では、記憶素子を持たないアクセラレータボード５０が、記憶デバイスに対してＩ／Ｏコマンドを発行する例を説明したが、本発明では、アクセラレータの機能と記憶デバイスの機能を含むアクセラレータ搭載記憶デバイス８００、８１０を採用することができる。
【０１７８】
例えば、図１９の情報処理装置１０のように、アクセラレータとしてＦＰＧＡ９００を搭載したアクセラレータ搭載記憶デバイス８００と、ＦＰＧＡ９１０を搭載したアクセラレータ搭載記憶デバイス８１０を、ＰＣＩｅスイッチ３１０を介してＤＢサーバ２０に接続する構成などがある。ＤＢサーバ２０及びＰＣＩｅスイッチ３１０は前記実施例１と同様の構成である。
【０１７９】
アクセラレータ搭載記憶デバイス８００では、Ｉ／Ｏコントローラ８０１とＦＰＧＡ９００は、チップ間通信回路９０１を有し、ＦＰＧＡ９００のバッファメモリ９０３に、ＤＢ格納領域８０４のデータを転送することが可能となっている。これにより、フィルタ処理回路９０２を利用して、ＤＢ格納領域８０４のＤＢに対して、フィルタ処理を行うことができる。
【０１８０】
なお、Ｉ／Ｏコントローラ８０１は、前記実施例１の図２に示したＩ／Ｏコントローラ４０１と同様であり、プロセッサ８０２と、管理情報格納領域８０３と、コマンドインタフェース８０５を有する。コマンドインタフェース８０５は、Ａｄｍｉｎキュー８０６と、プロセッサキュー８０７と、ＦＰＧＡキュー８０８、８０９を有する。
【０１８１】
アクセラレータ搭載記憶デバイス８１０も同様の構成であり、Ｉ／Ｏコントローラ８１１とＦＰＧＡ９１０は、チップ間通信回路を有し、ＦＰＧＡ９１０のバッファメモリ９１３に、ＤＢ格納領域８１４のデータを転送することが可能となっている。これにより、フィルタ処理回路９１２を利用して、ＤＢ格納領域８１４のＤＢに対して、フィルタ処理を行うことができる。
【０１８２】
なお、Ｉ／Ｏコントローラ８１１は、前記実施例１の図２に示したＩ／Ｏコントローラ４０１と同様であり、プロセッサ８１２と、管理情報格納領域８１３と、コマンドインタフェース８１５を有する。コマンドインタフェース８１５は、Ａｄｍｉｎキュー８１６と、プロセッサキュー８１７と、ＦＰＧＡキュー８１８、８１９を有する。
【０１８３】
図２０は、情報処理装置１０で行われる初期化処理の一例を示すシーケンス図である。
【０１８４】
ホストプロセッサ２００は情報処理装置１０の初期化開始時に、自身が接続されているＰＣＩｅネットワークの構成情報をシステムメモリ２１０から取得する（１５０１）。
【０１８５】
次に、ホストプロセッサ２００は、取得したＰＣＩｅネットワークの構成情報を用いて、データベース格納領域８０４、８１４にアクセスするＦＰＧＡ９００、９１０を割り当てる（１５０２）。この割り当ては、前記実施例１の図４と同様に行うことができる。
【０１８６】
ホストプロセッサ２００は、アクセラレータ搭載記憶デバイス８００のＡｄｍｉｎキュー８０６を用いて、ホストプロセッサ２００用のＩ／Ｏ発行キュー８０７と、アクセラレータ搭載記憶デバイス８１０のＦＰＧＡ９１０用のＩ／Ｏ発行キュー８０８を生成する（１５０３）。
【０１８７】
また同様に、ホストプロセッサ２００は、アクセラレータ搭載記憶デバイス８１０のＡｄｍｉｎキュー８１６を用いて、ホストプロセッサ２００用のＩ／Ｏ発行キュー８１７と、アクセラレータ搭載記憶デバイス８００のＦＰＧＡ９００用のＩ／Ｏ発行キュー８１８を生成する（１５０４）。
【０１８８】
その後、ホストプロセッサ２００は、アクセラレータ搭載記憶デバイス８００には、アクセラレータ搭載記憶デバイス８１０のＩ／Ｏ発行キュー８１８の情報を通知する（１５０５）。また、ホストプロセッサ２００は、アクセラレータ搭載記憶デバイス８１０には、アクセラレータ搭載記憶デバイス８００のＩ／Ｏ発行キュー８０８の情報を通知する（１５０６）。上記図２０の処理により、アクセラレータ搭載記憶デバイス８００と、アクセラレータ搭載記憶デバイス８１０は、相互にＩ／Ｏコマンドを発行してフィルタ処理を実行することが可能となる。
【０１８９】
なお、上記実施例３ではＩ／Ｏコントローラ８０１、８１１と、ＦＰＧＡ９００、９１０が独立したチップとして実装されている例を紹介したが、フィルタ処理回路９０２、９１２をＩ／Ｏコントローラ８０１、８１１に搭載するなど、アクセラレータの機能を持つＩ／Ｏコントローラとして一体化しても良い。
【０１９０】
なお、前記実施例１の図５の処理を、本実施例３に適用すると、ホストプロセッサ２００が、アクセラレータ搭載記憶デバイス８１０に対して、フィルタ処理コマンドを発行し、アクセラレータ搭載記憶デバイス８１０はアクセラレータ記憶デバイス８００からデータを読み込む。そして、アクセラレータ搭載記憶デバイス８１０のＦＰＧＡ９１０は、フィルタ処理を実行し、処理結果をホストプロセッサ２００のシステムメモリ２１０へ格納する。
【０１９１】
なお、前記実施例１の図７、図８、図９Ａ、図９Ｂの内容を、本実施例３に適用すると、まず、ホストプロセッサ２００は、起動時などに複数のアクセラレータは記憶デバイス８００、８１０の情報を収集して、ＰＣＩｅネットワークの構成情報としてシステムメモリ２１０に格納する。そして、ホストプロセッサ２００は、ＰＣＩｅネットワークの構成情報に基づいて、所定の条件を満たすアクセラレータは記憶デバイス８００、８１０とＦＰＧＡ９００、９１０の割り当てを決定する。ホストプロセッサ２００は、当該決定した割り当てに基づいて、アクセラレータは記憶デバイス８００のＡｄｍｉｎキュー８０６のアドレス、またはＩ／Ｏ発行キュー８０７、８０８のアドレスを、アクセラレータ搭載記憶デバイス８１０に通知することで割り当て実行する。
【０１９２】
なお、前記実施例１の図１０の処理を、本実施例３に適用すると、アクセラレータ搭載記憶デバイス８００に障害が発生したときには、アクセラレータ搭載記憶デバイス８００からの通知に基づいてホストプロセッサ２００が障害を検知する。ホストプロセッサ２００は、フィルタ処理を実行するアクセラレータ搭載記憶デバイス８１０に対して、アクセラレータ搭載記憶デバイス８００の障害を通知する。
【０１９３】
なお、前記実施例１の図１１の処理を、本実施例３に適用すると、アクセラレータ搭載記憶デバイス８１０のＦＰＧＡ９１０に障害が発生したときには、アクセラレータ搭載記憶デバイス８１０が、データを読み込んだアクセラレータ搭載記憶デバイス８００に対してＦＰＧＡ９１０の障害を通知する。
【０１９４】
あるいは、アクセラレータ搭載記憶デバイス８１０が、ホストプロセッサ２００にＦＰＧＡ９１０の障害を通知し、ホストプロセッサ２００がアクセラレータ搭載記憶デバイス８００にＦＰＧＡ９１０の障害を通知してもよい。
【０１９５】
なお、前記実施例１の図１４または図１５の処理を、本実施例３に適用すると、ホストプロセッサ２００は、新たなアクセラレータ搭載記憶デバイスの追加を検知すると、システムメモリ２１０のＰＣＩｅネットワークの構成情報を参照して、新たなアクセラレータ搭載記憶デバイスとＦＰＧＡの割り当てを決定する。そして、ホストプロセッサ２００は、新たな割り当てに基づいて、ＡｄｍｉｎキューやＩ／Ｏ発行キューのアドレスを新たなアクセラレータ搭載記憶や既存のアクセラレータ搭載記憶デバイス８００に通知して割り当てを変更する。
【０１９６】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、又は置換のいずれもが、単独で、又は組み合わせても適用可能である。
【０１９７】
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、及び機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記録装置、または、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に置くことができる。
【０１９８】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際には殆ど全ての構成が相互に接続されていると考えてもよい。
【０１９９】
＜補足＞
データを格納する記憶デバイスであって、
前記記憶デバイスは、
前記初期化の命令を受け付ける初期設定インタフェースと、
Ｉ／Ｏコマンドを発行するＩ／Ｏ発行インタフェースと、を有し、
前記Ｉ／Ｏ発行インタフェースは、
前記第１の装置からのＩ／Ｏコマンドを受け付ける第１のＩ／Ｏ発行インタフェースと、
前記第２の装置からのＩ／Ｏコマンドを受け付ける第２のＩ／Ｏ発行インタフェースと、を含み、
前記記憶デバイスは
前記第１の装置と第２の装置から、それぞれ独立して前記Ｉ／Ｏコマンドを受け付け可能であることを特徴とする情報処理装置。
【符号の説明】
【０２００】
１０  情報処理装置
２０  データベースサーバ
５０  アクセラレータボード
２００  ホストプロセッサ
３１０  ＰＣＩｅスイッチ
４００  記憶デバイス
５００  ＦＰＧＡ
５０１  Ｉ／Ｏ処理回路
５０２  フィルタ処理回路
５０３  バッファメモリ
【図１】
2018113075.tif 000003
【図２】
2018113075.tif 000004
【図３】
2018113075.tif 000005
【図４】
2018113075.tif 000006
【図５】
2018113075.tif 000007
【図６】
2018113075.tif 000008
【図７】
2018113075.tif 000009
【図８】
2018113075.tif 000010
【図９Ａ】
2018113075.tif 000011
【図９Ｂ】
2018113075.tif 000012
【図１０】
2018113075.tif 000013
【図１１】
2018113075.tif 000014
【図１２】
2018113075.tif 000015
【図１３】
2018113075.tif 000016
【図１４】
2018113075.tif 000017
【図１５】
2018113075.tif 000018
【図１６】
2018113075.tif 000019
【図１７】
2018113075.tif 000020
【図１８】
2018113075.tif 000021
【図１９】
2018113075.tif 000022
【図２０】
2018113075.tif 000023
【図２１】
2018113075.tif 000024