(57)【特許請求の範囲】
【請求項１】
第１の演算装置と、前記第１の演算装置の処理能力を高める第２の演算装置と、を含み、
前記第１の演算装置は、
動作時の引数として繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付ける指示入力部と、
前記繰り返し処理に関する処理とデータをそれぞれ分割し、処理分割とデータ分割を生成する分割部と、
前記指示入力部が前記繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、前記第２の演算装置にて前記データ分割ごとに前記繰り返し処理を実行させる繰り返し処理制御部と、
を備える、繰り返し処理制御システム。
【請求項２】
前記指示入力部は、
前記繰り返し処理の処理データが、前記第２の演算装置が保持するメモリの容量を超えた場合には前記繰り返し処理を処理データの分割ごとに実行し、前記第２の演算装置が保持するメモリの容量を超えない場合には前記繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける、請求項１の繰り返し処理制御システム。
【請求項３】
前記繰り返し処理制御部は、前記分割部による前記処理分割を、複数の前記第２の演算装置に分散して実行させる、請求項１又は２の繰り返し処理制御システム。
【請求項４】
前記第１の演算装置は、
前記指示入力部からの指示に応じて、前記繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する情報を含む制御情報を作成する、繰り返し処理制御情報生成部をさらに備え、  
前記繰り返し処理制御部は、前記制御情報に基づき、前記繰り返し処理を前記第２の演算装置に実行させる、請求項１乃至３のいずれか一項に記載の繰り返し処理制御システム。
【請求項５】
前記指示入力部はユーザプログラムから使用されるライブラリであって、前記ユーザプログラムの処理を示すＤＡＧ（Directed Acyclic Graph）を作成し、
前記分割部は、前記ユーザプログラムが作成したＤＡＧを受信し、前記ＤＡＧが含むデータと処理を分割し、
前記繰り返し処理制御情報生成部は、前記ユーザプログラムが作成したＤＡＧに付随する情報であって、前記指示入力部により指定された繰り返し処理の実行方法を参照することで、前記制御情報を作成し、
前記繰り返し処理制御部は、前記分割部が作成した前記処理分割と、前記制御情報に含まれる前記繰り返し処理の完了判定方法及び繰り返しにおけるデータの入れ替え方法に関する情報と、に従い前記第２の演算装置に前記繰り返し処理を実行させる、請求項４の繰り返し処理制御システム。
【請求項６】
第１の演算装置と、前記第１の演算装置の処理能力を高める第２の演算装置と、を含むシステムにおいて、
動作時の引数として繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付けるステップと、
前記繰り返し処理に関する処理とデータをそれぞれ分割し、処理分割とデータ分割を生成するステップと、
前記指示を受け付けるステップが前記繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、前記第２の演算装置にて前記データ分割ごとに前記繰り返し処理を実行させるステップと、
を含む、繰り返し処理制御方法。
【請求項７】
前記指示を受け付けるステップは、
前記繰り返し処理の処理データが、前記第２の演算装置が保持するメモリの容量を超えた場合には前記繰り返し処理を処理データの分割ごとに実行し、前記第２の演算装置が保持するメモリの容量を超えない場合には前記繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける、請求項６の繰り返し処理制御方法。
【請求項８】
前記繰り返し処理を実行させるステップは、
前記処理分割を複数の前記第２の演算装置に分散して実行させる、請求項６又は７の繰り返し処理制御方法。
【請求項９】
前記指示を受け付けるステップが受け付けた指示に応じて、前記繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する情報を含む制御情報を作成するステップをさらに含み、
前記繰り返し処理を実行させるステップは、
前記制御情報に基づき、前記繰り返し処理を前記第２の演算装置に実行させる、請求項６乃至８のいずれか一項に記載の繰り返し処理制御方法。
【請求項１０】
請求項６乃至９のいずれか一項に記載の繰り返し処理制御方法を、コンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、繰り返し処理制御システム、繰り返し処理制御方法及びプログラムに関する。特に、アクセラレータを用いた繰り返し処理制御システム、繰り返し処理制御方法及びプログラムに関する。
【背景技術】
【０００２】
繰り返し処理制御システムの一例が、非特許文献１に開示されている。図１４に示されるように、非特許文献１に開示された繰り返し処理制御システムは、クライアント９０と、タスクスケジューラ９０１を含むホスト９１と、ホスト９２−１〜９２−３と、を含んで構成される。
【０００３】
ホスト９２−１〜９２−３のそれぞれは、ｍａｐタスク９４とｒｅｄｕｃｅタスク９５を実行するタスクトラッカ９３を含んで構成される。繰り返し処理制御システムは、１つ以上の複数のホスト９２を含むことが可能である。図１４の例示では、３つのホスト９２が含まれ、各ホスト９２を区別するためにハイフン「−」と数字を組み合わせて表記している。また、以下の説明において、ホスト９２−１〜９２−３の構成及び動作が同一となる場合には、ホスト９２−１について説明し、ホスト９２−２、９２−３に関する説明を省略する。
【０００４】
クライアント９０は、ホスト９１のタスクスケジューラ９０１に繰り返し処理の実行を要求する。タスクスケジューラ９０１は、繰り返し処理の個別の周回の処理をホスト９２−１〜ホスト９２−３に分散させ実行させる。タスクスケジューラ９０１による分散は、繰り返し処理を要求したクライアント９０には透過に行われる。ホスト９２−１は、分散された処理の要求を受信する。
【０００５】
ホスト９２−１の内部では、タスクトラッカ９３−１が、ｍａｐタスク９４−１とｒｅｄｕｃｅタスク９５−１の２つのタスクを実行することにより上記要求された処理（分散された処理）を実行する。なお、ｍａｐタスクは、処理データが含む各要素に対して独立に行う並列化可能な処理である。一方、ｒｅｄｕｃｅタスクは、ｍａｐタスクの出力をホスト９２−１〜ホスト９２−３間で交換してから行う処理であり、タスクスケジューラ９０１が制御する繰り返し処理の終了を判断する判定を与える。タスクスケジューラ９０１は、繰り返し処理の個別の周回の結果として受信する繰り返し処理の判定を参照し、繰り返し処理が継続の判定であれば次の周回の処理に進む。タスクスケジューラ９０１は、繰り返し処理が終了の判定であれば繰り返し処理を完了する。
【０００６】
また、非特許文献１に開示された繰り返し処理制御システムでは、ホストから他のホストに繰り返し処理の実行が依頼されているが、１つの装置（ホスト）の中で当該繰り返し処理制御システムが構築されることがある。具体的には、ホストに含まれるＣＰＵ（Central Processing Unit；演算装置）とアクセラレータ（コプロセッサとも称される）とにより繰り返し処理制御システムが構築されることもある。
【先行技術文献】
【非特許文献】
【０００７】
【非特許文献１】Y. Bu、 B. Howe、 M. Balazinska、 and M. D. Ernst、 “HaLoop: efficient iterative data processing on large clusters” VLDB Endowment、 vol. 3、 Issue 1-2、 Sep. 2010.
【発明の概要】
【発明が解決しようとする課題】
【０００８】
なお、上記先行技術文献の開示を、本書に引用をもって繰り込むものとする。以下の分析は、本発明者らによってなされたものである。
【０００９】
上述のように、アクセラレータを用いた繰り返し処理制御システムが構築されることがあるが、その場合、処理データが繰り返し処理を行うアクセラレータのメモリを超えるＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合（メモリに乗らないデータを処理する場合）、繰り返し処理が高速に行えない問題が生じる可能性がある。その理由は、繰り返し処理の個別の周回において、処理データをアクセラレータに入れ替えて処理を行うため、アクセラレータに対するデータの入出力（Ｉ／Ｏ；Input/Output）のための時間が処理性能のボトルネックとなるためである。
【００１０】
本発明は、処理データが繰り返し処理を行うアクセラレータのメモリを超えるＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合に、繰り返し処理を高速に行うことに寄与する、繰り返し処理制御システム、繰り返し処理制御方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
本発明の第１の視点によれば、第１の演算装置と、前記第１の演算装置の処理能力を高める第２の演算装置と、を含み、前記第１の演算装置は、動作時の引数として繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付ける指示入力部と、前記繰り返し処理に関する処理とデータをそれぞれ分割し、処理分割とデータ分割を生成する分割部と、前記指示入力部が前記繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、前記第２の演算装置にて前記データ分割ごとに前記繰り返し処理を実行させる繰り返し処理制御部と、を備える、繰り返し処理制御システムが提供される。
【００１２】
本発明の第２の視点によれば、第１の演算装置と、前記第１の演算装置の処理能力を高める第２の演算装置と、を含むシステムにおいて、動作時の引数として繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付けるステップと、前記繰り返し処理に関する処理とデータをそれぞれ分割し、処理分割とデータ分割を生成するステップと、前記指示を受け付けるステップが前記繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、前記第２の演算装置にて前記データ分割ごとに前記繰り返し処理を実行させるステップと、を含む、繰り返し処理制御方法が提供される。
【００１３】
本発明の第３の視点によれば、上記繰り返し処理制御方法を、コンピュータに実行させるプログラムが提供される。
なお、このプログラムは、コンピュータが読み取り可能な記憶媒体に記録することができる。記憶媒体は、半導体メモリ、ハードディスク、磁気記録媒体、光記録媒体等の非トランジェント（non-transient）なものとすることができる。本発明は、コンピュータプログラム製品として具現することも可能である。
【発明の効果】
【００１４】
本発明の各視点によれば、処理データが繰り返し処理を行うアクセラレータのメモリを超えるＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合に、繰り返し処理を高速に行うことに寄与する、繰り返し処理制御システム、繰り返し処理制御方法及びプログラムが、提供される。
【図面の簡単な説明】
【００１５】
【図１】一実施形態の概要を説明するための図である。
【図２】第１の実施形態に係る繰り返し制御システムの構成の一例を示す図である。
【図３】第１の実施形態に係るホストにて実現される処理モジュールの一例を示す図である。
【図４】データ処理ＡＰＩの一例を示す図である。
【図５】２種類のＡＰＩを用いて作成されたユーザプログラムの処理を示すＤＡＧの一例を示す図である。
【図６】繰り返し処理ＡＰＩの一例を示す図である。
【図７】第１の実施形態に係るアクセラレータ制御部によるデータ分割及び処理分割を説明するための図である。
【図８】メモリ管理テーブルの一例を示す図である。
【図９】データ管理テーブルの一例を示す図である。
【図１０】分割繰り返し実行プランに対応するＤＡＧの一例を示す図である。
【図１１】非分割繰り返し実行プランに対応するＤＡＧの一例を示す図である。
【図１２】第１の実施形態に係る繰り返し処理生成部が、繰り返し処理を含むＤＡＧの繰り返し処理部分の実行方法を決定し、制御情報を生成する動作の一例を示すフローチャートである。
【図１３】第１の実施形態に係るスケジューラが、繰り返し処理生成部が作成した繰り返し処理の実行プランの制御情報に基づいて繰り返し処理を制御する動作の一例を示すフローチャートである。
【図１４】繰り返し処理制御システムの一例を示す図である。
【発明を実施するための形態】
【００１６】
初めに、一実施形態の概要について説明する。なお、この概要に付記した図面参照符号は、理解を助けるための一例として各要素に便宜上付記したものであり、この概要の記載はなんらの限定を意図するものではない。
【００１７】
一実施形態に係る繰り返し処理制御システムは、第１の演算装置１０１と、第１の演算装置１０１の処理能力を高める第２の演算装置１０２と、を含む。第１の演算装置１０１は、指示入力部１１１と、分割部１１２と、繰り返し処理制御部１１３と、を備える。指示入力部１１１は、繰り返し処理を処理データの分割ごとに実行するか、又は、繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付ける。分割部１１２は、繰り返し処理に関する処理とデータをそれぞれ分割し、処理分割とデータ分割を生成する。繰り返し処理制御部１１３は、指示入力部１１１が繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、第２の演算装置１０２にてデータ分割ごとに繰り返し処理を実行させる。
【００１８】
繰り返し制御システムは、指示入力部１１１という、繰り返し処理を処理データの分割ごとに実行するか、繰り返し処理を処理データの全体に対して実行するかというインターフェイスを提供する。そのため、例えば、処理データがアクセラレータのメモリの和より大きいＯｕｔ−ｏｆ−Ｃｏｒｅとなり、データの移動が必要になることが想定される場合には、ユーザプログラムは、繰り返し処理の実行を分割データごとに実行するように指示することが可能となる。その結果、Ｏｕｔ−ｏｆ−Ｃｏｒｅの繰り返し処理においてデータ分割ごとに繰り返し処理を実行することで、各周回における処理データのアクセラレータに対する入れ替えのためのデータの入出力が回避され、高速に繰り返し処理を実行することができる。
【００１９】
以下に具体的な実施の形態について、図面を参照してさらに詳しく説明する。なお、各実施形態において同一構成要素には同一の符号を付し、その説明を省略する。
【００２０】
［第１の実施形態］
第１の実施形態について、図面を用いてより詳細に説明する。
【００２１】
図２は、第１の実施形態に係る繰り返し制御システムの構成の一例を示す図である。図２を参照すると、繰り返し制御システムは、ＣＰＵ１０と、メインメモリ１１と、アクセラレータ２０−１〜２０−３と、を含んで構成される。第１の実施形態に含まれるアクセラレータの数は、便宜上、３個とするが、アクセラレータの数を限定する趣旨ではない。アクセラレータは１つ以上存在すればよい。
【００２２】
なお、以降の説明において、アクセラレータ２０−１〜２０−３に繰り返し処理の実行を要求する側のハードウェアをホスト１と表記する。さらに、各構成要素がハイフォン（-）に区切られた符号にて表記されている場合には、ハイフォンの左側の数字により各構成要素を代表するものとする。例えば、アクセラレータ２０−１〜２０−３を区別する特段の理由がない場合には、「アクセラレータ２０」と表記する。
【００２３】
図２に示す繰り返し制御システムにおいて、ホスト１は、アクセラレータ２０−１〜２０−３のそれぞれに接続されている。
【００２４】
ＣＰＵ１０は、後述する各処理モジュール、プログラムを実現するための計算手段（演算装置）である。ＣＰＵ１０は、上述の第１の演算装置１０１に相当する。
【００２５】
メインメモリ１１は、ＣＰＵ１０がプログラムの実行に使用するメモリであると共に、アクセラレータ２０がリソース（メモリリソース）の不足により保持できなくなったデータを退避するためにも用いられる。
【００２６】
アクセラレータ２０は、コンピュータのＩ／Ｏスロットに挿入する等の形態で実装されるＣＰＵ１０のコプロセッサ（co-processor）である。各アクセラレータ２０は、データの処理を行うプロセッサ２１と、データを格納するアクセラレータメモリ２２と、を含む。アクセラレータ２０は、ＣＰＵ１０の処理能力を高める計算手段（演算装置）として使用される。アクセラレータ２０は、上述の第２の演算装置１０２に相当する。なお、以降の説明では、各アクセラレータ２０間に機能的な相違点は存在しないので、アクセラレータ２０−１を主に例にとり説明する。
【００２７】
図３は、ホスト１にて実現される処理モジュールの一例を示す図である。図３を参照すると、ホスト１において、ユーザプログラム３０と、ユーザライブラリ４０と、アクセラレータ制御部５０と、が処理モジュールとして実現される。
【００２８】
ユーザプログラム３０は、繰り返し処理を行うモジュール（手段）である。
【００２９】
ユーザライブラリ４０は、ユーザプログラム３０の処理を示す有向非巡回グラフ（ＤＡＧ；Directed Acyclic Graph）を作成し、アクセラレータ制御部５０に送信するためのアプリケーションプログラミングインタフェース（ＡＰＩ；Application Programming Interface）をユーザプログラム３０に提供する。ユーザライブラリ４０は、上述の指示入力部１１１に相当する。
【００３０】
ユーザライブラリ４０は、上記ユーザプログラム３０の処理を示すＤＡＧを作成するためのＡＰＩを提供するデータ処理ＡＰＩ４１と、ＤＡＧを拡張し繰り返し処理を示す拡張ＤＡＧを作成するためのＡＰＩを提供する繰り返し処理ＡＰＩ４２と、を含む。以下の説明では、繰り返し処理を含むように拡張したＤＡＧも単にＤＡＧと表記する。
【００３１】
アクセラレータ制御部５０は、アクセラレータ２０を制御する手段である。アクセラレータ制御部５０の詳細は後述する。
【００３２】
図４は、データ処理ＡＰＩ４１の一例を示す図である。図４に示すように、データ処理ＡＰＩ４１は、予約ＡＰＩ及び実行ＡＰＩの２種類を含む。
【００３３】
図５は、当該２種類のＡＰＩを用いて作成されたユーザプログラムの処理を示すＤＡＧの一例を示す図である。但し、図５において、スイッチ判定処理４０１やスイッチ処理４０２は、後述する繰り返し処理ＡＰＩ４２に対応する。
【００３４】
図５を参照すると、予約ＡＰＩはＤＡＧの処理の１つに対応する。予約ＡＰＩがユーザプログラム３０から呼び出されると、ＤＡＧに１つの処理と当該処理が生成するデータが作成される。例えば、図５において、データ２０１に対し予約ＡＰＩを用いて、処理３０１が呼ばれた場合、ＤＡＧに処理３０１及びその出力データであるデータ２０２が付加される。なお、予約ＡＰＩは処理を予約するためのＡＰＩであり、呼び出された直後にアクセラレータ２０にて処理が実行されるわけではない。予約ＡＰＩの呼び出しにより、ＤＡＧが生成されるだけである。
【００３５】
一方、実行ＡＰＩは、ＤＡＧに新たな処理とその処理により生成されるデータが付加される場合とされない場合があるが、それまでに生成されたＤＡＧの処理の実行をトリガする（処理を起動する）ＡＰＩである。実行ＡＰＩに属する処理は、ユーザプログラム３０内でＤＡＧが処理された後のデータが必要となる場合や、計算結果のデータをアクセラレータ２０上のアクセラレータメモリ２２にデータオブジェクトとして保持するｓｔｏｒｅＯｂｊｅｃｔを実行する場合等である。
【００３６】
ここで、予約ＡＰＩや実行ＡＰＩは、図４にてα、βとして示される１つあるいは複数の引数を持つ場合がある。この引数の１つは、カーネル関数と称される、ユーザプログラム３０がデータに対し実行する処理を示す関数である場合がある。予約ＡＰＩや実行ＡＰＩが、関数を必要とするかどうかはＡＰＩの種類に依存する。
【００３７】
予約ＡＰＩや実行ＡＰＩはデータに対し行われる処理のパターンを示し、実際の具体的な処理はユーザプログラム内で予約ＡＰＩと実行ＡＰＩの引数として与えられるカーネル関数により行われる。
【００３８】
パターンの一例はｍａｐである。ｍａｐでは入力データを構成する全ての要素に対しカーネル関数を適用する。ＤＡＧの入力データの典型例は画像やデータベースのテーブルである。これらのデータにｍａｐが適用された場合、カーネル関数が画像の各画素や、データベースの各エントリに個別に適用される。
【００３９】
また、カーネル関数を必要としないＡＰＩの代表例はｓｔｏｒｅＯｂｊｅｃｔやｏｕｔｐｕｔＦｉｌｅである。ｓｔｏｒｅＯｂｊｅｃｔは、計算結果をアクセラレータ２０上のアクセラレータメモリ２２にデータオブジェクトとして保持するＡＰＩである。ｏｕｔｐｕｔＦｉｌｅは、計算結果をホスト１のファイルシステムのファイルとして格納するＡＰＩである。
【００４０】
以上のようにして、ユーザプログラム３０が、予約ＡＰＩと実行ＡＰＩを呼び出すたびに、上記ユーザライブラリ４０を呼び出すユーザプログラム３０の内部でＤＡＧが生成される。つまり、予約ＡＰＩが呼ばれた場合には、対応する処理と出力データがＤＡＧに付加される。一方、実行ＡＰＩが呼ばれた場合には、処理と出力データの追加が必要であればそれらが行われ、ユーザライブラリ４０が、ユーザプログラム３０からアクセラレータ制御部５０に、それまでに生成したＤＡＧを通知する。なお、作成されたＤＡＧは、ユーザプログラム３０が呼び出した予約ＡＰＩや実行ＡＰＩの種類、各ＡＰＩに与えられたカーネル関数を含むものである。
【００４１】
次に、繰り返し処理ＡＰＩ４２について説明する。
【００４２】
図６は、繰り返し処理ＡＰＩの一例を示す図である。図６に示す、ｓｔａｒｔＩｔｅｒａｔｉｏｎとｅｎｄＩｔｅｒａｔｉｏｎは、繰り返し処理の区間を示すＡＰＩである。ユーザプログラム３０の内部でこれらのＡＰＩが呼び出された間の区間が、繰り返し処理の対象区間である。ｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩは、その引数としてｍｏｄｅとｍａｘＩｔｅｒａｔｉｏｎを有する。
【００４３】
ｍｏｄｅは繰り返し処理の動作モードを示す。後述するようにＤＡＧ内のデータと処理は、それぞれデータ分割と処理分割に分割されて複数のアクセラレータ２０−１〜２０−３に分散して実行可能である。また、全ての処理データがアクセラレータ２０のアクセラレータメモリ２２に収容できないＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合、分割されたデータをアクセラレータ２０のアクセラレータメモリ２２とメインメモリ１１の間で入れ替えて処理を行う。当該入れ替え処理に関し、他のアクセラレータ２０−２、２０−３についても同じである。
【００４４】
ｍｏｄｅに係る引数は、これらの分散処理に関して３つの動作モードを定義する。
（１）第１の動作モードは、分割モードであり、データ分割毎に繰り返し処理を行うモードである。
（２）第２の動作モードは、Ｏｕｔ−ｏｆ−Ｃｏｒｅ分割モードであり、処理データがアクセラレータ２０のアクセラレータメモリ２２に収容できないＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合にデータ分割ごとの繰り返し処理を実行し、Ｏｕｔ−ｏｆ−Ｃｏｒｅとならない場合には処理データ全体に対し繰り返し処理を行うモードである。
（３）第３の動作モードは、非分割モードであり処理データ全体に対し繰り返し処理を行うモードである。
【００４５】
繰り返し処理ＡＰＩ４２を呼び出すユーザプログラム３０は、当該プログラムが処理するデータの内容や、プログラムが実現する機能等に応じて、適切な動作モードを選択し、ｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩの引数（ｍｏｄｅ）を定め、決定する。つまり、プログラマは、プログラムの仕様を考慮して適切な動作モードを選択し、ｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩの引数を決定する。
【００４６】
ここで、分割モードやＯｕｔ−ｏｆ−Ｃｏｒｅ分割モードを指定する繰り返し処理には様々な種類があるが、アルゴリズムの一例として、画像におけるエッジ検出のように個別のデータ分割ごとに収束判定を行い、結果のデータ分割を合わせて最終結果を得る場合と、全体のデータで収束判定を行って結果を求める場合と、２つの場合において処理結果が同じ処理が挙げられる。
【００４７】
また別の一例として、エラー値が一定以内に収まると繰り返し処理を完了するアルゴリズムが、分割モードやＯｕｔ−ｏｆ−Ｃｏｒｅ分割モードを指定する繰り返し処理として例示される。この場合、個別のデータ分割に対する繰り返し処理を行い、その結果を合わせて全体の結果を求める場合と、処理データ全体で繰り返し処理を行い求める結果の差が小さく実用上は同じ場合に、本来処理データ全体に行うべき繰り返し処理をデータ分割ごとに行うことができる。
【００４８】
ｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩは、別の引数としてｍａｘＩｔｅｒａｔｉｏｎを指定できる。当該引数は、繰り返し処理における最大繰り返し回数を示す。
【００４９】
上記説明したように、繰り返し処理ＡＰＩ４２は、ユーザプログラム３０から使用されるライブラリに含まれ、ユーザプログラム３０の処理を示すＤＡＧを作成する。その際、繰り返し処理ＡＰＩ４２は、繰り返し処理を処理データの分割ごとに実行するか、又は、繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付ける。さらに、繰り返し処理ＡＰＩ４２は、繰り返し処理の処理データが、アクセラレータ２０が保持するメモリの容量を超えた場合には繰り返し処理を処理データの分割ごとに実行し、アクセラレータ２０が保持するメモリの利用可能な容量を超えない場合には繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける。
【００５０】
図６に示す、ｂｒｅａｋは繰り返し処理の収束条件を示すＡＰＩである。ｂｒｅａｋで指定された収束条件が満たされると繰り返し処理を終了し、繰り返し終了後の処理に移行する。ｂｒｅａｋに係るＡＰＩは、引数としてｖａｌ及びｃｏｎｄｉｔｉｏｎを含む。ｂｒｅａｋに係るＡＰＩは判定するデータに対し呼び出され、ｖａｌは条件の比較値、ｃｏｎｄｉｔｉｏｎはその比較条件である。例えば、ｖａｌが０、ｃｏｎｄｉｔｉｏｎがＥＱＵＡＬの場合、判定するデータが０と等しいことが繰り返し処理の収束条件となる。また、ｂｒｅａｋに係るＡＰＩは、判定に用いるデータを判定前に加工するカーネル関数を引数としてさらに指定することも可能である。
【００５１】
図６に示すｓｗａｐＡｔＩｔｅｒａｔｉｏｎに係るＡＰＩは、繰り返し処理時にデータを入れ替えるＡＰＩである。当該ＡＰＩは、引数として入れ替え先のデータを指定可能である。
【００５２】
図５を参照すると、ＤＡＧを作成するユーザプログラム３０の内部では、処理３０２を呼び出す前にｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩが呼び出される。なお、図５に例示する処理３０２と処理３０３は、データ処理ＡＰＩ４１の予約ＡＰＩの呼び出しにより作成される。
【００５３】
スイッチ判定処理４０１は、ｂｒｅａｋに係るＡＰＩの呼び出しにより作成される。データ２０５は、ｂｒｅａｋに係るＡＰＩが出力した判定結果を示すフラグである。データ２０５により示されるフラグが、ＴＲＵＥ（真）であれば繰り返し処理の収束を示し、ＦＡＬＳＥ（偽）であれば繰り返し処理の継続を示す。
【００５４】
なお、Ｂｒｅａｋに係るＡＰＩは、データ２０４を処理するためのカーネル関数を引数としてもよい。例えば、データ２０４が複数の要素から構成される場合、それらの和を取るカーネル関数が与えられ、データ２０５のフラグの判定は、データ２０４の各要素の和がｂｒｅａｋに与えられた判定条件と合致するか否かを示すフラグであっても良い。例えば、「各要素の和が１０に等しい」等が挙げられる（前述のｂｒｅａｋの引数のｖａｌが１０、ｃｏｎｄｉｔｉｏｎがＥＱＵＡＬに相当）。
【００５５】
スイッチ処理４０２は、ｓｗａｐＡｔＩｔｅｒａｔｉｏｎに係るＡＰＩにより作成される。図５に示す例示では、スイッチ処理４０２は、データ２０５がＦＡＬＳＥの場合、データ２０２をデータ２０４に入れ替える（置き替える）。これにより繰り返し処理の次の周回は、処理３０２から開始される。一方、スイッチ処理４０２は、データ２０５がＴＲＵＥの場合、データ２０４をデータ２０６として出力する。
【００５６】
ユーザプログラム３０ではｓｗａｐＡｔＩｔｅｒａｔｉｏｎに係るＡＰＩの後にｅｎｄＩｔｅｒａｔｉｏｎに係るＡＰＩが呼ばれ、繰り返し処理の区切り箇所が判定される。ｅｎｄＩｔｅｒａｔｉｏｎに係るＡＰＩまでに記述されているＤＡＧの処理は、繰り返し処理の各周回で実行される。
【００５７】
ユーザプログラム３０は、アクセラレータ２０を用いるプログラマが作成するアプリケーションプログラムである。ユーザプログラム３０は、ユーザライブラリ４０のデータ処理ＡＰＩ４１が提供する予約ＡＰＩ及び実行ＡＰＩと、繰り返し処理ＡＰＩ４２と、を用いて実装される。
【００５８】
アクセラレータ制御部５０は、ユーザプログラム３０の処理を示すＤＡＧを受信し、当該ＤＡＧが含むデータと処理を分割し、当該分割されたデータと処理を複数のアクセラレータ２０に分散して実行する（実行させる）。なお、以降の説明において、ＤＡＧに含まれるデータを分割すること又は分割されたデータを、データ分割と表記し、ＤＡＧに含まれる処理を分割すること又は分割された処理を、処理分割と表記する。
【００５９】
図７は、アクセラレータ制御部５０によるデータ分割及び処理分割を説明するための図である。図７を参照すると、図５のＤＡＧに含まれるデータ２０１と、処理３０１と、データ２０２のそれぞれにおいて、データと処理を２分割する場合が、例示されている。この場合、処理３０１をデータ２０１のデータ分割２１１−１及びデータ分割２１１−２の双方に適用すれば、データ２０１を分割しない場合の処理と同じ結果が得られる。上記処理は、並列計算ではデータパラレルという処理形態に属し、当該分野の技術者であれば通常知る技術である。つまり、第１の実施形態に係る繰り返し処理制御システムが対象とするデータ及び処理は、上記データパラレル（並列計算）に適するデータ及び処理である。また、計算処理の分野の技術者であれば、データパラレルに適したデータをどのように分割するかに関しても、通常知る技術である。
【００６０】
なお、図７において、データ分割２１１−１に対する処理を処理分割３１１−１、データ分割２１１−２に対する処理を処理分割３１１−２と表記しているが、実際の処理内容は図５に示す処理３０１と同じである。また、図７の例では、分割数を「２」としているが、分割数を限定する趣旨ではない。さらに、これらの分割は複数のアクセラレータで分散して処理しても良いし、ホスト１が１つのアクセラレータに限り接続されている場合には各分割を１つのアクセラレータで順に処理しても良い。
【００６１】
図３に説明を戻すと、アクセラレータ制御部５０は、ＤＡＧ解析部５１と、繰り返し処理生成部５２と、スケジューラ５３と、タスク実行部５４と、データ移動部５５と、データ管理部５６と、データ管理テーブル５７と、メモリ管理部５８と、メモリ管理テーブル５９と、を含んで構成される。
【００６２】
ＤＡＧ解析部５１は、ユーザプログラム３０が呼び出したユーザライブラリ４０から受信したＤＡＧ（ユーザプログラム３０の処理を示すＤＡＧ）を解析し、当該受信したＤＡＧが含むデータと処理をデータ分割と処理分割に分割し、それらの分割を管理するエントリを作成する手段である。例えば、ＤＡＧ解析部５１は、対象となる処理データが画像である場合には、当該画像を予め定めたサイズの小画像に分割する。より具体的には、処理の対象となる画像のサイズが１００×１００ピクセルのサイズを有する場合、当該画像を１０分割（例えば、小画像のサイズは１０×１００ピクセル）し、１０個の小画像（データ分割）を作成する。あるいは、ＤＡＧ解析部５１は、処理データがデータベースに係るデータである場合には、全エントリを対象として分割する。例えば、データベースに格納されたエントリ数が１００であれば、当該全エントリを１０分割し、１０個のデータ分割を作成する。なお、上記２つの具体例における分割数１０は例示であって、分割数を限定する趣旨ではないことは勿論である。ＤＡＧ解析部５１は、上述の分割部１１２に相当する。
【００６３】
繰り返し処理生成部５２は、ＤＡＧに含まれる繰り返し処理を管理するエントリを作成する手段である。
【００６４】
スケジューラ５３は、ＤＡＧ解析部５１から実行すべき処理分割を受信し、各処理分割を処理するアクセラレータ２０−１〜２０−３の決定と、各アクセラレータ２０が実行する処理分割の順序を決定する手段である。スケジューラ５３は、上述の繰り返し処理制御部１１３に相当する。スケジューラ５３は、後述のように、繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、アクセラレータ２０にてデータ分割ごとに繰り返し処理を実行させる。また、その際、スケジューラ５３は、分割された処理（処理分割）を、複数のアクセラレータ２０に分散して実行させることもある。
【００６５】
タスク実行部５４は、アクセラレータ２０に処理分割を実行させる手段（分割された処理を実行させる手段）である。
【００６６】
データ移動部５５は、処理分割の実行に必要なデータ分割のアクセラレータ２０への準備や出力処理分割のメモリの確保を行う手段である。
【００６７】
データ管理部５６は、データ分割を管理する手段である。データ管理部５６は、データ分割を管理するためにデータ管理テーブル５７を使用する。
【００６８】
メモリ管理部５８は、アクセラレータ２０のアクセラレータメモリ２２を管理する手段である。メモリ管理部５８は、当該メモリを管理するためにメモリ管理テーブル５９を使用する。つまり、メモリ管理テーブル５９は、アクセラレータ２０のアクセラレータメモリ２２を管理するためのテーブルとして用いられる。
【００６９】
ここで、アクセラレータ２０のアクセラレータメモリ２２は一定サイズのページに分割して管理される。ページサイズは、例えば、４ＫＢｙｔｅや６４ＫＢｙｔｅである。メモリ管理テーブル５９は、図８に示すように各ページに関する情報を保持する。図８を参照すると、アクセラレータメモリ２２の各ページの情報は、アクセラレータフィールド、ページ番号フィールド、使用中フラグフィールド、使用データフィールド、データ分割番号フィールド及びロックフラグフィールドにより管理される。
【００７０】
アクセラレータフィールドには、各ページが属するアクセラレータ２０を特定する情報が格納される。ページ番号フィールドには、管理対象のページを特定する情報が格納される。使用中フラグフィールドには、ページが使用中であることを示すフラグが格納される。使用データフィールドには、ページが使用中である場合、ページが保持するデータの識別子が格納される。データ分割番号フィールドには、ページが保持するデータはデータのどの分割かを示す情報が格納される。ロックフラグフィールドには、ページが計算に使用中であり解放することが禁止であることを示すフラグが格納される。なお、使用中フラグとロックフラグはブール値である。
【００７１】
また、データの識別子（使用データフィールドの値）は、ＤＡＧのデータに割り当てられる（ＤＡＧのデータに対応する）。例えば、図８に示すメモリ管理テーブル５９の最初のエントリは、アクセラレータ２０−１のページ１は、データ２０２の分割１によって使用され、当該ページは現在計算に使用されているためロック中であることを示す。ロック中のページが保持するデータは、メインメモリ１１に退避することができないものとして扱われる。
【００７２】
メモリ管理部５８は、データ移動部５５からの要求によりアクセラレータ２０におけるアクセラレータメモリ２２の確保や解放の登録をメモリ管理テーブル５９に対して行う。データ移動部５５がメモリを確保する場合には、メモリ管理部５８は、使用中フラグをアサートし、メモリを使用する使用データやデータ分割番号をメモリ管理テーブル５９に登録する。また、スケジューラ５３の要請により、実行中の処理分割に関わるデータ分割のロックがアサートされる。
【００７３】
データ管理テーブル５７は、アクセラレータ２０のアクセラレータメモリ２２が保持するデータ分割を管理するために用いられるテーブルである。データ管理テーブル５７は、図９に示すようにユーザプログラム３０から送信されたＤＡＧ内のデータを分割したデータ分割に関する情報を保持する。図９を参照すると、各データ分割の情報は、データ分割が属するデータ番号、分割番号、そのデータが計算済みかを示す計算済みフラグ、そのデータを保持するデバイスを示すデバイス、データを保持するアクセラレータ２０やメインメモリ１１のページ番号の各種情報を保持するフィールドにより管理される。なお、計算済みフラグはブール値である。
【００７４】
例えば、図９に示すデータ管理テーブル５７の最初のエントリは、データ２０２の分割１は既に計算済みであり、アクセラレータ２０−１のページ１に保持されていることを示す。データ管理テーブル５７を用いることで、当該テーブルのエントリが保持するデバイスとページ番号により、メモリ管理テーブル５９の該当エントリを参照し、各データが使用するページの情報を検索したり、計算に使用する場合にページをロックしたりすることができる。
【００７５】
データ管理部５６は、データ管理テーブル５７の管理を行う。具体的には、データ管理部５６は、ＤＡＧ解析部５１からデータ分割の新規登録の要求を受信し、当該要求をデータ管理テーブル５７に登録する。また、データ移動部５５からの依頼により、データ管理部５６は、各データ分割を含むデバイスとページ番号をデータ管理テーブル５７に登録する。さらに、スケジューラ５３からの依頼を受け、データ管理部５６は、計算が完了したデータ分割の計算済みフラグをアサートする。
【００７６】
ＤＡＧ解析部５１は、ユーザプログラム３０から受信したＤＡＧを解析し、当該ＤＡＧが含むデータをデータ分割に分割し、当該ＤＡＧが含む処理を処理分割に分割する。その際、ＤＡＧ解析部５１は、ＤＡＧ内のデータを分割したデータ分割のエントリに関する、データ管理テーブル５７への登録をデータ管理部５６に依頼する。このようなエントリは、データ分割の数に相当する個数が作成される。なお、データのエントリ作成時点では、未だ各データ分割の計算が行われていないため計算済みフラグは「０」となる。
【００７７】
ただし、ＤＡＧの入力データとしてユーザプログラム３０の今回より前のＤＡＧが出力したデータや、ユーザプログラム３０とは別のユーザプログラムが以前に作成し、アクセラレータ２０上のアクセラレータメモリ２２に保持されたデータ分割はエントリが既に存在しているため新たに作成する必要はなく、且つ、それらの計算済みフラグはセットされている。
【００７８】
また、ＤＡＧ解析部５１は、ＤＡＧの処理を処理分割に分割し、処理分割の実行をアクセラレータ制御部５０の内部で管理するためのエントリを作成する。さらに、ＤＡＧ解析部５１は、ＤＡＧが繰り返し処理を含む場合に、当該繰り返し処理の実行方法の決定を、繰り返し処理生成部５２に依頼する。
【００７９】
また、ＤＡＧ解析部５１は、作成した処理分割のエントリと繰り返し処理生成部５２が作成した繰り返し処理制御のエントリの実行をスケジューラ５３に要求する。さらに、ＤＡＧ解析部５１は、ユーザプログラム３０の完了通知を受信し、ユーザプログラム３０がＤＡＧの実行により生成したデータのうち、プログラムの完了を超えて保持されるデータオブジェクト以外のデータ分割のエントリをデータ管理テーブル５７から消去するようデータ管理部５６に要求する（不要なデータ分割の消去を依頼する）。また、ＤＡＧ解析部５１は、消去したエントリが使用していたページを解放するようにメモリ管理部５８に要求する。
【００８０】
繰り返し処理生成部５２は、ＤＡＧの繰り返し処理の実行方法を決定する。繰り返し処理生成部５２は、ＤＡＧ解析部５１から渡された繰り返し処理において繰り返し処理ＡＰＩ４２のｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩの引数で指定された動作モードを確認し、繰り返し処理の実行方法を決定する。さらに、繰り返し処理生成部５２は、繰り返し処理の実行を制御する制御情報を作成する。具体的には、繰り返し処理生成部５２は、繰り返し処理ＡＰＩ４２が生成したＤＡＧ（即ち、繰り返し処理ＡＰＩ４２からの指示）に応じて、繰り返し処理を処理データの分割ごとに実行するか、又は、繰り返し処理を処理データの全体に対して実行するか、に関する情報（以下、実行プランと表記する）を含む制御情報を作成する。つまり、繰り返し処理生成部５２は、ユーザプログラム３０が作成したＤＡＧに付随する情報（ｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩの引数であるｍｏｄｅ）により指定された繰り返し処理の実行方法（３つのモードのうちいずれか）を参照することで、制御情報を作成する。
【００８１】
実行プランは、繰り返し処理生成部５２が決定した繰り返し処理に関する実行方法である。例えば、動作モードが分割モードの場合、繰り返し処理生成部５２は、データ分割ごとの繰り返し処理を行う分割繰り返し実行プランを作成する。より具体的には、ユーザプログラム３０が作成したＤＡＧが図５である場合、繰り返し処理生成部５２は、図１０に示す入力されたデータ分割（入力データ分割）ごとの繰り返し処理を作成する。なお、ここでは、データ分割の数が「２」である場合を示すが、データ分割の数を限定する趣旨ではない。
【００８２】
繰り返し処理生成部５２は、アクセラレータ制御部５０で実行を制御するためのスイッチ判定処理とスイッチ処理のエントリをデータ分割毎に作成する。より具体的には、繰り返し処理生成部５２は、繰り返し処理の完了判定方法及び繰り返しにおけるデータの入れ替え方法に関する情報を上述の制御情報に含ませ、スケジューラ５３に対し、アクセラレータ２０に繰り返し処理を実行させることを指示する。
【００８３】
また、動作モードがＯｕｔ−ｏｆ−Ｃｏｒｅ分割モードである場合、繰り返し処理生成部５２は、処理データのサイズとアクセラレータ２０が保持するアクセラレータメモリ２２のメモリ容量に基づき、実行プランを作成する。例えば、繰り返し処理が含む処理データの和が繰り返し処理を実行するアクセラレータ２０が保持するアクセラレータメモリ２２の和を超えなければ、繰り返し処理生成部５２は、処理データ全体に対して繰り返し処理を行う非分割繰り返し実行プランを作成する。図５の例示においては、データ２０１〜２０６のデータサイズの合計が、繰り返し処理を実行しようとするアクセラレータ２０におけるアクセラレータメモリ２２のメモリ容量よりも小さい場合には、繰り返し処理生成部５２は、非分割繰り返し実行プランを作成する。なお、分割・非分割の実行プラン決定の際には、アクセラレータ２０におけるアクセラレータメモリ２２のサイズ自体（メモリ容量）を用いることができる。即ち、アクセラレータ２０のアクセラレータメモリ２２の空き容量を判断に用いるのではない。その理由は、１回目の繰り返し処理において他のデータは全てスワップアウトすることも可能だからである。例えば、繰り返し処理の回数が１００である場合に、当該１００回周回の際に、処理に関するデータが全てアクセラレータ２０のアクセラレータメモリ２２に載せられるか否かが判断基準となる。
【００８４】
上記の例示において、分割・非分割の実行プランの判断にデータ２０１〜２０６のデータサイズの合計を用いることの前提は、繰り返し処理の各周回時に処理が終わったデータを消去しないことである。換言すれば、繰り返し処理の各周回時に処理が終わったデータを消去するのであれば、データ２０１〜２０６のデータサイズの合計を実行プラン決定の判断に用いなくともよい。具体例には、データ２０３の生成後にデータ２０２を消去する、データ２０４の生成後のデータ２０３を消去するといった処理を実行することで、データ２０１〜２０６のデータサイズの合計から消去する分のサイズ（データ２０２、データ２０４のデータサイズ）を差し引くことができる。
【００８５】
さらに、繰り返し処理においてアクセラレータ２０上に居続けるデータはデータ２０２〜２０５であることを考慮すれば、実行プラン決定の判断の際に用いるデータサイズからデータ２０１及び２０６のデータサイズを除外することも可能である。
【００８６】
一方、上記処理データの和が繰り返し処理を実行するアクセラレータ２０が保持するアクセラレータメモリ２２の和を超えれば、繰り返し処理生成部５２は、分割モードと同じ分割繰り返し実行プランを作成する。つまり、図５において、データ２０１のサイズが、繰り返し処理を実行しようとするアクセラレータ２０におけるアクセラレータメモリ２２のメモリ容量よりも大きく、Ｏｕｔ−ｏｆ−Ｃｏｒｅが生じる状況下では、繰り返し処理生成部５２は、分割繰り返し実行プランを作成する。
【００８７】
非分割繰り返し実行プランが作成される場合、図５に例示するＤＡＧから作成される実行方法は、図１１に例示するＤＡＧとなる。繰り返し処理生成部５２は、全てのデータ分割に対しスイッチ判定処理４０１とスイッチ処理４０２の実行をアクセラレータ制御部５０で制御するためのエントリを１つ作成する。スイッチ判定処理４０１は、入力となる全てのデータ分割に基づいて判定処理を行い、判定結果であるデータ２０５の入力をスイッチ処理４０２に入力する処理を示すエントリである。また、スイッチ処理４０２は、スイッチ制御によりデータ分割２１４−１とデータ分割２１４−２を、データ分割２１２−１とデータ分割２１２−２にそれぞれ入れ替えるか、又は、結果をデータ分割２１６−１、データ分割２１６−２として出力するかを決定する処理のエントリである。
【００８８】
図３に示すスケジューラ５３は、ＤＡＧ解析部５１からＤＡＧが含む処理を分割した処理分割の実行要求を処理分割のエントリを受信する形で受け付ける。さらに、スケジューラ５３は、当該処理分割を実行する順番を決定し、処理分割を実行するための入力データ分割の確保と出力データ分割を出力するためのメモリ領域の確保を行う。また、スケジューラ５３が受信する実行要求には、繰り返し処理生成部５２が作成する繰り返し処理に関わるスイッチ判定処理やスイッチ処理等の繰り返し処理に関する上記制御情報も含む。
【００８９】
スケジューラ５３は、上記制御情報に基づき、繰り返し処理をアクセラレータ２０に実行させる。より具体的には、スケジューラ５３は、受信した要求のうち、ＤＡＧの上流から順番に処理を実行する。図５に例示されるＤＡＧでは処理３０１が処理３０２より上流の処理として扱われる。なお、下流の処理を実行するには上流の処理が完了している必要がある。
【００９０】
スケジューラ５３は、次に実行する処理分割のアクセラレータ２０における入力データ分割のためのメモリ領域の確保と、出力データ分割を出力するためのメモリ領域の確保と、を行う。実行する処理分割が、ＤＡＧの最初の処理を分割したものである場合、入力データとしてアクセラレータ２０のアクセラレータメモリ２２が保持するデータオブジェクトの識別子か、又は、データを読み込むファイルの名前が指定されている。
【００９１】
また、実行する処理が最初以外の処理である場合には、ＤＡＧ内の前の処理が完了していれば、その処理の出力データが既に計算されている。上記２つの場合とも、データ管理テーブル５７の対応するエントリのデバイス列（デバイスフィールド）がアクセラレータ２０を示していれば、それらのデータ分割はメインメモリ１１に退避されていないため、アクセラレータ２０のアクセラレータメモリ２２上に準備完了となっている。一方、データ管理テーブル５７におけるデバイス列がメインメモリ１１の場合、又は、データをファイルから読み込む場合には、スケジューラ５３は、そのデータ（データ分割）をアクセラレータ２０のアクセラレータメモリ２２上に用意する。
【００９２】
デバイス列がメインメモリ１１の場合、スケジューラ５３は、メモリ管理テーブル５９を参照し、退避されたデータ分割をロードするために十分な空きページがいずれかのアクセラレータ２０に存在するか確認する。十分な空きページが存在すれば、スケジューラ５３は、当該空きページに向けて退避されたデータをロードするようにデータ移動部５５に要求する。一方、空きページが十分でなければ、スケジューラ５３は、データ管理テーブル５７及びメモリ管理テーブル５９を参照し、ロックされていないページが保持するデータ分割を選択し、当該データ分割をメインメモリ１１に退避するようにデータ移動部５５に要求する。なお、退避の要求はデータ分割を単位として行われる。
【００９３】
上記により、入力データ分割をロードするメモリが確保できるため、スケジューラ５３は、データ移動部５５に対し、入力データ分割をアクセラレータ２０にロードするよう通知する。
【００９４】
また、入力データ分割をファイルから読み込む場合、スケジューラ５３は、そのデータ分割をロードするために十分な空きページがいずれかのアクセラレータ２０に存在するか確認する。十分な空きページが存在すれば、スケジューラ５３は、当該データ分割をファイルからロードするようにデータ移動部５５に要求する。一方、空きページが十分でない場合に空きページを確保するスケジューラ５３の動作は、メインメモリ１１に退避されたデータ分割をアクセラレータ２０にロードする場合の動作と同じである。
【００９５】
処理の出力データに関しては、メモリ管理テーブル５９を参照し、実行する処理分割の出力データに必要なページ数が入力データ分割を確保したアクセラレータ２０の空きページから確保可能であれば、スケジューラ５３は、メモリを確保するようデータ移動部５５に要求する。一方、空きページから確保可能でなければ、スケジューラ５３は、退避された入力データをロードするためにメモリを確保する場合と同様に、まず、アクセラレータ２０のアクセラレータメモリ２２上でロックされていないページが保持するデータ分割をメインメモリ１１に退避するようするようデータ移動部５５に通知する。その後、スケジューラ５３は、データ移動部５５に出力データを出力するためのページ数を確保させる。
【００９６】
スケジューラ５３は、また、実行する処理分割の入力データ分割と出力データ分割のメモリ領域をロックするようメモリ管理部５８に依頼する。なお、実行する処理分割の種類によっては入力データと出力メモリ領域のいずれか一方だけ準備すれば良い場合がある。例えば、実行する処理分割が既に存在しているデータをユーザプログラム３０の完了を超えてアクセラレータ２０のアクセラレータメモリ２２に保持するｓｔｏｒｅＯｂｊｅｃｔであった場合、アクセラレータ２０のメモリ領域が既にデータを保持しているため、メモリ領域を確保する必要がない。
【００９７】
スケジューラ５３は、また、入力データ分割と出力データ分割のメモリ領域を確保した処理分割に対し、タスク実行部５４に、該当する処理分割を実行するために必要なアクセラレータ番号、入力データ分割のアドレス、出力データ分割を書き込むアドレス、又は、それらの情報を知るために必要なデータ管理テーブル５７とメモリ管理テーブル５９のエントリ情報を通知し、処理を行わせる（タスク実行部５４が処理分割を実行する）。当該処理は、データ分割の単位で行われる。
【００９８】
スケジューラ５３は、また、タスク実行部５４から処理の完了通知を受信し、入力データ分割と出力データ分割のメモリ管理テーブル５９のロックを解除するようメモリ管理部５８に依頼すると共に、データ管理部５６にデータ管理テーブル５７の出力データ分割の計算済みフラグをセットするように通知する。
【００９９】
スケジューラ５３は、また、ＤＡＧに含まれる繰り返し処理の実行制御を行う。スケジューラ５３は、受信した繰り返し処理生成部５２が作成した繰り返し処理の実行プランの制御情報が図１０に例を示すデータ分割毎の繰り返し処理を行う分割繰り返し実行プランであった場合、データ分割毎に繰り返し処理を行い、あるデータ分割に対する繰り返し処理が完了後、次のデータ分割に対する繰り返し処理に進む。
【０１００】
図１０に示すデータ分割２１２−１に対する繰り返し処理の例では、スケジューラ５３は、処理分割３１３−１の実行後、当該個別の処理分割の実行と同様にスイッチ判定処理４０１−１を、タスク実行部５４にアクセラレータ２０に行わせるよう要求し、データ２０５−１をアクセラレータ２０のアクセラレータメモリ２２上に出力させる。
【０１０１】
図１０の例示において、スイッチ処理４０２−１は、スケジューラ５３で行う処理である。スケジューラ５３は、データ２０５−１のフラグを参照し、収束条件を満たしていなければ、データ分割２１４−１を新たな処理分割３１２−１の入力とし、繰り返し処理の次の周回に進む。また、収束条件を満たしていれば、スケジューラ５３は、データ分割２１４−１を、データ分割２１６−１として出力する。データ分割２１２−２に対する繰り返し処理も同様である。
【０１０２】
一方、繰り返し処理生成部５２から受信した繰り返し処理の制御情報が、図１１に例示する処理データ全体に対する繰り返し処理を行う非分割繰り返し実行プランであった場合、スケジューラ５３は、データ全体に対する繰り返し処理の制御を行う。具体的には、スケジューラ５３は、図１１に示す処理分割３１３−１と処理分割３１１−２の実行が完了した後（処理３０１が完了した後）、上記個別の処理分割の実行と同様にスイッチ判定処理４０１をタスク実行部５４にアクセラレータ２０に行わせるよう要求し、データ２０５をアクセラレータ２０のアクセラレータメモリ２２上に出力させる。
【０１０３】
なお、スイッチ判定処理４０１の入力となる全てのデータ分割が、アクセラレータ２０のアクセラレータメモリ２２に収容できない場合、スケジューラ５３は、個別のデータ分割ごとに途中計算の結果を出力させ、その途中計算の集計によりデータ２０５を出力する段階的なスイッチ判定処理４０１を行うことも可能である。図１１に示す例示では、スイッチ判定処理４０１がデータ分割２１４−１とデータ分割２１４−２が含む要素の和である場合、初めに、データ分割２１４−１の要素の和とデータ分割２１４−２の要素の和を個別に取得し、次の段階でそれらの和を計算し、当該和（計算値）に対して収束判定を行ってデータ２０５が示すフラグとすることが可能である。
【０１０４】
スイッチ処理４０２は、スケジューラ５３で行う処理である。スケジューラ５３は、データ２０５を参照し、繰り返し処理が収束条件を満たしていなければデータ分割２１４−１とデータ分割２１４−２をそれぞれデータ分割２１２−１とデータ分割２１２−２として入れ替え、処理３０２から下流の処理を再実行することで繰り返し処理の次の周回に進む。
【０１０５】
また、収束条件を満たしていれば、スケジューラ５３は、データ分割２１４−１とデータ分割２１４−２をそれぞれ、データ分割２１６−１とデータ分割２１６−２として出力する。
【０１０６】
データ移動部５５は、スケジューラ５３の要求を受け、アクセラレータ２０におけるアクセラレータメモリ２２の確保やアクセラレータ２０に対するデータの移動を行う。データ移動部５５は、スケジューラ５３からの要求を受け、アクセラレータ２０のアクセラレータメモリ２２の確保をメモリ管理部５８に要求する。その際、確保するメモリが保持する使用データ番号やデータ分割番号の登録の要求も併せて行われる。
【０１０７】
また、スケジューラ５３の要求を受け、データ移動部５５は、出力データ分割のデータ管理テーブル５７の計算済みフラグをセットし、出力データ分割を保持するデバイスの情報を更新するようにデータ管理部５６に要求する。また、データ移動部５５は、スケジューラ５３からの要求を受け、データ分割をアクセラレータ２０のアクセラレータメモリ２２からメインメモリ１１に退避する。この場合、データ移動部５５は、退避したデータ分割のデータ管理テーブル５７のデバイス列を移動先のデバイスに更新するようデータ管理部５６に要求する（例えば、デバイス列がアクセラレータ２０からメインメモリ１１に更新される、又は、その逆）。
【０１０８】
また、データ移動部５５は、退避したデータ分割が使用していたページのメモリ管理テーブル５９のエントリの使用中フラグを解除するようメモリ管理部５８に要求する。さらに、データ移動部５５は、スケジューラ５３からの要求を受け付け、メインメモリ１１に退避していたデータ分割をアクセラレータ２０にロードする。このときの動作は、データ分割をアクセラレータ２０のアクセラレータメモリ２２からメインメモリ１１に退避する動作と逆になる。
【０１０９】
タスク実行部５４は、スケジューラ５３からの要求を受け、スケジューラ５３から受信したユーザプログラム３０のカーネル関数を用いて指定されたアクセラレータ２０により指定された入力アドレスと出力アドレスに対し処理分割の処理を行う。また、タスク実行部５４は、処理分割の実行完了をスケジューラ５３に通知する。
【０１１０】
次に、第１の実施形態の動作について図面を参照しつつ説明する。
【０１１１】
図１２は、主に繰り返し処理生成部５２が、繰り返し処理を含むＤＡＧの繰り返し処理部分の実行方法を決定し、制御情報を生成する動作の一例を示すフローチャートである。
【０１１２】
ステップＳ１０１において、ユーザプログラム３０は、繰り返し処理ＡＰＩ４２を用いて繰り返し処理を含むＤＡＧを作成する。その際、ユーザプログラム３０は、ｓｔａｒｔＩｔｅｒａｔｉｏｎに係るＡＰＩの引数に繰り返し処理の動作モードを指定する。
【０１１３】
ステップＳ１０２において、ユーザプログラム３０の中でデータ処理ＡＰＩ４１の実行ＡＰＩが呼び出されると、それまでに作成されたＤＡＧの処理の実行要求がユーザプログラム３０からアクセラレータ制御部５０に行われる。
【０１１４】
ステップＳ１０３において、ＤＡＧ解析部５１は、受信したＤＡＧを解析し、繰り返し処理の部分を判別し、繰り返し部の実行方法の決定を、繰り返し処理生成部５２に要求する。その後、繰り返し処理生成部５２は、ＤＡＧの繰り返し処理の動作モードが分割モードの場合（ステップＳ１０４、Ｙｅｓ分岐）、入力データ分割に対し個別に繰り返し処理を行う分割繰り返し実行プランを作成する（ステップＳ１０８）。
【０１１５】
また、繰り返し処理生成部５２は、繰り返し処理の動作モードがＯｕｔ−ｏｆ−Ｃｏｒｅ分割モードの場合（ステップＳ１０５、Ｙｅｓ分岐）、ＤＡＧの繰り返し部が保持する使用メモリの情報を参照し、使用メモリがアクセラレータ２０のアクセラレータメモリ２２の和より大きいＯｕｔ−ｏｆ−Ｃｏｒｅであれば（ステップＳ１０６、Ｙｅｓ分岐）、分割繰り返し実行プランを作成する。
【０１１６】
一方、繰り返し処理生成部５２は、ＤＡＧ処理がＯｕｔ−ｏｆ−Ｃｏｒｅではない（ステップＳ１０６、Ｎｏ分岐）場合に、データ全体に対して繰り返し処理を行う非分割繰り返し実行プランを作成する（ステップＳ１０７）。
【０１１７】
また、繰り返し処理生成部５２は、ステップＳ１０４、Ｓ１０５で指定された動作モードが、分割モードにもＯｕｔ−ｏｆ−Ｃｏｒｅ分割モードに該当しない場合（ステップＳ１０４及びＳ１０５にてＮｏ分岐）にも、非分割繰り返し実行プランを作成する（ステップＳ１０７）。
【０１１８】
続いて、図１３を参照しつつ、スケジューラ５３が、繰り返し処理生成部５２が作成した繰り返し処理の実行プランの制御情報に基づいて繰り返し処理を制御する動作について説明する。その際、図１０に示すように繰り返し処理が分割繰り返し実行プランである場合のデータ分割２１２−１に対する繰り返し処理の制御について説明する。データ分割２１２−２に対する制御も同じである。
【０１１９】
スケジューラ５３は、ＤＡＧ解析部５１から繰り返し処理が含む全ての処理分割と、繰り返し処理の実行を管理する制御情報と、を実行要求として受信し、繰り返し処理を開始する（ステップＳ２０１）。
【０１２０】
スケジューラ５３は、処理分割３１２−１と処理分割３１３−１を、上記の処理分割を実行する方法で実行する（ステップＳ２０２）。
【０１２１】
スケジューラ５３は、スイッチ判定処理４０１−１の入力となるデータ分割２１４−１と、データ２０５−１の出力に関するメモリの確保をデータ移動部５５に要求することでアクセラレータ２０のアクセラレータメモリ２２に容量を確保し、スイッチ判定処理４０１−１の実行をタスク実行部５４に要求する。タスク実行部５４は、指定されたアクセラレータ２０によりスイッチ判定処理４０１−１を実行する（ステップＳ２０３）。
【０１２２】
続いて、スケジューラ５３は、データ２０５−１を参照し、繰り返し処理の収束を判定する（ステップＳ２０４）。
【０１２３】
繰り返し処理が収束しなければ（ステップＳ２０４、Ｎｏ分岐）、スケジューラ５３は、データ分割２１２−１をデータ分割２１４−１に入れ替え（ステップＳ２０５）、処理分割３１２−１より下流の処理分割を未実行化（ステップＳ２０６）し、処理分割３１２−１から次の周回の処理を開始する。
【０１２４】
また、繰り返し処理が収束していれば（ステップＳ２０４、Ｙｅｓ分岐）、スケジューラ５３は、データ分割２１４−１をデータ分割２１６−１として出力し、処理を終了する。
【０１２５】
また、繰り返し処理が図１１に例示する非分割繰り返し実行プランだった場合、スイッチ判定処理４０１の実行の前に処理３０２と、処理３０３が含む全ての処理分割の実行が完了している必要がある。スイッチ判定処理４０１は、データ分割２１４−１とデータ分割２１４−２の双方に基づいて、スイッチ処理４０２を制御するデータ２０５を生成する。スイッチ処理４０２ではデータ２０５に基づいてデータ分割２１４−１とデータ分割２１４−２をそれぞれ、データ分割２１２−１とデータ分割２１２−２に入れ替えて繰り返し処理の次の周回に進むか、又は、繰り返し処理を終了しデータ分割２１６−１とデータ分割２１６−２として出力するかを決定する。これらの制御は、上記分割繰り返し実行プランの動作から当該分野の技術者であれば容易に類推できる動作と言える。
【０１２６】
以上のように、第１の実施形態に係る繰り返し処理制御システムは、「分割モード」、「Ｏｕｔ−ｏｆ−Ｃｏｒｅ分割モード」及び「非分割モード」という３つの繰り返し処理の動作モードを提供する。とりわけ、「Ｏｕｔ−ｏｆ−Ｃｏｒｅ分割モード」では、処理データがアクセラレータのメモリの和より大きい場合に限り、繰り返し処理をデータ分割ごとに行い、メモリの和以下の場合はデータ全体に対して行う。ユーザプログラムは、上記３つのモードを選択可能とするＡＰＩ（当該ＡＰＩを提供するライブラリ）を用いて、動作モードを指定する。さらに、第１の実施形態に係る繰り返し処理制御システムでは、当該ＡＰＩ（ユーザライブラリ）が指示した動作モードに関する情報を参照し、繰り返し処理を含むプログラムの処理を明示するＤＡＧの実行プランを生成する。具体的には、繰り返し処理生成部５２は、上記動作モードに関する情報に基づき、ＤＡＧの実行プランとして、分割繰り返し実行プラン又は非分割繰り返し実行プランのいずれかを作成する。スケジューラ５３は、当該作成された実行プランに従って、アクセラレータ２０に繰り返し処理を実行させる。
【０１２７】
その結果、第１の実施形態では、ユーザプログラムに対し透過に処理を分割し、複数のアクセラレータに分散して繰り返し処理を実行させるシステムであって、繰り返し処理をデータ分割に対し個別に行うか、データ全体に対し行うか、又は処理データがアクセラレータのメモリの和より大きいＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合に依存してそれらを選択するかという動作モードの選択をユーザプログラムから行えるシステムが提供できる。また、当該繰り返し制御システムの構成は、Ｏｕｔ−ｏｆ−Ｃｏｒｅの繰り返し処理においてデータ分割ごとに繰り返し処理を実行することで処理全体に対し繰り返し処理を行う場合に必要となる各周回における処理データのアクセラレータに対する入れ替えのためのデータＩ／Ｏを回避し、高速に繰り返し処理を実行することができる。
【０１２８】
即ち、第１の実施形態では、ユーザプログラム３０には透過にアクセラレータ制御部５０の中でＤＡＧの処理とデータが分割され複数のアクセラレータ２０に分散して処理が実行される。また、当該システムにおいて、繰り返し処理をデータ全体ではなく個別のデータ分割に対し、又は、処理データがＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合に限り、個別のデータ分割に対し行う指示をユーザプログラム３０から行うことができるようにする。
【０１２９】
当該構成により、繰り返し処理の各周回において処理データをアクセラレータ２０に入れ替えることなく、個別のデータ分割をアクセラレータ２０に保持させたまま個別のデータ分割に対する繰り返し処理を実行し、その繰り返し処理が完了すると次のデータ分割に対する繰り返し処理を実行することで、処理データがアクセラレータ２０のアクセラレータメモリ２２を超えるＯｕｔ−ｏｆ−Ｃｏｒｅとなる場合に繰り返し処理を高速に行うことができる。
【０１３０】
なお、上述の説明で用いた複数のフローチャートでは、複数の工程（処理）が順番に記載されているが、実施形態で実行される工程の実行順序は、その記載の順番に制限されない。実施形態では、例えば各処理を並行して実行する等、図示される工程の順番を内容的に支障のない範囲で変更することができる。
【０１３１】
上記の説明により、本発明の産業上の利用可能性は明らかであるが、本発明は、１つ以上のアクセラレータを含む計算装置の繰り返し処理の高速化といった用途に好適である。
【０１３２】
上記の実施形態の一部又は全部は、以下の付記のようにも記載され得るが、以下には限られない。
【０１３３】
［付記１］
上述の第１の視点に係る繰り返し処理制御システム。
［付記２］
前記指示入力部は、
前記繰り返し処理の処理データが、前記第２の演算装置が保持するメモリの容量を超えた場合には前記繰り返し処理を処理データの分割ごとに実行し、前記第２の演算装置が保持するメモリの容量を超えない場合には前記繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける、付記１の繰り返し処理制御システム。
［付記３］
前記繰り返し処理制御部は、前記分割部による前記処理分割を、複数の前記第２の演算装置に分散して実行させる、付記１又は２の繰り返し処理制御システム。
［付記４］
前記第１の演算装置は、
前記指示入力部からの指示に応じて、前記繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する情報を含む制御情報を作成する、繰り返し処理制御情報生成部をさらに備え、  
前記繰り返し処理制御部は、前記制御情報に基づき、前記繰り返し処理を前記第２の演算装置に実行させる、付記１乃至３のいずれか一に記載の繰り返し処理制御システム。
［付記５］
前記指示入力部はユーザプログラムから使用されるライブラリであって、前記ユーザプログラムの処理を示すＤＡＧ（Directed Acyclic Graph）を作成し、
前記分割部は、前記ユーザプログラムが作成したＤＡＧを受信し、前記ＤＡＧが含むデータと処理を分割し、
前記繰り返し処理制御情報生成部は、前記ユーザプログラムが作成したＤＡＧに付随する情報であって、前記指示入力部により指定された繰り返し処理の実行方法を参照することで、前記制御情報を作成し、
前記繰り返し処理制御部は、前記分割部が作成した前記処理分割と、前記制御情報に含まれる前記繰り返し処理の完了判定方法及び繰り返しにおけるデータの入れ替え方法に関する情報と、に従い前記第２の演算装置に前記繰り返し処理を実行させる、付記４の繰り返し処理制御システム。
［付記６］
上述の第２の視点に係る繰り返し処理制御方法。
［付記７］
前記指示を受け付けるステップは、
前記繰り返し処理の処理データが、前記第２の演算装置が保持するメモリの容量を超えた場合には前記繰り返し処理を処理データの分割ごとに実行し、前記第２の演算装置が保持するメモリの容量を超えない場合には前記繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける、付記６の繰り返し処理制御方法。
［付記８］
前記繰り返し処理を実行させるステップは、
前記処理分割を複数の前記第２の演算装置に分散して実行させる、付記６又は７の繰り返し処理制御方法。
［付記９］
前記指示を受け付けるステップが受け付けた指示に応じて、前記繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する情報を含む制御情報を作成するステップをさらに含み、
前記繰り返し処理を実行させるステップは、
前記制御情報に基づき、前記繰り返し処理を前記第２の演算装置に実行させる、付記６乃至８のいずれか一に記載の繰り返し処理制御方法。
［付記１０］
上述の第３の視点に係るプログラム。
なお、付記６の形態及び付記１０の形態は、付記１の形態と同様に、付記２の形態〜付記５の形態に展開することが可能である。
【０１３４】
なお、引用した上記の非特許文献の開示は、本書に引用をもって繰り込むものとする。本発明の全開示（請求の範囲を含む）の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の全開示の枠内において種々の開示要素（各請求項の各要素、各実施形態ないし実施例の各要素、各図面の各要素等を含む）の多様な組み合わせ、ないし、選択が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。特に、本書に記載した数値範囲については、当該範囲内に含まれる任意の数値ないし小範囲が、別段の記載のない場合でも具体的に記載されているものと解釈されるべきである。
【符号の説明】
【０１３５】
１  ホスト
１０  ＣＰＵ（Central Processing Unit）
１１  メインメモリ
２０、２０−１〜２０−３  アクセラレータ
２１、２１−１〜２１−３  プロセッサ
２２、２２−１〜２２−３  アクセラレータメモリ
３０  ユーザプログラム
４０  ユーザライブラリ
４１  データ処理ＡＰＩ
４２  繰り返し処理ＡＰＩ
５０  アクセラレータ制御部
５１  ＤＡＧ解析部
５２  繰り返し処理生成部
５３  スケジューラ
５４  タスク実行部
５５  データ移動部
５６  データ管理部
５７  データ管理テーブル
５８  メモリ管理部
５９  メモリ管理テーブル
１０１  第１の演算装置
１０２  第２の演算装置
１１１  指示入力部
１１２  分割部
１１３  繰り返し処理制御部
２０１〜２０６、２０５−１、２０５−２  データ
２１１−１〜２１６−２  データ分割
３１１−１〜３１３−２  処理分割
３０１〜３０３  処理
４０１、４０１−１、４０１−２  スイッチ判定処理
４０２、４０２−１、４０２−２  スイッチ処理
【図１】
0006724380.tif 000002
【図２】
0006724380.tif 000003
【図３】
0006724380.tif 000004
【図４】
0006724380.tif 000005
【図５】
0006724380.tif 000006
【図６】
0006724380.tif 000007
【図７】
0006724380.tif 000008
【図８】
0006724380.tif 000009
【図９】
0006724380.tif 000010
【図１０】
0006724380.tif 000011
【図１１】
0006724380.tif 000012
【図１２】
0006724380.tif 000013
【図１３】
0006724380.tif 000014
【図１４】
0006724380.tif 000015