【手続補正書】
【提出日】平成19年11月22日(2007.11.22)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】００５７
【補正方法】変更
【補正の内容】
【００５７】
命令ブロック５０１を実行した後、分岐ブロック５０６においてｙが１０以上であるかどうかを判定する。ｙが１０以上（分岐ブロック５０６のｙｅｓ）ならば、命令ブロック５０２に進み、ｘに命令ブロック５０１で得られたｙから１０引いた値を格納する。ｙが１０以下（分岐ブロック５０６のｎｏ）ならば、命令ブロック５０３に進み、ｘに命令ブロック５００において得られたｘの値に１０足した値を格納する。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００６３
【補正方法】変更
【補正の内容】
【００６３】
本発明に係るコンパイラ装置はスレッド６００以外に、実行頻度の高い実行経路に関して、その実行経路上の命令を実行できるように変換、生成したスレッドが図７〜図９に示すコード列である。
図７には、図５の実行頻度一位の実行経路５５１上の命令群をコード化したスレッド７００を記してある。コード７０１、７１３、７１９はそれぞれラベルコードである。コード７０２〜７１２は、図５のブロック５００、５０１、５０２を他の実行経路に分岐しないようにコード化した内容になっており、ブロック５０５、５０６がこの実行経路を通るかどうかの２択に変えたコードを含んでいる。
【手続補正３】
【補正対象書類名】明細書
【補正対象項目名】００６４
【補正方法】変更
【補正の内容】
【００６４】
コード７１４、７１５は実行経路５１１を通る場合に他のプロセッサエレメントで実行されているスレッドを停止させるコードである。
コード７１７、７１８は、実行経路５５１が実行されたときにコードを反映させる処理になる。この反映処理は、実行経路５５１の出口で生存していて、かつ実行経路５５１で変更されているデータが対象になる。
コード７２０、７２１はこのスレッド７００の終了処理である。
図８には、実行経路５５２上の命令をアセンブラコードに変換したスレッド８００を記してある。
【手続補正４】
【補正対象書類名】明細書
【補正対象項目名】００６５
【補正方法】変更
【補正の内容】
【００６５】
コード８０１、８１４、８１７、８２０はそれぞれラベルコードである。
またコード８０２〜８１３は図５におけるブロック５００、５０１、５０３の命令をコード化した内容になっている。コード８１５、８１６は実行経路５５２を通ることが確定した場合に、他のプロセッサエレメントで実行されているスレッドを停止させ、コード８２１、８２２はスレッド８００終了処理を行っている。また、コード８１８、８１９は、実行経路５５２が実行されたときにコードを反映させる処理になる。
【手続補正５】
【補正対象書類名】明細書
【補正対象項目名】００６６
【補正方法】変更
【補正の内容】
【００６６】
図９には、図５におけるブロック５００、５０４を通る実行経路を通る場合の最適化されたコードであるスレッド９００を記してある。
コード９０１、９０９、９１２、９１４はそれぞれラベルコードである。
またコード９０２〜９０８は図５におけるブロック５００、５０４の命令をコード化した内容になっている。コード９１０、９１１はこの実行経路を通ることが確定した場合に、他のプロセッサエレメントで実行されているスレッドを停止させ、コード９１５、９１６はスレッド９００の終了処理を行っている。また、コード９１３は、ブロック５００、５０４が実行されたときにコードを反映させる処理になる。
【手続補正６】
【補正対象書類名】明細書
【補正対象項目名】００６７
【補正方法】変更
【補正の内容】
【００６７】
図７のコード７０２〜７１２、図８のコード８０２〜８１３、図９の９０２〜９０８において同じメモリへの格納処理が生じる場合、各スレッドでの値の保証ができなくなり、プログラム作成者の望む結果が得られないことがあるため、メモリ共有型では別のメモリ領域への格納処理に変えることがある。
【手続補正７】
【補正対象書類名】明細書
【補正対象項目名】００７６
【補正方法】変更
【補正の内容】
【００７６】
「blt  （番地３）」は、直前の比較コード  cmp  （番地１）,(番地２)  の比較において、（番地２）の値が（番地１）の値よりも小さい場合に、（番地３）に指定されるコードに命令を飛ばすコードである。それ以外の場合には以降のコードを続行する。例えば、図７のコード７０６においては、その前のコード７０５の比較を受けて、レジスタＤ０に格納されている値が０よりも小さい場合に、コード７０７からコード７１９までは実行されずにコード７２０に飛び、以降のコードが実行されることになる。
【手続補正８】
【補正対象書類名】明細書
【補正対象項目名】００８１
【補正方法】変更
【補正の内容】
【００８１】
「#beginthread  （番地）」は、スレッドの開始コードで、（番地）のスレッドの実行開始を促がす。例えば、図１０のコード１００６においては、ＬＡＢＥＬ５００−５０１−５０２で始まるスレッド、即ち図７のコード列で示されるスレッド７００を実行する。
「#endthread」は、スレッドの終了コードで、現在実行しているスレッドを終了状態に設定し、スレッドが終了したことを示す情報を返す。例えば、図７のコード７２０においてはスレッド７００を終了し、終了したことを示す情報をプログラムのメインに返す。
【手続補正９】
【補正対象書類名】明細書
【補正対象項目名】００８３
【補正方法】変更
【補正の内容】
【００８３】
「#waitthread  （番地）」は、スレッドの終了を待つコードで、（番地）から始まるスレッドの実行結果の終了を待つ。この終了は上記#endthreadからの情報によって知ることができる。例えば、図１０のコード１０１０においては、ＴＨＲＥＡＤ５００−５０４の終了を待っている。
「#commit  （番地１）」は、メインプログラム、若しくはスレッドプロセスで生成した情報（番地１）を、メインプログラムと全てのスレッドプロセスに反映させるコードである。
【手続補正１０】
【補正対象書類名】明細書
【補正対象項目名】００９４
【補正方法】変更
【補正の内容】
【００９４】
ターゲットハードウェア１３０のメモリの形態がメモリ共有型であった場合には、図７〜図９におけるコード７０２、８０２、９０２のように逐一ａの値をレジスタに格納しなおさなければならなかったが、メモリ分散型ではそのようにする必要はなく、例えば、図２１にあるメモリ分散型の場合のメインスレッドのように、メインスレッドにおいて各プロセッサエレメントの各レジスタにブロードキャストすることで、処理を省略することができる。そのためのコードが図２１におけるコード２１０４〜２１０７である。
【手続補正１１】
【補正対象書類名】明細書
【補正対象項目名】００９５
【補正方法】変更
【補正の内容】
【００９５】
コード２１０５では、コード２１０１〜２１０３で生成されたスレッドにａの値を各プロセッサエレメントのメモリのレジスタＤ０に格納するように各スレッドを実行しているプロセッサエレメントに通達する。
コード２１０６では、コード２１０１〜２１０３で生成されたスレッドにｂの値を各プロセッサエレメントのメモリのレジスタＤ１に格納するように各スレッドを実行しているプロセッサエレメントに通達する。
コード２１０７では、コード２１０１〜２１０３で生成されたスレッドにｃの値を各プロセッサエレメントのメモリのレジスタＤ２に格納するように各スレッドを実行しているプロセッサエレメントに通達する。
【手続補正１２】
【補正対象書類名】明細書
【補正対象項目名】００９９
【補正方法】変更
【補正の内容】
【００９９】
ターゲットハードウェアのプロセッサエレメントの数を取得し、コンパイラによって生成されるスレッドの数との整合をとるコードがラベル１１０５から始まるコード１１０６〜１１１８に記されている。
まず、コンパイラによって生成されるスレッドの数ｍを取得し、その数ｍをレジスタＤ０に格納する（コード１１０６）。次にターゲットハードウェアの並列実行可能なプロセッサエレメントの数ｎを取得し、その値をレジスタＤ１に格納する（コード１１０７）。そしてレジスタＤ０に格納されたｍとレジスタＤ１に格納されたｎの値を比較し（コード１１０８）、ｎ≧ｍならばラベルコード１１１１に飛び（コード１１０９）、ｎ＜ｍならばラベルコード１１１３に飛ぶ（コード１１１０）。
【手続補正１３】
【補正対象書類名】明細書
【補正対象項目名】０１００
【補正方法】変更
【補正の内容】
【０１００】
ｎ≧ｍの場合には、特に問題はなく、ｍの値をレジスタＤ１に格納する（コード１１１２）。
ｎ＜ｍの場合には、生成されたスレッドの数ｍの方が並列実行可能な命令数ｎを上回っているため、すべてのスレッドを実行できない。
そこで、まず、レジスタＤ１に格納されている値ｎから１引いた数をＤ１に格納しなおす（コード１１１４）。このｎ−１の数が必要とする実行可能なスレッドの数である。一つ余るプロセッサエレメントは、元のプログラムをそのままコードにした図６のコードを実行する。
【手続補正１４】
【補正対象書類名】明細書
【補正対象項目名】０１０１
【補正方法】変更
【補正の内容】
【０１０１】
次に命令の番地計算を行うために、ｎ−１の値に命令語長、例えば８bitなら８をかけ（コード１１１５）、Ｐ＿ＰＯＩＮＴＥＲの番地をレジスタＤ２に格納する（コード１１１６）。レジスタＤ２に格納された値からレジスタＤ１に格納された値を引いて、算出された値でレジスタＤ２を更新する（コード１１１７）。そして、レジスタＤ２に格納されている番地の値に命令を飛ばす（コード１１１８）。このＤ２に格納されている値によって以下のどのスレッドから開始するのかを決定する。例えば、ターゲットハードウェアの並列実行可能数が２であった場合には、コード１１２２から開始する。並列実行可能数が３の場合には、コード１１２１から開始する。コード１１２０〜コード１１２２に関しては下から順に実行頻度の高かった実行経路を実行するスレッド開始のコードになっている。
【手続補正１５】
【補正対象書類名】明細書
【補正対象項目名】０１０２
【補正方法】変更
【補正の内容】
【０１０２】
このスレッド１１００をメインスレッドにすることにより、ターゲットハードウェアの並列実行可能数を得ていない場合であってもこのコンパイラ装置は、実行プログラムを生成できる。なお、コード１１２４以降のコードは、全てを図示していないが、図１０におけるコード１０１２以降のコードと同様の構成とする。
ターゲットハードウェアの性能が分からない場合に、その性能を取得する必要があり、その流れを図１６のフローチャートに簡単に示しておいた。
【手続補正１６】
【補正対象書類名】図面
【補正対象項目名】図５
【補正方法】変更
【補正の内容】
【図５】
2006154971.tif 000001
【手続補正１７】
【補正対象書類名】図面
【補正対象項目名】図６
【補正方法】変更
【補正の内容】
【図６】
2006154971.tif 000002
【手続補正１８】
【補正対象書類名】図面
【補正対象項目名】図７
【補正方法】変更
【補正の内容】
【図７】
2006154971.tif 000003
【手続補正１９】
【補正対象書類名】図面
【補正対象項目名】図８
【補正方法】変更
【補正の内容】
【図８】
2006154971.tif 000004
【手続補正２０】
【補正対象書類名】図面
【補正対象項目名】図９
【補正方法】変更
【補正の内容】
【図９】
2006154971.tif 000005
【手続補正２１】
【補正対象書類名】図面
【補正対象項目名】図１１
【補正方法】変更
【補正の内容】
【図１１】
2006154971.tif 000006
【手続補正２２】
【補正対象書類名】図面
【補正対象項目名】図１２
【補正方法】変更
【補正の内容】
【図１２】
2006154971.tif 000007
【手続補正２３】
【補正対象書類名】図面
【補正対象項目名】図１３
【補正方法】変更
【補正の内容】
【図１３】
2006154971.tif 000008
【手続補正２４】
【補正対象書類名】図面
【補正対象項目名】図１４
【補正方法】変更
【補正の内容】
【図１４】
2006154971.tif 000009
【手続補正２５】
【補正対象書類名】図面
【補正対象項目名】図２１
【補正方法】変更
【補正の内容】
【図２１】
2006154971.tif 000010