(57)【特許請求の範囲】
【請求項１】
ソースプログラムを分割するプログラム分割装置であって、
基準とすべきオブジェクトデータ量を基準データ量として保持するオブジェクトデータ量保持部と、
前記ソースプログラム内から分割開始位置情報を検出する開始位置情報検出部と、
前記開始位置情報検出部により検出された分割開始位置情報で特定される開始位置から始まる分割プログラムの暫定終了位置を定める終了位置設定部と、
前記開始位置と、前記終了位置設定部により定められる暫定終了位置とで規定される仮分割プログラムをコンパイルするよう所定のコンパイラに指示する変換指示部と、
前記変換指示部による指示に応じた、前記コンパイラの変換結果に対応するオブジェクトデータ量を取得データ量として取得する変換結果取得部と、
前記オブジェクトデータ量保持部により保持される基準データ量と、前記変換結果取得部により取得される取得データ量とを比較し、その比較結果に応じて前記終了位置設定部を制御する制御部と、を備え、
前記制御部は、前記基準データ量と前記取得データ量とが一致または近づくように前記暫定終了位置を変更するよう、前記終了位置設定部を制御することを特徴とするプログラム分割装置。
【請求項２】
前記終了位置設定部は、前記ソースプログラム内において前記分割開始位置情報で特定される開始位置に対し、所定の行数進んだ行を前記暫定終了位置の初期値とし、
前記制御部は、前記取得データ量が前記基準データ量未満であり、かつ前記暫定終了位置が、前記開始位置を含む意味的または機能的にまとまった単位演算処理の最後に到達していないとき、前記暫定終了位置をｎ（ｎは自然数）行、進めるよう前記終了位置設定部に指示し、
前記暫定終了位置が前記単位演算処理の最後に到達したとき、そのときの仮分割プログラムを正式な分割プログラムとすることを特徴とする請求項１に記載のプログラム分割装置。
【請求項３】
前記仮分割プログラムを保持する仮分割プログラム保持部と、
前記暫定終了位置が変更されるたび、前記仮分割プログラム保持部に前記仮分割プログラムを登録する仮分割プログラム登録部をさらに備え、
前記変換指示部は、前記暫定終了位置が変更されるたび、前記仮分割プログラムをコンパイルするよう前記コンパイラに指示し、
前記制御部は、前記取得データ量が前記基準データ量を超えたとき、前記仮分割プログラム保持部に超える前の最後に登録された仮分割プログラムを正式な分割プログラムとすることを特徴とする請求項１または２に記載のプログラム分割装置。
【請求項４】
前記制御部は、前記暫定終了位置が、前記開始位置のネストより下位のネストに到達したとき、前記変換指示部に、前記仮分割プログラムのコンパイルを前記コンパイラに指示しないよう指示し、前記開始位置と同位のネストに到達するまで、前記暫定終了位置を進めるよう前記終了位置設定部に指示することを特徴とする請求項１から３のいずれかに記載のプログラム分割装置。
【請求項５】
前記仮分割プログラムを保持する仮分割プログラム保持部と、
前記暫定終了位置が変更されるたび、前記仮分割プログラム保持部に前記仮分割プログラムを登録する仮分割プログラム登録部をさらに備え、
前記終了位置設定部は、前記ソースプログラム内において、前記分割開始位置情報で特定される開始位置の行と、その開始位置を含む意味的または機能的にまとまった単位演算処理の最終行と、の半分の位置にある行を前記暫定終了位置の初期値とし、
前記制御部は、前記取得データ量が前記基準データ量を超えるとき、初期では、前記開始位置の行から前記最終行までの１／４の行数、二回目以降では、前記暫定終了位置を前回移動した行数の半分の行数、戻すよう前記終了位置設定部に指示し、
前記取得データ量が前記基準データ量未満のとき、初期では、前記開始位置の行から前記最終行までの１／４の行数、二回目以降では、前記暫定終了位置を前回移動した行数の半分の行数、進めるよう前記終了位置設定部に指示し、
前記暫定終了位置が前回移動した行数が一のとき、前記取得データ量が前記基準データ量以下である仮分割プログラムのうち、前記仮分割プログラム保持部に最後に登録された仮分割プログラムを正式な分割プログラムとすることを特徴とする請求項１に記載のプログラム分割装置。
【請求項６】
前記制御部は、前記変換結果取得部が前記コンパイラからエラーを取得したとき、そのときの仮分割プログラムを前記仮分割プログラム保持部に登録しないよう、前記仮分割プログラム登録部に指示することを特徴とする請求項３または５に記載のプログラム分割装置。
【請求項７】
前記オブジェクトデータ量保持部は、プロセッサの単位時間当たりの実行ステップ数、または使用メモリサイズで規定されるオブジェクトデータ量を保持することを特徴とする請求項１から６のいずれかに記載のプログラム分割装置。
【請求項８】
前記オブジェクトデータ量保持部は、ｙ（ｙは２以上の整数）個の演算器を含む演算器列で、またはｘ×ｙ（ｘ、ｙは２以上の整数）で二次元配置された複数の演算器を含む演算アレイで、ｍ（ｍは自然数）サイクルに実行可能なステップ数で規定されるオブジェクトデータ量を保持することを特徴とする請求項１から６のいずれかに記載のプログラム分割装置。
【請求項９】
ソースプログラムを分割する分割方法であって、
基準とすべきオブジェクトデータ量を基準データ量としてオブジェクトデータ量保持部に保持する第１ステップと、
前記ソースプログラム内から、分割開始位置情報を開始位置情報検出部により検出する第２ステップと、
前記開始位置情報検出部により検出された分割開始位置情報で特定される開始位置から始まる分割プログラムの暫定終了位置を終了位置設定部により定める第３ステップと、
前記開始位置と、前記終了位置設定部により定められる暫定終了位置とで規定される仮分割プログラムをコンパイルするよう所定のコンパイラに、変換指示部により指示する第４ステップと、
前記変換指示部による指示に応じた、前記コンパイラの変換結果に対応するオブジェクトデータ量を取得データ量として変換結果取得部により取得する第５ステップと、
前記オブジェクトデータ量保持部により保持される基準データ量と、前記変換結果取得部により取得される取得データ量とを比較し、その比較結果に応じて前記終了位置設定部を制御部により制御する第６ステップと、を備え、
前記第６ステップは、前記基準データ量と前記取得データ量とが一致または近づくように前記暫定終了位置を変更するよう、前記終了位置設定部を制御することを特徴とするプログラム分割方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを分割するためのプログラム分割装置および分割方法に関する。
【背景技術】
【０００２】
近年、マルチスレッドを活用したプログラミングが盛んである。マルチスレッドとは、一つのアプリケーションを複数のスレッドに分割し、プロセッサに並行して処理させる手法である。処理時間を非常に短い単位に分割し、複数のスレッドに順番に処理することによって、シングルコアのプロセッサでも複数の処理を同時に行っているようにみせることができる。
【０００３】
ソースプログラムをスレッドに分割して時分割処理する場合、好適に分割しないとリアルタイム性がそこなわれてしまう。また、マルチコアのプロセッサでもコアの数より多いスレッドを同時に処理する場合、同様である。
【０００４】
回路構成が動的に変更可能なリコンフィギュラブルプロセッサを用いる場合、その分割位置を求めるのに多くの作業量を要する。リコンフィギュラブルプロセッサは、ＡＬＵ(Arithmetic Logic Unit)と呼ばれる基本演算機能を複数持つ多機能素子を多段に並べたＡＬＵアレイを備える。リコンフィギュラブルプロセッサでは、ソースプログラムの記述から、その記述を実行する場合に必要な実行ステップ数を推測することが難しいため、好適な分割位置を簡単に求めることができない。
【０００５】
出願人は、リコンフィギュラブルプロセッサに実行させるべきソースプログラムをトライ＆エラーで分割していた。すなわち、ソースプログラムを手作業で分割し、その分割プログラムをコンパイルして実行ステップ数を取得し、その実行ステップ数をもとに次の分割位置を決めるという作業を、取得された実行ステップ数が所定の最大実行ステップ数に収まる最大になるまで繰り返していた。
【０００６】
特許文献２は、処理ブロックをＧＵＩ操作で組み合わせてプログラミングを行う組み込み用プログラム生成方法を開示する。この方法は、処理ブロックに関するライブラリ情報を基にして、生成されるプログラムが必要とするハードウエア資源データ、プログラム容量、及びサイクル数を算出し、生成されるプログラムが一つのプロセッサの性能を超えるものである場合、並列又は直列に接続される複数のプロセッサに分けてソースプログラムを生成する。
【特許文献１】特開２００６−４３４５号公報
【特許文献２】特開２００７−８００４９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
上述したような手作業による分割は煩雑であり、アプリケーションの開発効率を低下させていた。本発明はこうした状況に鑑みなされたものであり、その目的は、簡単にソースプログラムを好適な位置で分割することができるプログラム分割装置および方法を提供することにある。
【課題を解決するための手段】
【０００８】
本発明のある態様のプログラム分割装置は、ソースプログラムを分割するプログラム分割装置であって、基準とすべきオブジェクトデータ量を基準データ量として保持するオブジェクトデータ量保持部と、ソースプログラム内から分割開始位置情報を検出する開始位置情報検出部と、開始位置情報検出部により検出された分割開始位置情報で特定される開始位置から始まる分割プログラムの暫定終了位置を定める終了位置設定部と、開始位置と、終了位置設定部により定められる暫定終了位置とで規定される仮分割プログラムをコンパイルするよう所定のコンパイラに指示する変換指示部と、変換指示部による指示に応じた、コンパイラの変換結果に対応するオブジェクトデータ量を取得データ量として取得する変換結果取得部と、オブジェクトデータ量保持部により保持される基準データ量と、変換結果取得部により取得される取得データ量とを比較し、その比較結果に応じて終了位置設定部を制御する制御部と、を備える。制御部は、基準データ量と取得データ量とが一致または近づくように暫定終了位置を変更するよう、終了位置設定部を制御する。
【０００９】
本発明のさらに別の態様は、プログラム分割装置である。この装置は、ソースプログラムを分割するプログラム分割装置であって、ソースプログラム内から分割開始位置情報を検出する開始位置情報検出部と、ソースプログラム内から分割終了位置情報を検出する終了位置情報検出部と、開始位置情報検出部により検出された分割開始位置情報で特定される開始位置と、終了位置情報検出部により検出された分割終了位置情報で特定される終了位置とで規定される分割プログラムをコンパイルするよう所定のコンパイラに指示する変換指示部と、変換指示部による指示に応じた、コンパイラの変換結果を取得する変換結果取得部と、を備える。
【００１０】
なお、以上の構成要素の任意の組み合わせ、本発明の表現を方法、装置、システム、記録媒体、コンピュータプログラムなどの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【００１１】
本発明によれば、簡単にソースプログラムを好適な位置で分割することができる。
【発明を実施するための最良の形態】
【００１２】
図１は、実施の形態１に係る情報処理システム３００の構成を示すブロック図である。情報処理システム３００は、プログラム分割装置１００およびコンパイラ２００を備える。プログラム分割装置１００は、オブジェクトデータ量保持部１０、開始位置情報検出部１２、終了位置設定部１４、仮分割プログラム登録部１６、仮分割プログラム保持部１８、変換指示部２０、変換結果取得部２２および制御部２４を含む。
【００１３】
これらの構成は、ハードウェア的には、任意のコンピュータのＣＰＵ、メモリ、その他のＬＳＩで実現でき、ソフトウェア的にはメモリにロードされたプログラムなどによって実現されるが、ここではそれらの連携によって実現される機能ブロックを描いている。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組み合わせによっていろいろな形で実現できることは、当業者には理解されるところである。
【００１４】
オブジェクトデータ量保持部１０は、基準とすべきオブジェクトデータ量を基準データ量として保持する。基準とすべきオブジェクトデータ量は、プロセッサの単位時間当たりの実行ステップ数、または使用メモリサイズで規定されるオブジェクトデータ量であってもよい。より具体的には、プロセッサの単位時間当たりに実行可能な最大実行ステップ数、または使用可能な最大メモリ領域であってもよい。
【００１５】
また、基準とすべきオブジェクトデータ量は、ｙ（ｙは２以上の整数）個の演算器を含む演算器列で、またはｘ×ｙ（ｘ、ｙは２以上の整数）で二次元配置された複数の演算器を含む演算アレイで、ｍ（ｍは自然数）サイクルに実行可能なステップ数で規定されるオブジェクトデータ量であってもよい。とくに後者は、リコンフィギュラブルプロセッサを用いる場合に適用可能な基準である。この詳細は後述する。
【００１６】
開始位置情報検出部１２は、ソースプログラム内から分割開始位置情報を検出する。このソースプログラムはＣ言語などの高級言語で記述されており、分割を開始すべき位置に分割開始位置情報が付加されている。分割開始位置情報は、プログラムなどによりコメントとして埋め込まれる。また、本プログラム分割装置１００が統合開発環境下のＧＵＩ操作のツールとして実装される場合、分割開始位置情報をマウス操作などで付加するようにしてもよい。分割開始位置情報は、意味的または機能的にまとまった単位演算処理を記述した部分の、実質的な処理が開始される行に付加されることが多い。この単位演算処理はサブルーチンまたは関数ととらえてもよい。
【００１７】
終了位置設定部１４は、開始位置情報検出部１２により検出された分割開始位置情報で特定される開始位置から始まる分割プログラムの暫定終了位置を定める。実施の形態１の基本例では、ソースプログラム内において分割開始位置情報で特定される開始位置に対し、所定の行数進んだ行を暫定終了位置の初期値とする。たとえば、一行進んだ行であってもよい。以下、この暫定終了位置を制御部２４からの指示により変更する。なお、この暫定終了位置は上記開始位置を含む単位演算処理の最終行を超えることはない。
【００１８】
仮分割プログラム登録部１６は、仮分割プログラム保持部１８に仮分割プログラムを登録する。仮分割プログラムを登録する際、開始位置を含む単位演算処理のうち、開始位置と暫定終了位置とで規定された部分以外の記述は削除する。その単位演算処理の前後の記述であって、その仮分割プログラムでは実行されない関数など、不要な記述は、コンパイラ２００によりコンパイルされる際に削除されるため、ここで削除する必要はない。ただし、後述するシーケンサの指定など残しておくべき動作補助用コメントは、コンパイラ２００に削除されないよう削除禁止の識別情報を付しておく必要がある。
【００１９】
仮分割プログラム登録部１６は、暫定終了位置が変更されるたびに仮分割プログラムを登録する。暫定終了位置が変更される場合でも、制御部２４から登録する必要がない旨の指示があった場合、登録しない。
【００２０】
仮分割プログラム保持部１８は、仮分割プログラム登録部１６により登録される仮分割プログラムを保持する。仮分割プログラム登録部１６により登録される、すべての仮分割プログラムを保持してもよいし、直近に登録された仮分割プログラムのみを保持し、先に登録された仮分割プログラムは削除してもよい。
【００２１】
変換指示部２０は、上記開始位置と、終了位置設定部１４により定められる暫定終了位置とで規定される仮分割プログラムをコンパイルするよう所定のコンパイラ２００に指示する。コンパイラ２００に渡すべきデータは、仮分割プログラム登録部１６が仮分割プログラム保持部１８に渡すデータと同じでよい。
【００２２】
変換指示部２０は、暫定終了位置が変更されるたび、仮分割プログラムの変換をコンパイラ２００に指示する。暫定終了位置が変更される場合でも、制御部２４から、コンパイラ２００にコンパイルを指示する必要がない旨の指示があった場合、コンパイラ２００に指示しない。
【００２３】
変換結果取得部２２は、変換指示部２０による指示に応じた、コンパイラ２００の変換結果に対応するオブジェクトデータ量を取得データ量として取得する。変換結果取得部２２は、当該取得データ量を上記基準データ量と同様の形式、たとえばプロセッサの実行ステップ数で取得してもよいし、取得したオブジェクトファイルから実行ステップ数を特定してもよい。
【００２４】
制御部２４は、オブジェクトデータ量保持部１０により保持される基準データ量と、変換結果取得部２２により取得される取得データ量とを比較し、その比較結果に応じて終了位置設定部１４を制御する。制御部２４は、基準データ量と取得データ量とが一致または近づくように暫定終了位置を変更するよう、終了位置設定部１４を制御する。例外的に、仮分割プログラムが開始位置を含む単位演算処理のすべてを含み、かつその仮分割プログラムの変換結果であるところの取得データ量が基準データ量より小さい場合、両データ量の差を近づけようとせずに、その仮分割プログラムを正式な分割プログラムとする。
【００２５】
以下、より具体的に説明する。制御部２４は、取得データ量が基準データ量未満であり、かつ暫定終了位置が、開始位置を含む単位演算処理の最後に到達していないとき、暫定終了位置をｎ（ｎは自然数）行、進めるよう終了位置設定部１４に指示する。制御部２４は、取得データ量が基準データ量を超えたとき、仮分割プログラム保持部１８に超える前の最後に登録された仮分割プログラムを正式な分割プログラムとする。制御部２４は、取得データ量と基準データ量とが一致したとき、そのときの仮分割プログラムを正式な分割プログラムとする。暫定終了位置が単位演算処理の最後に到達したときも、そのときの仮分割プログラムを正式な分割プログラムとする。
【００２６】
制御部２４は、暫定終了位置が、開始位置のネストより下位のネストに到達したとき、変換指示部２０に、仮分割プログラムのコンパイルをコンパイラ２００に指示しないよう指示し、当該開始位置と同位のネストに到達するまで、当該暫定終了位置を進めるよう終了位置設定部１４に指示する。開始位置を含む単位演算処理より下位の単位演算処理内では分割しないため、不要な仮分割プログラムの登録やコンパイルを回避することができる。
【００２７】
制御部２４は、変換結果取得部２２がコンパイラ２００からエラーを取得したとき、そのときの仮分割プログラムを仮分割プログラム保持部１８に登録しないよう、仮分割プログラム登録部１６に指示する。文法的に分割してはいけない位置で分割されている場合、エラーが発生する。たとえば、Ｉｆ．．文、ｅｌｓｅｉｆ．．文、ｅｌｓｅ文、などは文法的に文の途中で切ることができない。
【００２８】
コンパイラ２００は、変換指示部２０から指示された、仮分割プログラムをコンパイルし、その変換結果を変換結果取得部２２に渡す。なお、オブジェクトデータ量保持部１０に保持されている基準データ量と同様の形式、たとえばプロセッサの実行ステップ数を出力してもよいし、単純にオブジェクトファイルを変換結果取得部２２に渡してもい。また、変換中にエラーが発生した場合、その旨を変換結果取得部２２に通知する。
【００２９】
図２は、実施の形態１に係るプログラム分割装置１００の動作例を示すフローチャートである。前提として、単位時間あたりのプロセッサの最大実行ステップ数が基準データ量としてオブジェクトデータ量保持部１０に保持されているものとする。また、分割すべきソースプログラムには、その分割開始位置を指定するコメントが埋め込まれているものとする。
【００３０】
まず、プログラム分割装置１００にソースプログラムファイルが読み込まれ（Ｓ１０）、開始位置情報検出部１２は、そのソースプログラムに分割開始位置がコメントとして埋め込まれているか否か調査する（Ｓ１２）。そのコメントが埋め込まれていなければ（Ｓ１２のＮ）、処理不能として終了する。埋め込まれていれば（Ｓ１２のＹ）、つぎの処理へ移行する。
【００３１】
開始位置情報検出部１２は、当該コメントのある行を分割開始位置に設定し、終了位置設定部１４は、その行の次の行を分割すべき暫定終了位置の初期値に設定する（Ｓ１４）。仮分割プログラム登録部１６は、当該コメントのある関数内（以下適宜、エントリ関数という）で、開始位置から暫定終了位置までに関係のないソースプログラムの記述を削除する（Ｓ１６）。その際、ヘッダファイルから値を呼び出す必要がある変数など、初期値が設定されていない変数に初期値を代入する。
【００３２】
仮分割プログラム登録部１６は、上記記述の削除後のソースプログラムを仮分割プログラムファイルとして、仮分割プログラム保持部１８に一時保存する（Ｓ１８）。この際、この仮分割プログラムの関数名を分割前ソースプログラム内の関数名から、コンパイラ２００で使用するパラメータファイルに記述する関数名に変更するとよい。
【００３３】
変換指示部２０は当該仮分割プログラムをコンパイラ２００にコンパイルさせる（Ｓ２０）。制御部２４は、変換結果取得部２２がコンパイラ２００からエラー通知を受けたか否か判定する（Ｓ２２）。受けていない場合（Ｓ２２のＮ）、ステップＳ２４に遷移し、受けた場合（Ｓ２２のＹ）、ステップＳ３０に遷移する。エラーの発生は、分割できない位置で分割された仮分割プログラムであることを示しており、ステップＳ２４、ステップＳ２６およびステップＳ２８の処理は実行する必要がなく、それらの処理をスキップする。なお、エラーが発生した仮分割プログラムについては、そのファイルを仮分割プログラム保持部１８から削除する。
【００３４】
ステップＳ２４において、変換結果取得部２２は、コンパイラ２００から変換結果として実行ステップ数を取得する（Ｓ２４）。制御部２４は、この実行ステップ数が上記基準データ量より小さいか否かを判定する（Ｓ２６）。実行ステップ数が当該基準データ量より小さい場合（Ｓ２６のＮ）、ステップＳ２８に遷移し、実行ステップ数が当該基準データ量以上の場合（Ｓ２６のＹ）、ステップＳ３６に遷移する。
【００３５】
ステップＳ２８において、制御部２４は、暫定終了位置が、エントリ関数の最終行を超えたか否か判定する（Ｓ２８）。エントリ関数の最終行を超えていれば（Ｓ２８のＹ）、ステップＳ３８に遷移し、エントリ関数の最終行を超えていなければ（Ｓ２８のＮ）、ステップＳ３０に遷移する。
【００３６】
終了位置設定部１４は、制御部２４の指示に応じて暫定終了位置を一行分、インクリメントする（Ｓ３０）。制御部２４は、インクリメントされた暫定終了位置が、エントリ関数より下位のネストに入ったか否かを判定する（Ｓ３２）。たとえば、暫定終了位置がｆｏｒ文、ｗｈｉｌｅ文、ｄｏ  ｗｈｉｌｅ文、などのループ内に入った場合などが該当する。下位のネストに入った場合（Ｓ３２のＹ）、ステップＳ３０に遷移し、下位ネストから抜けるまで（Ｓ３２のＮ）、暫定終了位置のインクリメントを繰り返す。下位ネストから抜けた場合、または下位ネストに入っていない場合（Ｓ３２のＮ）、ステップＳ３４に遷移する。
【００３７】
制御部２４は、暫定終了位置が、エントリ関数より上位のネストに入ったか否かを判定する（Ｓ３４）。上位のネストに入った場合（Ｓ３４のＹ）、ステップＳ３８に遷移する。目的とする分割位置に達したため、新たな分割は行わない。上位のネストに入っていない場合（Ｓ３４のＮ）、ステップＳ１６に遷移し、新たな分割位置での分割を継続する。
【００３８】
ステップＳ２６において、取得された実行ステップ数が当該基準データ量以上の場合（Ｓ２６のＹ）、制御部２４は、この実行ステップ数が上記基準データ量と一致するか否かを判定する（Ｓ３６）。一致する場合（Ｓ３６のＹ）、仮分割プログラム保持部１８に最後に保存された仮分割プログラムを正式な分割プログラムに決定する（Ｓ３７）。一致しない場合（Ｓ３６のＮ）、仮分割プログラム保持部１８に前回保存された仮分割プログラムを正式な分割プログラムに決定する（Ｓ３８）。
【００３９】
制御部２４は、ステップＳ３７またはステップＳ３８で決定された分割プログラム内からエントリ関数の前後にある、当該分割プログラムで使用しない関数など、不要な記述を削除し最終的な分割プログラムを分割ソースプログラムファイルとして生成する（Ｓ３９）。以上で全体処理が終了する。
【００４０】
図３は、実施の形態に係る分割プログラムを実行させるべき、リコンフィギュラブル回路５０を搭載したプロセッサ５００の構成を示す図である。このプロセッサ５００は、設定データ保持部３０、シーケンサ装置４０、リコンフィギュラブル回路５０および出力データ保持部６０を備える。
【００４１】
設定データ保持部３０は、リコンフィギュラブル回路５０に所期の回路を構成するための設定データを保持し、その設定データをリコンフィギュラブル回路５０に供給する。シーケンサ装置４０は、設定データ保持部３０からリコンフィギュラブル回路５０に供給する設定データを選択する。
【００４２】
リコンフィギュラブル回路５０は、機能の変更が可能なＡＬＵを複数有する。具体的には、縦方向にｘ個、横方向にｙ個のＡＬＵが配置されたｘ×ｙのＡＬＵアレイを備える。ここでは、縦方向に四個、横方向に六個配置されている。ＡＬＵアレイに加えて、前段のＡＬＵ列の出力と後段のＡＬＵ列の入力との接続関係を設定可能な接続部を備える。各ＡＬＵの機能および各ＡＬＵ間の接続関係は、上記設定データにより設定される。通常、一クロックで一段のＡＬＵ（ｙ個）が同時に動作する。この一段のＡＬＵで実行されるプログラムの分量がスレッドの基本実行単位となる。
【００４３】
出力データ保持部６０は、リコンフィギュラブル回路５０から出力されるデータを保持する。このデータは、外部に出力されることも、リコンフィギュラブル回路５０の入力にフィードバックされることも可能である。
【００４４】
上述したように、基準とすべきオブジェクトデータ量としてプロセッサの実行ステップ数を採用することができる。図３に示すような、リコンフィギュラブル構成を備えたプロセッサでは、実行ステップ数をつぎのように規定することができる。まず、横方向にｙ個配置されたＡＬＵアレイ一段の一サイクルで実行可能な処理を、単位実行ステップ数と規定することができる。さらに、縦方向にｘ個、横方向にｙ個配置されたＡＬＵアレイ全体の一サイクルで実行可能な処理を、単位実行ステップ数と規定することもできる。基準データ量として実行ステップ数がｍと設定された場合、ＡＬＵアレイの一段または全体をｍ回使用して実行可能なプログラムの最大量が、分割すべきスレッドの最大量となる。ＡＬＵアレイの全体を基準とすると、ＡＬＵ列の空き時間を抑制し、より無駄のないコマンドの割り当てが可能となる。
【００４５】
図３に示すように、プロセッサ５００は出力データ保持部６０に出力されたデータがリコンフィギュラブル回路５０の初段にフィードバックする構成を持っているため、リコンフィギュラブル回路５０を複数サイクル使用する場合でも、その合計の段数をそのまま基準データ量とすることができる。
【００４６】
以下、実施の形態１に係るプログラム分割装置１００を用いたソースプログラムの分割処理と、その処理により分割された分割プログラムを図３に示したプロセッサ５００で実行させる処理を実際の具体例を用いて説明する。
【００４７】
図４は、実施の形態１に係るプログラム分割装置１００で分割すべき、分割開始位置がコメントとして埋め込まれているソースプログラムの第１例を示す。図５は、図４のソースプログラムの仮分割プログラムを示す。図６は、図４のソースプログラムの最終的な分割プログラムを示す。図７は、図４のソースプログラムに対応するデータフローグラフを示す。図８は、図６のソースプログラムに対応するデータフローグラフを示す。
【００４８】
ここでのデータフローグラフとは、リコンフィギュラブル回路５０の各ＡＬＵで実行すべき各演算間の実行順序の依存関係を表現し、入力変数および定数の演算の流れをグラフ形式で示したものである。図７、８のデータフローグラフは、４×６のＡＬＵアレイを持つリコンフィギュラブル回路５０に実行させるべきデータフローグラフを示す。各データフローグラフ内の、「○」が演算命令（以下適宜、ノードという）、「□」が入力変数または出力変数を示す。ＡＬＵアレイの配置構成とデータフローグラフの構成が対応していれば、上記単位実行ステップ数は、データフローグラフの一段（ＡＬＵアレイの一段に対応）または一ユニット（ＡＬＵアレイ全体に対応する）ととらえることができる。
【００４９】
以下、この例では４×６のＡＬＵアレイで実行可能な処理を単位実行ステップ数とし、上述した基準データ量として実行ステップ数＝２が設定されているものとする。
図４のソースプログラムは、配列ｘの要素０から要素７までに格納された値を順次加算し、その加算後の値に変数ｚ１と変数ｚ２の値を加算する演算処理を実行する。具体的には、変数ｙ＝０＋１＋２＋３＋４＋５＋６＋７＋８＋１００＋２００を演算する。
【００５０】
このソースプログラム内には、「＿ＶＭＳＩＺＥ＿ＣＨＫ＿ＳＴＡＲＴ＿」というコメントが埋め込まれている。開始位置情報検出部１２はこのコメントを検出すると、この行を分割すべき開始位置に設定する。
【００５１】
図５は、ｆｏｒ文の最後で分割された仮分割プログラムを示す。すなわち、変数ｙに対する変数ｚ１と変数ｚ２の加算は含まれていない。図５では、仮分割プログラム内の関数名を「ｄｉｖｉｄｅ＿ｔｍｐ」にしている。
【００５２】
図６は、正式に決定された分割プログラムを示す。分割位置が図５の仮分割プログラムと同じであるため、その分割位置が上記基準データ量を満たす、最大の分割位置であったことが分かる。図６では、正式な分割プログラム内の関数名を「Ｄｉｖｉｄｅ＿Ｒｅｓｕｌｔ」にしている。
【００５３】
図７は、コンパイラ２００により図４のソースプログラムが変換されたデータフローグラフである。ノード内の「ＭＯＶ」はスルー、「＋」は加算処理である。ここでは実行ステップ数＝３、すなわち最終結果を出力する時点が上記ＡＬＵアレイの三サイクル目になるため、基準データ量である実行ステップ数＝２の条件を満たしていない。
【００５４】
図８は、コンパイラ２００により図６のソースプログラムが変換されたデータフローグラフである。ここでは実行ステップ数＝２、すなわち最終結果を出力する時点が上記ＡＬＵアレイの二サイクル目の最終段になるため、基準データ量である実行ステップ数＝２の条件を満たしている。
【００５５】
図９は、実施の形態１に係るプログラム分割装置１００で分割すべき、分割開始位置がコメントとして埋め込まれているソースプログラムの第２例を示す。図１０は、図９のソースプログラムの仮分割プログラムを示す。図１１は、図９のソースプログラムの最終的な分割プログラムを示す。図１２は、図９のソースプログラムに対応するデータフローグラフを示す。図１３は、図１１のソースプログラムに対応するデータフローグラフを示す。
【００５６】
以下、この例では４×６のＡＬＵアレイで実行可能な処理を単位実行ステップ数とし、上述した基準データ量として実行ステップ数＝３が設定されているものとする。
図９のソースプログラムの基本構造は、ヘッダファイルから読み込まれた変数ＥＸＴ＿ｉｎ１が０より小さいとき、「変数Ｇ＿ａａａ」＝「変数Ｇ＿ａａａ１」＋２＋３＋「変数ＥＸＴ＿ｉｎ１」＋１を演算し、０以上のとき、「変数Ｇ＿ａａａ」＝「変数Ｇ＿ａａａ」＋１＋１を演算するものである。
【００５７】
このソースプログラム内には、「＿ＶＭＳＩＺＥ＿ＣＨＫ＿ＳＴＡＲＴ  」というコメントが埋め込まれている。開始位置情報検出部１２はこのコメントを検出すると、この行を分割すべき開始位置に設定する。
【００５８】
図１０は、２回目に登場するｉｆ文の最後で分割された仮分割プログラムを示す。すなわち、３、４回目ｉｆ文は含まれていない。図１１は、正式に決定された分割プログラムを示す。分割位置が図１０の仮分割プログラムと同じであるため、その分割位置が上記基準データ量を満たす、最大の分割位置であったことが分かる。図１０と図１１とを比較すると、図１１では、ｖｏｉｄ  ｆｕｎｃ３（）  ｛Ｇ＿ａａａ＋＝３；｝が削除されていることが分かる。この処理は３回目のｉｆ文の判断結果により実行される関数であり、分割プログラムに３回目のｉｆ文が含まれない以上、不要な記述であり削除される。
【００５９】
図１２は、コンパイラ２００により図９のソースプログラムが変換されたデータフローグラフである。ノード間の実線は実際のデータの流れを示し、点線は制御信号、たとえば条件判定結果の流れを示す。ノード内の「＞＝」、「！＝」は条件判定処理、「ｍｅｒｇｅ」は制御信号に応じて入力データを切り替える処理である。たとえば、そのデータフローグラフの二段目の二列に位置するノード内の、「ｍｅｒｇｅ」は一段目一列に位置するノードからの制御信号を受けて「１」を取り込むか、変数「Ｇ＿ｓｔａｇｅ」を取り込むかを決定する。
【００６０】
図１２のデータフローグラフでは、実行ステップ数＝４、すなわち最終結果を出力する時点が上記ＡＬＵアレイの四サイクル目になるため、基準データ量である実行ステップ数＝３の条件を満たしていない。
【００６１】
図１３は、コンパイラ２００により図１１のソースプログラムが変換されたデータフローグラフである。ここでは実行ステップ数＝３、すなわち最終結果を出力する時点が上記ＡＬＵアレイの三サイクル目の最終段になるため、基準データ量である実行ステップ数＝３の条件を満たしている。
【００６２】
つぎに実施の形態１に係るプログラム分割装置１００の変形例について説明する。本変形例は、基本例のように暫定終了位置を順次移動させるのではなく、二分法を用いて暫定終了位置を移動させる。
【００６３】
以下、図１に示した構成要素の、基本例と異なる動作について説明する。
終了位置設定部１４は、分割すべきソースプログラム内において、開始位置情報検出部１２により検出された分割開始位置情報で特定される開始位置の行と、その開始位置を含む単位演算処理の最終行と、の半分の位置にある行を暫定終了位置の初期値とする。単位演算処理全体の行数が割り切れない場合、小数を切り捨てするか切り上げるかして整数にする。以下、本変形例の他の除算についても同様とする。
【００６４】
制御部２４は、取得データ量が基準データ量を超えるとき、初期では、上記開始位置の行から上記最終行までの１／４の行数、二回目以降では、上記暫定終了位置を前回移動した行数の半分の行数、戻すよう終了位置設定部１４に指示する。逆に、取得データ量が基準データ量未満のとき、初期では、上記開始位置の行から上記最終行までの１／４の行数、二回目以降では、上記暫定終了位置を前回移動した行数の半分の行数、進めるよう終了位置設定部１４に指示する。取得データ量と基準データ量が一致したとき、仮分割プログラム保持部１８に最後に登録された仮分割プログラムを正式な分割プログラムとする。上記暫定終了位置が前回移動した行数が一のとき、取得データ量が基準データ量以下である仮分割プログラムのうち、仮分割プログラム保持部１８に最後に登録された仮分割プログラムを正式な分割プログラムとする。
【００６５】
制御部２４は、取得データ量が基準データ量を超えるときの仮分割プログラムを、仮分割プログラム登録部１６に登録しないよう指示してもよいし、または仮分割プログラム保持部１８に登録された後に、その仮分割プログラムを仮分割プログラム保持部１８内から削除してもよい。
【００６６】
図１４は、実施の形態１の変形例に係るプログラム分割装置１００の動作例を示すフローチャートである。前提として、単位時間あたりのプロセッサの最大実行ステップ数が基準データ量としてオブジェクトデータ量保持部１０に保持されているものとする。また、分割すべきソースプログラムには、その分割開始位置を指定するコメントが埋め込まれているものとする。
【００６７】
まず、プログラム分割装置１００にソースプログラムファイルが読み込まれ（Ｓ４０）、開始位置情報検出部１２は、そのソースプログラムに分割開始位置がコメントとして埋め込まれているか否か調査する（Ｓ４２）。そのコメントが埋め込まれていなければ（Ｓ４２のＮ）、処理不能として終了する。埋め込まれていれば（Ｓ４２のＹ）、つぎの処理へ移行する。
【００６８】
開始位置情報検出部１２は、当該コメントのある行を分割開始位置に設定し、終了位置設定部１４は、その行と、その行を含む関数の最終行との半分に位置する行を分割すべき暫定終了位置の初期値に設定する（Ｓ４４）。仮分割プログラム登録部１６は、エントリ関数内で、開始位置から暫定終了位置までに関係のないソースプログラムの記述を削除する（Ｓ４６）。仮分割プログラム登録部１６は、上記記述の削除後のソースプログラムを仮分割プログラムファイルとして、仮分割プログラム保持部１８に一時保存する（Ｓ４８）。
【００６９】
変換指示部２０は当該仮分割プログラムをコンパイラ２００にコンパイルさせる（Ｓ５０）。変換結果取得部２２は、コンパイラ２００から変換結果として実行ステップ数を取得する（Ｓ５２）。制御部２４は、この実行ステップ数と上記基準データ量とが一致するか否か判定する（Ｓ５４）。一致する場合（Ｓ５４のＹ）、ステップＳ６４に遷移し、一致しない場合（Ｓ５４のＮ）、ステップＳ５６に遷移する。
【００７０】
ステップＳ５６において、制御部２４は、暫定終了位置を二分法によりさらに移動可能か否かを判定する（Ｓ５６）。前回の移動行数が１行の場合、移動不能となる。移動可能な場合（Ｓ５６のＹ）、ステップＳ５８に遷移し、移動不能な場合（Ｓ５６のＮ）、ステップＳ６４に遷移する。
【００７１】
ステップＳ５８において、制御部２４は、取得された実行ステップ数が上記基準データ量より大きいか小さいか判定する（Ｓ５８）。大きい場合（Ｓ５８のＹ）、暫定終了位置を二分法により後退させるよう終了位置設定部１４に指示する。具体的には、前回移動した行数の半分の行数後退させるよう指示する（Ｓ６０）。小さい場合（Ｓ５８のＮ）、暫定終了位置を二分法により前進させるよう終了位置設定部１４に指示する（Ｓ６２）。具体的には、前回移動した行数の半分の行数前進させるよう指示する。ステップＳ６０またはステップＳ６２の後、ステップＳ４６に遷移し、新たな分割位置での分割を継続する。
【００７２】
ステップＳ６４において、制御部２４は、取得された実行ステップ数が上記基準データ量以上の仮分割プログラムのうち、最後に登録された仮分割プログラムを正式な分割プログラムに決定する（Ｓ６４）。
【００７３】
なお、フローチャートには記述しないがこの正式な分割プログラムがコンパイラ２００からエラーが通知されたものである場合、この分割プログラムの終了位置を、コンパイルした際にエラーが発生しない位置まで後退させるよう終了位置設定部１４に指示し、その位置の仮分割プログラムを正式な分割プログラムに決定する。
【００７４】
また、上記正式な分割プログラムの終了位置が開始位置のネストより下位のネストに入っている場合、この仮分割プログラムの終了位置を、開始位置のネストと同位になる位置まで後退させるよう終了位置設定部１４に指示する。その位置の仮分割プログラムを正式な分割プログラムに決定する。
【００７５】
制御部２４は、当該正式な分割プログラムからエントリ関数の前後にある、当該分割プログラムで使用しない関数など、不要な記述を削除し最終的な分割プログラムを分割ソースプログラムファイルとして生成する（Ｓ６６）。以上で全体処理が終了する。
【００７６】
以上説明したように実施の形態１によれば、基準とすべきオブジェクト量を登録し、かつ分割開始位置を指定するだけで、終了位置はシステムが最適な位置に決定することから、簡単にソースプログラムを好適な位置で分割することができる。リアルタイム性が保証される最大処理量の実行が可能な位置で分割することができる。これにより、複数のスレッドを時分割に処理する場合、各スレッドのリアルタイム性が保証されつつ、全体の処理時間を短縮することができる。よって、マルチスレッドに対応したアプリケーションの開発効率を向上させることができる。とくに、リコンフィギュラブル回路を搭載したプロセッサで実行させることに適した、短いサイクル時間で実行ステップ数を一定の値以下に抑えることを要請されるアプリケーションを開発する場合に有効である。
【００７７】
また、実際に仮分割プログラムをコンパイルして実行ステップ数を求めることにより、コンパイラによる最適化を反映させた正確な実行ステップ数を求めることができる。ライブラリ情報をもとに予測するだけでは、最適化を反映した正確な実行ステップ数を求めることが困難である。
【００７８】
また、最適な終了位置を探索するために二分法を採用すると、最適な終了位置を探索するまでの時間を平準化することができる。なお、制御部２４は開始位置を含む単位演算処理の長さに応じて、順次探索を採用するか二分法探索を採用するか決定してもよい。すなわち、所定の行数より短いとき前者を採用し、長いとき後者を採用する。これにより、最適な終了位置までの探索時間をより最適化することができる。
【００７９】
図１５は、実施の形態２に係る情報処理システム３００の構成を示すブロック図である。情報処理システム３００は、プログラム分割装置１００およびコンパイラ２００を備える。プログラム分割装置１００は、開始位置情報検出部１２、終了位置情報検出部１５、変換指示部２０および変換結果取得部２２を備える。
【００８０】
開始位置情報検出部１２は、ソースプログラム内から分割開始位置情報を検出する。終了位置情報検出部１５は、ソースプログラム内から分割終了位置情報を検出する。このソースプログラム内には、分割開始位置情報と同様に、分割を終了すべき位置に分割開始位置情報が付加されている。
【００８１】
変換指示部２０は、開始位置情報検出部１２により検出された分割開始位置情報で特定される開始位置と、終了位置情報検出部により検出された分割終了位置情報で特定される終了位置とで規定される分割プログラムをコンパイルするよう所定のコンパイラ２００に指示する。変換結果取得部２２は、変換指示部２０による指示に応じた、コンパイラ２００の変換結果を取得する。ここでは、オブジェクトデータ量およびエラーの有無の、少なくとも一方を取得する。オブジェクトデータ量を実行ステップ数で規定する場合、コンパイラ２００からオブジェクトデータ量をプロセッサの実行ステップ数として取得してもよいし、取得したオブジェクトファイルからプロセッサの実行ステップ数をプログラム分割装置１００側で求めてもよい。
【００８２】
図１６は、実施の形態２に係るプログラム分割装置１００の動作例を示すフローチャートである。前提として、分割すべきソースプログラムには、その分割開始位置を指定するコメントおよびその分割終了位置を指定するコメントが埋め込まれているものとする。
【００８３】
まず、プログラム分割装置１００にソースプログラムファイルが読み込まれ（Ｓ７０）、開始位置情報検出部１２および終了位置情報検出部１５は、そのソースプログラムに分割開始位置および分割終了位置がコメントとしてそれぞれ埋め込まれているか否か調査する（Ｓ７２）。そのコメントの少なくとも一方が埋め込まれていなければ（Ｓ７２のＮ）、処理不能として終了する。両方埋め込まれていれば（Ｓ７２のＹ）、つぎの処理へ移行する。
【００８４】
開始位置情報検出部１２および終了位置情報検出部１５は、それらコメントのあるエントリ関数内で、開始位置から終了位置までに関係のないソースプログラムの記述を削除する（Ｓ７４）。変換指示部２０は、開始位置から終了位置までの分割プログラムをコンパイラ２００にコンパイルさせる（Ｓ７６）。変換結果取得部２２は、コンパイラ２００からエラー通知を受けたか否か判定する（Ｓ７８）。受けた場合（Ｓ７８のＹ）、実行ステップ数を取得する必要がないため、処理を終了する。受けていない場合（Ｓ７８のＮ）、コンパイラ２００から実行ステップ数を取得する（Ｓ８０）。変換結果取得部２２は、当該分割プログラムからエントリ関数の前後にある、当該分割プログラムで使用しない関数など、不要な記述を削除し最終的な分割プログラムを分割ソースプログラムファイルとして生成する（Ｓ８２）。以上で全体処理が終了する。
【００８５】
図１７は、実施の形態２に係るプログラム分割装置１００で分割すべき、分割開始位置がコメントとして埋め込まれているソースプログラムを示す。図１８は、図１７のソースプログラムの最終的な分割プログラムを示す。図１９は、図１８のソースプログラムに対応するデータフローグラフを示す。
【００８６】
図１７のソースプログラムは、上述した図４のソースプログラムと同様の演算を実行するためのプログラムである。このソースプログラム内には、「＿ＶＭＳＩＺＥ＿ＣＨＫ＿ＳＴＡＲＴ＿」および「＿ＶＭＳＩＺＥ＿ＣＨＫ＿ＥＮＤ＿」というコメントが埋め込まれている。開始位置情報検出部１２は「＿ＶＭＳＩＺＥ＿ＣＨＫ＿ＳＴＡＲＴ＿」を検出すると、この行を分割開始位置に設定する。終了位置情報検出部１５は「＿ＶＭＳＩＺＥ＿ＣＨＫ＿ＥＮＤ＿」を検出すると、この行を分割終了位置に設定する。図１８では、エントリ関数内にて、範囲指定された演算処理、すなわち「ｙ＋＝ｚ１」および「ｙ＋＝ｚ２」以外の記述は不要な記述として削除されている。図１９は、コンパイラ２００により図１８のソースプログラムが変換されたデータフローグラフである。ＡＬＵアレイ全体を単位実行ステップ数と規定した場合、実行ステップ数＝１となり、ＡＬＵアレイの一段を単位実行ステップ数と規定した場合、実行ステップ数＝３となる。
【００８７】
以上説明したように実施の形態２によれば、分割開始位置と分割終了位置を指定するだけで、分割しようとしている分割プログラムの、コンパイル後の正確な実行ステップ数を簡単に確認することができる。また、その位置で分割した場合にエラーが発生するか否かも簡単に確認することができる。
【００８８】
以上、本発明をいくつかの実施形態をもとに説明した。これらの実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【００８９】
たとえば、上述した実施の形態１では上記基準データ量として実行ステップ数を使用したが（ステップＳ２６などの判定処理）、これに代えてメモリ使用量やメモリアクセス数など、ボトルネックになりうるものを基準データ量として使用してもよい。また、複数の要素に対応する複数の基準データ量を組み合わせて、少なくとも一つの要素がそれに対応する基準データ量を超えるか否かで判断してもよい。
【００９０】
また、図２、図１４のフローチャートでは、分割開始位置がコメントとして埋め込まれていなければエラーとして終了した。この点、終了せずに分割開始位置を分割すべきソースプログラムの先頭に設定してもよい。この場合、コメントなどが付されていないことを、分割開始位置を先頭に指定する分割開始位置情報ととらえればよい。
【００９１】
また、図２のフローチャートでは、暫定終了位置が開始位置より下位のネストに到達した場合、同位のネストに到達するまでコンパイルをスキップしたが、そのネストの関数をインライン展開し、逐次、コンパイルしてもよい。
【図面の簡単な説明】
【００９２】
【図１】実施の形態１に係る情報処理システムの構成を示すブロック図である。
【図２】実施の形態１に係るプログラム分割装置の動作例を示すフローチャートである。
【図３】実施の形態に係る分割プログラムを実行させるべき、リコンフィギュラブル回路を搭載したプロセッサの構成を示す図である。
【図４】実施の形態１に係るプログラム分割装置で分割すべき、分割開始位置がコメントとして埋め込まれているソースプログラムの第１例を示す図である。
【図５】図４のソースプログラムの仮分割プログラムを示す図である。
【図６】図４のソースプログラムの最終的な分割プログラムを示す図である。
【図７】図４のソースプログラムに対応するデータフローグラフを示す図である。
【図８】図６のソースプログラムに対応するデータフローグラフを示す図である。
【図９】実施の形態１に係るプログラム分割装置で分割すべき、分割開始位置がコメントとして埋め込まれているソースプログラムの第２例を示す図である。
【図１０】図９のソースプログラムの仮分割プログラムを示す図である。
【図１１】図９のソースプログラムの最終的な分割プログラムを示す図である。
【図１２】図９のソースプログラムに対応するデータフローグラフを示す図である。
【図１３】図１１のソースプログラムに対応するデータフローグラフを示す図である。
【図１４】実施の形態１の変形例に係るプログラム分割装置の動作例を示すフローチャートである。
【図１５】実施の形態２に係る情報処理システムの構成を示すブロック図である。
【図１６】実施の形態２に係るプログラム分割装置の動作例を示すフローチャートである。
【図１７】実施の形態２に係るプログラム分割装置で分割すべき、分割開始位置がコメントとして埋め込まれているソースプログラムを示す図である。
【図１８】図１７のソースプログラムの最終的な分割プログラムを示す図である。
【図１９】図１８のソースプログラムに対応するデータフローグラフを示す図である。
【符号の説明】
【００９３】
１０  オブジェクトデータ量保持部、  １２  開始位置情報検出部、  １４  終了位置設定部、  １５  終了位置情報検出部、  １６  仮分割プログラム登録部、  １８  仮分割プログラム保持部、  ２０  変換指示部、  ２２  変換結果取得部、  ２４  制御部、  ３０  設定データ保持部、  ４０  シーケンサ装置、  ５０  リコンフィギュラブル回路、  ６０  出力データ保持部、  １００  プログラム分割装置、  ２００  コンパイラ、  ３００  情報処理システム、  ５００  プロセッサ。  
【図１】
0005197061.tif 000002
【図２】
0005197061.tif 000003
【図３】
0005197061.tif 000004
【図４】
0005197061.tif 000005
【図５】
0005197061.tif 000006
【図６】
0005197061.tif 000007
【図７】
0005197061.tif 000008
【図８】
0005197061.tif 000009
【図９】
0005197061.tif 000010
【図１０】
0005197061.tif 000011
【図１１】
0005197061.tif 000012
【図１２】
0005197061.tif 000013
【図１３】
0005197061.tif 000014
【図１４】
0005197061.tif 000015
【図１５】
0005197061.tif 000016
【図１６】
0005197061.tif 000017
【図１７】
0005197061.tif 000018
【図１８】
0005197061.tif 000019
【図１９】
0005197061.tif 000020