(57)【要約】  プロセッサに接続された第１のメモリと、第２のメモリを含むアクセラレータと、データを格納するストレージ装置と、を含んでデータ処理部を稼働させる計算機システムは、データの処理要求を受け付ける処理要求受付部と、処理要求内の処理の内容を分析する処理内容分析部と、アクセラレータの負荷を検出する負荷検出部と、処理の内容の分析結果と、アクセラレータの負荷とを取得して、所定の条件が成立したときには処理をアクセラレータに実行させるオフロード処理部と、所定の条件が成立しなかったときには受け付けた処理をプロセッサに処理させる処理実行部を含み、オフロード処理部は、アクセラレータに第２のメモリに記憶領域を確保させてから前記ストレージ装置にデータを転送させた後に処理を実行し、処理実行部は、プロセッサに第１のメモリに記憶領域を確保させてからストレージ装置にデータを転送させてから処理を実行する。
2017119098.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサと、
前記プロセッサに接続された第１のメモリと、
第２のメモリを含むアクセラレータと、
前記プロセッサ及び前記アクセラレータに接続されてデータを格納するストレージ装置と、を含んでデータ処理部を稼働させる計算機システムであって、
前記データ処理部は、
前記データの処理要求を受け付ける処理要求受付部と、
前記処理要求に含まれる処理の内容を分析する処理内容分析部と、
前記アクセラレータの負荷を検出する負荷検出部と、
前記処理の内容の分析結果と、前記アクセラレータの負荷とを取得して、所定の条件が成立したときには受け付けた処理を前記アクセラレータに実行させるオフロード処理部と、
前記所定の条件が成立しなかったときには受け付けた処理を前記プロセッサに処理させる処理実行部と、を含み、
前記オフロード処理部は、
前記アクセラレータに前記第２のメモリに記憶領域を確保させてから、前記ストレージ装置に処理要求に含まれるデータを前記第２のメモリの前記記憶領域に転送させ、前記アクセラレータに処理を実行させ、
前記処理実行部は、
前記プロセッサに前記第１のメモリに記憶領域を確保させてから、前記ストレージ装置に前記処理要求に含まれるデータを前記第１のメモリの前記記憶領域に転送させ、前記プロセッサに処理を実行させることを特徴とする計算機システム。
【請求項２】
請求項１に記載の計算機システムであって、
前記アクセラレータは複数であって、
前記負荷検出部は、
前記アクセラレータで実行中のコマンド数と、処理内容と、データ量のうち少なくともひとつを取得して前記アクセラレータの負荷をそれぞれ算出し、
前記オフロード処理部は、
前記アクセラレータのうち、相対的に負荷の低いアクセラレータを選択して処理を実行させることを特徴とする計算機システム。
【請求項３】
請求項１に記載の計算機システムであって、
前記データ処理部が複数稼働し、前記データ処理部には予め優先度がそれぞれ設定され、
前記オフロード処理部は、
前記データ処理部に設定された優先度が前記所定の条件を満たすときに、前記アクセラレータに前記処理を実行させることを特徴とする計算機システム。
【請求項４】
請求項３に記載の計算機システムであって、
前記データ処理部は、起動時に前記優先度が設定されることを特徴とする計算機システム。
【請求項５】
請求項１に記載の計算機システムであって、
前記オフロード処理部は、
前記アクセラレータが前記第２のメモリに記憶領域を確保できなかった場合には、前記アクセラレータによる処理を禁止して、前記処理実行部に処理を実行させることを特徴とする計算機システム。
【請求項６】
請求項１に記載の計算機システムであって、
前記オフロード処理部は、
前記処理の内容から当該処理を実行するデータのサイズが所定の閾値を超えていれば、前記所定の条件が成立したと判定して前記アクセラレータに当該処理を実行させ、
前記処理実行部は、
前記処理の内容から当該処理を実行するデータのサイズが所定の閾値以下であれば、前記所定の条件が成立しなかったと判定して前記プロセッサに当該処理を実行させることを特徴とする計算機システム。
【請求項７】
請求項１に記載の計算機システムであって、
前記データ処理部は、
前記アクセラレータの第２のメモリの物理アドレスを前記第１のメモリの仮想アドレスに割り当て、
前記オフロード処理部は、
前記アクセラレータに前記処理を実行させる際には、前記第２のメモリの物理アドレス前記ストレージ装置に通知して前記データを転送させ、
前記処理実行部は、
前記プロセッサに前記処理を実行させる際には、前記第１のメモリの仮想アドレスを第１のメモリの物理アドレスに変換して前記ストレージ装置に通知して前記データを転送させることを特徴とする計算機システム。
【請求項８】
請求項１に記載の計算機システムであって、
前記データ処理部は、
前記アクセラレータの負荷情報として、前記アクセラレータで実行中のコマンド数と、処理内容と、データ量を保持するアクセラレータ管理情報を有することを特徴とする計算機システム。
【請求項９】
プロセッサと、前記プロセッサに接続された第１のメモリと、第２のメモリを含むアクセラレータと、前記プロセッサ及び前記アクセラレータに接続されてデータを格納するストレージ装置とを含む計算機でデータ処理を実行する計算機の制御方法であって、
前記計算機が、前記データの処理要求を受け付ける第１のステップと、
前記計算機が、前記処理要求に含まれる処理の内容を分析する第２のステップと、
前記計算機が、前記アクセラレータの負荷を検出する第３のステップと、
前記計算機が、前記処理の内容の分析結果と、前記アクセラレータの負荷とを取得して、所定の条件が成立したときには受け付けた処理を前記アクセラレータに実行させる第４のステップと、
前記計算機が、前記所定の条件が成立しなかったときには受け付けた処理を前記プロセッサに処理させる第５のステップと、を含み、
前記第４のステップは、
前記アクセラレータに前記第２のメモリに記憶領域を確保させてから、前記ストレージ装置に処理要求に含まれるデータを前記第２のメモリの前記記憶領域に転送させ、前記アクセラレータに処理を実行させ、
前記第５のステップは、
前記プロセッサに前記第１のメモリに記憶領域を確保させてから、前記ストレージ装置に前記処理要求に含まれるデータを前記第１のメモリの前記記憶領域に転送させ、前記プロセッサに処理を実行させることを特徴とする計算機の制御方法。
【請求項１０】
請求項９に記載の計算機の制御方法であって、
前記アクセラレータは複数であって、
前記第３のステップは、
前記アクセラレータで実行中のコマンド数と、処理内容と、データ量のうち少なくともひとつを取得して前記アクセラレータの負荷をそれぞれ算出し、
前記第４のステップは、
前記アクセラレータのうち、相対的に負荷の低いアクセラレータを選択して処理を実行させることを特徴とする計算機の制御方法。
【請求項１１】
請求項９に記載の計算機の制御方法であって、
前記計算機はデータ処理を実行し、前記データ処理には予め優先度がそれぞれ設定され、
前記第４のステップは、
前記データ処理に設定された優先度が前記所定の条件を満たすときに、前記アクセラレータに前記処理を実行させることを特徴とする計算機の制御方法。
【請求項１２】
請求項１１に記載の計算機の制御方法であって、
前記データ処理は、起動時に前記優先度が設定されることを特徴とする計算機の制御方法。
【請求項１３】
請求項９に記載の計算機の制御方法であって、
前記第４のステップは、
前記アクセラレータが前記第２のメモリに記憶領域を確保できなかった場合には、前記アクセラレータによる処理を禁止し
前記第５のステップは、
前記アクセラレータが前記第２のメモリに記憶領域を確保できなかった場合には、前記プロセッサに前記処理を実行させることを特徴とする計算機の制御方法。
【請求項１４】
請求項９に記載の計算機の制御方法であって、
前記第４のステップは、
前記処理の内容から当該処理を実行するデータのサイズが所定の閾値を超えていれば、前記所定の条件が成立したと判定して前記アクセラレータに当該処理を実行させ、
前記第５のステップは、
前記処理の内容から当該処理を実行するデータのサイズが所定の閾値以下であれば、前記所定の条件が成立しなかったと判定して前記プロセッサに当該処理を実行させることを特徴とする計算機の制御方法。
【請求項１５】
請求項９に記載の計算機の制御方法であって、
前記データ処理は、
前記アクセラレータの第２のメモリの物理アドレスを前記第１のメモリの仮想アドレスに割り当て、
前記第４のステップは、
前記アクセラレータに前記処理を実行させる際には、前記第２のメモリの物理アドレス前記ストレージ装置に通知して前記データを転送させ、
前記第５のステップは、
前記プロセッサに前記処理を実行させる際には、前記第１のメモリの仮想アドレスを第１のメモリの物理アドレスに変換して前記ストレージ装置に通知して前記データを転送させることを特徴とする計算機の制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ処理を行う計算機システム及び計算機システムに接続されるアクセラレータに関するものである。
【背景技術】
【０００２】
コンピュータシステムは何らかのデータ処理を目的とする。これらデータ処理はコンピュータシステム内のプロセッサによって実施される。また、処理対象となるデータはコンピュータシステムの二次記憶装置（例えばＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ））等に格納されており、プロセッサは二次記憶装置に対して処理対象のデータを一次記憶装置（例えばＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））に転送するように指示する。そして、プロセッサは、二次記憶装置によるデータ転送が完了した後に、一次記憶装置に格納されたデータを処理する。こうしたコンピュータシステムでは、二次記憶装置の転送性能がボトルネックとなりデータ処理の性能が制限されてきた。【０００３】
近年、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）を二次記憶装置として利用したコンピュータシステムが広まっている。ＳＳＤを二次記憶装置に用いることで、データの転送性能が飛躍的に向上し、前述の二次記憶装置によるボトルネックが解消された。しかし、二次記憶装置の性能が向上する一方でデータ処理を行うプロセッサの性能向上は鈍化しており、データ処理システムにおいてプロセッサの処理性能がコンピュータシステム全体のボトルネックとなっている。【０００４】
このプロセッサによるデータ処理性能のボトルネックを回避するため、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）やＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）等の装置をコンピュータシステムに接続し、プロセッサに替わってデータ処理の一部を担うコンピュータシステムが登場している（例えば特許文献１）。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】米国特許第８８２４４９２号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上記特許文献１では、二次記憶装置からデータをアクセラレータとしてのＦＰＧＡに直接転送し、ＦＰＧＡにて所定の処理をした後、処理結果を一次記憶装置に転送する技術が開示されている。【０００７】
しかし、様々なデータ処理の中には、アクセラレータへオフロードせずにプロセッサにて処理を実施するほうが効率的な処理も存在する。例えば、オフロードする処理対象データのサイズが小さい場合、プロセッサは少量のデータをアクセラレータに転送する制御を行い、さらに、オフロードする処理内容を記述した情報をアクセラレータに転送する制御を行い、アクセラレータから通知されるオフロード処理の結果を取得する、といった処理を行う必要がある。【０００８】
このように、データのサイズが小さい場合では、プロセッサに対するデータ処理の負荷が軽減されても、アクセラレータに処理をオフロードするために新たな処理負荷が生じるため、プロセッサからアクセラレータへの負荷オフロードが十分になされず、プロセッサの性能ボトルネックが回避されないという課題が生じる場合があった。【０００９】
上記特許文献１に開示された技術では、こうした課題が考慮されておらず全ての処理をアクセラレータにオフロードするため、上述のように適切な性能向上効果が得られない場合が存在する。【００１０】
また、上記特許文献１のように複数の解析処理の全てをアクセラレータにオフロードする構成では、全ての解析処理をアクセラレータ内に実装する必要がある。こうした構成では、極めて稀に発生する処理まで考慮してアクセラレータを開発する必要が生じ、開発工数の増大及びコストの増大を招く、という課題があった。【００１１】
また、上記特許文献１に開示された技術では、こうした課題が考慮されておらず全処理をアクセラレータにオフロードするため、コンピュータシステムが実行する可能性のある全てのデータ処理をアクセラレータ内に実装する必要がある。【００１２】
また、複数のアプリケーションが稼働しており、複数接続されたアクセラレータが稼働するコンピュータシステムでは、様々なアプリケーションか個別にアクセラレータを利用する。このとき、アクセラレータの処理負荷を平準化する必要があるが、上記特許文献１ではアクセラレータの負荷を平準化することができない、という問題があった。
【課題を解決するための手段】
【００１３】
本発明は、プロセッサと、前記プロセッサに接続された第１のメモリと、第２のメモリを含むアクセラレータと、前記プロセッサ及び前記アクセラレータに接続されてデータを格納するストレージ装置と、を含んでデータ処理部を稼働させる計算機システムであって、前記データ処理部は、前記データの処理要求を受け付ける処理要求受付部と、前記処理要求に含まれる処理の内容を分析する処理内容分析部と、前記アクセラレータの負荷を検出する負荷検出部と、前記処理の内容の分析結果と、前記アクセラレータの負荷とを取得して、所定の条件が成立したときには受け付けた処理を前記アクセラレータに実行させるオフロード処理部と、前記所定の条件が成立しなかったときには受け付けた処理を前記プロセッサに処理させる処理実行部と、を含み、前記オフロード処理部は、前記アクセラレータに前記第２のメモリに記憶領域を確保させてから、前記ストレージ装置に処理要求に含まれるデータを前記第２のメモリの前記記憶領域に転送させ、前記アクセラレータに処理を実行させ、前記処理実行部は、前記プロセッサに前記第１のメモリに記憶領域を確保させてから、前記ストレージ装置に前記処理要求に含まれるデータを前記第１のメモリの前記記憶領域に転送させ、前記プロセッサに処理を実行させる。
【発明の効果】
【００１４】
本発明によれば、様々なデータ処理を行う計算機システムにおいて、アクセラレータにオフロードする事が好適な処理のみをオフロードする事が可能となる。例えば、計算機システムのデータ処理全体のうち、高頻度に生じる処理内容をアクセラレータで高速に処理することで、計算機システムの全体の性能を向上させることができる。また、複数のアクセラレータの負荷を平準化することが可能となり、計算機システムの全体的なデータ処理性能を向上させる事が可能となる。
【図面の簡単な説明】
【００１５】
【図１】本発明の実施例を示し、計算機システムの一例を示すブロック図である。
【図２】本発明の実施例を示し、アクセラレータの一例を示すブロック図である。
【図３】本発明の実施例を示し、サーバにおけるデータ転送経路の一例を示すブロック図である。
【図４】本発明の実施例を示し、サーバのソフトウェア構成の一例を示すブロック図である。
【図５】本発明の実施例を示し、サーバで行われる処理の一例を示すフローチャートである。
【図６】本発明の実施例を示し、サーバのアクセラレータ管理情報の一例を示す図である。
【図７】本発明の実施例を示し、サーバのメモリ空間の一例を示すマップである。
【図８】本発明の変形例を示し、計算機システムの一例を示すブロック図である。
【図９】本発明の変形例を示し、計算機システムの一例を示すブロック図である。
【図１０】本発明の変形例を示し、サーバのソフトウェア構成の一例を示すブロック図である。
【発明を実施するための形態】
【００１６】
以下、本発明の一実施例について添付図面を用いて説明する。
【実施例１】
【００１７】
（１−１）システム構成
図１は、計算機システムの一例を示すブロック図である。まず図１を用いて、本発明が適用される計算機システムの構成について説明する。図１は、本発明が適用される計算機システムの一例について示しており、本発明は、図１を例とする計算機システムに適用可能なものである。まず図１について説明する。【００１８】
図１は、本発明が適用されるサーバ１００の構成を示している。図１のサーバ１００は、一次記憶領域（または主記憶装置、メモリ）であるＤＲＡＭ１１１と、ソフトウェアに従って様々な処理を行なうプロセッサ１１２と、各種周辺機器を接続するスイッチ（以下ＳＷ）１１３、二次記憶領域（または補助記憶装置、ストレージ装置）となるＨＤＤ／ＳＳＤ１１５−１、１１５−２と、プロセッサ１１２からの指示に基づいてデータ処理を行うアクセラレータ１１４−１、１１４−２を含む。なお、アクセラレータ全体を“−”のない符号１１４で示す。その他の構成要素についても同様に“−”のない符号で、当該構成要素の全体を指す。【００１９】
ＤＲＡＭ１１１は、プロセッサ１１２から短時間でアクセス可能に接続されており、プロセッサ１１２が処理するプログラムや処理を行うデータを格納する記憶領域である。【００２０】
プロセッサ１１２は、プログラムに従って稼働し、対象のデータを処理する装置である。プロセッサ１１２は、内部に複数のプロセッサコア（図示省略）を含み、プロセッサコアは各自独立してプログラムを処理することができる。また、プロセッサ１１２は、内部にＤＲＡＭコントローラを含み、プロセッサコアからのリクエストに応じてＤＲＡＭ１１１からデータを取得し、またはＤＲＡＭ１１１にデータを格納する。【００２１】
また、プロセッサ１１２は、外部ＩＯインターフェース（図示省略）を含んでＳＷ１１３と接続する。またプロセッサ１１２は、ＳＷ１１３を経由して二次記憶装置であるＨＤＤ／ＳＳＤ１１５やアクセラレータ１１４に指示を通知する事が可能である。【００２２】
ＳＷ１１３は、高速な外部ＩＯバスを中継する構成要素であり、例えばＰＣＩ−ＥｘｐｒｅｓｓやＩｎｆｉｎｉｂａｎｄ等の接続規格のパケットを、所定のルーティング方式で転送する。ＳＷ１１３は、ＨＤＤ／ＳＳＤ１１５とアクセラレータ１１４を複数台接続しており、プロセッサ１１２と各種デバイス間で情報を転送する。【００２３】
ＨＤＤ／ＳＳＤ１１５は、処理の対象となるデータを格納する二次記憶装置である。本発明においては、ＨＤＤ／ＳＳＤ１１５はプロセッサ１１２から通知される情報に基づき対象データをＤＡＲＭ１１１または、後述のアクセラレータ１１４内のＤＲＡＭ（主記憶装置）４０１に転送する。本発明においては、二次記憶装置は、ＨＤＤやＳＳＤのいずれでも構わない。【００２４】
なお、本実施例のサーバ１００の構成を示す図１では、プロセッサ１１２の外部にあるＳＷ１１３を経由してＨＤＤ／ＳＳＤ１１５と接続する例について記すが、本発明はこの例に限定されるものではなく、プロセッサ１１２とＨＤＤ／ＳＳＤ１１５やアクセラレータ１１４が直接接続されていてもよい。【００２５】
また、本実施例のサーバ構成を示す図１では、サーバ１００内に一つのプロセッサ１１２とひとつのＳＷ１１３を有する構成を示すが、本発明はこの例に限定されるものではない。例えば、図７で示すようにサーバ１００Ａには、複数のプロセッサ１１２−１、１１２−２と、ＳＷ１１３−１、１１３−２が搭載されていても良く、一つのプロセッサ１１２に複数のＳＷ１１３が接続される構成、または、複数のプロセッサ１１２に一つのＳＷ１１３が接続される構成であっても構わない。【００２６】
また、本実施例のサーバの構成を示す図１では、サーバ１００内にＳＷ１１３を格納した構成について記すが、本発明はこの構成について限定されるものではない。例えば、図８で示すようにサーバ１００−１、１００−２が複数有り、複数のサーバ１００が複数のエキスパンダー３０１−１、３０１−２を共有する構成であっても良い。【００２７】
エキスパンダー３０１は、内部にＳＷ１１３と、ＨＤＤ／ＳＳＤ１１５−１、１１５−２と、アクセラレータ１１４−１、１１４−２を含み、ＨＤＤ／ＳＳＤ１１５、アクセラレータ１１４はＳＷ１１３を経由してサーバ１００内のプロセッサ１１２に接続される。【００２８】
上記構成において、サーバ１００−１、１００−２はサーバ間通信経路３０２（例えばＩｎｆｉｎｉｂａｎｄまたはＥｔｈｅｒｎｅｔ）を用いて相互に通信し、後述するアクセラレータ１１４内のＤＲＡＭ領域の管理を協調して行う。【００２９】
（１−２）アクセラレータの構成
次に図２を用いて、本発明が適用されるアクセラレータ１１４−１の内部構成について説明する。図２は、アクセラレータ１１４−１の一例を示すブロック図である。図２に示すアクセラレータ１１４−１はＦＰＧＡ４００とＤＲＡＭ４０１によって構成される。なお、図１に示したアクセラレータ１１４−１、１１４−２は同様の構成である。【００３０】
ＦＰＧＡ４００は、少なくとも内部にホストインターフェース部４１１と、組み込みプロセッサ４１２と、ＦＰＧＡ内部スイッチ部４１３と、データ処理機能部４１４及びＳＲＡＭ部４１５を有する。【００３１】
ホストインターフェース部４１１は、ＦＰＧＡ４００内に実装された機能であり、接続されるＳＷ１１３とのデータ通信を行う機能部である。【００３２】
組み込みプロセッサ４１２は、ホスト（プロセッサ１１２）からの指示に基づいて所定の処理を行う機能部である。本実施例ではサーバ１００内のプロセッサ１１２は、アクセラレータ１１４に対してフィルタ処理（対象データ中、指定した条件に一致したデータのみを取り出す処理）のオフロードコマンドを作成し、オフロードコマンドの実施をアクセラレータ１１４に指示する。【００３３】
この指示を組み込みプロセッサ４１２が検知すると、サーバ１００からコマンドを取得する。そして、組み込みプロセッサ４１２は、フィルタ処理の条件を取得し、当該条件を後述のデータ処理機能部４１４に通知する。次に、アクセラレータ１１４内のＤＲＡＭ４０１における対象データの位置をデータ処理機能部４１４に通知し、処理開始を指示する。【００３４】
ＦＰＧＡ内部スイッチ部４１３は、ＦＰＧＡ４００内の各機能部間での情報通信を行うため、各機能部に接続される。尚、図２には、スター型に接続されたスイッチの例について記しているが、ＦＰＧＡ内部スイッチ部４１３は、共有バス構成にて接続されていてもよい。【００３５】
データ処理機能部４１４は、サーバのプロセッサ１１２から指示された内容に基づいてデータ処理を行う論理回路である。データ処理機能部４１４は、組み込みプロセッサ４１２の指示に基づいて処理を開始し、組み込みプロセッサ４１２から指定されたアクセラレータ１１４内のＤＲＡＭ４０１の領域から対象データを読み出し、組み込みプロセッサ４１２から指示されたフィルタリング条件を用いて、対象データ中から条件に該当するデータのみをホストインターフェース部４１１を介してサーバ１００のプロセッサ１１２に転送する。【００３６】
尚、本実施例では、データ処理の一例としてフィルタ処理について記すが、本発明はこのデータ処理内容に限定されるものではない。例えば加算処理でもよく、指定されたデータの合計値を演算し、その合計値のみをサーバ１００に転送する制御でもよい。【００３７】
また、本実施例では、アクセラレータ１１４がＦＰＧＡによって構成された例について示すが本発明はこの例に限定されるものではない。例えば、アクセラレータ１１４がＧＰＵによって構成されており、データ処理機能部４１４や組み込みプロセッサ４１２等の区別無く、各種処理を全てＧＰＵのコアが処理するとしても良い。【００３８】
（１−３）アクセラレータにて処理する場合のデータ転送経路
続いて図３を用いて本実施例におけるデータの転送経路について説明する。本実施例では、データの処理内容に基づきサーバ１００内のプロセッサ１１２が、データ処理をプロセッサ１１２自身で処理するか、アクセラレータ１１４にオフロードするか否かを判定する。本実施例ではその一つの例として、フィルタ処理を行う対象データのサイズが小さい（閾値Ｔｈ１以下）場合にはプロセッサ１１２自身でフィルタ処理を行い、フィルタ処理を行う対象データのサイズが大きい（閾値Ｔｈ１を超える）場合にはアクセラレータ１１４内のデータ処理機能部４１４にて処理を行う。【００３９】
図３の破線の矢印にて示すデータ転送経路５０１は、データ処理をプロセッサ１１２自身で処理する際のデータ転送経路である。プロセッサ１１２は、対象データを格納するための領域としてオペレーティングシステムの標準機能を用いてＤＲＡＭ１１１内の領域を確保し、その領域をＨＤＤ／ＳＳＤ１１５に通知する。通知を受けたＨＤＤ／ＳＳＤ１１５は、ＤＲＡＭ１１１内の領域に向けて対象データを転送する。対象データの転送完了後、ＨＤＤ／ＳＳＤ１１５はプロセッサ１１２に対してデータ転送の完了を通知する。【００４０】
プロセッサ１１２はデータ転送の完了を取得後、ＤＲＡＭ１１１に直接アクセスし、対象データを取得してフィルタ処理を行う。【００４１】
一方で、図３の実線の矢印にて示すデータ転送経路５０２は、データ処理をアクセラレータ１１４にオフロードする際のデータ転送経路である。プロセッサ１１２は、対象データを格納するための領域として後述するアクセラレータＤＲＡＭアロケータ６２１を用いてアクセラレータ１１４内のＤＲＡＭ４０１で記憶領域を確保し、その記憶領域をＨＤＤ／ＳＳＤ１１５に通知する。通知を受けたＨＤＤ／ＳＳＤ１１５は、アクセラレータ１１４内のＤＲＡＭ４０１の領域に向けて対象データを転送する。対象データの転送完了後、ＨＤＤ／ＳＳＤはプロセッサ１１２に対して完了を通知する。【００４２】
プロセッサ１１２はデータ転送完了の通知を取得後、オフロード用のコマンドを作成する。このオフロード用のコマンドには、フィルタ処理の条件等を含む。そしてプロセッサ１１２は、このコマンドをアクセラレータ１１４に通知する。通知を受けたアクセラレータ内の組み込みプロセッサ４１２は、プロセッサ１１２から通知されたフィルタ処理の条件をデータ処理機能部４１４に通知する。その後、組み込みプロセッサ４１２は、データ処理機能部４１４に処理の開始を指示する。【００４３】
組み込みプロセッサ４１２から指示を受けたデータ処理機能部４１４は、対象データをＤＲＡＭ４０１から取得して、フィルタ処理を行う。そして、組み込みプロセッサ４１２はフィルタ処理の結果をサーバ１００のプロセッサ１１２に転送する。【００４４】
上述のとおり、図３にて実線にて示したアクセラレータ１１４にてデータ処理をする際のデータ転送経路５０２を実現することで、転送不可が集中するプロセッサ１１２とＳＷ１１３間のデータ転送経路や、プロセッサ１１２とＤＲＡＭ１１１間の転送経路に対象データを転送することなく、ＨＤＤ／ＳＳＤ１１５とアクセラレータ１１４間の経路のみに対象データを転送するだけで、データ処理を実現できる。【００４５】
このため、サーバ１００の性能を向上させる際に、プロセッサ１１２やＤＲＡＭ１１１を増強せずに、ＨＤＤ／ＳＳＤ１１５やアクセラレータ１１４の個数を増やすのみで性能向上を達成できる。【００４６】
（１−４）ソフトウェア構成
続いて、実施例１におけるソフトウェア構成について図４を用いて説明する。図４は、本実施例におけるサーバ１００のソフトウェアの構成の一例を示すブロック図である。図４に示すソフトウェアのいずれも図１に示したサーバ１００、または図８または図９にて示したサーバ１００Ａ、１００−１、１００−２のプロセッサ１１２によって処理される。【００４７】
アプリケーション６０１−１、６０１−２は、例えば、ＨＤＤ／ＳＳＤ１１５に格納されたデータ処理を行うデータベースソフトウェアであり、オペレーティングシステム６０２が提供する仮想（または論理）アドレス上で稼働するソフトウェアである。なお、本実施例ではデータ処理を行うアプリケーションの一例としてデータベースソフトウェアを挙げ、データベースソフトウェアがフィルタ処理及びインデックスの管理情報生成処理をする例について記すが、本発明はこのソフトウェアに限定されるものではない。例えば、アプリケーションとして画像処理ソフトウェアであっても良く、画像処理ソフトウェアが、画像処理（例えば、画像フォーマット変換）をアクセラレータにオフロードするものにも適用される。【００４８】
また、図４で示すようにアプリケーション６０１は、オペレーティングシステム６０２上で稼働するものに限定されない。【００４９】
例えば図１０のアプリケーション６０１のように、オペレーティングシステム６０２上で稼働する仮想化ソフトウェア６０４にて管理されるゲストオペレーティングシステム６０２上で稼働するものにも適用される。【００５０】
図４において、データ処理部として機能するアプリケーション６０１は、データの処理要求を受け付ける処理要求受付部６０３と、受け付けた処理内容を分析する処理内容分析部６０９と、アクセラレータ１１４の負荷を検出する負荷検出部６０５と、処理のオフロードの有無を判定し、オフロード処理を実行させるオフロード処理部６０６と、処理のオフロードを行わない場合にデータ処理をプロセッサ１１２にて実行する処理実行部６０７とを含む。【００５１】
アプリケーション６０１の処理内容分析部６０９は、アクセラレータ１１４にオフロード可能な処理を予め取得または設定されおり、内部で生じる様々な処理について、アクセラレータにて処理すべきか、プロセッサ１１２にて処理すべきかを判定する。【００５２】
また、アプリケーション６０１の負荷検出部６０５は、後述のアクセラレータ管理情報８００をアクセラレータドライバ６１０から取得することで、アクセラレータ１１４の負荷状況を取得する。そして、アクセラレータ１１４の負荷が所定の閾値Ｔｈ２以上で高くプロセッサ１１２で処理するほうが高速に処理可能と判定される場合、アプリケーション６０１のオフロード処理部６０６は、処理内容としてアクセラレータ１１４にオフロード可能な場合であってもアクセラレータ１１４へのオフロードを禁止して、処理実行部６０７がプロセッサ１１２にて処理する。【００５３】
また、オフロード処理部６０６は、アクセラレータ１１４に処理をオフロードする場合、後述のアクセラレータ管理情報８００から、複数のアクセラレータ１１４の負荷を取得して、負荷が相対的に低いアクセラレータ１１４を選択して処理をオフロードする。例えば、アプリケーション６０１は、複数のアクセラレータ１１４のうち負荷が最小のアクセラレータ１１４を選択して処理をオフロードする。【００５４】
オペレーティングシステム６０２は、アクセラレータ１１４や二次記憶装置であるＨＤＤ／ＳＳＤ１１５等を管理し、アプリケーションを稼働させるソフトウェアである。オペレーティングシステム６０２は、少なくとも内部に、アクセラレータドライバ６１０と、ＨＤＤ／ＳＳＤドライバ６１１とを含む。【００５５】
アクセラレータドライバ６１０は、アプリケーション６０１がアクセラレータ１１４を利用する際に使用するソフトウェアである。アクセラレータドライバ６１０は、アクセラレータＤＲＡＭアロケータ６２１とオフロードコマンド発行６２２と、オフロードコマンド完了チェック６２３と、アクセラレータ管理情報の取得６２４の機能を有する。【００５６】
アクセラレータＤＲＡＭアロケータ６２１は、アクセラレータ１１４が有するＤＲＡＭ４０１の記憶領域を管理する機能である。アプリケーション６０１は、アクセラレータ１１４の利用時にアクセラレータＤＲＡＭアロケータ６２１に対してメモリ要求とメモリ要求サイズを通知する。【００５７】
通知を受けたアクセラレータＤＲＡＭアロケータ６２１は、管理するアクセラレータ１１４内のＤＲＡＭ４０１の記憶領域で空き領域を探索し、要求サイズ分を確保する。アクセラレータＤＲＡＭアロケータ６２１は、確保した領域が利用中である事を示す情報をアクセラレータＤＲＡＭアロケータ６２１が管理するアクセラレータ管理情報８００に記録する。そして、アクセラレータＤＲＡＭアロケータ６２１は、確保した領域の先頭を示す物理アドレスをアプリケーション６０１に返す。一方で、要求サイズ分のＤＲＡＭ４０１の記憶領域を確保できなかった場合、アクセラレータＤＲＡＭアロケータ６２１は、確保不能であることを示す情報をアプリケーション６０１に通知する。【００５８】
また、アプリケーション６０１のオフロード処理部６０６は、利用していたアクセラレータ１１４内のＤＲＡＭ４０１の記憶領域が不要となった場合（例えば、フィルタ処理のオフロード結果取得が完了したときなど）、アクセラレータＤＲＡＭアロケータ６２１にメモリ領域の開放を指示する。指示を受け付けたアクセラレータＤＲＡＭアロケータ６２１は、内部の管理情報（管理情報）から該当する領域を「空き」状態に変更して更新する。そして、アクセラレータＤＲＡＭアロケータ６２１は、メモリ領域の開放が完了したことをアプリケーション６０１のオフロード処理部６０６に通知する。【００５９】
オフロードコマンド発行６２２は、アプリケーション６０１のオフロード処理部６０６が所定のオフロードコマンドをアクセラレータ１１４に発行する際に利用する機能である。アプリケーション６０１のオフロード処理部６０６は、ＨＤＤ／ＳＳＤ１１５に対して、対象データをアクセラレータＤＲＡＭアロケータ６２１に確保した記憶領域へ転送するよう指令する。そして、アプリケーション６０１は、アクセラレータドライバ６１０のオフロードコマンド発行６２２に処理の実行とフィルタ処理の条件を与える。【００６０】
オフロードコマンド発行６２２は、フィルタ処理の条件をアクセラレータ１１４に通知し、実行を開始させる。その後、オフロードコマンド発行６２２は、オフロードコマンドの発行が完了したことをアプリケーション６０１のオフロード処理部６０６に通知する。【００６１】
オフロードコマンド完了チェック６２３は、アプリケーション６０１のオフロード処理部６０６が発行済みのオフロードコマンドが完了しているか否かをアクセラレータ１１４に問い合わせるための機能である。【００６２】
アクセラレータドライバ６１０は、アクセラレータ１１４から通知されたオフロードコマンド処理の完了を保持しておき、アプリケーション６０１のオフロード処理部６０６からオフロードコマンド完了チェック６２３を介したアクセスがあった際に、アクセラレータ管理情報８００を参照することで、指定されたオフロードコマンドが完了しているか否かを判定する。オフロードコマンド完了チェック６２３は、アクセラレータ１１４でオフロードコマンドの完了を確認した後、フィルタ処理の結果をアプリケーション６０１のオフロード処理部６０６に応答する。【００６３】
アクセラレータ管理情報の取得６２４は、アプリケーション６０１の負荷検出部６０５及びオフロード処理部６０６が後述するアクセラレータ管理情報８００を取得するために用いる機能である。本実施例のアプリケーション６０１は、複数のアクセラレータ１１４を管理しており、各アクセラレータ１１４への負荷が平準化されるように調整する。【００６４】
このため、アプリケーション６０１はオフロードコマンドの発行前に、アクセラレータ管理情報の取得６２４の機能を用いてアクセラレータ１１４の管理情報を取得し、この管理情報から現在負荷が相対的に低いアクセラレータ１１４を選択する。この機能によって、本実施例のアプリケーション６０１はアクセラレータ１１４の負荷の平準化を実現する。【００６５】
尚、本実施例では、アプリケーション６０１がこれらアクセラレータドライバ６１０の各機能と直接通信する例について記述するが、本発明はこの例に限定されるものではない。例えば、複数のアプリケーション６０１から共通してアクセスされるライブラリ（または、オペレーティングシステム６０２内の機能）があり、そのライブラリが複数のアプリケーション６０１からの要求を調停してアクセラレータドライバ６１０にアクセスしても良い。【００６６】
また、アクセラレータ管理情報の取得６２４の機能については、オペレーティングシステム６０２内のドライバではなく、オペレーティングシステム６０２上にて稼働する複数のアプリケーション６０１から参照可能なソフトウェアであっても良い。【００６７】
ＨＤＤ／ＳＳＤドライバ６１１は、アプリケーション６０１がＨＤＤ／ＳＳＤ１１５にＩＯコマンドを発行する際に利用するソフトウェアであり、ＩＯＣＭＤ１発行６３１と、ＩＯＣＭＤ２発行６３２と、ＩＯＣＭＤ完了チェック６３３の機能を有する。【００６８】
ＩＯＣＭＤ１発行６３１は、アプリケーション６０１の処理実行部６０７がプロセッサ１１２を用いてデータ処理を行う際に、ＨＤＤ／ＳＳＤ１１５から対象データを取得するために利用する機能である。アプリケーション６０１は、データを処理するため、対象データを格納する記憶領域の確保をオペレーティングシステム６０２に要求する。この記憶領域の確保は、オペレーティングシステム６０２がＬｉｎｕｘであるときの「ｍａｌｌｏｃ」や「ｐｏｓｉｘ＿ｍｅｍａｌｉｇｎ」等の機能であり、記憶領域の確保を要求されたオペレーティングシステム６０２は、管理下のＤＲＡＭ１１１の空き領域から、要求された記憶領域を確保して、当該記憶領域の仮想アドレスをアプリケーション６０１に応答する。【００６９】
次に、アプリケーション６０１は、この仮想アドレスをＩＯＣＭＤ１発行に通知し、この仮想アドレスに対象データを格納するように指示する。指示を受け付けたＩＯＣＭＤ１発行６３１は、仮想アドレスをオペレーティングシステム６０２の他の機能に問い合わせ、物理アドレスに変換し、その物理アドレスをＨＤＤ／ＳＳＤ１１５に通知し、対象データの取得を指示する。【００７０】
尚、アプリケーション６０１は、ＩＯＣＭＤ１発行に対して連続した仮想アドレスを通知するが、その仮想アドレスを物理アドレスに変換して、離散的な複数の物理アドレスとなっても構わない。この場合、ＩＯＣＭＤ１は、離散的な複数の物理アドレス全てをＨＤＤ／ＳＳＤ１１５に通知する。通知を受けたＨＤＤ／ＳＳＤ１１５は、指定された複数の物理アドレスに対して対象データを転送する。対象データの転送が完了した後、ＨＤＤ／ＳＳＤ１１５は、転送完了情報をサーバ１００のアプリケーション６０１に通知する。【００７１】
ＩＯＣＭＤ２発行６３２は、アプリケーション６０１のオフロード処理部６０６がアクセラレータ１１４を用いてデータ処理する際に、ＨＤＤ／ＳＳＤ１１５からアクセラレータ１１４内のＤＲＡＭ４０１に対象データを転送させるために用いる機能である。【００７２】
アプリケーション６０１のオフロード処理部６０６は、アクセラレータ１１４でデータ処理を行うため、前述のアクセラレータＤＲＡＭアロケータ６２１を用いて、対象データを格納するためのアクセラレータ１１４内のＤＲＡＭ４０１で記憶領域を確保する。このとき、アクセラレータＤＲＡＭアロケータ６２１は、確保した記憶領域を示すアクセラレータ内ＤＲＡＭ４０１の物理アドレスをアプリケーション６０１に返す。【００７３】
アプリケーション６０１のオフロード処理部６０６は、このアクセラレータ内ＤＲＡＭ４０１の物理アドレスをＩＯＣＭＤ２発行６３２に通知し、データ転送を指示する。指示を受けたＩＯＣＭＤ２発行６３２は、アプリケーション６０１から通知された物理アドレスをＨＤＤ／ＳＳＤ１１５に通知して、対象のデータ転送を指示する。【００７４】
ＩＯＣＭＤ２発行６３２からデータ転送を指示されたＨＤＤ／ＳＳＤ１１５は、指定されたアクセラレータ内ＤＲＡＭ４０１の物理アドレスに対してデータを転送し、転送が完了すると転送完了情報をサーバ１００のアプリケーション６０１のオフロード処理部６０６に通知する。【００７５】
ＩＯＣＭＤ完了チェック６３３は、アプリケーション６０１がＩＯＣＭＤ１またはＩＯＣＭＤ２にて発行したコマンドの完了を検知するための機能である。ＨＤＤ／ＳＳＤドライバ６１１は、ＨＤＤ／ＳＳＤ１１５のデータ転送の完了を検知した際、内部管理情報（図示省略）にデータ転送が完了したことを記録し、保持している。【００７６】
アプリケーション６０１のオフロード処理部６０６は、ＩＯＣＭＤ完了チェック６３３を定期的（所定の周期）に呼び出して、発行中のＩＯＣＭＤが完了しているか否かをＨＤＤ／ＳＳＤドライバ６１１に問い合わせる。このとき、ＨＤＤ／ＳＳＤドライバ６１１は、内部管理情報を参照し、「データ転送完了」または、「データ転送未完」をアプリケーション６０１のオフロード処理部６０６に通知する。【００７７】
オペレーティングシステム６０２と、アプリケーション６０１の各機能部はプログラムとしてメモリとしてのＤＲＡＭ１１１にロードされる。【００７８】
プロセッサ１１２は、各機能部のプログラムに従って処理することによって、所定の機能を提供する機能部として稼働する。例えば、プロセッサ１１２は、データベースプログラムに従って処理することでデータ処理部（アプリケーション６０１）として機能する。他のプログラムについても同様である。さらに、プロセッサ１１２は、各プログラムが実行する複数の処理のそれぞれの機能を提供する機能部としても稼働する。計算機及び計算機システムは、これらの機能部を含む装置及びシステムである。【００７９】
オペレーティングシステム６０２やアプリケーション６０１の各機能を実現するプログラム、テーブル等の情報は、ストレージサブシステムや不揮発性半導体メモリ、ハードディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。【００８０】
図７はサーバ１００のメモリ空間の一例を示すマップである。サーバ１００のＤＲＡＭ１１１のメモリ空間１１１０は、オペレーティングシステム６０２によって管理される。図示の例では、サーバ１００のＤＲＡＭ１１１のメモリ空間１１１０に割り当てられた仮想アドレスが０ｈ〜Ｅ００００ｈの例を示す。【００８１】
オペレーティングシステム６０２は、アクセラレータ１１４のＤＲＡＭ４０１の物理アドレスを、メモリ空間１１１０の仮想アドレスに割り当てておく。【００８２】
例えば、オペレーティングシステム６０２は、アクセラレータ１１４−１のＤＲＡＭ４０１の物理アドレスの０ｈ〜ＦＦＦｈを、メモリ空間１１１０内の仮想アドレスのＡ０００ｈ〜ＡＦＦＦｈに割り当てる。また、オペレーティングシステム６０２は、例えば、アクセラレータ１１４−２のＤＲＡＭ４０１の物理アドレスの０ｈ〜ＦＦＦｈを、メモリ空間１１１０内の仮想アドレスのＤ０００ｈ〜ＤＦＦＦｈに割り当てる。【００８３】
アクセラレータ１１４は、ＤＲＡＭ１１１に割り当てられた上記記憶領域（Ａ０００〜ＡＦＦＦ、Ｄ０００〜ＤＦＦＦ）へオフロードされた対象データの処理結果を書き込んでおく。これにより、アプリケーション６０１はＤＲＡＭ１１１内に書き込まれたオフロード処理の結果を利用することができる。【００８４】
なお、上記ではオペレーティングシステム６０２上でアプリケーション６０１を実行する例を示したが、図１０に示す仮想化ソフトウェア６０４を用いた場合は、次のようになる。図１０は、本実施例の変形例を示し、サーバ１００のソフトウェア構成の一例を示すブロック図である。【００８５】
仮想化ソフトウェア６０４は、オペレーティングシステム６０２でゲストオペレーティングシステム６０２を稼働させるソフトウェアである。ゲストオペレーティングシステム６０２からのアクセラレータ１１４、ＨＤＤ／ＳＳＤ１１５への各種命令を仲介するソフトウェアである。仮想化ソフトウェア６０４は、アクセラレータドライバ６１０やＨＤＤ／ＳＳＤドライバ６１１に、アプリケーション６０１と同様の形態でアクセラレータ１１４内のＤＲＡＭ４０１で記憶領域の確保や、オフロードコマンドの発行や、各種ＩＯの発行を行う。【００８６】
ゲストオペレーティングシステム６０２は、仮想化ソフトウェア６０４上で稼働するオペレーティングシステムである、ゲストオペレーティングシステム６０２内には、オペレーティングシステム６０２内のアクセラレータドライバ６１０とＨＤＤ／ＳＳＤドライバ６１１と同様のインターフェースを持つゲストオペレーティングシステム内ドライバ６４１を有する。【００８７】
ゲストオペレーティングシステム６０２上で稼働するアプリケーション６０１は、このゲストオペレーティングシステム内ドライバ６４１を用いることで、オペレーティングシステム６０２内の、アクセラレータドライバ６１０、ＨＤＤ／ＳＳＤドライバ６１１に命令を通知する。【００８８】
ゲストオペレーティングシステム内ドライバ６４１は、オペレーティングシステム６０２内のアクセラレータドライバ６１０とＨＤＤ／ＳＳＤドライバ６１１と同様のインターフェースをアプリケーション６０１に提供する。そして、ゲストオペレーティングシステム内ドライバ６４１はアプリケーション６０１からの指示に応じて、仮想化ソフトウェア６０４を介してアクセラレータドライバ６１０またはＨＤＤ／ＳＳＤドライバ６１１に指示を送る。【００８９】
（１−５）アクセラレータ管理情報
次に、図６を用いてアクセラレータ管理情報８００について説明する。図６はサーバ１００のアクセラレータ管理情報８００の一例を示す図である。【００９０】
アクセラレータ管理情報８００は、前述のアクセラレータドライバ６１０が管理し、更新処理を行う。アクセラレータドライバ６１０は、アプリケーション６０１からの指示に基づいてオフロードコマンドを発行する度に、アクセラレータ管理情報８００の該当項目を更新する。【００９１】
本実施例のアクセラレータ管理情報８００は、発行中のオフロードコマンド数８０１と、発行中の対象データサイズ８０２と、発行中の処理内容内訳８０３のエントリを持ち、アクセラレータ１１４毎に個別の独立したフィールド８１１、８１２を有する。なお、図中アクセラレータＸがアクセラレータ１１４−１に対応し、アクセラレータＹがアクセラレータ１１４−２に対応する。【００９２】
発行中のオフロードコマンド数８０１は、該当するアクセラレータ１１４に発行済みのオフロードコマンド数を格納するフィールドである。アクセラレータドライバ６１０は、オフロードコマンドをアクセラレータ１１４に通知した際に、このフィールドをオフロードしたコマンド数だけインクリメントして更新する。【００９３】
また、アクセラレータドライバ６１０は、アクセラレータ１１４からオフロードコマンドの完了を受領した際には、発行中のオフロードコマンド数８０１のフィールド８１１、８１２の値をデクリメントして更新する。【００９４】
アプリケーション６０１がこのフィールド８１１、８１２の値を取得することで、アクセラレータ１１４毎の負荷の差異を取得することができる。仮に、複数のアプリケーション６０１が発行するアクセラレータ１１４へのオフロードコマンドの内容が同一であると仮定される場合には、アプリケーション６０１はこのフィールド８１１、８１２の値が相対的に小さいアクセラレータ１１４に対してオフロードコマンドを発行することで、アクセラレータ１１４の負荷を平準化する。【００９５】
図６の例では、発行中のオフロードコマンド数８０１のエントリにおいて、アクセラレータＸに２０個のコマンドが発行済みであり、アクセラレータＹには３２個のコマンドが発行済みである場合を示している。仮に、これらオフロードコマンドが同一（処理内容が同一で且つリクエストサイズが同一）である場合には、このフィールドの値が少ないアクセラレータ１にコマンドを発行することで、負荷の平準化を実現する。【００９６】
アクセラレータ１１４−１にコマンドを発行した場合には、アクセラレータドライバ６１０は、このフィールド８１１、８１２の値を既存の２０から２１にインクリメントして更新する。また、アクセラレータ１１４−１からのコマンド完了を受領した場合には、アクセラレータドライバがこのフィールドの値を２０から１９にデクリメントして保存する。【００９７】
発行中の対象データサイズ８０２は、該当するアクセラレータ１１４に発行済みの対象データ量を格納するエントリである。アクセラレータドライバ６１０は、オフロードコマンドをアクセラレータ１１４に通知した際に、このエントリのフィールド８１１、８１２をオフロードしたデータサイズだけインクリメントして更新する。【００９８】
また、アクセラレータドライバ６１０は、アクセラレータ１１４からオフロードコマンドの完了を受領した際には、このエントリのフィールド８１１、８１２の値をデクリメントして更新する。【００９９】
アクセラレータ１１４にオフロードする対象データサイズにばらつきが大きい環境では、前述の発行中のオフロードコマンド数８０１のエントリに格納された値では、アクセラレータ１１４の負荷を予測できない。この場合、発行中の対象データサイズ８０２のエントリでフィールド８１１、８１２の値を用いてアクセラレータ１１４の負荷を推定する。例えば発行中のコマンド数が多いアクセラレータ１１４であっても、各コマンドの対象データサイズ８０２が小さい場合、処理に要する時間は短いと推測される。このため、アプリケーション６０１は、発行中のデータサイズ８０２の値が相対的に小さいアクセラレータ１１４を選択してオフロードを実施することでアクセラレータ１１４の負荷を平準化できる。【０１００】
図６の例では、アクセラレータＸに合計３０７２ＫＢのオフロードコマンドが発行済みであり、アクセラレータＹに合計８１９２ＫＢのオフロードコマンドが発行済みであることを示す。仮にオフロードした処理内容が同一種類であれば、このフィールド８１１、８１２の値が相対的に小さいアクセラレータ１にオフロードコマンドを発行することで負荷の平準化を図ることができる。【０１０１】
発行中の処理内容内訳８０３は、該当するアクセラレータ１１４に発行済みのオフロードコマンドの処理内訳について格納するエントリである。アクセラレータ１１４が複数の処理が実施可能な場合、例えば、「データのフィルタリング」と「画像データのフォーマット変換」の二種類の処理が可能なアクセラレータ１１４の場合、アプリケーション６０１は各処理の処理時間が異なるため、前述の発行中のオフロードコマンド数８０１や発行中の対象データサイズ８０２では、アクセラレータ１１４が完了するまでの処理時間を推定できない。【０１０２】
そこで、発行中の処理内容内訳８０３に、発行中のコマンド毎について処理内容と処理データサイズを格納し、アプリケーション６０１は、これらの情報からコマンド毎の処理時間を負荷として推定する。そして、アプリケーション６０１は、処理時間が相対的に短いアクセラレータ１１４にオフロードすることで、アクセラレータ１１４の負荷の平準化を測る。また、上記推定した処理時間からプロセッサ１１２にて処理したほうが高速と考えられる場合、プロセッサ１１２にて処理する。【０１０３】
図６に示す例では、アクセラレータＸに発行中の処理内容内訳８０３のエントリのフィールド８１１に「４ＫＢ毎のデータ処理に１００μｓの処理時間が必要な処理Ａ」について、処理データサイズとして「５１２ＫＢ」とするコマンドを「４個」発行中であることを示す情報を格納している。【０１０４】
さらに発行中の処理内容内訳８０３のエントリでは、フィールド８１１に「１６ＫＢ毎のデータ処理に１０μｓの処理時間が必要な処理Ｂ」について、処理データサイズを「６４ＫＢ」とするコマンドを「１６個」発行中という情報を格納している。【０１０５】
このとき、この情報をアクセラレータドライバ６１０から取得したアプリケーション６０１は、取得した情報からアクセラレータＹの処理完了時間は、おおよそ１００μｓ×５１２ＫＢ／４ＫＢ×４個＋１０μｓ×６４ＫＢ／１６ＫＢ×１６個＝５１２００μｓ＋２５６μｓ＝５３７６０μｓと予測する。【０１０６】
そして、アプリケーション６０１は、この処理完了時間を他のアクセラレータ１１４についても同様に計算して比較（図６の例のアクセラレータＹは、１０  μｓ×２５６ＫＢ／１６ＫＢ×３２個＝５１２０μｓであるから、アクセラレータＸの方が対象データサイズ８０２は小さい）し、相対的に処理完了時間の短いアクセラレータ１１４を選択することで、アクセラレータ１１４の負荷の平準化を行う。また、アプリケーション６０１は、対象データの処理をプロセッサ１１２で実施するべきか、アクセラレータ１１４にオフロードすべきかを判定する情報としてアクセラレータ管理情報８００を用いることができる。【０１０７】
なお、上記実施例では、アクセラレータ管理情報８００をオペレーティングシステム６０２のアクセラレータドライバ６１０内に保持する例を示したが、図示はしないが、アプリケーション６０１内に保持してもよい。【０１０８】
（１−６）データ処理内容
続いて、図５を用いて本実施例のサーバ１００で行われる処理の一例を説明する。図５は、サーバ１００で行われる処理の一例を示すフローチャートである。このフローチャートは、本実施例の対象とするデータベースのアプリケーション６０１にて実施される。データベースソフトウェアとして稼働するアプリケーション６０１は、サーバ１００の各種クライアントからの処理要求に応じてデータ処理を行う。アプリケーション６０１は、処理要求を受け付けると、図５に示すフローチャートを実行する。尚、図５に示す各ステップの処理を行う主体は、アプリケーション６０１を実行するプロセッサ１１２である。【０１０９】
本実施例におけるデータ処理の最初のステップＳ７０１は、アプリケーション６０１がデータ処理の指示（または要求）を受領する。例えばサーバ１００に接続されたクライアントＰＣ（図示省略）から、データベース全体のインデックス作成の指示が通知された場合、本実施例のアプリケーション６０１であるデータベースはその指示を受領する。【０１１０】
次のステップＳ７０２では、アプリケーション６０１がステップＳ７０１で受領したデータ処理の指示の内容を分析する。このステップにおいて、受領したデータ処理は、アプリケーション６０１によって複数種類の内部処理に分割される。例えば、受領したデータ処理の指示内容がインデックス作成の指示であった場合、インデックス作成に指定された条件に該当するデータを取得するフィルタ処理と、フィルタ処理の結果に基づいてインデックスの管理情報を生成する処理に分割される。【０１１１】
ステップＳ７０３では、ステップＳ７０２にて処理した複数の処理毎に、アクセラレータ１１４にて処理のオフロードが可能か否か、または有効か否かを判定する。例えば、上記ステップＳ７０２にて「フィルタ処理」と「インデックスの管理情報生成」の二種類の処理が必要と判断された場合、「フィルタ処理」、「インデックスの管理情報生成」という処理毎に、アクセラレータ１１４にて処理のオフロードが可能か判断する。【０１１２】
本実施例のアクセラレータ１１４は例えば、「フィルタ処理」の機能のみを搭載したものであり、上記の例において、アプリケーション６０１は、二つの処理のうち「フィルタ処理」については、アクセラレータ１１４にてオフロード可能と判定し、ステップＳ７０４に進む。【０１１３】
一方で、アプリケーション６０１は、「インデックスの管理情報生成」については、アクセラレータ１１４に処理をオフロードさせることは不可能と判定し、ステップＳ７１４に進む。【０１１４】
また、アプリケーション６０１は、アクセラレータ１１４にオフロード可能な処理であっても、一回のオフロードコマンド発行にてオフロードできるデータのサイズが所定の閾値Ｔｈ１以下で小さい場合、例えばプロセッサ１１２にて処理した場合の処理時間が５μｓ程度と推定され、オフロードコマンド発行とアクセラレータ１１４による処理時間が１０μｓと推定される場合、アクセラレータ１１４へのオフロードは処理時間の短縮に有効でないと判定してステップＳ７１４に進む。【０１１５】
一方、アプリケーション６０１は、一回のオフロードコマンド発行にて、アクセラレータ１１４にオフロード可能なデータのサイズが閾値Ｔｈ１を超えて大きい場合、ステップＳ７０４に進む。【０１１６】
尚、本実施例では、一回のオフロードコマンド発行にて処理するデータのサイズから、アプリケーション６０１が処理時間を予測して、プロセッサ１１２にて実施する場合とアクセラレータ１１４にて処理する場合に分岐して処理する例を示すが、本発明はこの例に限定されるものではない。【０１１７】
例えば、アプリケーション６０１は、アクセラレータ１１４にオフロードするリクエスト（データサイズ）の下限値を固定値として管理しても良い。例えば、アプリケーション６０１は、１６ＫＢ以下のデータはプロセッサ１１２にて処理するという閾値Ｔｈ１を保持し、この閾値Ｔｈ１に従ってオフロードの可否を判定してもよい。【０１１８】
ステップＳ７０４は、アプリケーション６０１がアクセラレータドライバ６１０からアクセラレータ１１４の利用状況を取得する。アプリケーション６０１は、アクセラレータドライバ６１０のアクセラレータ管理情報の取得６２４を用いてアクセラレータ管理情報８００を取得する。【０１１９】
ステップＳ７０５では、アプリケーション６０１が、上記ステップＳ７０４にて取得したアクセラレータ管理情報８００を用いて、アクセラレータ１１４に処理をオフロード可能か否かを判定する。アプリケーション６０１は、アクセラレータドライバ６１０から取得したアクセラレータ管理情報８００を参照し、上述のように各アクセラレータ１１４の負荷を推定し、アクセラレータ１１４の処理時間と、プロセッサ１１２の処理時間の比較結果に応じて、オフロードの可否を判定する。【０１２０】
例えば、アプリケーション６０１は、全てのアクセラレータ１１４の負荷が高く、アクセラレータ１１４で処理を実行した場合の処理待ち時間が、当該処理をプロセッサ１１２で処理した時間よりも長いと判定した場合、アクセラレータ１１４への処理のオフロードを禁止して、ステップＳ７１４に進む。換言すれば、アクセラレータ１１４による処理の高性能化が見込めない場合には、処理のオフロードは行わない。なお、アクセラレータ１１４へオフロードする際の処理待ち時間は、コマンドの作成とオフロード結果の受信までの時間を含む。また、アクセラレータ１１４の処理待ち時間と、プロセッサ１１２の処理時間の算出については後述する。【０１２１】
一方、アクセラレータ１１４で処理した場合の処理待ち時間が、プロセッサ１１２で処理した場合の時間よりも短い場合、アプリケーション６０１は、アクセラレータ１１４への処理オフロードによる高性能化の効果が見込めると判定し、ステップＳ７０６へ進む。【０１２２】
ステップＳ７０６では、アプリケーション６０１が、アプリケーション６０１自体に予め付与された優先度を用いてアクセラレータ１１４の利用を判断するステップである。【０１２３】
オフロードの実行可否の判定基準として、オペレーティングシステム６０２がＬｉｎｕｘやＵｎｉｘであれば、本実施例のアプリケーション６０１は、アプリケーション６０１自身に付与されたｎｉｃｅ値を用いて判断する。例えば、アプリケーション６０１は、サーバ１００に接続されたアクセラレータ１１４の負荷の合計が、ｎｉｃｅ値＝５に定められている閾値Ｔｈ２を超えているか否かを判定する。【０１２４】
アクセラレータ１１４の負荷の合計が閾値Ｔｈ２を超えていれば、「ｎｉｃｅ値＝５」に設定されたアプリケーション６０１は、他の相対的に優先度の高い（ｎｉｃｅ値が５よりも小さい）アプリケーション６０１に優先的にアクセラレータ１１４を利用させるため、アクセラレータ１１４の利用を諦めステップＳ７１５に進む。【０１２５】
一方、アプリケーション６０１のｎｉｃｅ値が小さく（優先度が高く）、複数のアクセラレータ１１４の負荷の合計がｎｉｃｅ値の閾値Ｔｈ２を下回る場合には、アプリケーション６０１は、アクセラレータ１１４を利用するためにステップＳ７０７に進む。【０１２６】
尚、本実施例では、アプリケーション６０１の優先度として、ＵＮＩＸ系にて用いられるアプリケーション６０１の優先度設定値であるｎｉｃｅ値を用いた例について示すが、本発明はこの例に限定されるものではない。ｎｉｃｅ値とはまったく別の系列の優先度を表す値であっても構わない。例えば、アクセラレータ専用の優先度を決定する値を、アプリケーション６０１の起動時にサーバ１００の入力装置（図示省略）から引数や設定ファイルを与えるようにしてもよい。【０１２７】
次に、ステップＳ７０７では、アプリケーション６０１が上記ステップＳ７０６にてアクセラレータ１１４にデータ処理をオフロードすると判定し、相対的に負荷の低いアクセラレータ１１４を選択する。アプリケーション６０１は、ステップＳ７０４にて取得したアクセラレータ管理情報８００の各フィールドを参照し、複数接続されたアクセラレータ１１４の中から、相対的に負荷の低いアクセラレータ１１４を選択する。この処理によって、同一計算機システム内のアクセラレータ１１４の負荷が平準化される。【０１２８】
ステップＳ７０８では、ステップＳ７０７でアプリケーション６０１が選択したアクセラレータ１１４において、当該アプリケーション６０１はＤＲＡＭ４０１の記憶領域を確保する。【０１２９】
アプリケーション６０１は、アクセラレータドライバ６１０内のアクセラレータＤＲＡＭアロケータ６２１に、オフロードする処理に必要な領域サイズを通知し、アクセラレータ１１４内のＤＲＡＭ４０１に記憶領域の確保を指示する。アプリケーション６０１から指示を受けたアクセラレータＤＲＡＭアロケータ６２１は、自身が管理する管理情報（図示省略）を参照し、アプリケーション６０１から要求されたサイズがＤＲＡＭ４０１で確保可能か否かを判定する。【０１３０】
アクセラレータＤＲＡＭアロケータ６２１は、記憶領域を確保できた場合は、確保したアクセラレータ１１４内のＤＲＡＭ４０１の領域をアプリケーション６０１に通知する。一方で、アクセラレータＤＲＡＭアロケータ６２１は、記憶領域をアクセラレータ１１４で確保できなかった場合には、確保不可を示す情報をアプリケーション６０１に通知する。【０１３１】
ステップＳ７０９では、アプリケーション６０１がアクセラレータＤＲＡＭアロケータ６２１から取得したアクセラレータ１１４のＤＲＡＭ４０１の記憶領域の確保結果を判定する。【０１３２】
上記ステップＳ７０８にて、アクセラレータ１１４でＤＲＡＭ４０１の記憶領域が確保できた場合には、アプリケーション６０１は、確保したアクセラレータ１１４のＤＲＡＭ４０１の記憶領域に対象データを転送するため、ステップＳ７１０に進む。【０１３３】
一方、ＤＲＡＭ４０１で記憶領域を確保できなかった場合には、アプリケーション６０１は、アクセラレータ１１４に処理をオフロードすることが困難となったため、プロセッサ１１２で処理すると判定する。なお、アプリケーション６０１は、ＤＲＡＭ４０１で記憶領域を確保できなかったエラーを、処理を要求したクライアントへ通知しない。エラーの通知を禁止することで、クライアントへの負担が少ない円滑なデータ処理を実現できる。そして、アプリケーション６０１は、プロセッサ１１２に接続されたＤＲＡＭ１１１に対象データを転送するため、ステップＳ７１５へ進んでＤＲＡＭ１１１の記憶領域を確保する。【０１３４】
オフロードを実施するステップＳ７１０では、ステップＳ７０８にてアプリケーション６０１が確保したアクセラレータ１１４内のＤＲＡＭ４０１の記憶領域に対象データを転送するように、アプリケーション６０１がＨＤＤ／ＳＳＤ１１５にＩＯコマンドを発行する。【０１３５】
アプリケーション６０１は、ＨＤＤ／ＳＳＤドライバ６１１内のＩＯＣＭＤ２発行６３２に対して、ステップＳ７０８にてアクセラレータＤＲＡＭアロケータ６２１から取得したアクセラレータ１１４内のＤＲＡＭ４０１の記憶領域を示す物理アドレスと、データサイズ、対象データが格納されているＨＤＤ／ＳＳＤ１１５上の領域を通知する。【０１３６】
通知を受けたＩＯＣＭＤ２発行６３２は、アプリケーション６０１から受領した各種情報をＨＤＤ／ＳＳＤ１１５に通知し、データ転送を開始させる。尚、このとき、アプリケーション６０１は、ＩＯＣＭＤ２発行６３２に対して物理アドレスを通知するため、上述のＩＯＣＭＤ１発行６３１のときのように、アプリケーション６０１から取得したアドレスを変換する必要はない。【０１３７】
次に、ステップＳ７１１では、アプリケーション６０１が、ＨＤＤ／ＳＳＤ１１５からデータ転送の完了を取得するステップである。ＨＤＤ／ＳＳＤドライバ６１１は、ＨＤＤ／ＳＳＤからの割り込み、またはポーリングを契機としてＨＤＤ／ＳＳＤのデータ転送完了を検知する。【０１３８】
そしてアプリケーション６０１は、ＨＤＤ／ＳＳＤドライバ６１１内のＩＯＣＭＤ完了チェック６３３を定期的に呼び出して、ＨＤＤ／ＳＳＤドライバ６１１がＨＤＤ／ＳＳＤ１１５のデータ転送完了を検知するのを監視する。このアプリケーション６０１による定期的な監視によって、アプリケーション６０１は、ＨＤＤ／ＳＳＤ１１５のデータ転送完了を検知する。【０１３９】
ステップＳ７１２は、上記ステップＳ７１１にて、アクセラレータ１１４内のＤＲＡＭ４０１への対象データの転送が完了したことを検知したアプリケーション６０１が、アクセラレータ１１４に対してオフロードコマンドを発行する。【０１４０】
アプリケーション６０１は、アクセラレータドライバ６１０内のオフロードコマンド発行６２２に対して、処理を行う対象データを指定する情報を通知する。本実施例では、フィルタ処理をアクセラレータ１１４へオフロードするために、フィルタ処理で取得したいデータの条件を通知する。【０１４１】
また、アプリケーション６０１は、アクセラレータ１１４にて行われたデータ処理結果を格納するＤＲＡＭ１１１の記憶領域もオフロードコマンド発行６２２に通知する。なお、この記憶領域は図７に示したとおりである。【０１４２】
通知を受けたオフロードコマンド発行６２２は、データ処理の条件と結果を格納するＤＲＡＭ１１１の記憶領域をアクセラレータ１１４に通知し、データ処理の開始を指示する。【０１４３】
この指示を受けたアクセラレータ１１４内の組み込みプロセッサ４１２は、データ処理機能部４１４を起動する。このとき、組み込みプロセッサ４１２は、データ処理機能部４１４にデータ処理結果を格納する領域として、アプリケーション６０１から通知されたＤＡＲＭ１１１の記憶領域も通知する。起動したデータ処理機能部４１４は、アクセラレータ１１４内のＤＲＡＭ４０１から対象データを取得し、データ処理を実施し、処理の結果を通知されたＤＲＡＭ１１１の記憶領域に転送する。【０１４４】
オフロード処理の完了後、組み込みプロセッサ４１２は、オフロードコマンド完了の通知をオペレーティングシステム６０２に送信する。組み込みプロセッサ４１２からのオフロードコマンド完了を受領したアクセラレータドライバ６１０は、オフロードコマンドが完了したことをアクセラレータ管理情報８００に記録する。【０１４５】
次にステップＳ７１３では、アプリケーション６０１がアクセラレータ１１４からのオフロードコマンド完了の通知を取得する。本実施例では、アクセラレータドライバ６１０が組み込みプロセッサ４１２からのオフロードコマンド完了の通知を受領した際、完了したことを内部の管理情報（図示省略）に記録している。【０１４６】
アプリケーション６０１は、アクセラレータドライバ６１０内のオフロードコマンド完了チェック６２３を定期的に呼び出し、オフロードコマンド完了の通知を監視する。このとき、オフロードコマンド完了チェック６２３は、アクセラレータドライバ６１０内部の管理情報（図示省略）を参照し、「オフロードコマンド完了」ｏｒ「オフロードコマンド未完」をアプリケーション６０１に通知する。【０１４７】
アプリケーション６０１は、オフロードコマンド完了チェック６２３によって、「オフロードコマンド完了」の通知を受領することで、アクセラレータ１１４に発行したオフロードコマンドが完了したことを検知する。【０１４８】
上記ステップＳ７０３においてプロセッサ１１２で処理を行うと判定されたステップＳ７１４では、アプリケーション６０１が、対象データをＨＤＤ／ＳＳＤ１１５から取得する必要があるか否かを判定する。例えば、フィルタ処理の結果に基づき新たな管理情報を作成する処理であった場合、対象データをＨＤＤ／ＳＳＤ１１５から取得する必要はないため、プロセッサ１１２によるアプリケーション６０１の処理を実施した後に終了する（Ｓ７１９）。尚、プロセッサ１１２によるアプリケーション６０１の処理についての説明は省略する。【０１４９】
一方で、アプリケーション６０１は、対象データをＨＤＤ／ＳＳＤ１１５から取得する必要があると判定した場合には、ステップＳ７１５に進む。ステップＳ７１５は、アプリケーション６０１が「アクセラレータでの処理はオフロードするデータサイズが小さくて非効率」、「該当処理のオフロードにアクセラレータは非対応」、「アクセラレータの負荷が高い」、「計算機システムのアクセラレータ負荷の合計が、アプリケーション６０１の優先度による定められている閾値を超過」、「アクセラレータ内のＤＲＡＭ確保が不可」等の複数の条件からデータ処理をプロセッサ１１２で実施すると判定した場合に進むステップである。【０１５０】
アプリケーション６０１は、データ処理をプロセッサ１１２にて実施するために対象データをプロセッサ１１２に接続されたＤＲＡＭ１１１に転送する必要がある。このため、アプリケーション６０１は、オペレーティングシステム６０２が管理するＤＲＡＭ１１１の記憶領域を確保する。このとき、公知または周知のオペレーティングシステム（例えば、ＷｉｎｄｏｗｓやＬｉｎｕｘ）６０２は、確保したＤＲＡＭ１１１の記憶領域にアクセスするための仮想アドレスをアプリケーション６０１に応答する。【０１５１】
ステップＳ７１６では、アプリケーション６０１がステップＳ７１５にて確保したＤＲＡＭ１１１の記憶領域に対象データを転送するようにＨＤＤ／ＳＳＤ１１５にＩＯを発行する。アプリケーション６０１は、ＨＤＤ／ＳＳＤドライバ６１１内のＩＯＣＭＤ１発行６３１に対して、ステップＳ７１５にてオペレーティングシステム６０２から取得したＤＲＡＭ１１１の記憶領域を示す仮想アドレスと、データサイズ、処理対象データが格納されているＨＤＤ／ＳＳＤ１１５上の領域を通知する。【０１５２】
通知を受けたＩＯＣＭＤ１発行６３１は、アプリケーション６０１から受領したＤＲＡＭ１１１の記憶領域を示す仮想アドレスを複数の物理アドレスに変換してＨＤＤ／ＳＳＤ１１５に通知し、データ転送の開始を指示する。【０１５３】
ステップＳ７１７では、アプリケーション６０１が、ＨＤＤ／ＳＳＤ１１５からデータ転送の完了を取得する。ＨＤＤ／ＳＳＤドライバ６１１は、ＨＤＤ／ＳＳＤ１１５からの割り込み、またはポーリングを契機としてＨＤＤ／ＳＳＤ１１５のデータ転送完了を検知する。そしてアプリケーション６０１は、ＨＤＤ／ＳＳＤドライバ６１１内のＩＯＣＭＤ完了チェック６３３を定期的に呼び出し、ＨＤＤ／ＳＳＤドライバ６１１がＨＤＤ／ＳＳＤ１１５のデータ転送の完了を監視する。このアプリケーション６０１による定期的な監視によって、アプリケーション６０１は、ＨＤＤ／ＳＳＤ１１５のデータ転送完了を検知する。【０１５４】
ステップＳ７１８では、上記ステップＳ７１７によって、プロセッサ１１２に接続されたＤＲＡＭ１１１へ転送された対象データについて、プロセッサ１１２がデータ処理を行う。【０１５５】
以上の処理によって、アプリケーション６０１が、コマンド処理の内容やアクセラレータ１１４の負荷状況からアクセラレータ１１４の利用の要否を判定し、アクセラレータ１１４にデータ処理をオフロードするまでの各種処理の例について説明した。【０１５６】
以上のフローチャートを実施することで、アプリケーション６０１は、複数のデータ処理についてアクセラレータ１１４にオフロードが有効なもののみ選択してオフロードできる。また、アクセラレータ１１４の負荷が高い場合には、アクセラレータ１１４の利用を停止して、プロセッサ１１２での処理に切り替えることも可能となる。また、高性能が要求されるアプリケーション６０１に高い優先度を付与することで、当該アプリケーション６０１が優先的にアクセラレータ１１４を利用する事が可能となる。【０１５７】
次に、アクセラレータ１１４の処理待ち時間と、プロセッサ１１２の処理時間の算出について以下に説明する。まず、プロセッサ１１２の処理時間の算出について説明する。【０１５８】
本実施例のアプリケーション６０１は、所定の単位データ量当たりのプロセッサ１１２による処理時間を、処理内容毎に個別に管理している。アプリケーション６０１は、例えば「256ＭＢのデータに対する処理Ａの処理時間は５秒」、「256MBのデータに対する処理Ｂの処理時間は７秒」等として管理している。そして、1024MBのデータに対する処理Ｂが発生した際、アプリケーション６０１は、処理Ｂの単位データ量あたりの処理時間から、1024MB/256MB×7分=28秒として、プロセッサ１１２の処理時間を算出する。【０１５９】
次に、アクセラレータの処理待ち時間について説明する。本実施例のアプリケーション６０１は、所定の単位データ量あたりのアクセラレータ１１４による処理時間を処理内容毎に個別に管理している。【０１６０】
アプリケーション６０１は、例えば、「256ＭＢのデータに対する処理Ａの処理時間は0.3秒」、「256MBのデータに対する処理Ｂの処理時間は0.6秒」等として管理している。そして、アプリケーション６０１は、アクセラレータ管理情報８００からアクセラレータ１１４に発行済みの処理を取得する。【０１６１】
アプリケーション６０１は、例えば、「1024MBのデータに対する処理Bが5個と2048MBのデータに対する処理Aが2個」等の発行済み処理の内容を取得する。アクセラレータ１１４の処理待ち時間はこれらの処理合計時間と新たに発行する処理の和となる。上記の例であれば、1024MB/256MB×0.6秒×5個+2048MB/256MB×0.3秒×２個=12秒+4.8秒=16.8秒が、既に発行済みの処理が完了するまでの時間であり、この状態でさらに1024MBのデータに対する処理Ｂをアクセラレータ１１４に実施させる場合には、1024MB/256MB×0.6秒=2.4秒の処理が加わる。【０１６２】
上記の結果、アクセラレータ１１４の処理待ち時間は、16.8秒+2.4秒=19.2秒と算出される。アプリケーション６０１は、この算出した値を前述のプロセッサ１１２の処理時間と比較することで、プロセッサ１１２とアクセラレータ１１４のいずれで処理した方が、高速に処理可能か判断できる。【０１６３】
尚、プロセッサ１１２は、アプリケーション６０１において当該処理のみを実施するわけではないので、処理時間の比較においてプロセッサ１１２の処理時間とアクセラレータ１１４の処理待ち時間とを平等に比較するとしなくても良い。【０１６４】
例えば、アプリケーション６０１は、プロセッサ１１２の処理時間の二倍をアクセラレータ１１４の処理待ち時間を上回った場合にのみ、プロセッサ１１２にて当該処理を実施するとしてもよい。また、このプロセッサ１１２の処理時間にかける係数（先の例では２倍）は、システムの全体処理負荷に占める当該処理の割合から決定するとしても良い。【０１６５】
以上のように、本実施例によれば、データ処理を実行可能なプロセッサ１１２とアクセラレータ１１４を有する計算機システムで、処理の内容や処理時間や負荷に応じてプロセッサ１１２とアクセラレータ１１４を効率よく使い分けることが可能となる。例えば、対象データのサイズが閾値Ｔｈ１以下で小さい場合は、プロセッサ１１２でオフロードコマンドを生成し、アクセラレータ１１４にオフロードコマンドを実行させ、アクセラレータ１１４が処理結果の出力を完了するまでの処理待ち時間は、プロセッサ１１２が処理する処理時間よりも長くなる。この場合、サーバ１００では、アクセラレータ１１４にオフロードすることなく、プロセッサ１１２に処理を実行させることでデータの処理を高速に行うことができる。【０１６６】
この場合、オペレーティングシステム６０２がプロセッサ１１２に接続されたＤＲＡＭ１１１に記憶領域を確保し、ＨＤＤ／ＳＳＤ１１５から処理を行うデータを転送しておくことで、プロセッサ１１２による処理を高速に行うことができる。【０１６７】
一方、対象データのサイズが閾値Ｔｈ１を超えて大きい場合は、プロセッサ１１２で処理するよりも、アクセラレータ１１４にオフロードした方が短時間で処理が完了する。したがって、プロセッサ１１２はオフロードコマンドを生成して、オフロードコマンドをアクセラレータ１１４に実行させることで、大量のデータを高速で処理することができる。このように、処理時間（処理コスト）に応じて処理を実行させる装置（プロセッサ１１２またはアクセラレータ１１４）を切り替えることで、前記従来例に比して効率のよいデータ処理を実現することができる。【０１６８】
この場合、オペレーティングシステム６０２がアクセラレータ１１４内のＤＲＡＭ４０１に記憶領域を確保し、ＨＤＤ／ＳＳＤ１１５から処理を行うデータを転送しておくことで、アクセラレータ１１４による処理を高速に行うことができる。【０１６９】
さらに、アプリケーション６０１は、アクセラレータ１１４の負荷を算出して、負荷が相対的に低いアクセラレータ１１４に処理をオフロードする。これにより、複数のアクセラレータ１１４の負荷を平準化することが可能となる。【０１７０】
また、アプリケーション６０１は、複数のアクセラレータ１１４の負荷が全体的に高い（負荷の合計が閾値Ｔｈ２を超える）場合には、アプリケーション６０１毎に設定された優先度が閾値Ｔｈ２を超えるもののみにアクセラレータ１１４の利用を許可することで、アクセラレータ１１４の負荷が過大になるのを抑制できる。【０１７１】
また、アプリケーション６０１は、アクセラレータ１１４でＤＲＡＭ４０１の記憶領域を確保できない場合には、プロセッサ１１２で処理を実行することにより、確実なデータ処理を実現することが可能となる。【０１７２】
また、アプリケーション６０１は、アクセラレータ１１４で実行可能な処理のみをオフロードし、その他の処理をプロセッサ１１２で行うことで、アクセラレータ１１４のコストの増大を抑制することができる。【０１７３】
なお、上記実施例では、アプリケーション６０１が処理のオフロード先やオフロードの有無を判定する例を示したが、オペレーティングシステム６０２が処理のオフロード先やオフロードの有無を判定するようにしてもよい。【０１７４】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、又は置換のいずれもが、単独で、又は組み合わせても適用可能である。【０１７５】
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によってハードウェアで実現してもよい。また、上記の各構成、及び機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによってソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記録装置、または、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に置くことができる。【０１７６】
また、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。実際には殆ど全ての構成が相互に接続されていると考えてもよい。
【図１】
2017119098.tif 000003
【図２】
2017119098.tif 000004
【図３】
2017119098.tif 000005
【図４】
2017119098.tif 000006
【図５】
2017119098.tif 000007
【図６】
2017119098.tif 000008
【図７】
2017119098.tif 000009
【図８】
2017119098.tif 000010
【図９】
2017119098.tif 000011
【図１０】
2017119098.tif 000012
【国際調査報告】
2017119098.tif 000013
2017119098.tif 000014
2017119098.tif 000015