(57)【特許請求の範囲】
【請求項１】
グローバルプロセッサと複数のプロセッサエレメントとを備えたＳＩＭＤ型プロセッサのためのコンパイル装置であって、
上記コンパイル装置は、上記ＳＩＭＤ型プロセッサにより実行する処理を示しかつ所定の変数名を含むソースコードを上記ＳＩＭＤ型プロセッサにより実行可能なアセンブリコードに変換する制御手段を備え、
上記グローバルプロセッサは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第１の記憶手段を備え、
上記各プロセッサエレメントは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第２の記憶手段を備え、
上記各プロセッサエレメントの第２の記憶手段は、上記複数のプロセッサエレメントの数分の複数のメモリであって、上記各プロセッサエレメントで互いに同一の変数名の変数値を記憶し、
上記ソースコードには、複数の引数を含む関数が記述されており、
上記アセンブリコードは、上記ＳＩＭＤ型プロセッサに、当該関数が呼び出されるときに上記各引数のそれぞれを上記グローバルプロセッサの変数名と上記プロセッサエレメントの変数名とに振り分ける処理と、上記関数に含まれる引数が上記グローバルプロセッサの変数名に振り分けられた場合は当該引数の引数値を上記グローバルプロセッサの上記第１の記憶手段のスタック領域に退避し、上記関数に含まれる引数が上記プロセッサエレメントの変数名に振り分けられた場合は上記各プロセッサエレメントにおいて互いに同一の引数名の引数値を上記各プロセッサエレメントの上記各メモリの同一のアドレスにそれぞれ退避する処理とを実行させるためのものである、
ことを特徴とするコンパイル装置。
【請求項２】
グローバルプロセッサと複数のプロセッサエレメントとを備えたＳＩＭＤ型プロセッサのためのコンパイル装置が実行するコンパイル方法であって、
上記コンパイル装置は、上記ＳＩＭＤ型プロセッサにより実行する処理を示しかつ所定の変数名を含むソースコードを上記ＳＩＭＤ型プロセッサにより実行可能なアセンブリコードに変換する制御ステップを実行し、
上記グローバルプロセッサは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第１の記憶手段を備え、
上記各プロセッサエレメントは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第２の記憶手段を備え、
上記各プロセッサエレメントの第２の記憶手段は、上記複数のプロセッサエレメントの数分の複数のメモリであって、上記各プロセッサエレメントで互いに同一の変数名の変数値を記憶し、
上記ソースコードには、複数の引数を含む関数が記述されており、
上記アセンブリコードは、上記ＳＩＭＤ型プロセッサに、当該関数が呼び出されるときに上記各引数のそれぞれを上記グローバルプロセッサの変数名と上記プロセッサエレメントの変数名とに振り分ける処理と、上記関数に含まれる引数が上記グローバルプロセッサの変数名に振り分けられた場合は当該引数の引数値を上記グローバルプロセッサの上記第１の記憶手段のスタック領域に退避し、上記関数に含まれる引数が上記プロセッサエレメントの変数名に振り分けられた場合は上記各プロセッサエレメントにおいて互いに同一の引数名の引数値を上記各プロセッサエレメントの上記各メモリの同一のアドレスにそれぞれ退避する処理とを実行させるためのものである、
ことを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えば画像処理のために用いられるＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ−ｓｔｒｅａｍ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ−ｓｔｒｅａｍ）型プロセッサのためのコンパイル装置及び方法に関する。
【背景技術】
【０００２】
近年、１つのグローバルプロセッサと複数のプロセッサエレメントとを備えたＳＩＭＤ型プロセッサであって、グローバルプロセッサは、グローバルプロセッサ用データＲＡＭを備えて構成され、プロセッサエレメントはそれぞれプロセッサエレメント用データＲＡＭを備えて構成されるＳＩＭＤ型プロセッサが使用されるようになってきている。ＳＩＭＤ型プロセッサは、１つの演算命令により複数のデータを並列処理することができる。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
しかしながら、上記ＳＩＭＤ型プロセッサ用の従来技術に係るコンパイラでは、グローバルプロセッサ用変数は、従来の汎用プロセッサ用のコンパイラで通常用いられる変数と同様に扱うことができるが、プロセッサエレメント用のデータは、プロセッサ内部のプロセッサエレメント用レジスタに記憶させて扱うことはあっても、変数として扱うことはなかった。また、プロセッサエレメント用データを関数の引数として扱うこともなかった。このため、プロセッサエレメント用データを関数で使用するには、グローバルなデータとして扱うことしかできず、さらにデータの数がレジスタの数に制限されてしまう問題があった。
【０００４】
また、グローバルプロセッサ用変数の変数値を記憶するための領域及びプロセッサエレメント用変数の変数値を記憶するための領域を、グローバルプロセッサ用データＲＡＭのスタック及びプロセッサエレメント用データＲＡＭのスタックの両方に確保すると、１つの変数に対して複数の領域が確保されるので、スタックの領域が大きくなる問題がある。特許文献１では、タスクごとにスタックを切り換えて使用する装置及び方法が開示されているが、変数ごとにスタックを使い分けることは行っていない。
【０００５】
本発明の目的は以上の問題を解決し、関数呼び出し時の引数としてプロセッサエレメント用変数名を指定することができ、関数内の自動変数としてプロセッサエレメント用変数名を指定することができ、かつ変数値を記憶するスタックの領域を減少させることができるコンパイル装置及び方法を提供することにある。
【課題を解決するための手段】
【０００６】
本発明に係るコンパイル装置は、グローバルプロセッサと複数のプロセッサエレメントとを備えたＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）型プロセッサのためのコンパイル装置であって、
上記ＳＩＭＤ型プロセッサにより実行する処理を示しかつ所定の変数名を含むソースコードを、上記ＳＩＭＤ型プロセッサにより実行可能な上記変数名を含むアセンブリコードに変換する制御手段を備えたコンパイル装置において、
上記グローバルプロセッサは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第１の記憶手段を備え、
上記各プロセッサエレメントは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第２の記憶手段を備え、
上記各プロセッサエレメントの第２の記憶手段は、上記各プロセッサエレメントで互いに同一の変数名の変数値を記憶し、
上記制御手段は、上記グローバルプロセッサのスタック領域と、上記各プロセッサエレメントのスタック領域とを使用してコード展開を行い、
上記制御手段は、
上記ソースコードに複数の引数を含む関数が含まれており、当該関数を呼び出すときに、上記各引数をそれぞれ、上記グローバルプロセッサの変数名と、上記プロセッサエレメントの変数名とに振り分けて、上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域に当該引数の引数値を退避し、上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域に当該引数の引数値を退避し、
上記関数内に記述されたソースコードをアセンブリコードに変換するときに、上記各スタック領域から上記引数の引数値を取り出すようにコード展開を行い、
上記関数内に宣言された複数の自動変数の領域を確保するときに、上記各自動変数をそれぞれ、上記グローバルプロセッサの変数名と、上記プロセッサエレメントの変数名とに振り分けて、上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域に当該自動変数の領域を確保し、上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域に当該自動変数の領域を確保するようにコード展開を行うことを特徴とする。
【０００７】
また、上記コンパイル装置において、上記制御手段は、上記関数に含まれる引数を上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域にのみ当該引数の引数値を退避し、上記関数に含まれる引数を上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域にのみ当該引数の引数値を退避することを特徴とする。
【０００８】
さらに、上記コンパイル装置において、上記制御手段は、上記関数内に宣言された自動変数を上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域にのみ当該自動変数の領域を確保し、上記関数内に宣言された自動変数を上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域にのみ当該自動変数の領域を確保するようにコード展開を行うことを特徴とする。
【０００９】
本発明に係るコンパイル方法は、グローバルプロセッサと複数のプロセッサエレメントとを備えたＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）型プロセッサのためのコンパイル方法であって、
上記ＳＩＭＤ型プロセッサにより実行する処理を示しかつ所定の変数名を含むソースコードを、上記ＳＩＭＤ型プロセッサにより実行可能な上記変数名を含むアセンブリコードに変換する制御ステップを備えたコンパイル方法において、
上記グローバルプロセッサは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第１の記憶手段を備え、
上記各プロセッサエレメントは、上記変数名の変数値を当該変数名に対応してスタック領域に記憶する第２の記憶手段を備え、
上記各プロセッサエレメントの第２の記憶手段は、上記各プロセッサエレメントで互いに同一の変数名の変数値を記憶し、
上記制御ステップは、上記グローバルプロセッサのスタック領域と、上記各プロセッサエレメントのスタック領域とを使用してコード展開を行い、
上記制御ステップは、
上記ソースコードに複数の引数を含む関数が含まれており、当該関数を呼び出すときに、上記各引数をそれぞれ、上記グローバルプロセッサの変数名と、上記プロセッサエレメントの変数名とに振り分けて、上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域に当該引数の引数値を退避し、上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域に当該引数の引数値を退避し、
上記関数内に記述されたソースコードをアセンブリコードに変換するときに、上記各スタック領域から上記引数の引数値を取り出すようにコード展開を行い、
上記関数内に宣言された複数の自動変数の領域を確保するときに、上記各自動変数をそれぞれ、上記グローバルプロセッサの変数名と、上記プロセッサエレメントの変数名とに振り分けて、上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域に当該自動変数の領域を確保し、上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域に当該自動変数の領域を確保するようにコード展開を行うことを特徴とする。
【００１０】
また、上記コンパイル方法において、上記制御ステップは、上記関数に含まれる引数を上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域にのみ当該引数の引数値を退避し、上記関数に含まれる引数を上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域にのみ当該引数の引数値を退避することを特徴とする。
【００１１】
また、上記コンパイル方法において、上記制御ステップは、上記関数内に宣言された自動変数を上記グローバルプロセッサの変数名に振り分けたときに当該スタック領域にのみ当該自動変数の領域を確保し、上記関数内に宣言された自動変数を上記プロセッサエレメントの変数名に振り分けたときに当該スタック領域にのみ当該自動変数の領域を確保するようにコード展開を行うことを特徴とする。
【発明の効果】
【００１２】
本発明に係るコンパイル装置及び方法によれば、各プロセッサエレメントで処理する複数のデータを１つの変数名で表してプロセッサエレメント用変数名として扱い、プロセッサエレメント用変数名に対する領域を、プロセッサエレメントの第２の記憶手段のスタック領域に確保するようにしたので、プロセッサエレメント用変数名をグローバルプロセッサ用変数名と同様に扱うことができる。したがって、関数呼び出し時の引数としてグローバルプロセッサ用変数名及びプロセッサエレメント用変数名を指定することができ、かつ関数内の自動変数としてグローバルプロセッサ用変数名及びプロセッサエレメント用変数名を指定することができる。
【００１３】
また、本発明に係るコンパイル装置及び方法によれば、引数がグローバルプロセッサ用変数名であるとき当該引数の引数値をグローバルプロセッサの第１の記憶手段のスタック領域に退避し、引数がプロセッサエレメント用変数名であるとき当該引数の引数値をプロセッサエレメントの第２の記憶手段のスタック領域に退避し、自動変数がグローバルプロセッサ用変数名であるとき当該自動変数の領域をグローバルプロセッサの第１の記憶手段のスタック領域に確保し、かつ自動変数がプロセッサエレメント用変数名であるとき当該自動変数の領域をプロセッサエレメントの第２の記憶手段のスタック領域に確保して、それぞれのスタック領域を別々に管理するので、スタック領域を減少させることができる。
【図面の簡単な説明】
【００１４】
【図１】本発明の実施形態に係るコンパイル装置１の構成を示すブロック図である。
【図２】図１のコンパイル装置１が対象とするＳＩＭＤ型プロセッサ２０の構成を示すブロック図である。
【図３】図２のグローバルプロセッサ用データＲＡＭ２１ｍのメモリマッピングを示す図である。
【図４】図２のＳＩＭＤ型プロセッサ２０において、グローバルプロセッサ用データＲＡＭ２１ｍにアクセスするためのアセンブリ言語命令を示す図である。
【図５】図２のＳＩＭＤ型プロセッサ２０において、プロセッサエレメントＰＥ用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）にアクセスするためのアセンブリ言語命令を示す図である。
【図６】図１のコンパイル装置１に入力されるソースコードの例を示す図である。
【図７】図１の変換テーブル１７ｃの構成を示す図である。
【図８】図６のソースコードの４行目における「＃ｐｒａｇｍａ  ＳＩＭＤ  ｆｕｎｃｔｉｏｎ」文を解析することによって作成される図１の変換テーブル１７ｃを示す図である。
【図９】従来技術に係る関数呼び出し時におけるデータＲＡＭのスタックフレームを示す図である。
【図１０】図２のグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームを示す図である。
【図１１】図２のプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームを示す図である。
【図１２】従来技術に係る関数内の自動変数領域を確保したデータＲＡＭのスタックフレームを示す図である。
【図１３】図１の自動変数テーブル１７ｄの構成を示す図である。
【図１４】関数内の自動変数に対する領域を確保した図２のグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームを示す図である。
【図１５】関数内の自動変数に対する領域を確保した図２のプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームを示す図である。
【発明を実施するための形態】
【００１５】
図１は、本発明の実施形態に係るコンパイル装置１の構成を示すブロック図である。本実施形態に係るコンパイル装置１は、グローバルプロセッサ２１と３５２個のプロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）とを備えたＳＩＭＤ型プロセッサ２０のためのコンパイル装置１であって、ＳＩＭＤ型プロセッサ２０により実行する処理を示しかつ所定の変数名を含むソースコードを、ＳＩＭＤ型プロセッサ２０により実行可能な上記変数名を含むアセンブリコードに変換するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１１を備えたコンパイル装置１において、グローバルプロセッサ２１は、上記変数名の変数値を当該変数名に対応してスタック領域に記憶するグローバルプロセッサ用データＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２１ｍを備え、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）は、上記変数名の変数値を当該変数名に対応してスタック領域に記憶するプロセッサエレメントＰＥ用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）を備え、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）のプロセッサエレメントＰＥ用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）は、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）で互いに同一の変数名の変数値を記憶することを特徴とする。
【００１６】
また、ＣＰＵ１１は、グローバルプロセッサ２１のスタック領域と、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）のスタック領域とを使用してコード展開を行い、さらに、ＣＰＵ１１は、
（Ａ）上記ソースコードに複数の引数を含む関数が含まれており、当該関数を呼び出すときに、上記各引数をそれぞれ、グローバルプロセッサ２１用の変数名と、プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）用の変数名とに振り分けて、グローバルプロセッサ２１用の変数名に振り分けたときにグローバルプロセッサ２１のスタック領域に当該引数の引数値を退避し、プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）用の変数名に振り分けたときにプロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）のスタック領域に当該引数の引数値を退避し、
（Ｂ）上記関数内に記述されたソースコードをアセンブリコードに変換するときに、上記各スタック領域から上記引数の引数値を取り出すようにコード展開を行い、
（Ｃ）上記関数内に宣言された複数の自動変数の領域を確保するときに、上記各自動変数をそれぞれ、グローバルプロセッサ２１用の変数名と、プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）用の変数名とに振り分けて、グローバルプロセッサ２１用の変数名に振り分けたときにグローバルプロセッサ２１のスタック領域に当該自動変数の領域を確保し、プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）用の変数名に振り分けたときにプロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）のスタック領域に当該自動変数の領域を確保するようにコード展開を行うことを特徴とする。
【００１７】
図１において、コンパイル装置１は、コンパイル装置１を制御する制御部であるＣＰＵ１１と、コンパイル装置１がコンパイル処理を実行するときに使用するＲＡＭ１２と、コンパイル装置１を制御するためのプログラムなどが格納されたＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）１３と、例えば液晶ディスプレイなどであり、コンパイル装置１の動作状態、及びコンパイル処理の途中経過並びに処理結果などを表示するための表示部１４と、例えばキーボード又はマウスなどの入力装置であり、ユーザなどがコンパイル装置１にデータ、指示、又は命令などを入力するための操作部１５と、例えばソースコード及びアセンブリコードなどを記憶する記憶装置などである外部機器１６ａにコンパイル装置１をインターフェースにより接続するための外部機器インターフェース１６と、コンパイル装置１がコンパイル処理を実行するときに使用するハードディスク１７とを備えて構成される。
【００１８】
図１において、ＣＰＵ１１、ＲＡＭ１２、ＲＯＭ１３、表示部１４、操作部１５、外部機器インターフェース１６、及びハードディスク１７は、バスなどによって互いに接続される。また、ハードディスク１７は、コンパイル装置１がコンパイル処理を実行するときに使用するソースコードバッファ１７ａ、変数テーブル１７ｂ、変換テーブル１７ｃ、自動変数テーブル１７ｄ、及びアセンブリコードバッファ１７ｅを有する。
【００１９】
図１のコンパイル装置１は、外部機器インターフェースを介して入力されるソースコードをハードディスク１７のソースコードバッファ１７ａに記憶する。次いで、コンパイル装置１は、ソースコードバッファ１７ａに記憶されたソースコードを読み出して、詳細後述するように、変数テーブル１７ｂ、変換テーブル１７ｃ、及び自動変数テーブル１７ｄを作成し、かつ変数テーブル１７ｂ、変換テーブル１７ｃ、及び自動変数テーブル１７ｄを参照してソースコードをアセンブリコードに変換して、アセンブリコードバッファ１７ｅに書き込む。その後、コンパイル装置１は、アセンブリコードバッファ１７ｅに書き込まれたアセンブリコードを含むファイルをハードディスク１７に生成する。なお、コンパイル装置１は、アセンブリコードバッファ１７ｅに書き込まれたアセンブリコードを外部機器インターフェース１６を介して外部機器１６ａに出力してもよい。
【００２０】
図２は、図１のコンパイル装置１が対象とするＳＩＭＤ型プロセッサ２０の構成を示すブロック図である。図２において、ＳＩＭＤ型プロセッサ２０は、１つのグローバルプロセッサ２１と、３５２個のプロセッサエレメントプロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）とを備えて構成される。グローバルプロセッサ２１は、グローバルプロセッサ用データＲＡＭ２１ｍを備えて構成され、ＳＩＭＤ型プロセッサ２０の全体の動作、及びプロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）の動作を制御する。
【００２１】
また、プロセッサエレメントＰＥ０は、１キロバイトのプロセッサエレメント用データＲＡＭ  ＲＡＭ０と、プロセッサエレメント用データＲＡＭ  ＲＡＭ０にバスによって接続された３２個のレジスタＲｍ−０（ｍ＝０，１，…，３１）と、上記バス及びプロセッサエレメントＰＥ０に隣接する６つのプロセッサエレメントのバスが接続された７対１のマルチプレクサ（ＭＵＸ）２２−０と、算術論理演算を行う算術論理演算回路（ＡＬＵ）２３−０と、算術論理演算の対象となるデータを算術論理演算回路２３−０に出力しかつ算術論理演算の演算結果を記憶するするアキュムレータ（Ａレジスタ）２４−０と、データを一時的に格納する補助レジスタ（Ｆレジスタ）２５−０と、乗除算演算及びテーブル変換に使用する乗除算レジスタ（Ｍレジスタ）２６−０と、命令の実行制御を行う条件レジスタ（Ｔレジスタ）２７−０とを備えて構成される。
【００２２】
さらに、プロセッサエレメントＰＥ１は、１キロバイトのプロセッサエレメント用データＲＡＭ  ＲＡＭ１と、プロセッサエレメント用データＲＡＭ  ＲＡＭ１にバスによって接続された３２個のレジスタＲｍ−１（ｍ＝０，１，…，３１）と、上記バス及びプロセッサエレメントＰＥ１に隣接する６つのプロセッサエレメントのバスが接続された７対１のマルチプレクサ（ＭＵＸ）２２−１と、算術論理演算を行う算術論理演算回路（ＡＬＵ）２３−１と、算術論理演算の対象となるデータを算術論理演算回路２３−１に出力しかつ算術論理演算の演算結果を記憶するするアキュムレータ（Ａレジスタ）２４−１と、データを一時的に格納する補助レジスタ（Ｆレジスタ）２５−１と、乗除算演算及びテーブル変換に使用する乗除算レジスタ（Ｍレジスタ）２６−１と、命令の実行実行制御を行う条件レジスタ（Ｔレジスタ）２７−１とを備えて構成される。またさらに、プロセッサエレメントＰＥｎ（ｎ＝２，３，…，３５１）は、上述したプロセッサエレメントＰＥ０，ＰＥ１と同様に構成されている。
【００２３】
図３は、図２のグローバルプロセッサ２１のグローバルプロセッサ用データＲＡＭ２１ｍのメモリマッピングを示す図である。図３に示すように、グローバルプロセッサ用データＲＡＭ２１ｍは、従来技術に係る汎用プロセッサにおけるデータＲＡＭと同様に、１６キロバイトであるＩ／Ｏ領域ａ１と、１６キロバイトであるデータ領域ａ２と、３２キロバイトであるプログラム領域ａ３とを備える。ここで、プログラム領域ａ３は、例外処理を実行するためのアドレステーブルを含んでいる。
【００２４】
図４は、図２のＳＩＭＤ型プロセッサ２０において、グローバルプロセッサ用データＲＡＭ２１ｍにアクセスするためのアセンブリ言語命令を示す図であり、図５は、図２のＳＩＭＤ型プロセッサ２０において、プロセッサエレメントＰＥ用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）にアクセスするためのアセンブリ言語命令を示す図である。図１のコンパイル装置１は、図４及び図５に示したアセンブリ言語命令を用いて、ソースコードをアセンブリコードに変換する。
【００２５】
図６は、図１のコンパイル装置１に入力されるソースコードの例を示す図である。図６のソースコードは、Ｃ言語で記述されている。ソースコードでは、「＃ｐｒａｇｍａ  ＳＩＭＤ  ｖａｒｉａｂｌｅ」文を用いて、プロセッサエレメント用変数名が指示される。プロセッサエレメント用変数名は、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）で処理する複数のデータをまとめて表している。「＃ｐｒａｇｍａ  ＳＩＭＤ  ｖａｒｉａｂｌｅ」文によってプロセッサエレメント用変数名を指示しておけば、グローバルプロセッサ用変数名を用いて演算を記述する方法と同様の方法で、プロセッサエレメント用変数名を用いて演算を記述することができる。一方、ソースコードにおいて使用されており、かつ「＃ｐｒａｇｍａ  ＳＩＭＤ  ｖａｒｉａｂｌｅ」文によって指示されていない変数名は、グローバルプロセッサ用変数名である。以下、プロセッサエレメント用変数名を有する変数をプロセッサエレメント用変数といい、グローバルプロセッサ用変数名を有する変数をグローバルプロセッサ用変数という。
【００２６】
図６のソースコードでは、１行目から３行目までにおいて「＃ｐｒａｇｍａ  ＳＩＭＤ  ｖａｒｉａｂｌｅ」文が記述されており、変数名ｃｏｌＲ，ｃｏｌＧ，ｃｏｌＢ，ｃｕｒＲ，ｃｕｒＧ，ｃｕｒＢ，ｔｍｐＲ，ｔｍｐＧ，ｔｍｐＢ，ｔｍｐＸがプロセッサエレメント用変数名であることが指示されている。
【００２７】
また、ソースコードでは、「＃ｐｒａｇｍａ  ＳＩＭＤ  ｆｕｎｃｔｉｏｎ」文を用いて、ソースコードで使用する関数の型、及び当該関数における引数の型が指示される。「＃ｐｒａｇｍａ  ＳＩＭＤ  ｆｕｎｃｔｉｏｎ」文では、関数名、左括弧「（」、ＧＰ又はＰＥの繰り返し、右括弧「）」が上記の順序で記述される。また、括弧内のｉ番目（ｉは自然数である。）に記述されたＧＰはｉ番目の引数がグローバルプロセッサ用引数であることを表し、ｉ番目に記述されたＰＥはｉ番目の引数がプロセッサエレメント用引数であることを表す。さらに、括弧内に記述されたＧＰの数とＰＥの数との合計が、関数における引数の数を表す。ここで、グローバルプロセッサ用引数は、グローバルプロセッサ用変数名が指定される引数を表し、プロセッサエレメント用引数は、プロセッサエレメント用変数名が指定される引数を表す。
【００２８】
図６のソースコードでは、４行目において「＃ｐｒａｇｍａ  ＳＩＭＤ  ｆｕｎｃｔｉｏｎ」文が記述されており、関数名がｆｕｎｃであり、関数ｆｕｎｃは３つの引数を有し、第１の引数はプロセッサエレメント用引数であり、第２の引数はグローバルプロセッサ用引数であり、第３の引数はプロセッサエレメント用引数であることが指示されている。また、４行目以下の関数宣言、変数宣言、代入文、ｉｆ文、関数呼び出しなどは、Ｃ言語における記述と同様である。
【００２９】
次いで、図１のコンパイル装置１によるコンパイル処理について説明する。ここで、コンパイル装置１は、コンパイル処理を実行する前に外部機器１６ａからソースコードをソースコードバッファ１７ａに読み込んでおり、コンパイル処理が終了した後、アセンブリコードバッファ１７ｅに記憶されたアセンブリコードを含むファイルをハードディスク１７に生成する。
【００３０】
コンパイル装置１は、ソースコードの「＃ｐｒａｇｍａ  ＳＩＭＤ  ｖａｒｉａｂｌｅ」文を解析して、プロセッサエレメント用変数名として指定された変数名を変数テーブル１７ｂに書き込むことにより、変数テーブル１７ｂを作成する。
【００３１】
また、コンパイル装置１は、ソースコードの「＃ｐｒａｇｍａ  ＳＩＭＤ  ｆｕｎｃｔｉｏｎ」文を解析して、変換テーブル１７ｃを作成する。コンパイル装置１は、関数呼び出しを行うソースコードに対して、当該関数におけるグローバルプロセッサ用引数の引数値をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに退避し、かつ当該関数におけるプロセッサエレメント用引数の引数値をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームにそれぞれ退避するアセンブリコードを生成する。したがって、ソースコードに記述されている引数の数と、それぞれのスタックフレームに退避される引数値の数とが異なることとなるので、コンパイル装置１は、それぞれのスタックフレームに退避される引数名及び引数値を管理するために変換テーブル１７ｃを作成する。
【００３２】
図７は、図１の変換テーブル１７ｃの構成を示す図である。図７に示すように、変換テーブル１７ｃは、各関数の引数の数と、各関数における引数がグローバルプロセッサ用であるか又はプロセッサエレメント用であるかを表す種別と、種別ごとの順序とを示す情報を記憶する。変換テーブル１７ｃは、ソースコードに含まれる関数ごとに作成される。
【００３３】
図８は、図６のソースコードの４行目における「＃ｐｒａｇｍａ  ＳＩＭＤ  ｆｕｎｃｔｉｏｎ」文を解析することによって作成される図１の変換テーブル１７ｃを示す図である。図８の変換テーブル１７ｃでは、引数の数が３であり、第１の引数はプロセッサエレメント用引数でありかつプロセッサエレメント用引数の１番目であり、第２の引数はグローバルプロセッサ用引数でありかつグローバルプロセッサ用引数の１番目であり、第３の引数はプロセッサエレメント用引数でありかつプロセッサエレメント用引数の２番目であることが示されている。
【００３４】
次いで、コンパイル装置１が、関数呼び出し用のアセンブリコードを生成する場合について説明する。ここでは、図６に示したソースコードの２３行目の関数呼び出しである以下の文をアセンブリコードに変換する場合について説明する。
【００３５】
［数１］
ｆｕｎｃ（ｃｕｒＲ，ｒｅｆ，ｃｕｒＧ）；
【００３６】
関数ｆｕｎｃでは、図６のソースコードの４行目で指示したとおり、第１の引数ｃｕｒＲ及び第３の引数ｃｕｒＧはプロセッサエレメントＰＥ用引数であり、第２の引数ｒｅｆがグローバルプロセッサ用引数である。これらの引数の引数値を関数ｆｕｎｃに渡す時、レジスタを通じて行う場合と、スタックフレームを用いる場合があるが、ここではスタックフレームを用いる場合の例を示す。
【００３７】
スタックフレームを用いて関数に引数を渡す場合、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームにもプロセッサエレメント用引数の引数値をダミーで退避し、かつプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームにもグローバルプロセッサ用引数の引数値をダミーで退避すると、ソースコードに記述された引数の数とスタックフレーム内の引数値の数とが一致して、従来技術に係る汎用プロセッサ用コンパイラと同様に引数のオフセット値が求められるが、スタックフレームの領域が大きくなる問題がある。そこで、本実施形態では、グローバルプロセッサ用引数の引数値をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームのみに退避し、プロセッサエレメント用引数の引数値をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームのみに退避し、それぞれのスタックフレームに対して個別のオフセット値を用いてそれぞれのスタックフレームを別々に管理することにより、スタックフレームの領域を低減することを特徴とする。ここでは、まず従来技術に係る関数呼び出し時のスタックフレームについて説明した後、本実施形態に係る関数呼び出し時のスタックフレームについて説明する。
【００３８】
図９は、従来技術に係る関数呼び出し時におけるデータＲＡＭのスタックフレームを示す図である。関数が３つの引数を有する場合、それらの引数の引数値は順に、又は逆順にスタックに退避される。図９を参照すると、第１の引数の引数値は領域ａ４に退避され、第２の引数の引数値は領域ａ５に退避され、第３の引数の引数値は領域ａ６に退避されている。その後、関数呼び出しが終了したときのリターンアドレスがスタックに退避される。図９を参照すると、リターンアドレスは、領域ａ７に退避されている。引数の引数値とリターンアドレスとがスタックに退避されたときにスタックポインタＳＰによって示された領域ａ７のアドレスが、関数内で引数を参照するときに使用されるフレームポインタＦＰの値となる。関数内において引数を参照するときは、フレームポインタＦＰの値に相対値を加算又は減算した値が用いられる。
【００３９】
次に、本実施形態に係る関数呼び出し時のスタックフレームについて説明する。図１のコンパイル装置１が対象とするＳＩＭＤ型プロセッサ２０では、図６の関数ｆｕｎｃにおける３つの引数ｃｕｒＲ，ｒｅｆ，ｃｕｒＧそれぞれの引数値は、図９を参照して上述した従来技術のように１つのデータＲＡＭに退避されない。第１の引数ｃｕｒＲ及び第３の引数ｃｕｒＧは、プロセッサエレメントＰＥ用引数であるため、プロセッサエレメントＰＥｎ（０，１，…，３５１）の数だけの実データが存在する。したがって、このような多数のデータをグローバルプロセッサ２１のグローバルプロセッサ用データＲＡＭ２１ｍに退避することは、実用的ではない。このため、第２の引数ｒｅｆの引数値のみをグローバルプロセッサ２１のグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに退避し、第１の引数ｃｕｒＲの引数値及び第３の引数ｃｕｒＧの引数値は、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のそれぞれにスタックフレームを作成して、当該スタックフレームに退避する。ただし、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）に作成されるスタックフレームには、リターンアドレスを退避する必要はないため、引数値のみが退避される。
【００４０】
図１０は、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームを示す図であり、図１１は、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームを示す図である。図１０に示すように、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームには、まず、グローバルプロセッサ用引数である第２の引数ｒｅｆの引数値が領域ａ８に退避され、その後リターンアドレスが領域ａ９に退避される。一方、図１１に示すように、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームのそれぞれには、まず、プロセッサエレメント用引数である第１の引数ｃｕｒＲの引数値が領域ａ１０に退避され、その後プロセッサエレメント用引数である第３の引数ｃｕｒＧの引数値が領域ａ１１に退避される。
【００４１】
コンパイル装置１は、変換テーブル１７ｃを参照して、各スタックフレームが上述した構成となるように、アセンブリコードを生成して、アセンブリコードバッファ１７ｅに書き込む。グローバルプロセッサ用引数に対しては、図５に示したアセンブリ言語命令を使用し、プロセッサエレメント用引数に対しては、図６に示したアセンブリ言語命令を使用して、アセンブリコードを生成する。
【００４２】
コンパイル装置１は上述したようにアセンブリコードを生成するので、グローバルプロセッサ用引数の引数値は、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに退避され、プロセッサエレメント用引数の引数値は、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームのそれぞれに退避され、それぞれのスタックフレームは別々に管理される。
【００４３】
次いで、コンパイル装置１が変数宣言、及び変数へアクセスする代入文などであるソースコードをアセンブリコードに変換する場合について説明する。まず、変数宣言に対して変数値を記憶する領域を確保する場合について説明する。コンパイル装置１は、変数テーブル１７ｂを参照して、スタティック（ｓｔａｔｉｃ）変数を含むグローバルプロセッサ用変数の変数値を記憶する領域を、図３に示したグローバルプロセッサ２１のグローバルプロセッサ用データＲＡＭ２１ｍのデータ領域ａ２に確保するコードを生成する一方、スタティック変数を含むプロセッサエレメント用変数の変数値を記憶する領域を、図２に示したプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）にそれぞれ確保するコードを生成する。
【００４４】
次に、変数へのアクセスについて説明する。コンパイル装置１は、図４及び図５に示したアセンブリ言語命令を用いて、アセンブリコードを生成する。ここで、コンパイル装置１は、グローバルプロセッサ用変数にアクセスする必要がある場合は、図４のグローバルプロセッサ用データＲＡＭ２１ｍにアクセスするためのアセンブリ言語命令を使用し、プロセッサエレメント用変数にアクセスする必要がある場合は、図５のプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）にアクセスするためのアセンブリ言語命令を使用する。
【００４５】
例えば、図６に示したソースコードの１６行目の代入文である以下の代入文をアセンブリコードに変換する場合について説明する。
【００４６】
［数２］
ｃｕｒＲ＝ｃｏｌＲ；
【００４７】
コンパイル装置１は、変数テーブル１７ｂを参照して、変数名ｃｕｒＲ及び変数名ｃｏｌＲがともにプロセッサエレメント用変数名であることを認識する。その後、コンパイル装置１は、図５に示したｌｄｒ命令及びｓｔｒ命令を用いて、以下のアセンブリコードを生成する。
【００４８】
［数３］
ｌｄｒ    ｃｏｌＲ，Ｒ０
ｓｔｒ    Ｒ０，ｃｕｒＲ
【００４９】
上記アセンブリコードでは、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）において、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）の変数ｃｏｌＲの変数値が記憶されているアドレスから、１ワードのデータがレジスタＲ０で示されるレジスタに読み出される。その後、レジスタＲ０で示されるレジスタが記憶しているデータが、各プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）の変数ｃｏｌＲの変数値が記憶されているアドレスに書き込まれる。
【００５０】
次に、図３に示したソースコードの１９行目の代入文である以下の代入文をアセンブリコードに変換する場合について説明する。
【００５１】
［数４］
ｒｅｆ＝０ｘ８０；
【００５２】
コンパイル装置１は、変数テーブル１７ｂを参照して、変数名ｒｅｆがグローバルプロセッサ用変数名であることを認識する。その後、コンパイル装置１は、図４に示したｌｄｉ命令及びｓｔ命令を用いて、以下のアセンブリコードを生成する。
【００５３】
［数５］
ｌｄｉ    ＃８０ｈ，Ｇ０
ｓｔ      Ｇ０，ｒｅｆ
【００５４】
上記アセンブリコードでは、グローバルプロセッサ２１において、即値＃８０ｈが、レジスタＧ０で示されるレジスタに書き込まれる。その後、レジスタＧ０で示されるレジスタが記憶しているデータが、グローバルプロセッサ用データＲＡＭ２１ｍの変数ｒｅｆの変数値が記憶されているアドレスに書き込まれる。
【００５５】
次いで、コンパイル装置１が自動変数の宣言文に対するアセンブリコードを生成する場合について説明する。ここで、自動変数とは、１つの関数の内部のみで使用される変数を表す。ソースコードが自動変数の宣言文である場合、コンパイル装置１は、自動変数の領域を確保するアセンブリコードを生成してアセンブリコードバッファ１７ｅに書き込む。ここでは、図６に示したソースコードの２７行目から３８行目までの関数ｆｕｎｃにおいて、２９行目で示される自動変数ｔｍｐＸ，ｍｉｎ，ｍａｘに対するアセンブリコードを生成する場合について説明する。まず従来技術に係る自動変数領域の確保について説明した後、本実施形態に係る自動変数領域の確保について説明する。
【００５６】
図１２は、従来技術に係る関数内の自動変数領域を確保したデータＲＡＭのスタックフレームを示す図である。３つの自動変数に対する領域を確保する場合、それらの領域は順に、あるいは逆順にスタックフレームに確保される。図１２を参照すると、図９を参照して説明したように関数呼び出し時に３つの引数の引数値及びリターンアドレスが領域ａ４乃至ａ７に退避され、その後、第１の自動変数の領域が領域ａ１２に確保され、第２の自動変数の領域が領域ａ１３に確保され、第３の自動変数の領域が領域ａ１４に確保される。
【００５７】
自動変数領域をスタックフレームに確保することによって、スタックポインタＳＰの値は、領域ａ１４を示すように更新されるが、フレームポインタＦＰの値は、自動変数領域をスタックフレームに確保する前にスタックポインタＳＰによって示された領域ａ７のアドレスである。関数内において自動変数を参照するときは、フレームポインタＦＰの値に相対値を加算又は減算した値が用いられる。
【００５８】
次に、本実施形態に係る自動変数領域の確保について説明する。コンパイル装置１は、読み込んだソースコード及び変数テーブル１７ｂを参照して、自動変数テーブル１７ｄを作成する。コンパイル装置１は、関数内の自動変数に対して、自動変数の名前がグローバルプロセッサ用変数名であれば当該自動変数に対する領域をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに確保し、かつ自動変数の名前がプロセッサエレメント用変数名であれば当該自動変数に対する領域をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームにそれぞれ確保するアセンブリコードを生成する。したがって、ソースコードに記述されている自動変数の数と、それぞれのスタックフレームに確保される自動変数に対する領域の数が異なることとなるので、コンパイル装置１は、それぞれのスタックフレームに確保される自動変数の領域を管理するために自動変数テーブル１７ｄを作成する。
【００５９】
図１３は、図１の自動変数テーブル１７ｄの構成を示す図である。図１３に示すように、自動変数テーブル１７ｄは、自動変数の数と、各自動変数がグローバルプロセッサ用であるか又はプロセッサエレメント用であるかを表す種別と、種別ごとの順序とを示す情報を記憶する。図１３の自動変数テーブル１７ｄを参照すると、自動変数の数が３であり、第１の自動変数はプロセッサエレメント用変数でありかつプロセッサエレメント用変数の１番目であり、第２の自動変数はグローバルプロセッサ用変数でありかつグローバルプロセッサ用変数の１番目であり、第３の自動変数はグローバルプロセッサ用変数でありかつグローバルプロセッサ用変数の２番目であることが示されている。
【００６０】
図１のコンパイル装置１が対象とするＳＩＭＤ型プロセッサ２０では、図６の関数ｆｕｎｃ内で使用される３つの自動変数ｔｍｐＸ，ｍｉｎ，ｍａｘの領域は、図１２を参照して上述した従来技術のように１つのデータＲＡＭに確保されない。第１の自動変数ｔｍｐＸは、プロセッサエレメントＰＥ用変数であるため、プロセッサエレメントＰＥｎ（０，１，…，３５１）の数だけの実データが必要である。したがって、このような多数のデータを記憶するための領域をグローバルプロセッサ２１のグローバルプロセッサ用データＲＡＭ２１ｍで確保することは、実用的ではない。このため、第２の自動変数ｍｉｎの領域及び第３の自動変数ｍａｘの領域のみをグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに確保し、第１の自動変数ｔｍｐＸは、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームのそれぞれに確保する。
【００６１】
図１４は、関数内の自動変数に対する領域を確保した図２のグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームを示す図であり、図１５は、関数内の自動変数に対する領域を確保した図２のプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームを示す図である。
【００６２】
図１４に示すように、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームには、図１０を参照して説明したように第２の引数ｄｉｔｈ（図６の２３行目における関数呼び出しでは引数ｒｅｆである。）の引数値及びリターンアドレスがそれぞれ領域ａ８，ａ９に退避され、その後、第２の自動変数ｍｉｎに対する領域が領域ａ１６に確保され、第３の自動変数ｍａｘに対する領域が領域ａ１７に確保される。このとき、スタックポインタＳＰは領域ａ１７を示す値であるが、フレームポインタＦＰは領域ａ９を示す値である。
【００６３】
一方、図１５に示すように、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームには、図１１を参照して説明したように第１の引数ｔｍｐＲ（図６の２３行目における関数呼び出しでは引数ｃｕｒＲである。）の引数値及び第３の引数ｔｍｐＢ（図６の２３行目における関数呼び出しでは引数ｃｕｒＧである。）がそれぞれ領域ａ１０，ａ１１に退避され、その後、第１の自動変数ｔｍｐＸに対する領域が領域ａ１９に確保される。このとき、スタックポインタＳＰは領域ａ１９を示す値であるが、フレームポインタＦＰは領域ａ１１を示す値である。
【００６４】
コンパイル装置１は、自動変数テーブル１７ｄを参照して、各スタックフレームが上述した構成となるように、アセンブリコードを生成して、アセンブリコードバッファ１７ｅに書き込む。グローバルプロセッサ用変数に対しては、図５に示したアセンブリ言語命令を使用し、プロセッサエレメント用変数に対しては、図６に示したアセンブリ言語命令を使用して、アセンブリコード生成する。
【００６５】
コンパイル装置１は上述したようにアセンブリコードを生成するので、グローバルプロセッサ用変数名を有する自動変数の領域は、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに確保され、プロセッサエレメント用変数名を有する自動変数の領域は、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームに確保され、それぞれのスタックフレームが別々に管理される。
【００６６】
次に、コンパイル装置１が、関数の内部に記述されたソースコードをアセンブリコードに変換する場合について説明する。まず、関数の引数にアクセスするときのアセンブリコードについて説明する。上述したように、関数内において、関数の引数は、フレームポインタＦＰからの相対位置で参照される。ここでは、図６のソースコードにおける関数ｆｕｎｃ内で、関数ｆｕｎｃの第２の引数ｄｉｔｈ（図６の２３行目における関数呼び出しでは引数ｒｅｆである。）を参照する場合について説明する。第２の引数ｄｉｔｈは、グローバルプロセッサ用引数であるので、第２の引数ｄｉｔｈを参照するためには、グローバルプロセッサ用データＲＡＭ２１ｍにアクセスする必要がある。上述したように、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームは、図１４に示すように構成されている。ここで、１ワードは２バイトであるとする。
【００６７】
第２の引数ｄｉｔｈは関数において２番目に記述されている引数であるため、従来技術においては、フレームポインタＦＰから２ワードぶんだけ大きいアドレスに記憶されているので、フレームポインタＦＰの値に２×２＝４である相対値を加算して、第２の引数ｄｉｔｈを参照する。しかし、本実施形態においては、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームには、グローバルプロセッサ用引数の引数値のみが記憶されている。また、図８を参照して説明したように、図８の変換テーブル１７ｃを参照すると、第２の引数ｄｉｔｈは、グローバルプロセッサ用引数の１番目であることが分かり、第２の引数ｄｉｔｈの引数値はフレームポインタＦＰから１ワードぶんだけ大きいアドレスに記憶されていることが分かる。したがって、コンパイル装置１は、フレームポインタＦＰの値に１×２＝２である相対値を加算して、第２の引数ｄｉｔｈを参照するアセンブリコードを生成する。
【００６８】
例えば、コンパイル装置１は、以下のようなディスプレースメント付き間接アドレッシングを用いたアセンブリコードを生成する。
【００６９】
［数６］
ｌｄ    ［ＦＰ，２］，Ｇ０
【００７０】
上記アセンブリコードでは、グローバルプロセッサ２１において、グローバルプロセッサ用データＲＡＭ２１ｍのフレームポインタＦＰの値に相対値２が加算された値で表されるアドレスから１ワードのデータがレジスタＧ０で示されるレジスタに書き込まれる。すなわち、第２の引数ｄｉｔｈの引数値がレジスタＧ０で示されるレジスタに書き込まれる。
【００７１】
次に、図６のソースコードにおける関数ｆｕｎｃ内で、関数ｆｕｎｃの第１の引数ｔｍｐＲ（図６の２３行目における関数呼び出しでは引数ｃｕｒＲである。）を参照する場合について説明する。第１の引数ｔｍｐＲは、プロセッサエレメント用引数であるので、第１の引数ｔｍｐＲを参照するためには、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）にアクセスする必要がある。上述したように、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームは、図１５に示すように構成されている。
【００７２】
上述した場合と同様に、図８の変換テーブル１７ｃを参照すると、第１の引数ｔｍｐＲは、プロセッサエレメント用引数の１番目であることが分かり、第１の引数ｔｍｐＲの引数値はフレームポインタＦＰから１ワードぶんだけ大きいアドレスに記憶されていることが分かる。したがって、コンパイル装置１は、フレームポインタＦＰの値に１×２＝２である相対値を加算して、第１の引数ｔｍｐＲを参照するアセンブリコードを生成する。
【００７３】
例えば、以下のようにｌｄｒ命令を用いたアセンブリコードを生成する。
【００７４】
［数７］
ｌｄｒ    ［Ｃ１４，２］，Ｒ０
【００７５】
上記アセンブリコードでは、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）において、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のレジスタＣ１４で示されるレジスタの値に相対値２が加算された値で表されるアドレスから１ワードのデータがレジスタＲ０で示されるレジスタに書き込まれる。すなわち、第１の引数ｔｍｐＲの引数値がレジスタＲ０で示されるレジスタに書き込まれる。ここで、レジスタＣ１４で示されるレジスタは、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のフレームポインタＦＰとして用いるレジスタである。
【００７６】
次に、第３の引数ｔｍｐＢ（図６の２３行目における関数呼び出しでは引数ｃｕｒＧである。）を参照するときについて説明する、この場合、上述した場合と同様に、図８の変換テーブル１７ｃを参照すると、第３の引数ｔｍｐＢは、プロセッサエレメント用引数の２番目であることが分かり、第３の引数ｔｍｐＢの引数値はフレームポインタＦＰから２ワードぶんだけ大きいアドレスに記憶されていることが分かる。したがって、コンパイル装置１は、フレームポインタＦＰの値に２×２＝４である相対値を加算して、第３の引数ｔｍｐＢを参照するアセンブリコードを生成する。
【００７７】
例えば、以下のようにｌｄｒ命令を用いたアセンブリコードを生成する。
【００７８】
［数８］
ｌｄｒ    ［Ｃ１４，４］，Ｒ１
【００７９】
上記アセンブリコードでは、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）において、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のレジスタＣ１４で示されるレジスタの値に相対値４が加算された値で表されるアドレスから１ワードのデータがレジスタＲ１で示されるレジスタに書き込まれる。すなわち、第３の引数ｔｍｐＢの引数値がレジスタＲ１で示されるレジスタに書き込まれる。ここで、レジスタＣ１４で示されるレジスタは、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のフレームポインタＦＰとして用いるレジスタである。
【００８０】
上述したように、グローバルプロセッサ用引数の引数値をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに退避し、かつプロセッサエレメント用引数の引数値をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームに退避することにより、ＳＩＭＤ型プロセッサ２０においても、関数内において、一般的な引数と同様に、グローバルプロセッサ用引数及びプロセッサエレメント用引数にアクセスすることが可能になる。
【００８１】
次に、関数の自動変数にアクセスするときのアセンブリコードについて説明する。上述したように、関数内において、自動変数は、フレームポインタＦＰからの相対位置で参照される。ここでは、図６のソースコードにおける関数ｆｕｎｃ内で、第２の自動変数ｍｉｎを参照する場合について説明する。第２の自動変数ｍｉｎは、グローバルプロセッサ用変数であるので、第２の自動変数ｍｉｎを参照するためには、グローバルプロセッサ用データＲＡＭ２１ｍにアクセスする必要がある。上述したように、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームは、図１４に示すように構成されている。ここで、１ワードは２バイトであるとする。
【００８２】
第２の自動変数ｍｉｎは関数において２番目に記述されている自動変数であるため、従来技術においては、フレームポインタＦＰから２ワードぶんだけ小さいアドレスに記憶されているので、フレームポインタＦＰの値から２×２＝４である相対値を減算して、第２の自動変数ｍｉｎを参照する。しかし、本実施形態においては、グローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームには、グローバルプロセッサ用変数の変数値のみが記憶されている。また、図１３を参照して説明したように、図１３の自動変数テーブル１７ｄを参照すると、第２の自動変数ｍｉｎは、グローバルプロセッサ用変数の１番目であることが分かり、第２の自動変数ｍｉｎの変数値はフレームポインタＦＰから１ワードぶんだけ小さいアドレスに記憶されていることが分かる。したがって、コンパイル装置１は、フレームポインタＦＰの値から１×２＝２である相対値を減算して、第２の自動変数ｍｉｎを参照するアセンブリコードを生成する。
【００８３】
例えば、コンパイル装置１は、以下のようなディスプレースメント付き間接アドレッシングを用いたアセンブリコードを生成する。
【００８４】
［数９］
ｓｔ    Ｇ０，［ＦＰ，−２］
【００８５】
上記アセンブリコードでは、グローバルプロセッサ２１において、レジスタＧ０で示されるレジスタの値が、グローバルプロセッサ用データＲＡＭ２１ｍのフレームポインタＦＰの値から相対値２が減算された値で表されるアドレスに書き込まれる。すなわち、レジスタＧ０で示されるレジスタの値が、第２の自動変数ｍａｘに対応する領域に書き込まれる。
【００８６】
次に、図６のソースコードにおける関数ｆｕｎｃ内で、第１の自動変数ｔｍｐＸを参照する場合について説明する。第１の自動変数ｔｍｐＸは、プロセッサエレメント用変数であるので、第１の自動変数ｔｍｐＸを参照するためには、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）にアクセスする必要がある。上述したように、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームは、図１５に示すように構成されている。
【００８７】
上述した場合と同様に、図１３の自動変数テーブル１７ｄを参照すると、第１の自動変数ｔｍｐＸは、プロセッサエレメント用変数の１番目であることが分かり、第１の自動変数ｔｍｐＸの変数値はフレームポインタＦＰから１ワードぶんだけ小さいアドレスに記憶されていることが分かる。したがって、コンパイル装置１は、フレームポインタＦＰの値から１×２＝２である相対値を減算して、第１の自動変数ｔｍｐＸを参照するアセンブリコードを生成する。
【００８８】
例えば、以下のようにｓｔｒ命令を用いたアセンブリコードを生成する。
【００８９】
［数１０］
ｓｔｒ    Ｒ０，［Ｃ１４，−２］
【００９０】
上記アセンブリコードでは、各プロセッサエレメントＰＥｎ（ｎ＝０，１，…，３５１）において、レジスタＲ０で示されるレジスタの値が、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のレジスタＣ１４で示されるレジスタの値から相対値２が減算された値で表されるアドレスに書き込まれる。すなわち、レジスタＲ０で示されるレジスタの値が、第１の自動変数ｔｍｐＸに対応する領域に書き込まれる。ここで、レジスタＣ１４で示されるレジスタは、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のフレームポインタＦＰとして用いるレジスタである。
【００９１】
上述したように、グローバルプロセッサ用変数の領域をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに確保し、プロセッサエレメント用変数の領域をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームに確保することにより、ＳＩＭＤ型プロセッサ２０においても、関数内において、一般的な自動変数と同様に、グローバルプロセッサ用変数名を有する自動変数及びプロセッサエレメント用変数名を有する自動変数にアクセスすることが可能になる。
【００９２】
以上説明したように、本実施形態によれば、各プロセッサエレメントＰＥｎ（０，１，…，３５１）で処理する複数のデータを１つの変数名で表してプロセッサエレメント用変数名として扱い、プロセッサエレメント用変数名に対する領域を、プロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）に確保するようにしたので、プロセッサエレメント用変数名をグローバルプロセッサ用変数名と同様に扱うことができる。したがって、関数呼び出し時の引数としてグローバルプロセッサ用変数名及びプロセッサエレメント用変数名を指定することができ、かつ関数内の自動変数としてグローバルプロセッサ用変数名及びプロセッサエレメント用変数名を指定することができる。
【００９３】
また、本実施形態によれば、引数がグローバルプロセッサ用変数名であるとき当該引数の引数値をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに退避し、引数がプロセッサエレメント用変数名であるとき当該引数の引数値をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームに退避し、自動変数がグローバルプロセッサ用変数名であるとき当該自動変数の領域をグローバルプロセッサ用データＲＡＭ２１ｍのスタックフレームに確保し、かつ自動変数がプロセッサエレメント用変数名であるとき当該自動変数の領域をプロセッサエレメント用データＲＡＭ  ＲＡＭｎ（ｎ＝０，１，…，３５１）のスタックフレームに確保して、それぞれのスタックフレームを別々に管理するので、スタック領域を減少させることができる。
【産業上の利用可能性】
【００９４】
本発明に係るコンパイル装置及び方法によれば、各プロセッサエレメントで処理する複数のデータを１つの変数名で表してプロセッサエレメント用変数名として扱い、プロセッサエレメント用変数名に対する領域を、プロセッサエレメントの第２の記憶手段のスタック領域に確保するようにしたので、プロセッサエレメント用変数名をグローバルプロセッサ用変数名と同様に扱うことができる。したがって、関数呼び出し時の引数としてグローバルプロセッサ用変数名及びプロセッサエレメント用変数名を指定することができ、かつ関数内の自動変数としてグローバルプロセッサ用変数名及びプロセッサエレメント用変数名を指定することができる。
【００９５】
また、本発明に係るコンパイル装置及び方法によれば、引数がグローバルプロセッサ用変数名であるとき当該引数の引数値をグローバルプロセッサの第１の記憶手段のスタック領域に退避し、引数がプロセッサエレメント用変数名であるとき当該引数の引数値をプロセッサエレメントの第２の記憶手段のスタック領域に退避し、自動変数がグローバルプロセッサ用変数名であるとき当該自動変数の領域をグローバルプロセッサの第１の記憶手段のスタック領域に確保し、かつ自動変数がプロセッサエレメント用変数名であるとき当該自動変数の領域をプロセッサエレメントの第２の記憶手段のスタック領域に確保して、それぞれのスタック領域を別々に管理するので、スタック領域を減少させることができる。
【符号の説明】
【００９６】
１…コンパイル装置、
１１…ＣＰＵ、
１２…ＲＡＭ、
１３…ＲＯＭ、
１４…表示部、
１５…操作部、
１６…外部機器インターフェース、
１６ａ…外部機器、
１７…ハードディスク、
１７ａ…ソースコードバッファ、
１７ｂ…変数テーブル、
１７ｃ…変換テーブル、
１７ｄ…自動変数テーブル、
１７ｅ…アセンブリコードバッファ、
２０…ＳＩＭＤ型プロセッサ、
２１…グローバルプロセッサ、
２１ｍ…グローバルプロセッサ用データＲＡＭ、
２２−０〜２２−３５１…マルチプレクサ（ＭＵＸ）、
２３−０〜２３−３５１…算術論理演算回路（ＡＬＵ）、
２４−０〜２４−３５１…アキュムレータ（Ａ）、
２５−０〜２５−３５１…補助レジスタ（Ｆ）、
２６−０〜２６−３５１…乗除算レジスタ（Ｍ）、
２７−０〜２７−３５１…条件レジスタ（Ｔ）、
ＰＥ０〜ＰＥ３５１…プロセッサエレメント、
Ｒ０−０〜Ｒ３１−０，Ｒ０−１〜Ｒ３１−１，…，Ｒ０−３５１〜Ｒ３１−３５１…レジスタ、
ＲＡＭ０〜ＲＡＭ３５１…プロセッサエレメント用データＲＡＭ。
【先行技術文献】
【特許文献】
【００９７】
【特許文献１】特開２００８−１８１４８１号公報。
【図１】
0005771926.tif 000002
【図２】
0005771926.tif 000003
【図３】
0005771926.tif 000004
【図４】
0005771926.tif 000005
【図５】
0005771926.tif 000006
【図６】
0005771926.tif 000007
【図７】
0005771926.tif 000008
【図８】
0005771926.tif 000009
【図９】
0005771926.tif 000010
【図１０】
0005771926.tif 000011
【図１１】
0005771926.tif 000012
【図１２】
0005771926.tif 000013
【図１３】
0005771926.tif 000014
【図１４】
0005771926.tif 000015
【図１５】
0005771926.tif 000016