(57)【要約】【課題】連続演算処理に展開される命令群を含むソースプログラムから、利用可能なプログラム容量の範囲内で最も実行性能が高いオブジェクトコードを生成する。【解決手段】ソースプログラムから実行用の機械語プログラムを生成するコンパイラが、連続演算処理に割り当て可能なプログラムエリアの空き容量Pの入力を受け付けるステップと、前記空き容量Pと展開後の演算処理１回当たりの必要メモリ容量Qとから連続演算可能回数Kを設定するステップ（Ｓ１０３）と、前記命令群に対応して実行すべき連続演算の演算回数AがK以下の場合は、Aに等しい回数の連続演算処理に展開し（Ｓ１０５）、実行すべき連続演算の演算回数AがKを超える場合は、Kに等しい回数の連続演算処理を繰り返すループと、K未満の端数に相当する回数の単独演算処理を繰り返すループとに展開するステップ（Ｓ１０７）とを有する。【選択図】図１
2013254282.tif 000002
【特許請求の範囲】
【請求項１】
連続演算処理に展開可能な命令を含んで記述されたソースプログラムから実行用の機械語プログラムを生成するコンパイラが、連続演算処理に割り当て可能なプログラムエリア空き容量Pの入力を受け付けるステップと、
前記コンパイラが、前記プログラムエリア空き容量Pを展開後の演算処理１回当たりの必要メモリ容量Qで割った値の整数部分を連続演算可能回数Kとして設定するステップと、
前記コンパイラが、前記命令にて実行すべき連続演算の演算回数Aが前記連続演算可能回数Kを超える場合は、前記連続演算可能回数Kに等しい連続演算を実行する連続演算記述形式の処理を１回以上繰り返すループと、前記連続演算可能回数K未満の端数に相当する回数の単独演算及び比較処理を繰り返すループとに展開するステップと、
を有することを特徴とするコンパイル処理方法。
【請求項２】
連続演算処理に展開可能な命令を含んで記述されたソースプログラムから実行用の機械語プログラムを生成するコンパイラが、連続演算処理に割り当て可能なプログラムエリア空き容量Pの入力を受け付けるステップと、
前記コンパイラが、前記プログラムエリア空き容量Pを展開後の演算処理１回当たりの必要メモリ容量Qで割った値の整数部分を連続演算可能回数Kとして設定するステップと、
前記コンパイラが、前記命令にて実行すべき連続演算の演算回数Aが前記連続演算可能回数Kを超える場合は、前記連続演算可能回数Kに等しい連続演算を実行する連続演算記述形式の処理を１回以上繰り返すループと、前記連続演算可能回数K未満の端数に相当する回数の連続演算を実行する連続演算記述形式の処理とに展開するステップと、
を有することを特徴とするコンパイル処理方法。
【請求項３】
請求項１または請求項２に記載のコンパイル処理方法において、
前記コンパイラが、前記実行すべき連続演算の演算回数Aが前記連続演算可能回数K以下の場合は、前記演算回数Aに等しい連続演算を実行する連続演算記述形式の処理に展開するステップ
をさらに有することを特徴とするコンパイル処理方法。
【請求項４】
連続演算処理に展開可能な命令を含んで記述されたソースプログラムと、コンパイルコマンドにより連続演算処理に割り当て可能なプログラムエリア空き容量Pとの入力を受け付ける受付手段と、
前記プログラムエリア空き容量Pを展開後の演算処理１回当たりの必要メモリ容量Qで割った値の整数部分を連続演算可能回数Kとして設定する連続演算可能回数設定手段と、
前記命令にて実行すべき連続演算の演算回数Aが前記連続演算可能回数Kを超える場合は、前記連続演算可能回数Kに等しい連続演算を実行する連続演算記述形式の処理を１回以上繰り返すループと、前記連続演算可能回数K未満の端数に相当する回数の単独演算及び比較処理を繰り返すループとに展開して、実行用の機械語プログラムを生成するコンパイル処理手段と、
を備えることを特徴とするコンパイラ。
【請求項５】
連続演算処理に展開可能な命令を含んで記述されたソースプログラムと、コンパイルコマンドにより連続演算処理に割り当て可能なプログラムエリア空き容量Pとの入力を受け付ける受付手段と、
前記プログラムエリア空き容量Pを展開後の演算処理１回当たりの必要メモリ容量Qで割った値の整数部分を連続演算可能回数Kとして設定する連続演算可能回数設定手段と、
前記命令にて実行すべき連続演算の演算回数Aが前記連続演算可能回数Kを超える場合は、前記連続演算可能回数Kに等しい連続演算を実行する連続演算記述形式の処理を１回以上繰り返すループと、前記連続演算可能回数K未満の端数に相当する回数の連続演算を実行する連続演算記述形式の処理とに展開して、実行用の機械語プログラムを生成するコンパイル処理手段と、
を備えることを特徴とするコンパイラ。
【請求項６】
請求項４または請求項５に記載のコンパイラにおいて、
前記コンパイル処理手段は、前記実行すべき連続演算の演算回数Aが前記連続演算可能回数K以下の場合は、前記演算回数Aに等しい連続演算を実行する連続演算記述形式の処理に展開する
ことを特徴とするコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば、Ｃ言語等の高級言語によって記述され、積和演算のような連続演算処理に展開される命令群を含むソースプログラムのコンパイル処理方法及びコンパイラに関するものである。
【背景技術】
【０００２】
近年の著しい電子機器技術の発達により、コンピュータの処理速度は日々高速化している。例えば、スーパーコンピュータでは、量子力学、気象研究、物理的シミュレーション等の高度な演算を、高速かつ高精度に実施できるようになってきている。これらの演算においては、積和演算等の連続演算処理が度々使用される。
【０００３】
また、スーパーコンピュータに限らず、連続演算処理を含むコンピュータプログラムを作成する場合の記述言語としては、Ｃ言語等の可視化性に優れた高級言語がよく用いられており、演算処理を実施するプロセッサにおいては、連続演算処理用の演算機構を備えたものも多々存在する。
【０００４】
図７は、従来のコンパイラによるＣ言語の積和演算命令「mac」のコンパイル処理の例を示すフローチャートである。Ｃ言語のソースコード（ソースプログラム）に、それぞれアドレスX及びアドレスYから始まるA個のデータの積和演算（A回連続して積和演算を実行）に該当するmac(X,Y,A)の記述が含まれているものとする（Ｓ７０１）。この場合、コンパイラは、演算子「mac」の記述を確認すると（Ｓ７０２）、積和演算の演算回数Aとコンパイラ固有の連続演算可能回数Mとの比較処理を実施する（Ｓ７０３）。演算回数Aがコンパイラの連続演算可能回数M以下の場合（Ｓ７０３にて"Yes"）、コンパイラは、「MAC」命令がA回連続する連続演算記述形式にコンパイルし（Ｓ７０４）、処理を終了する（Ｓ７０６）。一方、演算回数Aがコンパイラの連続演算可能回数Mよりも大きい場合は（Ｓ７０３にて"No"）、単独の「MAC」命令と比較処理命令「CMP/HI」との繰り返しとなる単独演算＋比較処理記述形式にコンパイルし（Ｓ７０５）、処理を終了する（Ｓ７０６）。
【０００５】
次に、コンパイル結果の相違による演算時間の違いについて説明する。一般的に、積和演算処理を高速で実施するＤＳＰ（Digital Signal Processor：ディジタルシグナルプロセッサ）等は、積和演算を効率よく実施するための積和演算器を有している。図８は、積和演算を１クロックで実行可能な積和演算器を備えたＤＳＰの例を示す概略構成図である。
【０００６】
積和演算器８は、まずデータエリアＡ０３のそれぞれX、Yのアドレスに格納されている２つのデータを読み出し、積算器８１にて両者の積算を実施する。積算された値は、加算器８２にて積和演算レジスタ８３に格納されている前回値に加算され、再度積和演算レジスタ８３に書き込まれる。積和演算開始時は、事前に積和演算レジスタ８３に初期値"0"を書き込む処理が必要となるが、２回目以降の演算処理は、X、Yのアドレスを１つずつずらして積算と加算とを実施していく処理のみなので、１クロックで実行することができる。本処理をA回繰り返したのちに積和演算レジスタ８３に格納されているデータが、演算結果「sum」となる。このように、ＤＳＰは、積和演算処理を効率よく実施するために、内部に積和演算器８を備え、少ない処理で積和演算を実行できる特徴をもっている。
【０００７】
図９は、図７を用いて前記した「MAC」命令の連続演算記述形式と、「MAC」命令の単独演算＋比較処理記述形式とにおける演算時間の比較例を示したものである。尚、図９の例では、比較時間計算の簡略化のため、１回目の「MAC」演算処理時間を２クロック（図９では"CLK"と表記）、２回目以降の「MAC」演算処理時間を１クロック、「CMP/HI」演算処理時間を１クロックとして記載している。例えば、演算回数１００回の積和演算に要する時間は、「MAC」命令の連続処理記述形式（Ｐ９１）の演算時間が１０１クロックであるのに対して、「MAC」命令の単独演算＋比較処理記述形式（Ｐ９２）にて１００回繰り返す場合の演算時間は３００クロックとなる。つまり、単独演算＋比較処理記述形式（Ｐ９２）は連続演算記述形式（Ｐ９１）の３倍近くの演算時間を要することとなる。
【０００８】
特許文献１には、ループ本体のサイズに基づいて展開する場合の最大展開数を決定し、決定した最大展開数の範囲内で用意した展開数が異なる複数の展開部を、総展開数がループ繰返し回数に等しくなるように組み合わせて実行することで実行性能を向上させるループ最適化方法が開示されている。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】特開平６−２２２９２８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１０】
前記したように、高級言語によって記述され、積和演算のような連続演算処理に展開される命令群を含むソースプログラムは、必要な連続演算回数とコンパイラ固有の連続演算可能回数との大小関係によってアセンブリ言語記述のコンパイル結果が変わり、演算時間が増大してしまう場合があるという問題がある。また、特許文献１に開示されているループ最適化方法は、最大展開数を大きくするほど実行性能が向上するが、その分用意すべき展開部の数が増えるので、プログラム容量が増大してしまうという問題がある。
【００１１】
本発明は、前記の問題を解決するためになされたものであり、高級言語によって記述され、連続演算処理に展開される命令群を含むソースプログラムから、利用可能なプログラム容量の範囲内で、より実行性能が高いオブジェクトコードを生成することができるコンパイル処理方法及びコンパイラを提供することを目的とする。
【課題を解決するための手段】
【００１２】
前記の目的を達成するために、本発明に係るコンパイル処理方法は、連続演算処理に展開可能な命令を含んで記述されたソースプログラムから実行用の機械語プログラムを生成するコンパイラが、連続演算処理に割り当て可能なプログラムエリア空き容量Pの入力を受け付けるステップと、前記コンパイラが、前記プログラムエリア空き容量Pを展開後の演算処理１回当たりの必要メモリ容量Qで割った値の整数部分を連続演算可能回数Kとして設定するステップと、前記コンパイラが、前記命令にて実行すべき連続演算の演算回数Aが前記連続演算可能回数Kを超える場合は、前記連続演算可能回数Kに等しい連続演算を実行する連続演算記述形式の処理を１回以上繰り返すループと、前記連続演算可能回数K未満の端数に相当する回数の単独演算及び比較処理を繰り返すループとに展開するステップと、を有するものとした。
【発明の効果】
【００１３】
本発明によれば、高級言語によって記述され、連続演算処理に展開される命令群を含むソースプログラムから、利用可能なプログラム容量の範囲内で、より実行性能が高いオブジェクトコードを生成することができるコンパイル処理方法及びコンパイラを提供できる。
【図面の簡単な説明】
【００１４】
【図１】本発明の実施の形態に係るコンパイラの動作例を示すフローチャートである。
【図２】プログラムエリア空き容量の入力方法の例を示す説明図である。
【図３】Ｃ言語によって記述されたソースプログラムが、コンパイラにより機械語記述の連続演算処理に展開されるまでの一連の処理の流れを例示したものである。
【図４】Ｃ言語の積和演算命令「mac」がアセンブリ言語記述にコンパイルされた例を示す説明図である。
【図５】連続演算可能回数の存在によって生じるコンパイル結果の相違例を示す説明図である。
【図６】コンパイラ固有の連続演算可能回数が設定されていない場合のコンパイル結果の例を示す説明図である。
【図７】従来のコンパイラによるＣ言語の積和演算命令「mac」のコンパイル処理の例を示すフローチャートである。
【図８】積和演算器を備えたＤＳＰの例を示す概略構成図である。
【図９】「MAC」命令の連続演算記述形式と、「MAC」命令の単独演算＋比較処理記述形式とにおける演算時間の比較例を示したものである。
【発明を実施するための形態】
【００１５】
以下、本発明を実施するための形態を、図面を参照して詳しく説明する。
図３は、高級言語であるＣ言語によって記述されたソースプログラムが、コンパイラによりコンパイルされ、機械語記述の連続演算処理に展開されるまでの一連の処理の流れを例示したものである。以降、Ｃ言語の積和演算命令「mac」を例として説明する。
【００１６】
Ｃ言語にて記述された積和演算命令「mac」を含むソースプログラム（Ｐ３１）は、コンパイラ（Ｃ３）により一度アセンブリ言語記述（Ｐ３２）に変換されたのち（Ｃ３１）、機械語記述のオブジェクトコード（Ｐ３３）に変換される（Ｃ３２）。
【００１７】
図４は、Ｃ言語の積和演算命令「mac」がアセンブリ言語記述にコンパイルされた例を示す説明図である。本図では積和演算の一例として、ディジタルフィルタでよく使用されるＦＩＲ（Finite Impulse Response：有限インパルス応答）フィルタの計算式を取り上げている。本ＦＩＲフィルタの計算式は、（式１）のような積和演算式で表される。
【００１８】
【数１】
2013254282.tif 000003
【００１９】
また、coeff(1)〜coeff(A)のデータ、及びdata(1)〜data(A)のデータは、それぞれデータエリア（Ａ０３）に連続して格納されており、X〜X+(A-1)、Y〜Y+(A-1)はcoeff(1)〜coeff(A)、data(1)〜data(A)のデータが格納されているアドレスを表すものとすると、Ｃ言語では（式１）を、
sum = mac(X,Y,A)  ・・・  （Ｐ４１）
と記述することができる。
【００２０】
Ｃ言語の積和演算命令「mac」は、アセンブリ言語記述にコンパイルされ、
MAC  @X+,@Y+
というアセンブリ言語の「MAC」命令がA回連続して記述された「MAC」命令列に変換される（Ｐ４２）。不図示のプロセッサがアセンブリ言語記述の前記「MAC」命令列を実行することにより、まずX、Yで指定されたアドレスのデータを読み出し、両データを積算して前回までの累積結果（初期値は"0"）に加算したのちに当該X、YのアドレスをX+1、Y+1に更新する。更新後、X+1、Y+1で指定されたアドレスのデータを読み出し、両データを積算して前回までの累積結果に加算したのちに当該X+1、Y+1のアドレスをX+2、Y+2に更新する。本処理をA回繰り返すことにより、積和演算の合計値sumが算出される。
【００２１】
ここで、繰り返しの演算回数Aの値に注目する。従来のコンパイラでは、図４にて説明したアセンブリ言語記述のコンパイル結果（Ｐ４２）は、演算回数Aの値によって変わってくる。これは、Ｃ言語の積和演算命令「mac」をアセンブリ言語記述にコンパイルする際に、コンパイラ固有の連続演算可能回数が存在することによる。
【００２２】
図５は、この連続演算可能回数の存在によって生じるコンパイル結果の相違例を示す説明図である。ソースプログラムＰ５１のように、Ｃ言語記述の演算回数Aが、コンパイラ固有の連続演算可能回数M以下の場合、アセンブリ言語記述のコンパイル結果Ｐ５２は、「MAC」命令がA回連続して記述されたものとなる。一方、ソースプログラムＰ５３のように、Ｃ言語記述の演算回数Bが、コンパイラ固有の連続演算可能回数Mを超えている場合は、アセンブリ言語記述のコンパイル結果Ｐ５４は、比較処理命令「CMP/HI」を含むループ処理にて記述されたものとなる。このコンパイル結果Ｐ５４では、「MAC」命令を１回実行する毎に更新後のアドレスXと、終了判定アドレスR（演算開始アドレスXに演算回数Bを足した値）との比較処理を行い、X≧Rとなるまで「MAC」命令を繰り返して実行することとなる。
【００２３】
このようなコンパイル結果の相違は、コンパイラの処理方法によって生じるものである。図６は、コンパイラ固有の連続演算可能回数が設定されていない場合のコンパイル結果の例を示す説明図である。この場合は、ソースプログラムＰ６１にて指定されたＣ言語記述の演算回数Lが、著しく大きな値であったとしても、アセンブリ言語記述のコンパイル結果Ｐ６２は、「MAC」命令がL回連続して記述されたものとなるので、機械語のオブジェクトコードＰ６３のプログラム容量が増加する。プロセッサ内メモリ領域Ａ０１においては、予めプログラムを格納するプログラムエリアＡ０２が設けられており、演算回数Lの値によってはプロセッサ内のプログラムエリアを多大に消費し、オブジェクトコードＰ６３のプログラム容量がプログラムエリアＡ０２の容量をオーバーしてしまう要因ともなりうる。そのため、従来のコンパイラでは、連続演算可能回数Mを設定し、プロセッサ内のプログラムエリアＡ０２を多大に消費しないようにしている。
【００２４】
図１は、本発明の実施の形態に係るコンパイラの動作例を示すフローチャートである。この図１には、一例として、Ｃ言語の積和演算命令「mac」をコンパイルする場合の処理の流れを示している。
【００２５】
ここでは、Ｃ言語にて記述されたソースコード（ソースプログラム）のなかにmac(X,Y,A)の記述が含まれているものとする（Ｓ１０１）。この場合、コンパイラは、演算子「mac」の記述を確認すると（Ｓ１０２）、コンパイル時のパラメータとしてユーザが指定したプログラムエリア空き容量から、連続演算可能回数を算出しその値をKに設定する（Ｓ１０３）。例えば、ユーザによって指定されたプログラムエリア空き容量をP、アセンブリ言語の「MAC」命令一行分の必要メモリ容量（図１では必要容量と略記）をQとすると、Kには、PをQで割った値（P/Q）の整数部の値が設定される。なお、「コンパイル時のパラメータとして指定されるプログラムエリア空き容量P」については、図２を用いて後記する。
【００２６】
次に、コンパイラは、積和演算命令「mac」にて指定されている演算回数Aと、Ｓ１０３にて設定した連続演算可能回数Kとの比較処理を実行する（Ｓ１０４）。その結果、演算回数Aが連続演算可能回数K以下の場合は（Ｓ１０４にて"Yes"）、コンパイラは、A回の「MAC」命令の連続演算記述にコンパイルしたのち（Ｓ１０５）、処理を終了する（Ｓ１０８）。
【００２７】
また、演算回数Aが連続演算可能回数Kよりも大きい場合は（Ｓ１０４にて"No"）、コンパイラは、K回の「MAC」命令の連続演算をループさせる回数をTに設定する（Ｓ１０６）。例えば、Tには、AをKで割った値（A/K）の整数部の値が設定される。続いて、コンパイラは、初期値"0"の変数Uにてループ回数をカウントし、K回の「MAC」命令の連続演算をT回実行する連続演算記述形式と、残りのK未満の端数の回数だけ比較命令「CMP/HI」を用いて「MAC」命令の単独演算の実行を繰り返す比較処理記述形式とにコンパイルしたのち（Ｓ１０７）、処理を終了する（Ｓ１０８）。なお、端数が生じない場合には、比較処理記述の部分は生成されない。
【００２８】
なお、図１では、端数の回数の演算を「MAC」命令の単独演算の実行を繰り返す比較処理記述形式によって実現する例を示したが、代わりに、端数の回数の「MAC」命令が連続した連続演算記述によって実現するものとしてもよい。その場合には、すでに実行が完了しているK回の「MAC」命令の連続演算を実行する連続演算記述形式のコードをプログラムエリアＡ０２からスワップアウトして上書きすることにより、プログラム容量の増大を防ぐようにすることが好ましい。
【００２９】
図２は、本発明に係るコンパイラへのプログラムエリア空き容量の入力方法の例を示す説明図である。Ｃ言語で記載されたソースプログラム（ソースコード）をコンパイルする際に、前記の連続演算可能回数Kを設定するために用いられるコンパイルパラメータとして、ユーザはプログラムエリア空き容量Pをコンパイラに入力する。図２に示すように、この入力には、例えば、「make2(P)」（Ｃ２０１）のようなコンパイルコマンドを用いることができる。
【００３０】
ユーザがプログラムエリア空き容量Pの値を確認するときには、従来のコンパイラと同様な比較処理命令「CMP/HI」を含むループ処理にて記述される比較処理記述形式（図５のコンパイル結果Ｐ５４参照）にて一旦コンパイルを実施し、生成されたオブェクトコードをプロセッサにローディングする。それにより、プロセッサ内メモリ領域Ａ０１内のプログラムエリアＡ０２内の未使用領域の容量をプログラムエリア空き容量Pとして確認することができる。ここで、アセンブリ言語記述での「MAC」命令１行分（Ｐ２１）が機械語記述Ｐ２２にコンパイルされたときの必要容量がQバイトであったとすると、プログラムエリア空き容量Pのなかに収容可能な「MAC」命令の最大数、つまり連続演算可能回数Kは、PをQで割った値（P/Q）の整数部の値に設定されることになる。
【００３１】
以上説明したように、本実施形態によれば、コンパイラが、ユーザによって指定されたプログラムエリア空き容量の範囲内で最大の連続演算可能回数を自動的に設定して連続演算記述形式に展開するので、プログラムエリアの空き容量を最大限に活用して演算処理の高速化を実現することができる。
【００３２】
以上にて本発明を実施するための形態の説明を終えるが、本発明の実施の態様はこれに限られるものではなく、本発明の趣旨を逸脱しないしない範囲において各種の変更が可能である。
【符号の説明】
【００３３】
Ａ０１  プロセッサ内メモリ領域
Ａ０２  プログラムエリア
Ａ０３  データエリア
Ｃ３    コンパイラ
８      積和演算器
８１    積算器
８２    加算器
８３    レジスタ
【図１】
2013254282.tif 000004
【図２】
2013254282.tif 000005
【図３】
2013254282.tif 000006
【図４】
2013254282.tif 000007
【図５】
2013254282.tif 000008
【図６】
2013254282.tif 000009
【図７】
2013254282.tif 000010
【図８】
2013254282.tif 000011
【図９】
2013254282.tif 000012