図1は、実施例に係る処理装置10の構成図である。処理装置10は、回路構成を再構成可能とする機能を有した集積回路装置26を備える。集積回路装置26は1チップとして構成され、リコンフィギュラブル回路12、設定データ保持部14、シーケンサ装置20、出力データ保持部30および経路部32を備える。リコンフィギュラブル回路12は、設定を変更することにより、機能の変更を可能とする。本実施例におけるリコンフィギュラブル回路12は、機能に対応する処理を実行ステップ毎(後述する図2に示す段)に順次実行する。
設定データ保持部14は、リコンフィギュラブル回路12に所期の回路を構成するための設定データを複数保持し、設定データを所定の時間間隔でリコンフィギュラブル回路12に順次供給する。設定データ保持部14は、記憶した設定データを、指定されたアドレス値をもとに出力するコマンドメモリとして構成されてもよい。この場合、設定データはコマンドデータと呼ぶことができる。シーケンサ装置20は、設定データ保持部14に記憶された複数の設定データの中から、リコンフィギュラブル回路12に供給する設定データを選択する機能をもつ。
経路部32は、フィードバックパスとして機能し、リコンフィギュラブル回路12の出力を、リコンフィギュラブル回路12の入力に接続する。出力データ保持部30は、リコンフィギュラブル回路12から出力されるデータ信号および/または外部から入力されるデータ信号を格納するための記憶領域を有する。出力データ保持部30に格納されたデータ信号は、経路部32を通じてリコンフィギュラブル回路12の入力に伝達され、また図示しない制御部からの出力指示に基づいて処理装置10の外部に出力される。
リコンフィギュラブル回路12は、機能の変更が可能な複数の論理回路を有して構成される。具体的には、リコンフィギュラブル回路12は、複数の演算機能を選択的に実行可能な論理回路を複数段に配列させた構成を有する。リコンフィギュラブル回路12は、前段の論理回路列の出力と後段の論理回路列の入力との接続関係を設定可能な接続部を有する。複数の論理回路は、マトリックス状に配置されてもよい。
各論理回路の機能と、論理回路間の接続関係とは、設定データ保持部14により供給される設定データに基づいて設定される。設定データは、所定の時間間隔でリコンフィギュラブル回路12に供給される。したがって、リコンフィギュラブル回路12は、供給される設定データに応じた演算処理機能を実行する。
シーケンサ装置20は、リコンフィギュラブル回路12における演算結果、具体的には分岐条件の判定結果をもとに、設定データ保持部14がリコンフィギュラブル回路12に供給する設定データを管理する。シーケンサ装置20は、実行すべきプログラムから生成される制御データに基づいて、設定データ保持部14から所期の設定データを出力させる。設定データおよび制御データは、以下の手順で生成される。
集積回路装置26により実現されるべきプログラムが、記憶部40に保持されている。プログラムは、リコンフィギュラブル回路12における所期の演算処理を記述し、具体的には信号処理回路または信号処理アルゴリズムなどをC言語などの高級言語で記述したものである。
コンパイル部50は、記憶部40に格納されたプログラムを読み出す。コンパイル部50は、読み出したプログラムをコンパイル処理し、複数のデータフローグラフ(DFG)と、DFGの処理順序を示すフローデータとを生成する。コンパイル部50は、生成したDFGとそのフローデータとを記憶部40に格納する。
DFGは、回路における演算子(演算間)の処理順序の依存関係を表現し、入力変数および定数の演算の流れをグラフ構造で示したものである。一般にDFGは、上から下に向かって演算が進むように形成される。
複数のDFGは、一つのプログラムを複数のサブプログラムに分解して、そのサブプログラムのそれぞれを変換することで生成される。DFGフローデータは、複数のサブプログラムに対応するDFGの処理順序を定め、特に条件分岐が発生する場合の分岐元と分岐先のDFGの処理順序を決定するように生成される。
設定データ生成部51は、DFGを、対応する設定データに変換し、設定データ保持部14に格納する。制御データ生成部54は、DFGフローデータを、対応する制御データに変換し、シーケンサ装置20に格納する。設定データは、DFGをリコンフィギュラブル回路12にマッピングするためのデータであり、リコンフィギュラブル回路12における論理回路の機能や論理回路間の接続関係を定める。
制御データは、リコンフィギュラブル回路12にマッピングする設定データ(DFG)の接続関係を表現するデータである。制御データは、リコンフィギュラブル回路12における演算の実行中、分岐条件の判定結果である分岐制御データ_SEQ_に応じて、分岐先となるDFGを定める。
シーケンサ装置20は、設定データ保持部14に、読出アドレスを供給する。このとき、リコンフィギュラブル回路12から供給される分岐制御データ_SEQ_などの値に応じて、次にリコンフィギュラブル回路12に供給する設定データの読出アドレスを決定する。設定データ保持部14は、読出アドレスを受けると、そのアドレスに格納した設定データをリコンフィギュラブル回路12に供給する。
図2は、リコンフィギュラブル回路12の構成の一例を示す。リコンフィギュラブル回路12は、それぞれが複数の演算機能を選択的に実行可能な論理回路の多段配列と、前段の論理回路の出力と後段の論理回路の入力の接続関係を任意に設定可能な接続部52とを備える。
リコンフィギュラブル回路12では、論理回路の多段配列構造により、上段から下段に向かって演算が進められる。なお、本明細書において「多段」とは、複数の段を意味する。なお、リコンフィギュラブル回路12の回路構成は、必ずしも多段配列を有する必要はないが、回路規模を削減するために全ての論理回路間の接続を可能とするのではなく、一部の論理回路同士の接続を実現させるのが好ましい。
リコンフィギュラブル回路12は、論理回路としてALU(Arithmetic Logic Unit)を有している。ALUは、複数種類の多ビット演算を選択的に実行可能な算術論理回路であって、論理和、論理積、ビットシフトなどの複数種類の多ビット演算を設定により選択的に実行できる。各ALUは、複数の演算機能を設定するためのセレクタを有して構成されている。図示の例では、ALUが、2つの入力端子と1つの出力端子を有して構成される。
リコンフィギュラブル回路12は、縦方向にX個、横方向にY個のALUが配置されたX段Y列のALUアレイとして構成される。ここでは、縦方向に3個、横方向に6個のALUが配置された3段6列のALUアレイを示している。
リコンフィギュラブル回路12は、接続部52およびALU列53を備える。ALU列53は複数段に設けられ、接続部52は前後段のALU列53の間に設けられて、前段のALUの出力と後段のALUの入力の接続関係を設定する。
図2に示す例では、第1段のALU列53aと第2段のALU列53bの間に、第2段を構成する接続部52bが設けられている。第2段のALU列53bと第3段のALU列53cの間に、第3段を構成する接続部52cが設けられる。なお、第1段を構成する接続部52aは、第1段のALU列53aの上側に設けられる。
第1段のALU11、ALU12、・・・、ALU16には、入力変数や定数が入力され、設定された所定の演算がなされる。演算結果の出力は、第2段の接続部52bに設定された接続にしたがって、第2段のALU21、ALU22、・・・、ALU26に入力される。
第2段の接続部52bにおいては、第1段のALU列53aの出力と第2段のALU列53bの入力の間で任意の接続関係、あるいは予め定められた接続関係の組合せの中から選択された接続関係を実現できるように接続用結線が構成されており、設定により所期の結線が有効となる。
第2段のALU21、ALU22、・・・、ALU26には、ALU列53aの出力が入力され、設定された所定の演算がなされる。演算結果の出力は、第3段の接続部52cの接続用結線において設定された接続にしたがって、第3段のALU31、ALU32、・・・、ALU36に入力される。
最終段となる第3段のALU列53cからの出力データは、出力データ保持部30に出力される。出力データ保持部30は、経路部32を介して、出力データを接続部52aに入力する。接続部52aは、接続用結線を設定し、第1段のALU11、ALU12、・・・、ALU16にデータを供給する。演算処理の最終結果が生成された場合には、出力データ保持部30が、データを処理装置10の外部に出力する。
図3は、コンパイル部50の構成を示す。コンパイル部50は、プログラム解析部100、シーケンス処理部102、分割部104、DFG生成部106、フローデータ生成部108を備える。
実施例におけるデータフローグラフ処理機能は、処理装置10において、CPU、メモリ、メモリにロードされたDFG処理用プログラムなどによって実現され、ここではそれらの連携によって実現される機能ブロックを描いている。DFG処理用プログラムは、処理装置10に内蔵されていてもよく、また記録媒体に格納された形態で外部から供給されるものであってもよい。したがってこれらの機能ブロックがハードウエアのみ、ソフトウエアのみ、またはそれらの組合せによっていろいろな形で実現できることは、当業者に理解されるところである。
図4は、本実施例におけるDFG処理方法のフローチャートを示す。まず、プログラム解析部100が、記憶部40に格納されたプログラムを読み出し(S10)、プログラムの解析を実行する(S12)。
プログラム解析部100は、以降の処理を効率的に実行するための前処理部であり、プログラムに含まれる関数の展開等を実行する。シーケンス処理部102は、プログラム記述内容に基づいて、プログラム中にシーケンス処理指定と分岐条件の演算を付加する(S14)。
本実施例においてシーケンス処理は、プログラムを複数のサブプログラムに分割するための前処理であり、プログラム中の分岐処理を検出して、シーケンス処理指定を実行する。分割部104は、シーケンス処理部102により付加されたシーケンス処理指定に基づいて、プログラムを複数のサブプログラムに分割する(S16)。このとき、分割部104は、分岐先の処理のそれぞれをサブプログラムとして抽出する。
DFG生成部106は、サブプログラムごとに、リコンフィギュラブル回路12の回路構成に適したDFGを生成し(S18)、記憶部40に格納する。フローデータ生成部108は、シーケンス処理指定と分岐条件を付加したプログラムとサブプログラムに基づいて、DFGのフローデータを生成する(S22)。
設定データ生成部51は、生成されたDFGからリコンフィギュラブル回路12用の設定データを生成し(S20)、制御データ生成部54は、DFGのフローデータからシーケンサ装置20に設定するための制御データを生成する(S24)。
図5は、ソースプログラムの一例を示す。このプログラムでは、func0を実行すると、func1が呼び出される。図6は、func1をfunc0中に展開して、一つのプログラムにまとめた形を示す。プログラム解析部100が、この関数の展開処理を実行する。関数を展開することで、後に実行するシーケンス処理指定やプログラムの分割処理を効率的に実行することが可能となる。シーケンス処理部102は、プログラム解析部100により解析されたプログラム中に、シーケンス処理の指定と分岐条件の演算を付加する。
図7は、シーケンス処理部102の動作を示すフローチャートである。まず、シーケンス処理部102は、mをプログラムの行数に設定する(S100)。シーケンス処理部102は、図6に示すプログラムを参照し、プログラムの行数が10行であるため、m=10を設定する。シーケンス処理部102は、i=1を設定する(S102)。シーケンス処理部102は、プログラムi行目を解析して(S104)、シーケンス処理を実行する部分であるかを調べる(S106)。
シーケンス処理は、プログラムを分割するための前処理であり、ループ数不定のループ演算のように単純にDFG化しただけでは演算処理が実行できない場合、もしくはシーケンス処理を実行することで回路規模、処理速度等のパフォーマンスが向上する場合に実行するものであり、実行するか否かは、プログラム中の機能または処理内容等で判定する。
本実施例では、分岐文(if文等)で文中の演算数が2つ以上、ループ文(for文等)でループ回数が不定または10回以上である場合に、シーケンス処理が実行される。このように、シーケンス処理の実行を、分岐先の処理量が所定量を超えるか否かに基づいて判断することで、リコンフィギュラブル回路12に供給する設定データを効率よく作成することが可能となる。
図6のプログラムにおいて、プログラム1行目の記述内容が「int i;」であり、その記述内容が分岐文またはループ文でないため、シーケンス処理部102は、シーケンス処理を実行しない(S106のN)。このとき、シーケンス処理部102は、iがmに等しいか否かを判定する(S114)。ここではi=1、m=10であるため(S114のN)、シーケンス処理部102は、iに1を加えて(S116)、i=2を設定する。
ステップはS104に戻り、プログラム2行目の記述内容が「x+=1;」であるため、シーケンス処理部102は、同様にシーケンス処理を実行しないことを判定する(S106のN)。シーケンス処理部102は、iに1を加えて(S116)、i=3を設定する。プログラム3行目の記述内容は「if(*y>0){」である。
if文のシーケンス処理の実行条件は前述のように演算数が2つ以上存在することである。ここでif文中の演算を参照すると、「x=x>>2;」、「*y-=x+3;」であり、演算数が2つ以上であるため、シーケンス処理部102はシーケンス処理を実行することを判定する(S106のY)。
次に、シーケンス処理部102は、プログラムの構文解析を実行し、シーケンス処理の範囲と分岐条件の選定を実行する(S108)。この場合、シーケンス処理の範囲は「if(){・・・}」であり、分岐条件は「*y>0」である。次に、シーケンス処理部102は、プログラム中に分岐条件を判定する演算命令を付加する(S110)。
図8は、図6に示すプログラムのif文の前に判定演算命令を付加したプログラムを示す。この例では、判定演算命令は「_SEQ_=*y>0;」である。分岐条件は「*y>0」である。従って、シーケンス処理部102は、シーケンス処理を実行する部分であることを示すため、if文を「if(_SEQ_)」と記述する(S112)。
「if(_SEQ_)」は、シーケンス処理を実行する部分であることを示す「シーケンス処理指定」である。ここで、「_SEQ_」は、分岐選択に必要なリコンフィギュラブル回路12からの出力信号に相当する変数となる。
リコンフィギュラブル回路12における演算処理の実行時、_SEQ_は、分岐制御データとしてリコンフィギュラブル回路12からシーケンサ装置20に供給される。シーケンサ装置20は、分岐制御データ_SEQ_を受け取ると、保持する制御データに基づいて、次に実行するDFGの設定データの読出アドレスを生成して、設定データ保持部14に供給する。
S112の後、シーケンス処理部102は、iがmに等しいか否かを判定する(S114)。このとき、シーケンス処理部102は、i=3、m=10であるため(S114のN)、iに1を加えて(S116)、i=4を設定する。
シーケンス処理部102は、プログラム4行目の記述内容が「x=x>>2;」であるため、シーケンス処理を実行しない(S106のN)。シーケンス処理部102は、iに1を加え、i=5を設定する(S116)。以降同様にフローを実行する。i=8のとき、プログラム8行目の記述内容は「for(i=0;i<100;i++){」である。for文のシーケンス処理の条件は前述のようにループ回数が不定または10回以上である。ここで、for文のループ回数を参照すると、ループ回数は100回である。このため、シーケンス処理部102は、シーケンス処理を実行すると判定をする(S106のY)。
シーケンス処理部102は、プログラムの構文解析を実行し、シーケンス処理の範囲と分岐条件の選定を実行する(S108)。この場合、シーケンス処理の範囲は「for(){・・・}」であり、分岐条件は「i<100」である。次にプログラム中に分岐条件を判定する演算命令を付加する(S110)。分岐条件が「i<100」であるため、図8に示すように、シーケンス処理部102は、for文中の最後尾に判定演算命令「_SEQ_=i<100;」を付加する。また、for文の前にiの初期化のための「i=0;」を付加する。
そして、シーケンス処理部102は、シーケンス処理を実行する部分であることを示すため、for文を「do{・・・}while(_SEQ_);」と記述する(S112)。「do{・・・}while(_SEQ_);」は、シーケンス処理を実行する部分であることを示す「シーケンス処理指定」である。この場合、ループ回数が100回と固定であるが、例えば分岐条件が「i<*y」のようにループ回数が不定の場合は、for文中の最後尾とfor文の前に判定演算命令「_SEQ_=i<*y;」を付加する。
続いて、シーケンス処理部102は、iがmに等しいか否かを判定する(S114)。シーケンス処理部102は、i=8、m=10であるため(S114のN)、iに1を加えて(S116)、i=9を設定する。以降同様にフローを実行し、シーケンス処理部102は、i=10のときi=mとなるため(S114のY)、シーケンス処理部102におけるシーケンス処理を終了する。以上のシーケンス処理により、図8に示すシーケンス指定付きプログラムが生成される。分割部104は、シーケンス処理指定に基づいてプログラムをサブプログラムに分割する。
図9は、分割部104の動作を示すフローチャートである。まず、分割部104は、mをシーケンス処理指定のプログラム部分の総数に設定する(S200)。図8に示すシーケンス指定付きプログラムでは、シーケンス処理部分は「if(_SEQ_){・・・}」と「do{・・・}while(_SEQ_)」の2箇所である。このため、分割部104はm=2を設定する。
次に、分割部104は、mが0であるか否かを判定する(S202)。分割部104は、m=0であれば(S202のY)、全プログラムをひとつのサブプログラムとして(S212)、分割処理を終了する。ここでは、分割部104は、m=2であるため(S202のN)、i=1を設定する(S204)。
続いて、分割部104は、i番目のシーケンス処理指定のプログラム部分をひとつのサブプログラムとして分割する(S206)。図8を参照して、1番目のシーケンス処理部分は「if(_SEQ_){・・・}」であるため、分割部104はその部分をひとつのサブプログラムとする。
図10は、図8に示すプログラムを分割して最終的に生成された複数のサブプログラムを示しており、「if(_SEQ_){・・・}」は、図10のfunc02に示すサブプログラムとして切り出される。
プログラム中の「if(_SEQ_)」は、func02を実行するかどうかの判断に相当するが、この判断は、図1に示すリコンフィギュラブル回路12から出力された_SEQ_の値に基づいて、シーケンサ装置20により実行される。したがって、DFG化する演算は「x=x>>2;」、「*y-=x+3;」であり、「if(_SEQ_)」はDFG化する必要がないため、サブプログラムには加えない。
続いて、分割部104は、iがmに等しいか否かを判定する(S208)。分割部104は、i=1、m=2であるため(S208のN)、iに1を加えて(S210)、i=2を設定する。
ステップはS206に戻り、2番目のシーケンス処理部分は「do{・・・}while(_SEQ_);」であるため、分割部104は、同様にその部分をひとつのサブプログラムとする。「do{・・・}while(_SEQ_);」は、図10のfunc04に示すサブプログラムとして切り出される。
続いて、分割部104は、iがmに等しいか否かを判定する(S208)。分割部104は、i=2、m=2であるため(S208のY)、S214に移る。ここまでの処理で、シーケンス処理指定のプログラム部分のサブプログラム化が終了する。
次に、分割部104は、残りのプログラム部分のサブプログラム化を実行する。まず、分割部104は、1番目のシーケンス処理指定のプログラムの前にプログラムがあるかどうかを判定する(S214)。1番目のシーケンス処理指定のプログラム「if(_SEQ_){・・・}」の前にプログラムがあるため(S214のY)、分割部104は、そのプログラムをひとつのサブプログラムとする(S216)。これにより、図10のfunc01に示すサブプログラムが生成される。
続いて、分割部104は、mが1に等しいか否かを判定する(S218)。なお、1番目のシーケンス処理指定のプログラムの前にプログラムが存在しない場合には(S214のN)、分割部104は、直接、S218の判定を実行する。この例では、分割部104は、m=2であるため(S218のN)、j=1を設定する(S220)。
続いて、分割部104は、j番目のシーケンス処理指定のプログラムと、(j+1)番目のシーケンス処理指定のプログラムの間にプログラムがあるかどうかの判定を実行する(S222)。ここでは、1番目のシーケンス処理指定のプログラム「if(_SEQ_){・・・}」と2番目のシーケンス処理指定のプログラム「do{・・・}while(_SEQ_);」の間にプログラムがあるため(S222のY)、分割部104は、そのプログラムをひとつのサブプログラムとする(S224)。これにより、図10のfunc03に示すサブプログラムが生成される。
続いて、分割部104は、jがm−1に等しいか否かを判定し(S226)、この例では、j=1、m=2であり、j=m−1であるため(S226のY)、分割部104は、m番目のシーケンス処理指定のプログラムの後にプログラムがあるかどうかの判定を実行する(S230)。ここでは、2番目のシーケンス処理指定のプログラム「do{・・・}while(_SEQ_);」の後にプログラムがないため(S230のN)、分割部104は本フローを終了する。
なお、S218において、mが1に等しい場合には(S218のY)、分割部104は、S230に移行して、1番目のシーケンス処理指定のプログラムの後にプログラムがあるかどうかの判定を実行する。プログラムが存在する場合には(S230のY)、分割部104は、m番目のシーケンス処理指定のプログラムの後の部分をひとつのサブプログラムとして分割する(S232)。
また、S226において、jが(m−1)に等しくない場合には(S226のN)、分割部104は、jに1を加えて(S228)、S222に戻り、シーケンス処理指定のプログラムの間に、プログラムがあるかどうかの判定を実行する。
以上の分割処理により、図10に示すサブプログラムが生成される。DFG生成部106は、図10のサブプログラムを、それぞれDFG化する。図11は、DFG生成部106により生成されたDFGを示す。設定データ生成部51は、これらのDFGに基づいて、リコンフィギュラブル回路12に供給するための設定データを生成する。
次に、フローデータ生成部108は、図8に示すシーケンス指定付きプログラムと、図10に示すサブプログラムに基づいて、DFGフローデータを生成する。
図12は、フローデータ生成部108の動作を示すフローチャートである。まず、フローデータ生成部108は、図10のすべてのサブプログラムに対し、図8のシーケンス指定付きプログラムのどの部分に当たるかを調べる(S300)。これにより、フローデータ生成部108は、サブプログラムの接続関係すなわちDFGの接続関係を調査する。このとき、フローデータ生成部108は、図8のプログラム中の演算を図10のfunc01からfunc04に置き換える。図13は、プログラム中の演算をfunc01からfunc04に置き換えたフロー用プログラムを示す。
続いて、フローデータ生成部108は、S300における調査結果に基づいて、フロー用プログラムの上流にあるサブプログラムから順に並べて配置する(S302)。これにより、DFG間の実行順序が定められ、実行順に沿ったDFGの配置が行われる。
図14は、DFGフローデータを示す。図13のフロー用プログラムにおいて、最上流にあるサブプログラムがfunc01であるため、図14に示すように、フローデータ生成部108は、DFGフローデータの最上段にfunc01を配置する。そして、次に登場するサブプログラムがfunc02であるため、フローデータ生成部108は、図14のように2段目にfunc02を配置する。以降同様に、フローデータ生成部108は、func03を3段目に、func04を4段目に配置する。
次に、フローデータ生成部108は、mをサブプログラムの総数に設定する(S304)。図10に示すサブプログラムの総数が4であるため、フローデータ生成部108はm=4を設定する。また、フローデータ生成部108はi=1を設定する(S306)。そして、フローデータ生成部108は、i番目のサブプログラムに対し、調査結果から次にいくつのサブプログラムに移行する可能性があるかを調べる(S308)。
ここでは、i=1であり、図13のフロー用プログラムを参照すると、1番目のサブプログラムfunc01の次に実行されるサブプログラムはfunc02またはfunc03である。従って、func01から移行する可能性のあるサブプログラムの総数は2つであり、フローデータ生成部108はn=2を設定する(S310)。また、フローデータ生成部108はj=1とする(S312)。
次に、フローデータ生成部108は、DFGフローデータに、i番目のサブプログラムからj個目の移行先のサブプログラムに処理が進むことを示す情報を付加する(S314)。ここでは、図14に示すように、フローデータ生成部108は、1番目のサブプログラムfunc01から1個目の移行先のサブプログラムfunc02に結線する。
続いて、フローデータ生成部108は、nが1より大きいか否かを判定する(S316)。ここではn=2であるため(S316のY)、フローデータ生成部108はDFGフローデータに移行条件を示す情報を付加する(S318)。図13を参照すると、_SEQ_=1の場合にfunc02に移行しているため、フローデータ生成部108は、func01からfunc02への移行条件として、「_SEQ_=1」を付加する。
フローデータ生成部108は、jがnに等しいか否かを判定する(S320)。ここではフローデータ生成部108は、j=1、n=2であるため(S320のN)、jに1を加えて(S322)、j=2とする。
S314に戻り、上記と同様に、フローデータ生成部108は、1番目のサブプログラムfunc01から2個目の移行先のサブプログラムfunc03に処理が進むことを示すための結線を実行する。フローデータ生成部108は、移行条件を示す情報「_SEQ_=0」を付加する。 フローデータ生成部108は、jがnに等しいか否かを判定する(S320)。フローデータ生成部108は、j=2、n=2であるため(S320のY)、iがmに等しいか否かを判定する(S324)。このとき、フローデータ生成部108は、i=1、m=4であるため(S324のN)iに1を加えて(S326)、i=2とする。
S308に戻って、図13のフロー用プログラムを参照して、2番目のサブプログラムfunc02はサブプログラムfunc03にのみ移行する。func02からの移行先のサブプログラムの総数は1つであり(S310)、フローデータ生成部108はn=1を設定する。また、フローデータ生成部108はj=1を設定する(S312)。そして、フローデータ生成部108は、func02からfunc03に結線する(S314)。
フローデータ生成部108は、nが1より大きいか否かを判定する(S316)。ここではフローデータ生成部108は、n=1であり(S316のN)、移行条件を示す情報を付加する必要がない。フローデータ生成部108は、jがnに等しいか否かを判定する(S320)。このとき、フローデータ生成部108は、j=1、n=1であるため(S320のY)、続いてiがmに等しいか否かを判定する(S324)。フローデータ生成部108は、i=2、m=4であるため(S324のN)、iに1を加えて(S326)、i=3とする。
S308に戻って、3番目のサブプログラムfunc03も同様にfunc03からfunc04に結線する。そして、フローデータ生成部108は、iに1を加えて、i=4とする。4番目のサブプログラムfunc04は、図13のフロー用プログラムを参照すると、4番目のサブプログラムfunc04の次に実行されるサブプログラムはfunc04または<処理終了>である。
したがって、func04からの移行先のサブプログラムの総数は2つであり、n=2とする(S310)。フローデータ生成部108が結線および移行条件を付加することで、図14に示すDFGフローデータが最終的に生成される。そして、iはmに等しくなるため(S324のY)、フローデータ生成部108の全処理が終了する。
図14のDFGフローデータは概念図であり、実際には図14の情報を数値データ化したDFGフローデータが生成される。制御データ生成部54は、図14のDFGフローデータに基づいて、シーケンサ装置20で設定データの選択に利用される制御データを生成する。制御データは、シーケンサ装置20に供給され、格納される。
実施例では、2つのシーケンス処理指定のプログラム間のプログラムをサブプログラムとして抽出する処理を説明したが、コンパイル部50は、シーケンス処理指定のプログラム中にさらにシーケンス処理指定がある場合であっても対応できる。
例えば、シーケンス処理指定のfor文の中にシーケンス処理指定のfor文があるような場合、シーケンス処理部102は、図15に示すようなシーケンス指定付きプログラムを生成する。そして分割部104は、プログラム<A>、<B>、<C>の3つをシーケンス処理指定のプログラムとして扱い、分割する。図16は、分割部により生成される複数のサブプログラムを示す。図17は、フローデータ生成部108により生成されるDFGフローデータを示す。
また、DFG生成部106が、リコンフィギュラブル回路12の回路構成に適するようにサブプログラムからDFGを生成するとき、ひとつのサブプログラムから複数のDFGを生成することも可能である。例えば、DFG生成部106が、図16に示すサブプログラムから、図18に示すように、ひとつのサブプログラムに対して複数のDFGを生成してもよい。
この場合でも、funcA、funcB、funcCのフローの関係は、図17に示したものと同じである。このとき、図17の「funcA」の部分が、実行順に並んだfuncAに属するDFG3つに置き換わることになる。funcB、funcCについても同様である。従って、このような場合、フローデータ生成部108は、funcA、funcB、funcCについてDFGフローデータを生成した後、この置き換えの処理を追加することで対応することができる。
funcAに属するDFGにおいて、実行順がDFGA-1、DFGA-2、DFGA-3であるとし、funcB、funcCも同様であるとすると、DFGフローデータは図19のようになる。funcA、funcB、funcC内のDFGの実行は_SEQ_によらずに決定され、func間で分岐が発生する場合、_SEQ_に応じて次のfuncが決定される。
本実施例では、プログラム解析部100が、図5のfunc1をfunc0に展開して、図6に示すように、ひとつの関数にしている。仮に、func0とfunc1を独立にDFG処理したとすると、「x+=1;」と「_SEQ_=*y>0;」が別々にサブプログラム化されるため、func01のようにひとつのサブプログラムにならず、サブプログラムが増加することになる。
サブプログラムが増加すれば、最終的に生成されるDFGが増加し、処理パフォーマンスの低下、回路規模の増加を招く恐れがある。従って、分割数をできるだけ減らしサブプログラムを少なくするために、プログラム解析部100は、複数の関数をひとつの関数にまとめる処理を実行する。
以上、本発明を実施例をもとに説明した。実施例は例示であり、それらの各構成要素や各処理プロセスの組み合わせにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
図20は、ソースプログラムの一例を示す。このソースプログラムでは、C記述に「/*_SEQ_*/」のようなコメントが加えられている。このコメントは、プログラム作成時に、シーケンス処理を指定するためのシーケンス処理指定コメントとしてプログラマにより挿入される。
C言語において、2つのスラッシュ「/・・・/」で囲まれる文字列は、コメントとして扱われ、通常のコンパイラは、コンパイル時にコマンド部分を無視する。この変形例では、シーケンス処理部102が、所期の演算処理としては記述されていないコメント部分が存在するか否かを判定し、シーケンス処理指定コメントが加えられている場合、そのコメント部分をシーケンス処理指定と認識する。
これにより、ユーザーが自由にシーケンス処理指定することが可能となる。また、コメントとしてシーケンス処理指定することにより、C記述での動作に影響を与えない。
図21は、シーケンス指定付きプログラムの例を示す。図20の「func1/*_SEQ_*/();」のように、プログラマにより記述されたシーケンス処理指定が関数にある場合、分割部104は、その関数部分をシーケンス処理指定と認識して、コメント部分により定められる範囲をサブプログラムとして抽出する。
ひとつの関数が複数箇所で呼び出される場合、従来はすべて展開されて同じ演算内容が複数箇所にあるDFGが作成されるが、関数にシーケンス処理指定をすることにより、関数のDFGがひとつだけ作成され、そのDFGが複数回呼び出されることになるため、最終的に生成されるDFG数を少なくできる。
関数にシーケンス処理指定をする場合、関数DFGが呼び出されるたびに引数の値(変数)が異なるため、func1の引数データの受け渡しを実行する必要がある。ここでは、図21に示すシーケンス指定付きプログラムの「func1/*_SEQ_*/();」の上2行と下1行がそれに該当する。受け渡すデータが配列の場合は配列のアドレスを渡し、変数の場合は変数(数値)を受け渡すようにする。このデータ受け渡し演算命令の追加処理は、図7のS110において実行すればよい。
図22は、シーケンス処理部102の動作の別の例を示すフローチャートである。まず、シーケンス処理部102は、mをプログラムの行数として設定する(S400)。具体的にはシーケンス処理部102は、図23に示すプログラムを参照し、プログラムの全行数が14行であるため、m=14を設定する。そして、シーケンス処理部102はi=1を設定する(S402)。
続いて、シーケンス処理部102はプログラムi行目を解析する(S404)。シーケンス処理部102は、プログラムi行目が特定の記述内容であるか否か判定する(S406)。また、シーケンス処理部102は、この判定がYESである場合にはS408の処理に移り、NOである場合にはS420の処理に移る。
この特定の記述内容は、一の演算処理から他の複数の演算処理に分岐している場合に他の複数の演算処理のうちのいずれかに演算処理を移行させるための条件を示す記述内容(ここではif文等の分岐文)、同一の演算処理を複数回繰り返し実行させるための条件を示す記述内容(ここではfor文等のループ文)などを含む。
S406においてプログラム1行目の記述内容は「int i;」であり、特定の記述内容(分岐文又はループ文)でないため、シーケンス処理部102はS420の処理に移る。シーケンス処理部102は、iがmに等しいか否かを判定する(S420)。ここではi=1、m=14であるため(S420のN)、シーケンス処理部102は、iに1を加えて(S422)、i=2を設定する。
上記S404の処理に戻り、シーケンス処理部102は、プログラム2行目の記述内容が「x+=1;」であるため、当該記述内容が特定の記述内容(分岐文又はループ文)ではないと判定する(S406のN)。シーケンス処理部102は、iに1を加えて、i=3とする(S420)。
上記S404の処理に戻り、シーケンス処理部102は、プログラム3行目の記述内容が特定の記述内容を示す「if(*y>0){」(分岐文)であるため、その記述内容の解析を実行し、シーケンス処理の範囲と分岐条件の選定を実行する(S408)。この場合、シーケンス処理の範囲は「if(){・・・}」,「else{・・・}」であり、分岐条件は「y>0」である。
このシーケンス処理は、プログラムを分割するための前処理であり、プログラムが分割されることによりリコンフィギュラブル回路12の回路規模、処理速度等のパフォーマンスが向上する場合に実行される。
続いて、シーケンス処理部102は、特定の記述内容におけるサブプログラムに対応するDFGを作成する(S410)。ここでは、シーケンス処理部102は、特定の記述内容if文における「x=x>>2;」,「y−=3;」,「*z+=4」に対応するDFG1を作成する(図24に示すDFG1参照)。また、シーケンス処理部102は、特定の記述内容else文における「x=5;」に対応するDFG2を作成する(図24に示すDFG2参照)。
シーケンス処理部102は、作成したDFG1(又はDFG2)に対応するリコンフィギュラブル回路12の実行ステップの数に応じてシーケンス処理を実行するか否かを判定する。なお、実行ステップは、本実施形態では図2に示す段毎に実行される処理である。但し、実行ステップは2以上の段毎に実行される処理であってもよい。
本実施形態では、シーケンス処理部102は、作成したDFG1(又はDFG2)に対応するリコンフィギュラブル回路12の実行ステップ(図2に示す段)の数が第1基準数(ここでは3)を超えている場合にはシーケンス処理を実行し、作成したDFG1(又はDFG2)に対応するリコンフィギュラブル回路12の実行ステップの数が第1基準数を超えていない場合にはシーケンス処理を実行しない。
例えば、図24に示すDFG1のうち、「x=x>>2;」に対応する演算は、リコンフィギュラブル回路12の第1段目のALU11に対応する。またDFG1のうち、「y−=3;」に対応する演算は、リコンフィギュラブル回路12の第1段目のALU12に対応する。更にDFG1のうち、「*z+=4」に対応する演算は、リコンフィギュラブル回路12の第1段目のALU13に対応する。
したがって、DFG1は、リコンフィギュラブル回路12の第1段目における各ALUに対応し、1つの実行ステップ(1段の処理)だけに対応していることとなる。また、DFG2も上記と同様に1つの実行ステップだけに対応していることとなる。よって、シーケンス処理部102は、作成したDFG1又はDFG2のそれぞれに対応するリコンフィギュラブル回路12の実行ステップの数が1であり、第1基準数(ここでは3)を超えていないため、シーケンス処理を実行しないと判定する。
続いて、シーケンス処理部102は、iがmに等しいか否かを判定する(S420)。ここではシーケンス処理部102は、i=3、m=14であるため(S420のN)、iに1を加えて(S422)、i=4とする。プログラム4行目の記述内容は「x=x>>2;」であり、特定の記述内容ではないため(S406のN)、iに1を加え、i=5とする(S422)。以降同様にフローを実行する。
上記S404の処理に戻り、シーケンス処理部102は、i=12ではプログラム12行目の記述内容が特定の記述内容を示す「for(i=0;i<100;i++){」である(S406のY)。シーケンス処理部102は、プログラムの構文解析を実行し、シーケンス処理の範囲と分岐条件の選定を実行する(S408)。この場合、シーケンス処理の範囲は「for(){・・・}」であり、分岐条件は「i<100」である。
続いて、シーケンス処理部102は、for文に含まれている記述内容に対応するDFG3を作成する(S410,図25に示すDFG3参照)。DFG3では100回の繰り返し処理が実行される。
また、DFG3のうちの1回目の処理における演算はリコンフィギュラブル回路12の第1段目のALU11に対応し、2回目の処理における演算はリコンフィギュラブル回路12の第2段目のALU21に対応する。
したがって、DFG3の100回の繰り返し処理がリコンフィギュラブル回路12の各段で順次実行されるため、DFG3に対応するリコンフィギュラブル回路12の段(繰り返し用いられる段も含む)の数は100となり、実行ステップ数は100となる。よって、シーケンス処理部102は、作成したDFG3に対応するリコンフィギュラブル回路12の実行ステップの数が100であり、第2基準数(ここでは10)を超えているため、シーケンス処理を実行すると判定する(S414のY)。
次に、シーケンス処理部102は、プログラム中に分岐条件を判定する判定演算命令を付加する(S416)。分岐条件が「i<100」であるため、図26に示すように、シーケンス処理部102は、for文中の最後尾に判定演算命令「_SEQ_=i<100;」を付加する。また、for文の前にiの初期化のための「i=0;」を付加する。
そして、シーケンス処理部102は、シーケンス処理を実行する部分であることを示すため、for文を「do{・・・}while(_SEQ_);」と記述する(S418)。「do{・・・}while(_SEQ_);」は、シーケンス処理を実行する部分であることを示す「シーケンス処理指定」である。
続いて、シーケンス処理部102は、iがmに等しいか否かを判定する(S420)。シーケンス処理部102は、i=12、m=14であるため(S420のN)、iに1を加えて(S422)、i=13とする。シーケンス処理部102は、以降同様にフローを実行し、i=14のときi=mと判定し(S420のY)、シーケンス処理部102におけるシーケンス処理を終了する。
以上のシーケンス処理により、図26に示すシーケンス指定付きプログラムが生成される。分割部104は、シーケンス処理指定に基づいてプログラムをサブプログラムに分割する。
図26は、図23に示すプログラムのfor文中に判定演算命令を付加したプログラムを示す。この例では、「_SEQ_=i<100;」が判定演算命令であり、「do{・・・}while(_SEQ_);」がシーケンス処理指定である。分割部104は、上述した図9に示す処理と同様に、図26に示すシーケンス処理指定「do{・・・}while(_SEQ_);」を参照し、シーケンス処理指定が付加されていないサブプログラム(func01)とそれ以外のサブプログラム(func02)とに分割する(図27参照)。
その後、DFG生成部106は、サブプログラム(func01)に対応するDFG、及びサブプログラム(func02)に対応するDFGを生成する(図28参照)。設定データ生成部51は、生成されたDFGに基づいてリコンフィギュラブル回路12に供給するための設定データを生成する。また、フローデータ生成部108は、上述した図12に示す処理と同様に、図29に示すシーケンス指定付きプログラムと図27に示すサブプログラムとに基づいてDFGフローデータを生成する(図30参照)。設定データ生成部51及びフローデータ生成部108における詳細な処理については上述した通りであるため、ここでは省略する。
上記図22乃至図30では、特定の記述内容(分岐文又はループ文)に対応するDFGを生成し、そのDFGに対応するリコンフィギュラブル回路12の実行ステップの数に応じて、プログラムを複数のサブプログラムに分割している。
このため、上記図22乃至図30における処理は、上記図7乃至図14における処理よりも、必要以上にDFG数を増大させないようにすることができ、DFGに対応する設定データの記憶量を少なくすることができ、更には回路規模を小さくすることができる。
さらに、上記図22乃至図30における処理は、必要以上にDFG数を増大させないため、リコンフィギュラブル回路12における処理を効率的に実行させることができる。このため、上記図22乃至図30における処理は、リコンフィギュラブル回路12において無駄な処理を実行させないため、消費電力を低く抑えることができる。
今回開示された実施例はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
10…処理装置、12…リコンフィギュラブル回路、14…設定データ保持部、20…シーケンサ装置、26…集積回路装置、30…出力データ保持部、32…経路部、40…記憶部、50…コンパイル部、51…設定データ生成部、54…制御データ生成部、100…プログラム解析部、102…シーケンス処理部、104…分割部、106…DFG生成部、108…フローデータ生成部。