以下、本発明の実施の形態を図面に基づいて詳細に説明する。なお、実施の形態を説明するための全図において、同一部には原則として同一の符号を付し、その繰り返しの説明は省略する。
図1は、本発明の一実施の形態であるDRP(動的再構成可能プロセッサ)向けコンパイラの構成を示した図である。DRP向けコンパイラ100は、コード生成部101と階層メモリ向けコード生成部102とから構成され、ソースプログラム110を入力として、プロセッサにより実行可能な形式のオブジェクトプログラムであるシーケンサコード120と、最終CPUコード130とを生成して出力する。
コード生成部101は、ソースプログラム110を入力して、後述する階層メモリを意識せずに、メインメモリから直接命令を読み込む形式で、中間CPUコード103、スレッドコード104、および階層スレッドグラフ105を生成して出力する。コード生成部101での処理は、一般的なコンパイラでの処理と同様であるため、処理内容についての説明は省略する。
階層メモリ向けコード生成部102は、コード生成部101が出力した中間CPUコード103、スレッドコード104、階層スレッドグラフ105を入力して、スレッド区間グラフ106を使いながら処理を行い、階層メモリを意識した形式で、シーケンサコード120と最終CPUコード130とを生成して出力する。階層メモリ向けコード生成部102での処理内容については後述する。
図2は、図1のDRP向けコンパイラ100が稼動するコンピュータシステムのハードウェア構成例を示した図である。コンピュータシステムは、メモリ200、CPU201、ディスプレイ202、HDD(ハードディスクドライブ)203、キーボード204を有し、これらがバス205に接続する構成となっている。HDD203に格納されたソースプログラム110は、メモリ200に格納されてCPU201上で稼動するDRP向けコンパイラ100に入力され、DRP向けコンパイラ100から出力されたシーケンサコード120と最終CPUコード130はHDD203に格納される。
図3は、図1のDRP向けコンパイラ100から出力されたシーケンサコード120および最終CPUコード130が稼動する情報処理装置のハードウェア構成例を示した図である。この情報処理装置は、例えばLSIとして実装され、DRP(動的再構成可能プロセッサ)300、CPU310、メインメモリ320、シーケンサメモリ330、CM340、TM350、シーケンサ(SEQ)360、データ転送用バス370、コンフィギュレーション転送用バス380を有する構成となっている。
DRP300は、さらに、プロセッサアレイ301、クロスパスネットワーク302、ローカルデータメモリ(LM)303を有する構成となっている。プロセッサアレイ301は、複数のプロセッサエレメント3011によって構成され、各プロセッサエレメント3011の間は、図示するように縦方向と横方向に配線で接続されている。ローカルデータメモリ303は、本実施の形態では左右それぞれ3バンクずつの合計6バンクの構成となっており、左右のローカルデータメモリ303は、それぞれプロセッサアレイ301の左端と右端にあるプロセッサエレメント3011と、クロスパスネットワーク302により接続されている。
シーケンサ360は、DRP300の動作を制御するシーケンサであり、シーケンサメモリ330は、シーケンサ360用のメモリであってシーケンサコード120を格納する。また、CM340は、プロセッサエレメント3011(セル)ごとのコンフィギュレーションである、セルコンフィギュレーションを格納するアドレッシング可能な命令プール用メモリであり、本実施の形態では7バンクを有する構成としている。また、TM350は、プロセッサアレイ301上で動作する1つのスレッドのプログラム(命令)であるスレッドテーブルを格納するアドレッシング可能な命令ブロックテーブル用メモリである。詳細は後述するが、CM340、TM350は、階層メモリを構成する要素となる。
ここで、メインメモリ320に格納された最終CPUコード130は、まず、TM350にスレッドテーブルを転送し、CM340にセルコンフィギュレーションを転送する。次に、シーケンサメモリ330に格納されたシーケンサコード120は、スレッドテーブルおよびセルコンフィギュレーションを用いて、セルコンフィギュレーションをプロセッサエレメント3011にロードし、DRP300の動作を制御する。このように、メインメモリ320からプロセッサエレメント3011まで段階的にデータの転送が行われる。
図4は、図3のプロセッサエレメント3011の構成例を示した図である。プロセッサエレメント3011は、DLY401、ALU402、MUL403、スイッチ405、407、RF(レジスタファイル)408、スイッチ409、412を有する構成となっている。DLY401は、1サイクルのディレイを発生させるディレイ用バッファであり、ALU402は、算術演算を行う算術演算器であり、MUL403は、乗算を行う乗算器である。
スイッチ405は、セルコンフィギュレーションによって、どのデータ入力用配線404からデータが入力したか、すなわち、詳細は後述するが、プロセッサエレメント3011のどの転送方向からデータが入力したかを選択する。さらに、入力するデータを演算させる演算器をDLY401、ALU402、MUL403の中から選択する。スイッチ407は、セルコンフィギュレーションによって、プロセッサエレメント3011が出力するデータを選択し、さらに、どのデータ出力用配線406にデータを出力するか、すなわち、プロセッサエレメント3011のどの転送方向にデータを出力するかを選択する。
RF408は、セルコンフィギュレーションを格納するレジスタファイルであり、詳細は後述するが、階層メモリを構成する要素となる。本実施の形態では、2バンクから構成されるものとしている。スイッチ409は、信号線410を介したシーケンサ360からの入力により、RF408の内の一方の内容を選択する。スイッチ412は、信号線411を介してCM340から転送されるセルコンフィギュレーションをどちらのRF408に入力するかを選択する。この構成により、RF408には2つのセルコンフィギュレーションが格納でき、プロセッサエレメント3011は、これらを使って2種類の演算を選択することができるので、高速に2種類の動的再構成を行うことが可能となる。
図5は、CM340とTM350との関係の例を示した図である。図5において、CM340には、各プロセッサエレメント3011のセルコンフィギュレーションとして、7個のセルコンフィギュレーション3401が格納されている。また、TM350には、命令ブロックテーブル3501、3502が格納されており、命令ブロックテーブル3501、3502は、それぞれ6個の要素を有する。この各要素は、それぞれ6個のプロセッサエレメント3011に対応するフィールドとなっている。
命令ブロックテーブル3501、3502の各フィールドには、7個のセルコンフィギュレーション3401のいずれかを指すポインタが格納されている。従って、命令ブロックテーブル3501または3502と、図4の信号線411およびスイッチ412とを使えば、各セルコンフィギュレーション3401を該当する各プロセッサエレメント3011に転送することができる。
図6は、図3のLSIの構成における階層メモリを示した図である。図中のMMは、メインメモリ320を表している。メモリ間を結ぶ破線は、対象のメモリ間(例えばTM350とRF408との間)では直接データを転送しないが、データ転送の制御を行うことを表す。また、メモリ間を結ぶ実線は、対象のメモリ間(例えばCM340とRF408との間)で直接データの転送を行うことを表す。
階層メモリは、プロセッサ(本実施の形態の動的再構成可能プロセッサの場合はプロセッサエレメント3011)から近いメモリを上層とする。従って、図3のLSIの場合は、RF408を最上層に有し、その1つ下層にCM340およびTM350を有し、さらに1つ下層にメインメモリ320を有する3階層の階層メモリを有する構成となる。なお、本実施の形態では階層メモリは3階層となっているがこれに限られるものではなく、3階層以上の階層を有する階層メモリであっても構わない。
以下に、図1の階層メモリ向けコード生成部102での処理の内容について説明する。図7は、階層メモリ向けコード生成部102の処理の流れを示すフローチャートである。まず、ステップS701で、中間CPUコード103の内、未処理のプログラム片Pの有無を判定する。未処理のプログラム片PがあればステップS702へ進み、なければ処理を終了する。
ステップS702では、プロセッサに最も近い、最上層の階層メモリのうちから一つを選択する。次に、ステップS703で、ステップS702で選択したメモリをxとし、xより一つ下層のメモリのうち、xとの間でデータ転送が可能なメモリ、またはxと他のメモリとの間のデータ転送を制御するメモリのうちの一つを選択する。
ここで、後者のメモリは、例えば、xに転送するデータを保持するメモリ(zとする)とは別の、そのデータを転送するx上のアドレスを保持するメモリ(wとする)等を指す。実際のデータ転送は、wとzを両方同時に用いて行われるので、本実施の形態では、wのようなメモリも、xとの間でデータ転送が可能なメモリと同様に扱う。TM350はこのようなメモリの一例である。
次に、ステップS704で、ステップS703で選択したメモリをyとし、プログラム片P内の命令に対してxとyとの間の命令転送スケジューリングを行う。ステップS704の命令転送スケジューリング処理の詳細については、図8を用いて説明する。
図8は、命令転送スケジューリング処理の流れを示すフローチャートである。まず、ステップS801では、プログラム片Pに対する階層スレッドグラフ105に未処理のスレッドがあるか否かを判定する。階層スレッドグラフ105については後述する。未処理のスレッドがあればステップS802へ進み、なければステップS806へ進む。
ステップS802では、xが再利用性の高いメモリか否かを判定し、再利用性の高いメモリであればステップS803へ進み、そうでなければステップS804へ進む。ここで、再利用性の高いメモリとは、何度も処理される可能性の高いデータを保持するメモリを意味し、プログラム処理中のある期間に参照するデータがそのメモリ上に存在する可能性が高いメモリを意味する。
例えば、複数のプロセッサエレメント3011間で共通に使われる可能性のあるデータや、コンフィギュレーションを保持するメモリは再利用性の高いメモリとみなし、各プロセッサエレメント3011間で別々に使うデータを保持するメモリは再利用性の低いメモリとみなす。なお、再利用性が高い・低いという判定は一つの目安であり、この判定が異なっても命令転送スケジューリング処理の結果に誤りが発生するわけではなく、DRP向けコンパイラ100が出力するプログラムの処理性能が変化する程度である。実際、ハードウェアシステムやコンパイラ設計によってこの判断は分かれるであろうし、このような区別がつきにくいメモリもあると考えられる。
ステップS803では、以降の処理において利用するread時間を0とする。これは、参照するデータがそのメモリに存在する可能性が高いので、下層メモリから読み込む必要がないことをモデル化している。一方、ステップS804では、read時間を「一つ下層のメモリyからのスレッド命令読込み時間」とする。これは、参照するデータがそのメモリに存在する可能性が低いので、下層のメモリから読み込む必要があることをモデル化している。
ステップS805では、第1メモリ占有期間を「スレッド実行時間」または「xより一つ上層のメモリへのスレッド命令書込み時間」、第2メモリ占有期間を第1メモリ占有期間にread時間を加えた期間とする。例えば、図6の階層メモリの場合は、「スレッド実行時間」は、xがスレッドのプログラムを格納するTM350である場合に用いる。一方、「xより一つ上層のメモリへのスレッド命令書込み時間」は、xがセルコンフィギュレーション3401を格納するCM340である場合に用いる。
次に、ステップS806で、第2メモリ占有期間を区間とするスレッド区間グラフ106を作成して、内側ループから順にスレッドにメモリxのメモリユニット割当てを行う。ここで、スレッド区間グラフは、「中田育男著、コンパイラの構成と最適化、朝倉書店、p.384」において定義されているものであり、レジスタ割当て処理でよく使われるものである。
次に、ステップS807で、一つ下層のメモリyからのスレッド命令読込みのスケジューリングを行い、必要な場合には同期命令を挿入する。ここで、スケジューリングは「中田育男著、コンパイラの構成と最適化、朝倉書店、p.358」において定義されているものであり、CPUに対する命令列の最適化処理でよく使われるものである。また、同期命令は、使用中のメモリユニットへの上書きを避ける場合などに、メモリユニットの使用終了を待つ目的で挿入される処理である。
最後に、ステップS808で、冗長な同期命令を削除する。例えば、1箇所に複数の同期命令がある場合、同期命令を一つに削減する。以上で命令転送スケジューリング処理を終了し、図7のステップS705へ戻る。
ステップS705では、yと同じ階層でxとデータ転送またはデータ転送の制御が可能な未処理メモリがあるか否かを判定する。もしあれば、再度ステップS704を実行し、もしなければ、ステップS706へ進む。
ステップS706では、yと同じ階層のメモリ間で整合・冗長削除処理を行う。ここでは、同種のデータを格納するメモリが複数ある場合、それらの間で重複するデータがあるか否かを判定し、重複するデータがある場合には、可能であればいずれか一方のみを残し、他方を削除する。この時、両者のデータのメモリ占有期間や同期命令を合わせたものを残されたデータの占有期間や同期命令とし、データ転送などにおいて支障や矛盾が生じないように整合を取る。
次に、ステップS707では、xと同じ階層の未処理メモリがあるか否かを判定する。もしあればステップS703へ戻り、なければステップS708へ進む。ステップS708では、xと同じ階層のメモリ間で整合・冗長削除処理を行う。ここでの処理内容は、ステップS706と同様である。
次に、ステップS709で、xより一つ下の階層のメモリのうちの一つを選択する。次に、ステップS710で、ステップS709で選択したメモリが最下位の階層のメモリか否かを判定する。最下位層のメモリでなければステップS703へ戻り、最下位層のメモリであればステップS711へ進む。最後に、ステップS711で、最下位階層メモリにおいてメモリ割当て処理を行う。
以下、実際のプログラム例について、階層メモリ向けコード生成部102でどのように処理が行われるのかについて説明する。図9は、本実施の形態のDRP向けコンパイラ100に入力するソースプログラム110の例を示した図である。文903と文904、文905と文906、文907と文908は、それぞれループを示す。本実施の形態でのDRP300では、各ループの実行はそれぞれスレッドとしてプロセッサアレイ301にマッピングされるものとする。
図10は、図9のソースプログラム110をスレッド化したものに対する階層スレッドグラフ105の例を示した図である。ノード1000は、図9の文901の関数funcに対応するノードである。ノード1001は、ノード1000の下の階層に対する最初のノードを表す。これは処理の便宜上設けたノードであり、これに対応する文は図9のソースプログラム110中にはない。
ノード1002は、図9の文903と文904が表すループを変換したスレッドに対応するノードである。また、ノード1003は、文905と文906が表すループを変換したスレッドに対応するノードである。同様に、ノード1004は、文907と文908が表すループを変換したスレッドに対応するノードである。ノード1005は、ノード1000の下の階層に対する最後のノードを表す。これも処理の便宜上設けたノードであり、これに対応する文は図9のソースプログラム110中にはない。
図11は、図10の階層スレッドグラフ105を実際に表現するデータ構造の例を示した図である。テーブル1100は、図10のノード1000に対応するテーブルである。ここで、nextフィールドとprevフィールドは、それぞれ同じ階層における直前直後のテーブルへのポインタを示す。図10の例では、ノード1000は関数を表すノードであり、これと同じ階層のノードはないのでこれらの値はNULLとなる。フラグfunc_kは、このテーブル1100が関数に対するテーブルであることを示す。beginpフィールドは、テーブル1100より下の階層のスレッドグラフの最初のテーブル1101へのポインタを示す。endpフィールドは、テーブル1100より下の階層のスレッドグラフの最後のテーブル1105へのポインタを示す。
テーブル1101は、図10のノード1001に対応するテーブルであり、この階層のスレッドグラフにおける最初のテーブルである。フラグbegin_kがそのことを示す。upperフィールドは、上の階層においてこの階層に接続されたテーブル1100へのポインタを示す。図11の階層スレッドグラフ105以外の階層の例としては、ループやif文などがある。すなわち、ループやif文に対応したテーブルが上の階層になり、ループ内の文やif文のthen側およびelse側の各文が下の階層になる。この時、ループ内の文の最初のテーブルに含まれるupperフィールドは、ループを表すテーブルへのポインタになり、then側の文の最初のテーブルに含まれるupperフィールドは、if文を表すテーブルへのポインタになる。entryフィールドは、後述するスレッド区間グラフ106へのポインタを示す。
テーブル1102は、図10のノード1002に対応するテーブルである。ここで、threadpフィールドは、スレッドコードへのポインタを示す。b-cycleフィールドは、本スレッドの開始サイクルを示す。最初のテーブル1101の直後のテーブルのサイクルは0とする。e-cycleフィールドは、本スレッドの実行終了時のサイクルを示す。
フラグpw-kは、ポスト処理もしくはウェイト処理を行うか、その両方とも行うかを示すフラグである。ポスト処理は何らかの対象に本スレッドの終了を知らせる処理であり、ウェイト処理は何らか対象の終了を待つ処理である。フラグr-load-kは、スレッド実行開始と同時にTM350内のコンフィギュレーションをRF408に転送するかどうかを示すフラグである。tm-numフィールドは、上記転送で使われるTM350内のメモリバンク番号を示す。rf-numフィールドは、上記転送で使われるRF408内のレジスタ番号を示す。
テーブル1103は、図10のノード1003に対応するテーブルであり、テーブル1104は、図10のノード1004に対応するテーブルである。これらのテーブルの内容は、前述したテーブル1102と同様である。テーブル1105は、図10のノード1005に対応するテーブルであり、この階層のスレッドグラフにおける最後のテーブルである。フラグend_kがそのことを示す。
次に、プロセッサアレイ301内の各プロセッサエレメント3011の配置およびデータの転送方向について説明する。図12は、プロセッサアレイ301内の各プロセッサエレメント3011に対して定めた座標の例を示した図である。図12の例では、6つのプロセッサエレメント3011に対して図示するようにx軸、y軸を定義し、座標によってプロセッサエレメント3011を特定できるようにしている。
図13は、あるプロセッサエレメント3011とその周囲のプロセッサエレメント3011とを接続する配線の方向を表す記号を示した図である。この記号はプロセッサエレメント3011に対する入力にも出力にも適用され、データの転送方向を表すことができる。例えば、一つ上に位置するプロセッサエレメント3011からの入力配線には記号"u"が付き、一つ上に位置するプロセッサエレメント3011への出力配線にも記号"u"が付く。同様にして、一つ下に位置するプロセッサエレメント3011との間の入出力には記号"d"を、一つ左に位置するプロセッサエレメント3011との間の入出力には記号"l"を、一つ右に位置するプロセッサエレメント3011との間の入出力には記号"r"を用いる。
図14は、以上に説明したプロセッサエレメント3011の配置およびデータの転送方向の指定方法に基づいて、図9のソースプログラム110の各ループをアセンブラ記述を用いて表したスレッドコードを示した図である。文1401の#threadがスレッドの開始を示し、その後の数字がスレッド番号を示す。また、文1408の#/threadがスレッドの終了を示す。従って、文1401と文1408で囲まれた文が、スレッド1に対応するアセンブラコードとなり、文1409と文1416で囲まれた文が、スレッド2に対応するアセンブラコードとなり、文1417と文1424で囲まれた文が、スレッド3に対応するアセンブラコードとなる。
文1402において、最初の"(1,1)"は、この命令が実行されるプロセッサエレメント3011の座標を表す。この座標は前述の図12の例に従って設定される。その後のdlyは、この座標のプロセッサエレメント3011に配置されるディレイ命令を表す。"dly l,r"とあるのは、左方向(l)からデータを入力して、右方向(r)からデータを出力することを表す。このデータの転送方向は前述の図13の例に従って設定される。同様に、例えば文1404は、左と下方向からデータを入力し、加算結果(add)を右方向に出力することを示す。また、文1410における"#'C1'"は、ディレイ用バッファに格納された即値"C1"を示す。以上の内容は、他の文についても同様に当てはまる。
図15は、図14のスレッドコードをプロセッサアレイ301にマッピングした例を示した図である。図15の(a)はスレッド1を、(b)はスレッド2を、(c)はスレッド3をそれぞれマッピングした結果を示している。(a)において、6つの矩形はそれぞれプロセッサエレメント3011を示す。また、図の左側のxとyは、入力配列の値xとyを示し、右側のz1は出力配列の値z1を示す。また、図中の矢印はデータの流れを示す。
dlyは1サイクルディレイ、addは加算、thrはディレイ無しのデータ転送、nopは何もしないことを示す。各矢印の上側に記載されている数字は、データ入力時点を0サイクルとして、矢印に該当するデータ転送が行われた時点での経過サイクル数を示す。本実施の形態でのDRP300では、プロセッサエレメント3011に同じサイクルに到達したデータ同士が演算されるので、このマッピングによってスレッド1での演算は正しく行われることになる。図15の(b)、(c)についても同様である。なお、(b)におけるmulは乗算、subは減算、rshftは右への1ビットシフトを表す。
図16は、図9のソースプログラム110に対する中間CPUコード103の例を示した図である。文1602のconf1には、スレッド1の各プロセッサエレメント3011のコンフィギュレーション、すなわち、図14の文1402から文1407までのスレッドコードが格納されている。また、文1605のth1では、conf1の中の各コンフィギュレーションを参照していることを示している。すなわち、conf1をCM340に置き、th1をTM350に置くことで、スレッド1のコンフィギュレーションをプロセッサアレイ301にロードする準備が整う。
文1608は、th1を使ってconf1のセルコンフィギュレーションを各プロセッサエレメント3011中のRF408の1番レジスタに格納する処理を表す。また、文1609は、配列xの500要素を、ローカルデータメモリ303の1番バンクにロードする処理を表す。同様に、文1610は、配列yの500要素を、ローカルデータメモリ303の2番バンクにロードする処理を表す。文1611は、DRP300の実行を開始することを表す。また、文1612は、DRP300の実行が終了するのを待つことを表す。文1613は、ローカルデータメモリ303の3番バンクにある500要素のデータを配列z1へストアする処理を表す。以上の内容は、その他の文についても同様に当てはまる。
図17は、階層スレッドグラフ105とスレッド区間グラフ106を表現するデータ構造の例を示した図である。テーブル1101〜1105は、図11の階層スレッドグラフ105のデータ構造例に示した各テーブルである。テーブル1701は、RF408、CM340、TM350などのメモリに割り当てるべき、コンフィギュレーションなどのデータを示すテーブルである。ここで、r-nextフィールドは、このテーブルに関連するテーブルであるテーブル1702へのポインタを示す。kindフィールドは、コンフィギュレーション名などのデータ名を示す。d-nextフィールドは、他のデータ名に対応するテーブル1701と同様のテーブルへのポインタを示す。
テーブル1702は、あるサイクル区間にテーブル1701で示されるデータ名がどのメモリ位置に割り当てられるかを示すテーブルである。ここで、r-nextは、同じデータ名に対応するテーブル1702と同様の次のテーブルへのポインタを示す。b-cycleは、あるデータが割り当てられる最初のサイクルを示す。e-cycleは、あるデータが割り当てられる最後のサイクルを示す。
m-elemは、あるデータが割り当てられるあるメモリ内の位置を示す。m-kindは、あるデータが割り当てられるメモリの種類(CM340など)を示す。pw-kは、ポスト処理もしくはウェイト処理を行うか、その両方とも行うかを示すフラグである。ポスト処理は何らかの対象に本スレッドの終了を知らせる処理であり、ウェイト処理は何らか対象の終了を待つ処理である。
図18は、図6の階層メモリにおいて最上層のメモリであるRF408に対するスレッド区間グラフ106の例を示した図である。このグラフは、スレッドとそのスレッドの実行期間を表したグラフである。図17の表記法で記載すると複雑になるので、説明の便宜上、以降図18のような表記法で説明する。
図18において、横軸はスレッドの実行サイクル数の経過を表す時間軸である。時間軸は期間に区切られており、時間軸上には該当期間で実行されるスレッドのスレッド番号(thread1〜thread3)が示されている。図18の例では3つの期間に区切られており、それぞれの期間が、図17の階層スレッドグラフ105の例における3つの階層(テーブル1102〜1104)に相当する。
区間1801は、スレッド1が実行されている区間を示したものである。この場合、スレッド1の実行に対応するデータ名はth1であり、対象がスレッドテーブル、すなわち、図16の文1605のth1であることを示す。区間1802は、スレッド1の実行前にコンフィギュレーションをTM350とCM340とを使ってRF408に転送する時間が必要であり、そのサイクル数をread区間として示したものである。以下、スレッド2、スレッド3についても同様である。
図6、図18の例に基づいて、図7、図8で示した処理の内容を具体的に説明すると以下の通りとなる。まず図7のステップS702で、最上位メモリであるRF408が選択される。次にステップS703で、RF408をxとし、RF408の1つ下の階層のメモリであるTM350が選択される。次にステップS704で、TM350をyとし、図8の処理に移る。
まずステップS802において、xであるRF408は再利用性の少ないメモリであるため、ステップS804へ進み、read時間をTM350からRF408へのデータのロード時間(前述のようにTM350とRF408との間では直接のデータ転送は行われないが、説明の便宜上このように記載しており、以下同様とする)である、図18における区間1802とする。さらにステップS805で、第1メモリ占有期間を、RF408のスレッド実行期間である、図18における区間1801とし、第2メモリ占有期間を、図18の区間1801と区間1802とを合わせた区間とする。
次にステップS806において、メモリユニットの割当てとして、RF408のレジスタ数は2個なので、それぞれのread区間に1または2の数字を割り当てる。図18の各read区間に記載されているr1、r2の文字は、その割当て結果を表しており、r1はRF408の1番レジスタに、r2は2番レジスタに対してreadがなされることを示している。その後、ステップS807で各read処理のスケジューリングを行う。その結果を表したものを図19に示す。
図19は、RF408におけるロード命令のスケジューリングを行った結果のスレッド区間グラフ106の例を示した図である。本実施の形態でのDRP300では、図11で説明したようにスレッド実行開始と同時にRF408へのロードが可能という特徴がある。この特徴を考慮して図18のread区間1803に対してロード命令の移動を行った結果が図19のread区間1901である。すなわち、2つのread処理r1とr2は、スレッドの実行開始と同時に行われる。
次に図8の処理を終了し、図7のステップS705に戻る。図6より、yに相当するTM350とCM340は同じ階層であるが、両メモリは協調して動作するので、この場合は一つのメモリとみなす。従って、この階層には他の未処理のメモリはないことになる。次にステップS706に移るが、yの階層は1つのメモリのみであるため整合・冗長削除の処理を行う必要がない。
ステップS707およびS708では、xの階層のメモリはRF408のみであるため、処理は行われない。次にステップS709で、xより一つ下の階層のメモリとしてTM350を選択し、ステップS710では、TM350は最下位層メモリではないためステップS703に戻る。ステップS703では、TM350をxとし、一つ下の階層のメモリとしてメインメモリ320を選択する。ステップS704では、メインメモリ320をyとして、図8の処理に移る。
ステップS802において、xであるTM350も再利用性の少ないメモリであるため、ステップS804で、メインメモリ320からTM350へのread時間を考慮する。次にステップS805では、図19におけるRF408のTM350からのread時間は、TM350の視点からはTM350からRF408へのwrite時間になるため、TM350のスレッド実行区間に該当する。これを表したものを図20に示す。
図20は、TM350に対するスレッド区間グラフ106の例を示した図である。ステップS805の処理により、図19のread区間1902は、図20ではwrite区間2001となっている。また、TM350は再利用性の少ないメモリであるため、メインメモリ320からのread時間を考慮する必要があり、read区間が加えられている。ステップS806において、TM350のメモリバンクは2つであるため、各read区間には2つのメモリバンクの一方を割り当てる。図20の各read区間に割り当てられたr1、r2の文字は、その割当て結果を表している。その後、ステップS807でスケジューリングを行う。
図21は、TM350におけるロード命令のスケジューリングを行った結果のスレッド区間グラフ106の例を示した図である。ポスト処理2101は、th3のスレッドに対応するread区間の終了時にポスト処理を行い、ウェイト処理2102は、thread2の開始時にウェイト処理を行うことを示す。このウェイト処理2102により、ポスト処理2101が完了していることを確認してから、TM350からRF408への書込みが開始されるため、プロセッサアレイ301によるスレッド3の実行時にスレッド3のコンフィギュレーションがRF408にあることが保証される。
次に、TM350と同様に、図7の処理においてCM340をxとし、メインメモリ320をyとして図8の処理に移る。図22は、ステップS806でメモリユニットの割当てが行われた時点での、CM340に対するスレッド区間グラフ106の例を示した図である。図の左端の命令群は、プロセッサエレメント3011に与えれらる命令を示す。その右に記載されている数字は、CM340の7個のメモリバンクのバンク番号を表し、各命令に対して通常のレジスタ割当てと同じアルゴリズムを使って、CM340の7個のメモリバンクのうちの該当のバンク番号に割り当てたことを示している。
write区間2201は、図20のwrite区間2001を表している。write区間2202は、NOPが存在するスレッドが3つあるので、NOP命令をreadする区間も3つあることを示している。同様に、write区間2203は、"add l,d,r"の命令が1番目と3番目のスレッドにのみ存在することを示している。
図23は、ステップS807により、CM340におけるロード命令のスケジューリングを行った結果のスレッド区間グラフ106の例を示した図である。ポスト処理2301とウェイト処理2302は、図22において、"sub l,d,r"の命令に対して、"dly l,r"の命令と同じバンク番号("5")が割り当てられたことによる同期命令である。これによって、"dly l,r"の命令が有効な間、このデータは上書きされないことが保証される。
ポスト処理2303とウェイト処理2304は、最後の3行の命令に対するロードの終了をチェックするための同期命令である。これによって、プロセッサアレイ301がスレッド2を実行するときに、スレッド2のコンフィギュレーションがRF408にあることが保証される。また、図の左端のm1、m2は、このスケジューリング結果に伴い、メインメモリ320上で連続配置することが望ましい命令群を示したものである。
図24は、前述したTM350に対するスレッド区間グラフ106と、CM340に対するスレッド区間グラフ106とを統合したスレッド区間グラフ106を示した図である。CM340とTM350は、異なる種類のデータを格納するメモリであるため、これらのメモリ間については整合・冗長削除処理を行うステップS706およびS707では処理は行われない。従って、図24のスレッド区間グラフ106は、図21のスレッド区間グラフ106と図23のスレッド区間グラフ106とを単に統合したものとなる。
図25は、図9のソースプログラム110に対して、図24のスレッド区間グラフ106に基づいて出力された最終CPUコード130を示した図である。文2502のm1は、図24のm1に対応するセルコンフィギュレーションの集合である。ここでm1は、図24のm1に含まれる1番目から5番目の命令までに対するコンフィギュレーションを上から順(r1〜r5の順)に含んでいる。
同様に、文2503のm2は、図24のm2に対応するセルコンフィギュレーションの集合である。ここでm2は、図24のm2に含まれる1番目から3番目の命令までに対するコンフィギュレーションを下から1番目、上から1番目、上から2番目の順(r5,r6,r7の順)に含んでいる。文2502のm1、文2503のm2には、それぞれ上記の順に各命令に対するセルコンフィギュレーションが4バイトずつ格納されている。
文2504〜文2506は、図14の各スレッドコードの各文に対する命令プールメモリCM340上のセルコンフィギュレーションへのポインタを初期値代入した配列である。文2507は、メインメモリ320からTM350へのデータ転送を行う命令を表す。文2504で示されたメインメモリ320上のポインタ配列th1をTM350上の1番目のエントリへ転送することを示している。
文2508は、メインメモリ320からCM340へのデータ転送を行う命令を表す。文2502で示されたメインメモリ320上の配列m1を、5要素分、CM340上の配列のcm[0]から始まる5要素に転送することを示している。これにより、図24のm1に含まれる5命令に対応するセルコンフィギュレーションが、上述した順序でcm[0]からcm[4]に格納される。
これにより、文2504のポインタ配列th1の最初の3要素cm[4]、cm[1]、cm[3]は、それぞれ、"dly l,r"、"thr l,r"、"add l,d,r"の命令を指すことになる。これらの命令は、図14のスレッドコードにおける文1402、文1403、文1404にそれぞれ該当する。以上により、文2504のポインタ配列th1はスレッドコードを保持する。文2505および文2506のポインタ配列th2とth3についても同様である。
文2509は、TM350を使ったCM340からRF408へのデータ転送を行う命令を表す。ポインタ配列th1の内容に従って、CM340上のセルコンフィギュレーションをRF408の1番目のエントリへ転送することを示している。
文2510は、文2505で示されたメインメモリ320上のポインタ配列th2をTM350上の2番目のエントリへ転送する命令を表す。文2511は、文2503で示されたメインメモリ320上の配列m2を3要素分、CM340上の配列のcm[4]から始まる3要素に転送することを示している。これにより、図24のm2に含まれる3命令に対応するセルコンフィギュレーションが、上述した順序でcm[4]からcm[6]に格納される。
この処理において、文2508でデータを格納したcm[4]へ別のデータを上書きすることになるが、この配列要素cm[4]の指す内容は文2509の処理によってRF408に転送済みなので、CM340上のこの要素は不要である。従って、文2511でこの要素cm[4]にデータを上書きしても問題はない。これにより、文2507〜文2511によって、図24におけるr5のread区間でロードしたデータへの上書きを避けるための同期命令であるポスト処理2301とウェイト処理2302に相当する内容が実現されている。
文2512は、メインメモリ320上の配列xをローカルデータメモリ303の1番目のエントリへ500要素分転送する命令を表す。同様に、文2513は、メインメモリ320上の配列yをローカルデータメモリ303の2番目のエントリへ500要素分転送することを表す。
文2514は、文2506で示されたメインメモリ320上のポインタ配列th3をTM350上の1番目のエントリへ転送する命令を表す。データ転送終了後、変数flagの値には1が代入される。文2507でポインタ配列th1をTM350上の同じエントリへ転送したが、この配列th1の指す内容は文2509においてRF408に転送済みなので、TM350上のこのエントリは不要である。従って、文2514でこのエントリにデータを上書きしても問題はない。文2515は、シーケンサコード120を格納しているメモリの1番目のエントリからシーケンサを起動する命令を表す。
ここで、図26は、シーケンサメモリ330の各エントリの内容を文の形で記述したシーケンサコード120の例を示した図である。文2601は、TM350上の2番目のエントリth2とCM340を使って、コンフィギュレーションをRF408の2番目のエントリに転送するコードである。このコードを実行直後に、制御は次の文2602に移る。
文2602は、RF408の1番目のエントリを使ってDRP300を再構成した後、500サイクルの間処理を実行し、処理終了後、文2601の転送コードの終了を待つコードである。文2602において文2601の処理の終了を待つことによって、図24における同期命令であるポスト処理2303とウェイト処理2304に相当する内容が実現されている。
文2603および文2604も、文2601および文2602と同様な動作を行う。文2604において文2603の処理の終了を待つことによって、図24における同期命令であるポスト処理2101とウェイト処理2102に相当する内容が実現されている。文2605も文2602と同様な動作を行うが、処理終了後、何も待たずに次の文の処理に移る。ここでは次に実行すべき文はないので、シーケンサコード120の処理は終了し、図25の処理に戻る。
図25の文2516では、変数flagの値が1、かつ、DRP300で実行中のスレッドに対するコンフィギュレーションが格納されたRF408のエントリ番号が2になるまで待つ。前者の条件は文2514の転送処理が終了していることを意味する。文2517は、スレッド1の処理の結果として得られる、ローカルデータメモリ303のエントリ1に格納されたデータを配列z1に500要素分転送する命令である。文2516の判定により、スレッド1の実行が終了し、スレッド2が実行中であることが確認できているので、この転送処理は安全に行うことができる。
文2518では、DRP300で実行中のスレッドに対するコンフィギュレーションが格納されたRF408のエントリ番号が1になるまで待つ。文2519は、スレッド2の処理の結果として得られる、ローカルデータメモリ303のエントリ2に格納されたデータを配列z2に500要素分転送する命令である。文2516の判定によりスレッド2が実行中であり、文2618の判定により、スレッド2の実行が終了し、スレッド3が実行中であることが確認できているので、この転送処理は安全に行うことができる。
文2520では、DRP300の動作が終了するまで待つ。文2521は、スレッド3の処理の結果として得られる、ローカルデータメモリ303のエントリ3に格納されたデータを配列z3に500要素分転送する命令である。以上により、図9のソースプログラム110に対応する処理が実行されることになる。
なお、本実施の形態では動的再構成可能プロセッサに対するオブジェクトプログラムを生成するDRP向けコンパイラ100について説明しているが、アドレッシング可能な3階層以上の階層を持つ階層メモリシステムを持つプロセッサに対するオブジェクトプログラムを生成するコンパイラについても同様に適用可能である。
また、本実施の形態ではDRP向けコンパイラ100がオブジェクトプログラムを生成する構成としているが、例えば、DRP向けコンパイラ100はアセンブリ言語プログラムを出力し、別途、アセンブラやリンケージエディタ等によりオブジェクトプログラムを生成するような構成であってもよい。また、DRP向けコンパイラ100による処理の前に、ソースプログラム110に対してプリプロセッサ等による処理を行ってもよい。このような、DRP向けコンパイラ100を含む一連の処理をツールチェインとして構成することも可能である。
以上に説明したように、階層メモリにプロセッサエレメント3011に対する命令列またはコンフィギュレーションを格納する命令プール用メモリCM340と、CM340中の複数の命令列またはコンフィギュレーションを指す命令ブロックテーブルを格納する命令ブロックテーブル用メモリTM350とを有する情報処理装置に対して、本実施の形態のDRP向けコンパイラ100は、オブジェクトプログラムである最終CPUコード130およびシーケンサコード120を出力する。
このオブジェクトプログラムは、CM340より下層であるメインメモリ320からCM340へ命令列またはコンフィギュレーションを転送し、また、TM350より下層であるメインメモリ320からTM350へ命令ブロックテーブルを転送し、さらに、CM340からこれより上層のメモリであるRF408へ、TM350中の命令ブロックテーブルの指す命令列またはコンフィギュレーションを転送するものである。
これにより、CM340においてコンフィギュレーションを共用することが可能になり、ある機能に再構成するためのコンフィギュレーションの一部がCM340に存在する可能性が高くなり、結果として全てのコンフィギュレーションをメインメモリ320から転送する可能性が低くなるため、メインメモリ320からコンフィギュレーションを転送するとしても、従来技術より短時間で転送を行うことができる。また、CM340上ではデータの重複がないように制御されるため、このようなデータ共用をサポートする階層メモリを効率的に使用することができる。
また、このオブジェクトプログラムは、階層メモリの下層から上層へ段階的にデータを転送するものであり、DRP向けコンパイラ100により適切な同期命令の挿入と命令スケジューリングが行われていることから、実行中にキャッシュの場合のように必要なデータが自動的に追い出されてしまうようなことがなく、また、転送途中に下層からの転送データにより上層のデータが上書きされてしまうこともないため、階層メモリにおいて、必要なときには必ず指定したメモリ上に必要な命令列またはコンフィギュレーションが存在するようにすることができる。
以上に説明したように、本実施の形態のDRP向けコンパイラ100によって生成されるオブジェクトプログラムは、実行時にソフトウエア的にキャッシュ制御を行うことなく階層メモリを有効に使うことができるため、アドレッシング可能な階層メモリを持つDRP等のアクセラレータにおいて、命令列やコンフィギュレーションのロードにかかるオーバーヘッドを極力少なくし、アクセラレータの高速処理能力を最大限に生かすことができる。
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
100…DRP向けコンパイラ、101…コード生成部、102…階層メモリ向けコード生成部、103…中間CPUコード、104…スレッドコード、105…階層スレッドグラフ、106…スレッド区間グラフ、110…ソースプログラム、120…シーケンサコード、130…最終CPUコード、
200…メモリ、201…CPU、202…ディスプレイ、203…HDD、204…キーボード、205…バス、
300…動的再構成可能プロセッサ(DRP)、301…プロセッサアレイ、302…クロスパスネットワーク、303…ローカルデータメモリ(LM)、310…CPU、320…メインメモリ、330…シーケンサメモリ、340…CM、350…TM、360…シーケンサ(SEQ)、370…データ転送用バス、380…コンフィギュレーション転送用バス、3011…プロセッサエレメント、
401…DLY、402…ALU、403…MUL、404…データ入力用配線、405…スイッチ、406…データ出力用配線、407…スイッチ、408…レジスタファイル(RF)、409…スイッチ、410…信号線、411…信号線、412…スイッチ、
3401…セルコンフィギュレーション、3501…命令ブロックテーブル、3502…命令ブロックテーブル。