初めに、一実施形態の概要について説明する。なお、この概要に付記した図面参照符号は、理解を助けるための一例として各要素に便宜上付記したものであり、この概要の記載はなんらの限定を意図するものではない。
一実施形態に係る繰り返し処理制御システムは、第1の演算装置101と、第1の演算装置101の処理能力を高める第2の演算装置102と、を含む。第1の演算装置101は、指示入力部111と、分割部112と、繰り返し処理制御部113と、を備える。指示入力部111は、繰り返し処理を処理データの分割ごとに実行するか、又は、繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付ける。分割部112は、繰り返し処理に関する処理とデータをそれぞれ分割し、処理分割とデータ分割を生成する。繰り返し処理制御部113は、指示入力部111が繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、第2の演算装置102にてデータ分割ごとに繰り返し処理を実行させる。
繰り返し制御システムは、指示入力部111という、繰り返し処理を処理データの分割ごとに実行するか、繰り返し処理を処理データの全体に対して実行するかというインターフェイスを提供する。そのため、例えば、処理データがアクセラレータのメモリの和より大きいOut−of−Coreとなり、データの移動が必要になることが想定される場合には、ユーザプログラムは、繰り返し処理の実行を分割データごとに実行するように指示することが可能となる。その結果、Out−of−Coreの繰り返し処理においてデータ分割ごとに繰り返し処理を実行することで、各周回における処理データのアクセラレータに対する入れ替えのためのデータの入出力が回避され、高速に繰り返し処理を実行することができる。
以下に具体的な実施の形態について、図面を参照してさらに詳しく説明する。なお、各実施形態において同一構成要素には同一の符号を付し、その説明を省略する。
[第1の実施形態]
第1の実施形態について、図面を用いてより詳細に説明する。
図2は、第1の実施形態に係る繰り返し制御システムの構成の一例を示す図である。図2を参照すると、繰り返し制御システムは、CPU10と、メインメモリ11と、アクセラレータ20−1〜20−3と、を含んで構成される。第1の実施形態に含まれるアクセラレータの数は、便宜上、3個とするが、アクセラレータの数を限定する趣旨ではない。アクセラレータは1つ以上存在すればよい。
なお、以降の説明において、アクセラレータ20−1〜20−3に繰り返し処理の実行を要求する側のハードウェアをホスト1と表記する。さらに、各構成要素がハイフォン(-)に区切られた符号にて表記されている場合には、ハイフォンの左側の数字により各構成要素を代表するものとする。例えば、アクセラレータ20−1〜20−3を区別する特段の理由がない場合には、「アクセラレータ20」と表記する。
図2に示す繰り返し制御システムにおいて、ホスト1は、アクセラレータ20−1〜20−3のそれぞれに接続されている。
CPU10は、後述する各処理モジュール、プログラムを実現するための計算手段(演算装置)である。CPU10は、上述の第1の演算装置101に相当する。
メインメモリ11は、CPU10がプログラムの実行に使用するメモリであると共に、アクセラレータ20がリソース(メモリリソース)の不足により保持できなくなったデータを退避するためにも用いられる。
アクセラレータ20は、コンピュータのI/Oスロットに挿入する等の形態で実装されるCPU10のコプロセッサ(co-processor)である。各アクセラレータ20は、データの処理を行うプロセッサ21と、データを格納するアクセラレータメモリ22と、を含む。アクセラレータ20は、CPU10の処理能力を高める計算手段(演算装置)として使用される。アクセラレータ20は、上述の第2の演算装置102に相当する。なお、以降の説明では、各アクセラレータ20間に機能的な相違点は存在しないので、アクセラレータ20−1を主に例にとり説明する。
図3は、ホスト1にて実現される処理モジュールの一例を示す図である。図3を参照すると、ホスト1において、ユーザプログラム30と、ユーザライブラリ40と、アクセラレータ制御部50と、が処理モジュールとして実現される。
ユーザプログラム30は、繰り返し処理を行うモジュール(手段)である。
ユーザライブラリ40は、ユーザプログラム30の処理を示す有向非巡回グラフ(DAG;Directed Acyclic Graph)を作成し、アクセラレータ制御部50に送信するためのアプリケーションプログラミングインタフェース(API;Application Programming Interface)をユーザプログラム30に提供する。ユーザライブラリ40は、上述の指示入力部111に相当する。
ユーザライブラリ40は、上記ユーザプログラム30の処理を示すDAGを作成するためのAPIを提供するデータ処理API41と、DAGを拡張し繰り返し処理を示す拡張DAGを作成するためのAPIを提供する繰り返し処理API42と、を含む。以下の説明では、繰り返し処理を含むように拡張したDAGも単にDAGと表記する。
アクセラレータ制御部50は、アクセラレータ20を制御する手段である。アクセラレータ制御部50の詳細は後述する。
図4は、データ処理API41の一例を示す図である。図4に示すように、データ処理API41は、予約API及び実行APIの2種類を含む。
図5は、当該2種類のAPIを用いて作成されたユーザプログラムの処理を示すDAGの一例を示す図である。但し、図5において、スイッチ判定処理401やスイッチ処理402は、後述する繰り返し処理API42に対応する。
図5を参照すると、予約APIはDAGの処理の1つに対応する。予約APIがユーザプログラム30から呼び出されると、DAGに1つの処理と当該処理が生成するデータが作成される。例えば、図5において、データ201に対し予約APIを用いて、処理301が呼ばれた場合、DAGに処理301及びその出力データであるデータ202が付加される。なお、予約APIは処理を予約するためのAPIであり、呼び出された直後にアクセラレータ20にて処理が実行されるわけではない。予約APIの呼び出しにより、DAGが生成されるだけである。
一方、実行APIは、DAGに新たな処理とその処理により生成されるデータが付加される場合とされない場合があるが、それまでに生成されたDAGの処理の実行をトリガする(処理を起動する)APIである。実行APIに属する処理は、ユーザプログラム30内でDAGが処理された後のデータが必要となる場合や、計算結果のデータをアクセラレータ20上のアクセラレータメモリ22にデータオブジェクトとして保持するstoreObjectを実行する場合等である。
ここで、予約APIや実行APIは、図4にてα、βとして示される1つあるいは複数の引数を持つ場合がある。この引数の1つは、カーネル関数と称される、ユーザプログラム30がデータに対し実行する処理を示す関数である場合がある。予約APIや実行APIが、関数を必要とするかどうかはAPIの種類に依存する。
予約APIや実行APIはデータに対し行われる処理のパターンを示し、実際の具体的な処理はユーザプログラム内で予約APIと実行APIの引数として与えられるカーネル関数により行われる。
パターンの一例はmapである。mapでは入力データを構成する全ての要素に対しカーネル関数を適用する。DAGの入力データの典型例は画像やデータベースのテーブルである。これらのデータにmapが適用された場合、カーネル関数が画像の各画素や、データベースの各エントリに個別に適用される。
また、カーネル関数を必要としないAPIの代表例はstoreObjectやoutputFileである。storeObjectは、計算結果をアクセラレータ20上のアクセラレータメモリ22にデータオブジェクトとして保持するAPIである。outputFileは、計算結果をホスト1のファイルシステムのファイルとして格納するAPIである。
以上のようにして、ユーザプログラム30が、予約APIと実行APIを呼び出すたびに、上記ユーザライブラリ40を呼び出すユーザプログラム30の内部でDAGが生成される。つまり、予約APIが呼ばれた場合には、対応する処理と出力データがDAGに付加される。一方、実行APIが呼ばれた場合には、処理と出力データの追加が必要であればそれらが行われ、ユーザライブラリ40が、ユーザプログラム30からアクセラレータ制御部50に、それまでに生成したDAGを通知する。なお、作成されたDAGは、ユーザプログラム30が呼び出した予約APIや実行APIの種類、各APIに与えられたカーネル関数を含むものである。
次に、繰り返し処理API42について説明する。
図6は、繰り返し処理APIの一例を示す図である。図6に示す、startIterationとendIterationは、繰り返し処理の区間を示すAPIである。ユーザプログラム30の内部でこれらのAPIが呼び出された間の区間が、繰り返し処理の対象区間である。startIterationに係るAPIは、その引数としてmodeとmaxIterationを有する。
modeは繰り返し処理の動作モードを示す。後述するようにDAG内のデータと処理は、それぞれデータ分割と処理分割に分割されて複数のアクセラレータ20−1〜20−3に分散して実行可能である。また、全ての処理データがアクセラレータ20のアクセラレータメモリ22に収容できないOut−of−Coreとなる場合、分割されたデータをアクセラレータ20のアクセラレータメモリ22とメインメモリ11の間で入れ替えて処理を行う。当該入れ替え処理に関し、他のアクセラレータ20−2、20−3についても同じである。
modeに係る引数は、これらの分散処理に関して3つの動作モードを定義する。
(1)第1の動作モードは、分割モードであり、データ分割毎に繰り返し処理を行うモードである。
(2)第2の動作モードは、Out−of−Core分割モードであり、処理データがアクセラレータ20のアクセラレータメモリ22に収容できないOut−of−Coreとなる場合にデータ分割ごとの繰り返し処理を実行し、Out−of−Coreとならない場合には処理データ全体に対し繰り返し処理を行うモードである。
(3)第3の動作モードは、非分割モードであり処理データ全体に対し繰り返し処理を行うモードである。
繰り返し処理API42を呼び出すユーザプログラム30は、当該プログラムが処理するデータの内容や、プログラムが実現する機能等に応じて、適切な動作モードを選択し、startIterationに係るAPIの引数(mode)を定め、決定する。つまり、プログラマは、プログラムの仕様を考慮して適切な動作モードを選択し、startIterationに係るAPIの引数を決定する。
ここで、分割モードやOut−of−Core分割モードを指定する繰り返し処理には様々な種類があるが、アルゴリズムの一例として、画像におけるエッジ検出のように個別のデータ分割ごとに収束判定を行い、結果のデータ分割を合わせて最終結果を得る場合と、全体のデータで収束判定を行って結果を求める場合と、2つの場合において処理結果が同じ処理が挙げられる。
また別の一例として、エラー値が一定以内に収まると繰り返し処理を完了するアルゴリズムが、分割モードやOut−of−Core分割モードを指定する繰り返し処理として例示される。この場合、個別のデータ分割に対する繰り返し処理を行い、その結果を合わせて全体の結果を求める場合と、処理データ全体で繰り返し処理を行い求める結果の差が小さく実用上は同じ場合に、本来処理データ全体に行うべき繰り返し処理をデータ分割ごとに行うことができる。
startIterationに係るAPIは、別の引数としてmaxIterationを指定できる。当該引数は、繰り返し処理における最大繰り返し回数を示す。
上記説明したように、繰り返し処理API42は、ユーザプログラム30から使用されるライブラリに含まれ、ユーザプログラム30の処理を示すDAGを作成する。その際、繰り返し処理API42は、繰り返し処理を処理データの分割ごとに実行するか、又は、繰り返し処理を処理データの全体に対して実行するか、に関する指示を受け付ける。さらに、繰り返し処理API42は、繰り返し処理の処理データが、アクセラレータ20が保持するメモリの容量を超えた場合には繰り返し処理を処理データの分割ごとに実行し、アクセラレータ20が保持するメモリの利用可能な容量を超えない場合には繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける。
図6に示す、breakは繰り返し処理の収束条件を示すAPIである。breakで指定された収束条件が満たされると繰り返し処理を終了し、繰り返し終了後の処理に移行する。breakに係るAPIは、引数としてval及びconditionを含む。breakに係るAPIは判定するデータに対し呼び出され、valは条件の比較値、conditionはその比較条件である。例えば、valが0、conditionがEQUALの場合、判定するデータが0と等しいことが繰り返し処理の収束条件となる。また、breakに係るAPIは、判定に用いるデータを判定前に加工するカーネル関数を引数としてさらに指定することも可能である。
図6に示すswapAtIterationに係るAPIは、繰り返し処理時にデータを入れ替えるAPIである。当該APIは、引数として入れ替え先のデータを指定可能である。
図5を参照すると、DAGを作成するユーザプログラム30の内部では、処理302を呼び出す前にstartIterationに係るAPIが呼び出される。なお、図5に例示する処理302と処理303は、データ処理API41の予約APIの呼び出しにより作成される。
スイッチ判定処理401は、breakに係るAPIの呼び出しにより作成される。データ205は、breakに係るAPIが出力した判定結果を示すフラグである。データ205により示されるフラグが、TRUE(真)であれば繰り返し処理の収束を示し、FALSE(偽)であれば繰り返し処理の継続を示す。
なお、Breakに係るAPIは、データ204を処理するためのカーネル関数を引数としてもよい。例えば、データ204が複数の要素から構成される場合、それらの和を取るカーネル関数が与えられ、データ205のフラグの判定は、データ204の各要素の和がbreakに与えられた判定条件と合致するか否かを示すフラグであっても良い。例えば、「各要素の和が10に等しい」等が挙げられる(前述のbreakの引数のvalが10、conditionがEQUALに相当)。
スイッチ処理402は、swapAtIterationに係るAPIにより作成される。図5に示す例示では、スイッチ処理402は、データ205がFALSEの場合、データ202をデータ204に入れ替える(置き替える)。これにより繰り返し処理の次の周回は、処理302から開始される。一方、スイッチ処理402は、データ205がTRUEの場合、データ204をデータ206として出力する。
ユーザプログラム30ではswapAtIterationに係るAPIの後にendIterationに係るAPIが呼ばれ、繰り返し処理の区切り箇所が判定される。endIterationに係るAPIまでに記述されているDAGの処理は、繰り返し処理の各周回で実行される。
ユーザプログラム30は、アクセラレータ20を用いるプログラマが作成するアプリケーションプログラムである。ユーザプログラム30は、ユーザライブラリ40のデータ処理API41が提供する予約API及び実行APIと、繰り返し処理API42と、を用いて実装される。
アクセラレータ制御部50は、ユーザプログラム30の処理を示すDAGを受信し、当該DAGが含むデータと処理を分割し、当該分割されたデータと処理を複数のアクセラレータ20に分散して実行する(実行させる)。なお、以降の説明において、DAGに含まれるデータを分割すること又は分割されたデータを、データ分割と表記し、DAGに含まれる処理を分割すること又は分割された処理を、処理分割と表記する。
図7は、アクセラレータ制御部50によるデータ分割及び処理分割を説明するための図である。図7を参照すると、図5のDAGに含まれるデータ201と、処理301と、データ202のそれぞれにおいて、データと処理を2分割する場合が、例示されている。この場合、処理301をデータ201のデータ分割211−1及びデータ分割211−2の双方に適用すれば、データ201を分割しない場合の処理と同じ結果が得られる。上記処理は、並列計算ではデータパラレルという処理形態に属し、当該分野の技術者であれば通常知る技術である。つまり、第1の実施形態に係る繰り返し処理制御システムが対象とするデータ及び処理は、上記データパラレル(並列計算)に適するデータ及び処理である。また、計算処理の分野の技術者であれば、データパラレルに適したデータをどのように分割するかに関しても、通常知る技術である。
なお、図7において、データ分割211−1に対する処理を処理分割311−1、データ分割211−2に対する処理を処理分割311−2と表記しているが、実際の処理内容は図5に示す処理301と同じである。また、図7の例では、分割数を「2」としているが、分割数を限定する趣旨ではない。さらに、これらの分割は複数のアクセラレータで分散して処理しても良いし、ホスト1が1つのアクセラレータに限り接続されている場合には各分割を1つのアクセラレータで順に処理しても良い。
図3に説明を戻すと、アクセラレータ制御部50は、DAG解析部51と、繰り返し処理生成部52と、スケジューラ53と、タスク実行部54と、データ移動部55と、データ管理部56と、データ管理テーブル57と、メモリ管理部58と、メモリ管理テーブル59と、を含んで構成される。
DAG解析部51は、ユーザプログラム30が呼び出したユーザライブラリ40から受信したDAG(ユーザプログラム30の処理を示すDAG)を解析し、当該受信したDAGが含むデータと処理をデータ分割と処理分割に分割し、それらの分割を管理するエントリを作成する手段である。例えば、DAG解析部51は、対象となる処理データが画像である場合には、当該画像を予め定めたサイズの小画像に分割する。より具体的には、処理の対象となる画像のサイズが100×100ピクセルのサイズを有する場合、当該画像を10分割(例えば、小画像のサイズは10×100ピクセル)し、10個の小画像(データ分割)を作成する。あるいは、DAG解析部51は、処理データがデータベースに係るデータである場合には、全エントリを対象として分割する。例えば、データベースに格納されたエントリ数が100であれば、当該全エントリを10分割し、10個のデータ分割を作成する。なお、上記2つの具体例における分割数10は例示であって、分割数を限定する趣旨ではないことは勿論である。DAG解析部51は、上述の分割部112に相当する。
繰り返し処理生成部52は、DAGに含まれる繰り返し処理を管理するエントリを作成する手段である。
スケジューラ53は、DAG解析部51から実行すべき処理分割を受信し、各処理分割を処理するアクセラレータ20−1〜20−3の決定と、各アクセラレータ20が実行する処理分割の順序を決定する手段である。スケジューラ53は、上述の繰り返し処理制御部113に相当する。スケジューラ53は、後述のように、繰り返し処理を処理データの分割ごとに実行するとの指示を受け付けた場合には、アクセラレータ20にてデータ分割ごとに繰り返し処理を実行させる。また、その際、スケジューラ53は、分割された処理(処理分割)を、複数のアクセラレータ20に分散して実行させることもある。
タスク実行部54は、アクセラレータ20に処理分割を実行させる手段(分割された処理を実行させる手段)である。
データ移動部55は、処理分割の実行に必要なデータ分割のアクセラレータ20への準備や出力処理分割のメモリの確保を行う手段である。
データ管理部56は、データ分割を管理する手段である。データ管理部56は、データ分割を管理するためにデータ管理テーブル57を使用する。
メモリ管理部58は、アクセラレータ20のアクセラレータメモリ22を管理する手段である。メモリ管理部58は、当該メモリを管理するためにメモリ管理テーブル59を使用する。つまり、メモリ管理テーブル59は、アクセラレータ20のアクセラレータメモリ22を管理するためのテーブルとして用いられる。
ここで、アクセラレータ20のアクセラレータメモリ22は一定サイズのページに分割して管理される。ページサイズは、例えば、4KByteや64KByteである。メモリ管理テーブル59は、図8に示すように各ページに関する情報を保持する。図8を参照すると、アクセラレータメモリ22の各ページの情報は、アクセラレータフィールド、ページ番号フィールド、使用中フラグフィールド、使用データフィールド、データ分割番号フィールド及びロックフラグフィールドにより管理される。
アクセラレータフィールドには、各ページが属するアクセラレータ20を特定する情報が格納される。ページ番号フィールドには、管理対象のページを特定する情報が格納される。使用中フラグフィールドには、ページが使用中であることを示すフラグが格納される。使用データフィールドには、ページが使用中である場合、ページが保持するデータの識別子が格納される。データ分割番号フィールドには、ページが保持するデータはデータのどの分割かを示す情報が格納される。ロックフラグフィールドには、ページが計算に使用中であり解放することが禁止であることを示すフラグが格納される。なお、使用中フラグとロックフラグはブール値である。
また、データの識別子(使用データフィールドの値)は、DAGのデータに割り当てられる(DAGのデータに対応する)。例えば、図8に示すメモリ管理テーブル59の最初のエントリは、アクセラレータ20−1のページ1は、データ202の分割1によって使用され、当該ページは現在計算に使用されているためロック中であることを示す。ロック中のページが保持するデータは、メインメモリ11に退避することができないものとして扱われる。
メモリ管理部58は、データ移動部55からの要求によりアクセラレータ20におけるアクセラレータメモリ22の確保や解放の登録をメモリ管理テーブル59に対して行う。データ移動部55がメモリを確保する場合には、メモリ管理部58は、使用中フラグをアサートし、メモリを使用する使用データやデータ分割番号をメモリ管理テーブル59に登録する。また、スケジューラ53の要請により、実行中の処理分割に関わるデータ分割のロックがアサートされる。
データ管理テーブル57は、アクセラレータ20のアクセラレータメモリ22が保持するデータ分割を管理するために用いられるテーブルである。データ管理テーブル57は、図9に示すようにユーザプログラム30から送信されたDAG内のデータを分割したデータ分割に関する情報を保持する。図9を参照すると、各データ分割の情報は、データ分割が属するデータ番号、分割番号、そのデータが計算済みかを示す計算済みフラグ、そのデータを保持するデバイスを示すデバイス、データを保持するアクセラレータ20やメインメモリ11のページ番号の各種情報を保持するフィールドにより管理される。なお、計算済みフラグはブール値である。
例えば、図9に示すデータ管理テーブル57の最初のエントリは、データ202の分割1は既に計算済みであり、アクセラレータ20−1のページ1に保持されていることを示す。データ管理テーブル57を用いることで、当該テーブルのエントリが保持するデバイスとページ番号により、メモリ管理テーブル59の該当エントリを参照し、各データが使用するページの情報を検索したり、計算に使用する場合にページをロックしたりすることができる。
データ管理部56は、データ管理テーブル57の管理を行う。具体的には、データ管理部56は、DAG解析部51からデータ分割の新規登録の要求を受信し、当該要求をデータ管理テーブル57に登録する。また、データ移動部55からの依頼により、データ管理部56は、各データ分割を含むデバイスとページ番号をデータ管理テーブル57に登録する。さらに、スケジューラ53からの依頼を受け、データ管理部56は、計算が完了したデータ分割の計算済みフラグをアサートする。
DAG解析部51は、ユーザプログラム30から受信したDAGを解析し、当該DAGが含むデータをデータ分割に分割し、当該DAGが含む処理を処理分割に分割する。その際、DAG解析部51は、DAG内のデータを分割したデータ分割のエントリに関する、データ管理テーブル57への登録をデータ管理部56に依頼する。このようなエントリは、データ分割の数に相当する個数が作成される。なお、データのエントリ作成時点では、未だ各データ分割の計算が行われていないため計算済みフラグは「0」となる。
ただし、DAGの入力データとしてユーザプログラム30の今回より前のDAGが出力したデータや、ユーザプログラム30とは別のユーザプログラムが以前に作成し、アクセラレータ20上のアクセラレータメモリ22に保持されたデータ分割はエントリが既に存在しているため新たに作成する必要はなく、且つ、それらの計算済みフラグはセットされている。
また、DAG解析部51は、DAGの処理を処理分割に分割し、処理分割の実行をアクセラレータ制御部50の内部で管理するためのエントリを作成する。さらに、DAG解析部51は、DAGが繰り返し処理を含む場合に、当該繰り返し処理の実行方法の決定を、繰り返し処理生成部52に依頼する。
また、DAG解析部51は、作成した処理分割のエントリと繰り返し処理生成部52が作成した繰り返し処理制御のエントリの実行をスケジューラ53に要求する。さらに、DAG解析部51は、ユーザプログラム30の完了通知を受信し、ユーザプログラム30がDAGの実行により生成したデータのうち、プログラムの完了を超えて保持されるデータオブジェクト以外のデータ分割のエントリをデータ管理テーブル57から消去するようデータ管理部56に要求する(不要なデータ分割の消去を依頼する)。また、DAG解析部51は、消去したエントリが使用していたページを解放するようにメモリ管理部58に要求する。
繰り返し処理生成部52は、DAGの繰り返し処理の実行方法を決定する。繰り返し処理生成部52は、DAG解析部51から渡された繰り返し処理において繰り返し処理API42のstartIterationに係るAPIの引数で指定された動作モードを確認し、繰り返し処理の実行方法を決定する。さらに、繰り返し処理生成部52は、繰り返し処理の実行を制御する制御情報を作成する。具体的には、繰り返し処理生成部52は、繰り返し処理API42が生成したDAG(即ち、繰り返し処理API42からの指示)に応じて、繰り返し処理を処理データの分割ごとに実行するか、又は、繰り返し処理を処理データの全体に対して実行するか、に関する情報(以下、実行プランと表記する)を含む制御情報を作成する。つまり、繰り返し処理生成部52は、ユーザプログラム30が作成したDAGに付随する情報(startIterationに係るAPIの引数であるmode)により指定された繰り返し処理の実行方法(3つのモードのうちいずれか)を参照することで、制御情報を作成する。
実行プランは、繰り返し処理生成部52が決定した繰り返し処理に関する実行方法である。例えば、動作モードが分割モードの場合、繰り返し処理生成部52は、データ分割ごとの繰り返し処理を行う分割繰り返し実行プランを作成する。より具体的には、ユーザプログラム30が作成したDAGが図5である場合、繰り返し処理生成部52は、図10に示す入力されたデータ分割(入力データ分割)ごとの繰り返し処理を作成する。なお、ここでは、データ分割の数が「2」である場合を示すが、データ分割の数を限定する趣旨ではない。
繰り返し処理生成部52は、アクセラレータ制御部50で実行を制御するためのスイッチ判定処理とスイッチ処理のエントリをデータ分割毎に作成する。より具体的には、繰り返し処理生成部52は、繰り返し処理の完了判定方法及び繰り返しにおけるデータの入れ替え方法に関する情報を上述の制御情報に含ませ、スケジューラ53に対し、アクセラレータ20に繰り返し処理を実行させることを指示する。
また、動作モードがOut−of−Core分割モードである場合、繰り返し処理生成部52は、処理データのサイズとアクセラレータ20が保持するアクセラレータメモリ22のメモリ容量に基づき、実行プランを作成する。例えば、繰り返し処理が含む処理データの和が繰り返し処理を実行するアクセラレータ20が保持するアクセラレータメモリ22の和を超えなければ、繰り返し処理生成部52は、処理データ全体に対して繰り返し処理を行う非分割繰り返し実行プランを作成する。図5の例示においては、データ201〜206のデータサイズの合計が、繰り返し処理を実行しようとするアクセラレータ20におけるアクセラレータメモリ22のメモリ容量よりも小さい場合には、繰り返し処理生成部52は、非分割繰り返し実行プランを作成する。なお、分割・非分割の実行プラン決定の際には、アクセラレータ20におけるアクセラレータメモリ22のサイズ自体(メモリ容量)を用いることができる。即ち、アクセラレータ20のアクセラレータメモリ22の空き容量を判断に用いるのではない。その理由は、1回目の繰り返し処理において他のデータは全てスワップアウトすることも可能だからである。例えば、繰り返し処理の回数が100である場合に、当該100回周回の際に、処理に関するデータが全てアクセラレータ20のアクセラレータメモリ22に載せられるか否かが判断基準となる。
上記の例示において、分割・非分割の実行プランの判断にデータ201〜206のデータサイズの合計を用いることの前提は、繰り返し処理の各周回時に処理が終わったデータを消去しないことである。換言すれば、繰り返し処理の各周回時に処理が終わったデータを消去するのであれば、データ201〜206のデータサイズの合計を実行プラン決定の判断に用いなくともよい。具体例には、データ203の生成後にデータ202を消去する、データ204の生成後のデータ203を消去するといった処理を実行することで、データ201〜206のデータサイズの合計から消去する分のサイズ(データ202、データ204のデータサイズ)を差し引くことができる。
さらに、繰り返し処理においてアクセラレータ20上に居続けるデータはデータ202〜205であることを考慮すれば、実行プラン決定の判断の際に用いるデータサイズからデータ201及び206のデータサイズを除外することも可能である。
一方、上記処理データの和が繰り返し処理を実行するアクセラレータ20が保持するアクセラレータメモリ22の和を超えれば、繰り返し処理生成部52は、分割モードと同じ分割繰り返し実行プランを作成する。つまり、図5において、データ201のサイズが、繰り返し処理を実行しようとするアクセラレータ20におけるアクセラレータメモリ22のメモリ容量よりも大きく、Out−of−Coreが生じる状況下では、繰り返し処理生成部52は、分割繰り返し実行プランを作成する。
非分割繰り返し実行プランが作成される場合、図5に例示するDAGから作成される実行方法は、図11に例示するDAGとなる。繰り返し処理生成部52は、全てのデータ分割に対しスイッチ判定処理401とスイッチ処理402の実行をアクセラレータ制御部50で制御するためのエントリを1つ作成する。スイッチ判定処理401は、入力となる全てのデータ分割に基づいて判定処理を行い、判定結果であるデータ205の入力をスイッチ処理402に入力する処理を示すエントリである。また、スイッチ処理402は、スイッチ制御によりデータ分割214−1とデータ分割214−2を、データ分割212−1とデータ分割212−2にそれぞれ入れ替えるか、又は、結果をデータ分割216−1、データ分割216−2として出力するかを決定する処理のエントリである。
図3に示すスケジューラ53は、DAG解析部51からDAGが含む処理を分割した処理分割の実行要求を処理分割のエントリを受信する形で受け付ける。さらに、スケジューラ53は、当該処理分割を実行する順番を決定し、処理分割を実行するための入力データ分割の確保と出力データ分割を出力するためのメモリ領域の確保を行う。また、スケジューラ53が受信する実行要求には、繰り返し処理生成部52が作成する繰り返し処理に関わるスイッチ判定処理やスイッチ処理等の繰り返し処理に関する上記制御情報も含む。
スケジューラ53は、上記制御情報に基づき、繰り返し処理をアクセラレータ20に実行させる。より具体的には、スケジューラ53は、受信した要求のうち、DAGの上流から順番に処理を実行する。図5に例示されるDAGでは処理301が処理302より上流の処理として扱われる。なお、下流の処理を実行するには上流の処理が完了している必要がある。
スケジューラ53は、次に実行する処理分割のアクセラレータ20における入力データ分割のためのメモリ領域の確保と、出力データ分割を出力するためのメモリ領域の確保と、を行う。実行する処理分割が、DAGの最初の処理を分割したものである場合、入力データとしてアクセラレータ20のアクセラレータメモリ22が保持するデータオブジェクトの識別子か、又は、データを読み込むファイルの名前が指定されている。
また、実行する処理が最初以外の処理である場合には、DAG内の前の処理が完了していれば、その処理の出力データが既に計算されている。上記2つの場合とも、データ管理テーブル57の対応するエントリのデバイス列(デバイスフィールド)がアクセラレータ20を示していれば、それらのデータ分割はメインメモリ11に退避されていないため、アクセラレータ20のアクセラレータメモリ22上に準備完了となっている。一方、データ管理テーブル57におけるデバイス列がメインメモリ11の場合、又は、データをファイルから読み込む場合には、スケジューラ53は、そのデータ(データ分割)をアクセラレータ20のアクセラレータメモリ22上に用意する。
デバイス列がメインメモリ11の場合、スケジューラ53は、メモリ管理テーブル59を参照し、退避されたデータ分割をロードするために十分な空きページがいずれかのアクセラレータ20に存在するか確認する。十分な空きページが存在すれば、スケジューラ53は、当該空きページに向けて退避されたデータをロードするようにデータ移動部55に要求する。一方、空きページが十分でなければ、スケジューラ53は、データ管理テーブル57及びメモリ管理テーブル59を参照し、ロックされていないページが保持するデータ分割を選択し、当該データ分割をメインメモリ11に退避するようにデータ移動部55に要求する。なお、退避の要求はデータ分割を単位として行われる。
上記により、入力データ分割をロードするメモリが確保できるため、スケジューラ53は、データ移動部55に対し、入力データ分割をアクセラレータ20にロードするよう通知する。
また、入力データ分割をファイルから読み込む場合、スケジューラ53は、そのデータ分割をロードするために十分な空きページがいずれかのアクセラレータ20に存在するか確認する。十分な空きページが存在すれば、スケジューラ53は、当該データ分割をファイルからロードするようにデータ移動部55に要求する。一方、空きページが十分でない場合に空きページを確保するスケジューラ53の動作は、メインメモリ11に退避されたデータ分割をアクセラレータ20にロードする場合の動作と同じである。
処理の出力データに関しては、メモリ管理テーブル59を参照し、実行する処理分割の出力データに必要なページ数が入力データ分割を確保したアクセラレータ20の空きページから確保可能であれば、スケジューラ53は、メモリを確保するようデータ移動部55に要求する。一方、空きページから確保可能でなければ、スケジューラ53は、退避された入力データをロードするためにメモリを確保する場合と同様に、まず、アクセラレータ20のアクセラレータメモリ22上でロックされていないページが保持するデータ分割をメインメモリ11に退避するようするようデータ移動部55に通知する。その後、スケジューラ53は、データ移動部55に出力データを出力するためのページ数を確保させる。
スケジューラ53は、また、実行する処理分割の入力データ分割と出力データ分割のメモリ領域をロックするようメモリ管理部58に依頼する。なお、実行する処理分割の種類によっては入力データと出力メモリ領域のいずれか一方だけ準備すれば良い場合がある。例えば、実行する処理分割が既に存在しているデータをユーザプログラム30の完了を超えてアクセラレータ20のアクセラレータメモリ22に保持するstoreObjectであった場合、アクセラレータ20のメモリ領域が既にデータを保持しているため、メモリ領域を確保する必要がない。
スケジューラ53は、また、入力データ分割と出力データ分割のメモリ領域を確保した処理分割に対し、タスク実行部54に、該当する処理分割を実行するために必要なアクセラレータ番号、入力データ分割のアドレス、出力データ分割を書き込むアドレス、又は、それらの情報を知るために必要なデータ管理テーブル57とメモリ管理テーブル59のエントリ情報を通知し、処理を行わせる(タスク実行部54が処理分割を実行する)。当該処理は、データ分割の単位で行われる。
スケジューラ53は、また、タスク実行部54から処理の完了通知を受信し、入力データ分割と出力データ分割のメモリ管理テーブル59のロックを解除するようメモリ管理部58に依頼すると共に、データ管理部56にデータ管理テーブル57の出力データ分割の計算済みフラグをセットするように通知する。
スケジューラ53は、また、DAGに含まれる繰り返し処理の実行制御を行う。スケジューラ53は、受信した繰り返し処理生成部52が作成した繰り返し処理の実行プランの制御情報が図10に例を示すデータ分割毎の繰り返し処理を行う分割繰り返し実行プランであった場合、データ分割毎に繰り返し処理を行い、あるデータ分割に対する繰り返し処理が完了後、次のデータ分割に対する繰り返し処理に進む。
図10に示すデータ分割212−1に対する繰り返し処理の例では、スケジューラ53は、処理分割313−1の実行後、当該個別の処理分割の実行と同様にスイッチ判定処理401−1を、タスク実行部54にアクセラレータ20に行わせるよう要求し、データ205−1をアクセラレータ20のアクセラレータメモリ22上に出力させる。
図10の例示において、スイッチ処理402−1は、スケジューラ53で行う処理である。スケジューラ53は、データ205−1のフラグを参照し、収束条件を満たしていなければ、データ分割214−1を新たな処理分割312−1の入力とし、繰り返し処理の次の周回に進む。また、収束条件を満たしていれば、スケジューラ53は、データ分割214−1を、データ分割216−1として出力する。データ分割212−2に対する繰り返し処理も同様である。
一方、繰り返し処理生成部52から受信した繰り返し処理の制御情報が、図11に例示する処理データ全体に対する繰り返し処理を行う非分割繰り返し実行プランであった場合、スケジューラ53は、データ全体に対する繰り返し処理の制御を行う。具体的には、スケジューラ53は、図11に示す処理分割313−1と処理分割311−2の実行が完了した後(処理301が完了した後)、上記個別の処理分割の実行と同様にスイッチ判定処理401をタスク実行部54にアクセラレータ20に行わせるよう要求し、データ205をアクセラレータ20のアクセラレータメモリ22上に出力させる。
なお、スイッチ判定処理401の入力となる全てのデータ分割が、アクセラレータ20のアクセラレータメモリ22に収容できない場合、スケジューラ53は、個別のデータ分割ごとに途中計算の結果を出力させ、その途中計算の集計によりデータ205を出力する段階的なスイッチ判定処理401を行うことも可能である。図11に示す例示では、スイッチ判定処理401がデータ分割214−1とデータ分割214−2が含む要素の和である場合、初めに、データ分割214−1の要素の和とデータ分割214−2の要素の和を個別に取得し、次の段階でそれらの和を計算し、当該和(計算値)に対して収束判定を行ってデータ205が示すフラグとすることが可能である。
スイッチ処理402は、スケジューラ53で行う処理である。スケジューラ53は、データ205を参照し、繰り返し処理が収束条件を満たしていなければデータ分割214−1とデータ分割214−2をそれぞれデータ分割212−1とデータ分割212−2として入れ替え、処理302から下流の処理を再実行することで繰り返し処理の次の周回に進む。
また、収束条件を満たしていれば、スケジューラ53は、データ分割214−1とデータ分割214−2をそれぞれ、データ分割216−1とデータ分割216−2として出力する。
データ移動部55は、スケジューラ53の要求を受け、アクセラレータ20におけるアクセラレータメモリ22の確保やアクセラレータ20に対するデータの移動を行う。データ移動部55は、スケジューラ53からの要求を受け、アクセラレータ20のアクセラレータメモリ22の確保をメモリ管理部58に要求する。その際、確保するメモリが保持する使用データ番号やデータ分割番号の登録の要求も併せて行われる。
また、スケジューラ53の要求を受け、データ移動部55は、出力データ分割のデータ管理テーブル57の計算済みフラグをセットし、出力データ分割を保持するデバイスの情報を更新するようにデータ管理部56に要求する。また、データ移動部55は、スケジューラ53からの要求を受け、データ分割をアクセラレータ20のアクセラレータメモリ22からメインメモリ11に退避する。この場合、データ移動部55は、退避したデータ分割のデータ管理テーブル57のデバイス列を移動先のデバイスに更新するようデータ管理部56に要求する(例えば、デバイス列がアクセラレータ20からメインメモリ11に更新される、又は、その逆)。
また、データ移動部55は、退避したデータ分割が使用していたページのメモリ管理テーブル59のエントリの使用中フラグを解除するようメモリ管理部58に要求する。さらに、データ移動部55は、スケジューラ53からの要求を受け付け、メインメモリ11に退避していたデータ分割をアクセラレータ20にロードする。このときの動作は、データ分割をアクセラレータ20のアクセラレータメモリ22からメインメモリ11に退避する動作と逆になる。
タスク実行部54は、スケジューラ53からの要求を受け、スケジューラ53から受信したユーザプログラム30のカーネル関数を用いて指定されたアクセラレータ20により指定された入力アドレスと出力アドレスに対し処理分割の処理を行う。また、タスク実行部54は、処理分割の実行完了をスケジューラ53に通知する。
次に、第1の実施形態の動作について図面を参照しつつ説明する。
図12は、主に繰り返し処理生成部52が、繰り返し処理を含むDAGの繰り返し処理部分の実行方法を決定し、制御情報を生成する動作の一例を示すフローチャートである。
ステップS101において、ユーザプログラム30は、繰り返し処理API42を用いて繰り返し処理を含むDAGを作成する。その際、ユーザプログラム30は、startIterationに係るAPIの引数に繰り返し処理の動作モードを指定する。
ステップS102において、ユーザプログラム30の中でデータ処理API41の実行APIが呼び出されると、それまでに作成されたDAGの処理の実行要求がユーザプログラム30からアクセラレータ制御部50に行われる。
ステップS103において、DAG解析部51は、受信したDAGを解析し、繰り返し処理の部分を判別し、繰り返し部の実行方法の決定を、繰り返し処理生成部52に要求する。その後、繰り返し処理生成部52は、DAGの繰り返し処理の動作モードが分割モードの場合(ステップS104、Yes分岐)、入力データ分割に対し個別に繰り返し処理を行う分割繰り返し実行プランを作成する(ステップS108)。
また、繰り返し処理生成部52は、繰り返し処理の動作モードがOut−of−Core分割モードの場合(ステップS105、Yes分岐)、DAGの繰り返し部が保持する使用メモリの情報を参照し、使用メモリがアクセラレータ20のアクセラレータメモリ22の和より大きいOut−of−Coreであれば(ステップS106、Yes分岐)、分割繰り返し実行プランを作成する。
一方、繰り返し処理生成部52は、DAG処理がOut−of−Coreではない(ステップS106、No分岐)場合に、データ全体に対して繰り返し処理を行う非分割繰り返し実行プランを作成する(ステップS107)。
また、繰り返し処理生成部52は、ステップS104、S105で指定された動作モードが、分割モードにもOut−of−Core分割モードに該当しない場合(ステップS104及びS105にてNo分岐)にも、非分割繰り返し実行プランを作成する(ステップS107)。
続いて、図13を参照しつつ、スケジューラ53が、繰り返し処理生成部52が作成した繰り返し処理の実行プランの制御情報に基づいて繰り返し処理を制御する動作について説明する。その際、図10に示すように繰り返し処理が分割繰り返し実行プランである場合のデータ分割212−1に対する繰り返し処理の制御について説明する。データ分割212−2に対する制御も同じである。
スケジューラ53は、DAG解析部51から繰り返し処理が含む全ての処理分割と、繰り返し処理の実行を管理する制御情報と、を実行要求として受信し、繰り返し処理を開始する(ステップS201)。
スケジューラ53は、処理分割312−1と処理分割313−1を、上記の処理分割を実行する方法で実行する(ステップS202)。
スケジューラ53は、スイッチ判定処理401−1の入力となるデータ分割214−1と、データ205−1の出力に関するメモリの確保をデータ移動部55に要求することでアクセラレータ20のアクセラレータメモリ22に容量を確保し、スイッチ判定処理401−1の実行をタスク実行部54に要求する。タスク実行部54は、指定されたアクセラレータ20によりスイッチ判定処理401−1を実行する(ステップS203)。
続いて、スケジューラ53は、データ205−1を参照し、繰り返し処理の収束を判定する(ステップS204)。
繰り返し処理が収束しなければ(ステップS204、No分岐)、スケジューラ53は、データ分割212−1をデータ分割214−1に入れ替え(ステップS205)、処理分割312−1より下流の処理分割を未実行化(ステップS206)し、処理分割312−1から次の周回の処理を開始する。
また、繰り返し処理が収束していれば(ステップS204、Yes分岐)、スケジューラ53は、データ分割214−1をデータ分割216−1として出力し、処理を終了する。
また、繰り返し処理が図11に例示する非分割繰り返し実行プランだった場合、スイッチ判定処理401の実行の前に処理302と、処理303が含む全ての処理分割の実行が完了している必要がある。スイッチ判定処理401は、データ分割214−1とデータ分割214−2の双方に基づいて、スイッチ処理402を制御するデータ205を生成する。スイッチ処理402ではデータ205に基づいてデータ分割214−1とデータ分割214−2をそれぞれ、データ分割212−1とデータ分割212−2に入れ替えて繰り返し処理の次の周回に進むか、又は、繰り返し処理を終了しデータ分割216−1とデータ分割216−2として出力するかを決定する。これらの制御は、上記分割繰り返し実行プランの動作から当該分野の技術者であれば容易に類推できる動作と言える。
以上のように、第1の実施形態に係る繰り返し処理制御システムは、「分割モード」、「Out−of−Core分割モード」及び「非分割モード」という3つの繰り返し処理の動作モードを提供する。とりわけ、「Out−of−Core分割モード」では、処理データがアクセラレータのメモリの和より大きい場合に限り、繰り返し処理をデータ分割ごとに行い、メモリの和以下の場合はデータ全体に対して行う。ユーザプログラムは、上記3つのモードを選択可能とするAPI(当該APIを提供するライブラリ)を用いて、動作モードを指定する。さらに、第1の実施形態に係る繰り返し処理制御システムでは、当該API(ユーザライブラリ)が指示した動作モードに関する情報を参照し、繰り返し処理を含むプログラムの処理を明示するDAGの実行プランを生成する。具体的には、繰り返し処理生成部52は、上記動作モードに関する情報に基づき、DAGの実行プランとして、分割繰り返し実行プラン又は非分割繰り返し実行プランのいずれかを作成する。スケジューラ53は、当該作成された実行プランに従って、アクセラレータ20に繰り返し処理を実行させる。
その結果、第1の実施形態では、ユーザプログラムに対し透過に処理を分割し、複数のアクセラレータに分散して繰り返し処理を実行させるシステムであって、繰り返し処理をデータ分割に対し個別に行うか、データ全体に対し行うか、又は処理データがアクセラレータのメモリの和より大きいOut−of−Coreとなる場合に依存してそれらを選択するかという動作モードの選択をユーザプログラムから行えるシステムが提供できる。また、当該繰り返し制御システムの構成は、Out−of−Coreの繰り返し処理においてデータ分割ごとに繰り返し処理を実行することで処理全体に対し繰り返し処理を行う場合に必要となる各周回における処理データのアクセラレータに対する入れ替えのためのデータI/Oを回避し、高速に繰り返し処理を実行することができる。
即ち、第1の実施形態では、ユーザプログラム30には透過にアクセラレータ制御部50の中でDAGの処理とデータが分割され複数のアクセラレータ20に分散して処理が実行される。また、当該システムにおいて、繰り返し処理をデータ全体ではなく個別のデータ分割に対し、又は、処理データがOut−of−Coreとなる場合に限り、個別のデータ分割に対し行う指示をユーザプログラム30から行うことができるようにする。
当該構成により、繰り返し処理の各周回において処理データをアクセラレータ20に入れ替えることなく、個別のデータ分割をアクセラレータ20に保持させたまま個別のデータ分割に対する繰り返し処理を実行し、その繰り返し処理が完了すると次のデータ分割に対する繰り返し処理を実行することで、処理データがアクセラレータ20のアクセラレータメモリ22を超えるOut−of−Coreとなる場合に繰り返し処理を高速に行うことができる。
なお、上述の説明で用いた複数のフローチャートでは、複数の工程(処理)が順番に記載されているが、実施形態で実行される工程の実行順序は、その記載の順番に制限されない。実施形態では、例えば各処理を並行して実行する等、図示される工程の順番を内容的に支障のない範囲で変更することができる。
上記の説明により、本発明の産業上の利用可能性は明らかであるが、本発明は、1つ以上のアクセラレータを含む計算装置の繰り返し処理の高速化といった用途に好適である。
上記の実施形態の一部又は全部は、以下の付記のようにも記載され得るが、以下には限られない。
[付記1]
上述の第1の視点に係る繰り返し処理制御システム。
[付記2]
前記指示入力部は、
前記繰り返し処理の処理データが、前記第2の演算装置が保持するメモリの容量を超えた場合には前記繰り返し処理を処理データの分割ごとに実行し、前記第2の演算装置が保持するメモリの容量を超えない場合には前記繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける、付記1の繰り返し処理制御システム。
[付記3]
前記繰り返し処理制御部は、前記分割部による前記処理分割を、複数の前記第2の演算装置に分散して実行させる、付記1又は2の繰り返し処理制御システム。
[付記4]
前記第1の演算装置は、
前記指示入力部からの指示に応じて、前記繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する情報を含む制御情報を作成する、繰り返し処理制御情報生成部をさらに備え、
前記繰り返し処理制御部は、前記制御情報に基づき、前記繰り返し処理を前記第2の演算装置に実行させる、付記1乃至3のいずれか一に記載の繰り返し処理制御システム。
[付記5]
前記指示入力部はユーザプログラムから使用されるライブラリであって、前記ユーザプログラムの処理を示すDAG(Directed Acyclic Graph)を作成し、
前記分割部は、前記ユーザプログラムが作成したDAGを受信し、前記DAGが含むデータと処理を分割し、
前記繰り返し処理制御情報生成部は、前記ユーザプログラムが作成したDAGに付随する情報であって、前記指示入力部により指定された繰り返し処理の実行方法を参照することで、前記制御情報を作成し、
前記繰り返し処理制御部は、前記分割部が作成した前記処理分割と、前記制御情報に含まれる前記繰り返し処理の完了判定方法及び繰り返しにおけるデータの入れ替え方法に関する情報と、に従い前記第2の演算装置に前記繰り返し処理を実行させる、付記4の繰り返し処理制御システム。
[付記6]
上述の第2の視点に係る繰り返し処理制御方法。
[付記7]
前記指示を受け付けるステップは、
前記繰り返し処理の処理データが、前記第2の演算装置が保持するメモリの容量を超えた場合には前記繰り返し処理を処理データの分割ごとに実行し、前記第2の演算装置が保持するメモリの容量を超えない場合には前記繰り返し処理を処理データの全体に対して実行する旨の指示をさらに受け付ける、付記6の繰り返し処理制御方法。
[付記8]
前記繰り返し処理を実行させるステップは、
前記処理分割を複数の前記第2の演算装置に分散して実行させる、付記6又は7の繰り返し処理制御方法。
[付記9]
前記指示を受け付けるステップが受け付けた指示に応じて、前記繰り返し処理を処理データの分割ごとに実行するか、又は、前記繰り返し処理を処理データの全体に対して実行するか、に関する情報を含む制御情報を作成するステップをさらに含み、
前記繰り返し処理を実行させるステップは、
前記制御情報に基づき、前記繰り返し処理を前記第2の演算装置に実行させる、付記6乃至8のいずれか一に記載の繰り返し処理制御方法。
[付記10]
上述の第3の視点に係るプログラム。
なお、付記6の形態及び付記10の形態は、付記1の形態と同様に、付記2の形態〜付記5の形態に展開することが可能である。
なお、引用した上記の非特許文献の開示は、本書に引用をもって繰り込むものとする。本発明の全開示(請求の範囲を含む)の枠内において、さらにその基本的技術思想に基づいて、実施形態ないし実施例の変更・調整が可能である。また、本発明の全開示の枠内において種々の開示要素(各請求項の各要素、各実施形態ないし実施例の各要素、各図面の各要素等を含む)の多様な組み合わせ、ないし、選択が可能である。すなわち、本発明は、請求の範囲を含む全開示、技術的思想にしたがって当業者であればなし得るであろう各種変形、修正を含むことは勿論である。特に、本書に記載した数値範囲については、当該範囲内に含まれる任意の数値ないし小範囲が、別段の記載のない場合でも具体的に記載されているものと解釈されるべきである。