(57)【要約】【課題】ベクトル演算に用いるプログラムにおいて、ベクトル長が変更される記述がある場合でも期待した命令コードを生成するコンパイル装置、コンパイル方法、及びプログラムを提供する。【解決手段】コンパイル装置１０は、ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他のベクトル命令で用いられている場合、ベクトル命令に戻り値を表す引数を追加し、戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、変換部２０と、変換された中間命令を用いて命令コードを生成する、生成部３０とを有する。【選択図】図１
2020201530.tif 000002
【特許請求の範囲】
【請求項１】
ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、変換手段と、
変換された前記中間命令を用いて命令コードを生成する、生成手段と、
を有することを特徴とするコンパイル装置。
【請求項２】
請求項１に記載のコンパイル装置であって、
前記変換手段は、前記ベクトル命令にベクトル長を表す引数を追加して、ベクトル長明示型のベクトル命令に変換する手段と、ベクトル長設定命令を削除する手段と、
を有することを特徴とするコンパイル装置。
【請求項３】
請求項１に記載のコンパイル装置であって、
前記変換手段は、ベクトル長に基づいてマスクを生成し、生成した前記マスクを用いて、ベクトル長設定命令をマスク命令に変換する手段と、前記ベクトル命令に前記マスクを表す引数を追加して、マスク付きベクトル命令に変換する手段とを有し、
前記生成手段は、前記マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、前記マスク生成中間命令をベクトル長設定命令コードに変換する手段と、マスク付きベクトル命令が静的単一代入形式に変換された前記マスク付き中間命令から前記マスクを表す引数を削除する手段と、前記マスク生成中間命令を削除する手段とを有する、
ことを特徴とするコンパイル装置。
【請求項４】
ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、変換手段と、
前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、生成手段と、
を有することを特徴とするコンパイル装置。
【請求項５】
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換し、
（ｂ）変換された前記中間命令を用いて命令コードを生成する
ことを特徴とするコンパイル方法。
【請求項６】
請求項５に記載のコンパイル方法であって、
前記（ａ）の処理において、前記ベクトル命令にベクトル長を表す引数を追加して、ベクトル長明示型のベクトル命令に変換し、ベクトル長設定命令を削除する
ことを特徴とするコンパイル方法。
【請求項７】
請求項５に記載のコンパイル方法であって、
前記（ａ）の処理において、ベクトル長に基づいてマスクを生成し、生成した前記マスクを用いて、ベクトル長設定命令をマスク命令に変換し、前記ベクトル命令に前記マスクを表す引数を追加して、マスク付きベクトル命令に変換し、
前記（ｂ）の処理において、前記マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、前記マスク生成中間命令をベクトル長設定命令コードに変換し、マスク付きベクトル命令が静的単一代入形式に変換された前記マスク付き中間命令から前記マスクを表す引数を削除し、前記マスク生成中間命令を削除する
ことを特徴とするコンパイル方法。
【請求項８】
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換し、
（ｂ）前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する
を有することを特徴とするコンパイル方法。
【請求項９】
コンピュータに、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、ステップと、
（ｂ）変換された前記中間命令を用いて命令コードを生成する、ステップと、
を実行させることを特徴とするプログラム。
【請求項１０】
請求項９に記載のプログラムであって、
前記（ａ）のステップにおいて、前記ベクトル命令にベクトル長を表す引数を追加して、ベクトル長明示型のベクトル命令に変換し、ベクトル長設定命令を削除する
ことを特徴とするプログラム。
【請求項１１】
請求項９に記載のプログラムであって、
前記（ａ）のステップにおいて、ベクトル長に基づいてマスクを生成し、生成した前記マスクを用いて、ベクトル長設定命令をマスク命令に変換し、前記ベクトル命令に前記マスクを表す引数を追加して、マスク付きベクトル命令に変換し、
前記（ｂ）のステップにおいて、前記マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、前記マスク生成中間命令をベクトル長設定命令コードに変換し、マスク付きベクトル命令が静的単一代入形式に変換された前記マスク付き中間命令から前記マスクを表す引数を削除し、前記マスク生成中間命令を削除する
ことを特徴とするプログラム。
【請求項１２】
コンピュータに、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、ステップと、
（ｂ）前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、ステップと、
を実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、命令コードを生成するコンパイル装置、コンパイル方法、及びプログラムに関する。
【背景技術】
【０００２】
ベクトル演算プロセッサなどのプログラムを記述する場合、組み込み（intrinsic）関数を用いることがある。組み込み関数は、アセンブリ言語のようにマシン命令に対応しているが、アセンブリ言語を用いるより使いやすいというメリットがある。
【０００３】
ところが、組み込み関数に相当する部分の記述をコンパイルした場合、期待したコンパイル結果、すなわち正しい命令コードを得られないことがある。
【０００４】
関連する技術として、特許文献１に記載のコンパイル装置が開示されている。そのコンパイル装置によれば、プログラムを中間テキストに変換し、中間テキストを修正することで、マスクデータ付きのベクトル演算を高速化する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１１−０２４５９８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、特許文献１に開示のコンパイル装置は、マスクデータ付きのベクトル演算を高速化する装置ではあるが、ベクトル演算においてベクトル長が変更された場合に、期待したコンパイル結果を得られるようにする装置ではない。
【０００７】
本発明の目的の一例は、ベクトル演算に用いるプログラムにおいて、ベクトル長が変更される記述がある場合でも期待した命令コードを生成するコンパイル装置、コンパイル方法、及びプログラムを提供することにある。
【課題を解決するための手段】
【０００８】
上記目的を達成するため、本発明の一側面におけるコンパイル装置は、
ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、変換手段と、
変換された前記中間命令を用いて命令コードを生成する、生成手段と、
を有することを特徴とする。
【０００９】
また、上記目的を達成するため、本発明の一側面におけるコンパイル装置は、
ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、変換手段と、
前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、生成手段と、
を有することを特徴とする。
【００１０】
上記目的を達成するため、本発明の一側面におけるコンパイル方法は、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換し、
（ｂ）変換された前記中間命令を用いて命令コードを生成する
ことを特徴とする。
【００１１】
また、上記目的を達成するため、本発明の一側面におけるコンパイル方法は、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換し、
（ｂ）前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する
ことを特徴とする。
【００１２】
上記目的を達成するため、本発明の一側面におけるプログラムは、
コンピュータに、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換し、ステップと、
（ｂ）変換された前記中間命令を用いて命令コードを生成する、ステップと、
を実行させることを特徴とする。
【００１３】
上記目的を達成するため、本発明の一側面におけるプログラムは、
コンピュータに、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、ステップと、
（ｂ）前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、ステップと、
を実行させることを特徴とする。
【発明の効果】
【００１４】
以上のように本発明によれば、ベクトル演算に用いるプログラムにおいて、ベクトル長が変更される記述がある場合でも期待した命令コードを生成できる。
【図面の簡単な説明】
【００１５】
【図１】図１は、第一の実施の形態におけるコンパイル装置の一例を示す図である。
【図２】図２は、第一の実施の形態におけるコンパイル装置の具体例を示す図である。
【図３】図３は、第一の実施の形態におけるコンパイル装置の動作の一例を示す図である。
【図４】図４は、第二の実施の形態におけるコンパイル装置の一例を示す図である。
【図５】図５は、第二の実施の形態におけるコンパイル装置の動作の一例を示す図である。
【図６】図６は、第三の実施の形態におけるコンパイル装置の一例を示す図である。
【図７】図７は、第三の実施の形態におけるコンパイル装置の動作の一例を示す図である。
【図８】図８は、第四の実施の形態におけるコンパイル装置の一例を示す図である。
【図９】図９は、第四の実施の形態におけるコンパイル装置の動作の一例を示す図である。
【図１０】図１０は、第一から第四の実施の形態におけるコンパイル装置を実現するコンピュータの一例を示す図である。
【発明を実施するための形態】
【００１６】
（第一の実施の形態）
以下、本発明の第一の実施の形態について、図１から図３を参照しながら説明する。
【００１７】
［装置構成］
最初に、図１を用いて、第一の実施の形態におけるコンパイル装置１０の構成について説明する。図１は、第一の実施の形態におけるコンパイル装置の一例を示す図である。
【００１８】
図１に示すコンパイル装置１０は、ベクトル演算に用いるプログラムにおいて、プログラムにベクトル長が変更される記述がある場合でも、期待した命令コードを生成できる装置である。また、図１に示すように、コンパイル装置１０は、変換部２０と、生成部３０とを有する。
【００１９】
このうち、変換部２０は、ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他のベクトル命令で用いられている場合、ベクトル命令に戻り値を表す引数を追加し、戻り値を表す引数を追加したベクトル命令を静的単一代入形式の中間命令に変換する。生成部３０は、変換された中間命令を用いて命令コードを生成する。
【００２０】
なお、静的単一代入形式（Static Single Assignment form：ＳＳＡ形式）とは、戻り値それぞれが一度だけ代入されるように定義した形式である。
【００２１】
このように、第一の実施の形態におけるコンパイル装置１０は、コンパイルの実行において、ベクトル演算に用いるプログラムにベクトル長を変更させる記述があっても、ベクトル長の変更に関連する記述を変更するので、当該プログラムを静的単一代入形式に変換しても、期待した命令コードを生成することができる。
【００２２】
第一の実施の形態について説明する。
プログラム１は、組み込み関数を用いずに記述されたプログラムの一例を示している。プログラム１は、例えば、Ｃ／Ｃ＋＋を用いて記述されたプログラムである。なお、以降に示すプログラムそれぞれにおいて「Ｌ１：」から「Ｌｎ：」（ｎは正の整数）は行番号を表す。
【００２３】
［プロクラム１］
L1：  for (i = 0; i < 256; ++i)
L2：     if (i < 128)
L3：        pout[i] = px[i] + py[i];
L4：      else
L5：        pout[i] = pz[i]
【００２４】
プログラム２は、プログラム１と同等の実行結果が得られるプログラムを、ベクトル演算に用いる組み込み関数を用いて記述したプログラムを示している。プログラム２は、例えば、図１に示したプログラムに相当し、組み込み関数であるベクトル長設定命令、ベクトル命令を用いて記述されている。
【００２５】
ベクトル長設定命令とは、ベクトル長を設定する命令である。ベクトル命令とは、一つの命令により多数のデータに対して同じ演算を行う命令である。なお、プログラム２で用いる組み込み関数については、「LLVM for SX-Aurora TSUBASA Vector Engine」（https://github.com/sx-aurora-dev/llvm）などに記載されている。
【００２６】
［プロクラム２］
L1：  _ve_lvl(256);
L2：  __vr vx = __ve_vld_vss(8, px); // vx[0:255] ← px[0:255]
L3：  __vr vy = __ve_vld_vss(8, py); // vy[0:255] ← py[0:255]
L4：  __vr vz = __ve_vld_vss(8, pz); // vz[0:255] ← pz[0:255]
L5：  _ve_lvl(128);
L6：  vz = _ve_vfaddd_vvv(vx, vy);   // vz[0:127] ← vx[0:127] + vy[0:127]
// vz[128:255] ←vz[128:255]
L7：  _ve_lvl(256);
L8：  _ve_vst_vss(vz, 8, pout);      // pout[0:255] ←vz[0:255]
【００２７】
プログラム２について説明する。Ｌ１のベクトル長設定命令「_ve_lvl(256)」は、ベクトル長を２５６要素に設定する。続いて、Ｌ２のロード命令「__vr vx = __ve_vld_vss(8, px)」は、引数「px」に対応するメモリアドレスの［０：２５５］から、２５６要素分のデータを読み出し、戻り値「vx」に対応するレジスタの［０：２５５］に格納する。
【００２８】
また、Ｌ３のロード命令「__vr vy = __ve_vld_vss(8, py)」は、引数「py」に対応するメモリアドレスの［０：２５５］から、２５６要素分のデータを読み出し、戻り値「vy」に対応するレジスタの［０：２５５］に格納する。
【００２９】
また、Ｌ４のロード命令「__vr vz = __ve_vld_vss(8, pz)」は、引数「pz」に対応するメモリアドレスの［０：２５５］から、２５６要素分のデータを読み出し、戻り値「vz」に対応するレジスタの［０：２５５］に格納する。
【００３０】
次に、Ｌ５のベクトル長設定命令「_ve_lvl(128)」は、ベクトル長を１２８要素に設定する。続いて、Ｌ６の加算命令「vz = __ve_vfaddd_vvv(vx, vy)」は、引数「vx」「vy」それぞれに対応するレジスタの［０：１２７］に格納されている１２８要素分のデータを、ベクトル演算器を用いて加算し、加算した結果を戻り値「vz」に対応するレジスタの［０：１２７］に格納する。
【００３１】
次に、Ｌ７のベクトル長設定命令「_ve_lvl(256)」は、ベクトル長を２５６に設定する。続いて、Ｌ８のストア命令「_ve_vst_vss(vz, 8, pout)」は、戻り値「vz」に対応するレジスタの［０：２５６］から２５６要素分のデータを読み出し、「pout」に対応するメモリアドレスの［０：２５６］に書き込みをする。
【００３２】
プログラム３は、プログラム２を静的単一代入形式の中間命令に変換したプログラムである。しかし。プログラム３は、プログラム２と同等の実行結果を得ることができない。
【００３３】
［プロクラム３］
L1：  call _ve_lvl(256)
L2：  %vx = call __ve_vld_vss(8, px)
L3：  %vy = call __ve_vld_vss(8, py)
L4：  %vz = call __ve_vld_vss(8, pz)
L5：  call _ve_lvl(128)
L6：  %vz1 = _ve_vfaddd_vvv(%vx, %vy)
L7：  call _ve_lvl(256)
L8：  call _ve_vst_vss(%vz1, 8, pout);
【００３４】
その理由は、プログラム３においては、Ｌ６に新たな戻り値「%vz1」に関する記述が生成されるが、Ｌ４の戻り値「%vz」（プログラム２の戻り値「vz」に対応する戻り値）に関する記述が生成されないので、プログラム２と同じ実行結果を得ることができない。具体的には、プログラム３の記述には、プログラム２における戻り値「vz」の［１２８：２５５］に関する記述がないので、プログラム２と同じ実行結果を得ることができない。
【００３５】
プログラム４は、プログラム３を用いて生成された命令コードである。プログラム４の記述では、プログラム３の引数「pout」に対応するメモリアドレスの［１２８：２５５］には、引数「px」に対応するメモリアドレスの［１２８：２５５］のデータが格納されるので、プログラム２と同じ実行結果を得ることができない。
【００３６】
［プロクラム４］
L1：  lvl       256
L2：  vld       %v1,... ; // 「...」はpxに対応するメモリアドレス
L3：  vld       %v2,... ; // 「...」はpyに対応するメモリアドレス
L4：  lvl       128
L5：  vfadd.d   %v1,%v1,%v2
L6：  lvl       256
L7：  vst       %v1,... ; // 「...」はpoutに対応するメモリアドレス
【００３７】
そこで、第一の実施の形態においては、プログラム２におけるベクトル長に関連する記述を変更した後、当該プログラムを静的単一代入形式に変換して、プログラム２と同等の実行結果を得られるプログラムを生成できるようにした。
【００３８】
具体的には、変換部２０は、まず、プログラム２の記述の中からＬ６に記述されているベクトル命令を検出する。続いて、変換部２０は、プログラム２のＬ６に記述されているベクトル命令に、プログラム２のＬ４において、既に用いられている戻り値「vz」を表す引数をプログラム５に示すように追加する。
【００３９】
［プロクラム５］
L5：  _ve_lvl(128);
L6：  vz = _ve_vfaddd_vvv(vx, vy, vz);
【００４０】
次に、変換部２０は、プログラムを静的単一代入形式の中間命令に変換して、プログラム６を生成する。このように生成されたプログラム６は、プログラム２と同等の実行結果を得ることができる。
【００４１】
［プロクラム６］
L1：  call _ve_lvl(256);
L2：  %vx = call __vevl_vld_vss(8, px)
L3：  %vy = call __vevl_vld_vss(8, py)
L4：  %vz = call __vevl_vld_vss(8, pz)
L5：  call _ve_lvl(128);
L6：  %vz1 = _vevl_vfaddd_vvv(%vx, %vy, %vz)
L7：  call _ve_lvl(256);
L5：  call _vevl_vst_vss(%vz1, 8, pout);
【００４２】
プログラム７は、プログラム６をコンパイルして生成された命令コードである。プログラム７において、プログラム６の引数「pout」に対応するメモリアドレスの［１２８：２５５］に、引数「pz」に対応するメモリアドレスの［１２８：２５５］のデータが格納されるので、プログラム２と同じ実行結果を得ることができる。
【００４３】
［プロクラム７］
L1：  lvl       256
L2：  vld       %v1,... ; // 「...」はpxに対応するメモリアドレス
L3：  vld       %v2,... ; // 「...」はpyに対応するメモリアドレス
L4：  vld       %v3,... ; // 「...」はpzに対応するメモリアドレス
L5：  lvl       128
L6：  vfadd.d   %v3,%v1,%v2
L7：  lvl       256
L8：  vst       %v3,... ; // 「...」はpoutに対応するメモリアドレス
【００４４】
続いて、図２を用いて、第一の実施の形態におけるコンパイル装置１０の構成をより具体的に説明する。図２は、第一の実施の形態におけるコンパイル装置の具体例を示す図である。
【００４５】
図２に示すように、第一の実施の形態におけるコンパイル装置１０の例において、変換部２０は、取得部２１と、検出部２２と、引数追加部２３と、形式変換部２４とを有する。
【００４６】
変換部２０について説明をする。
取得部２１は、組み込み関数を用いて記述されたベクトル演算に用いるプログラムを取得する。図２に示したプログラムは、例えば、上述したプログラム２などに相当する。具体的には、取得部２１は、入力装置（不図示のコンピュータ、記憶装置など）からプログラムを取得し、取得したプログラムを検出部２２へ転送する。
【００４７】
検出部２２は、ベクトル演算に用いるプログラムに記述されているベクトル命令を検出する。プログラム２の例では、検出部２２は、プログラム２のＬ６に記述されているベクトル命令を検出する。
【００４８】
引数追加部２３は、検出したベクトル命令の戻り値が、他のベクトル命令で用いられている場合、ベクトル命令に戻り値を表す引数を追加する。プログラム２の例では、引数追加部２３は、プログラム２のＬ６のような記述を、プログラム５のＬ６のような記述に変更する。
【００４９】
形式変換部２４は、引数追加部２３により生成されたプログラムを、静的単一代入形式の中間命令に変換する。形式変換部２４は、例えば、プログラムの記述を、プログラム６のような中間命令に変換する。
【００５０】
生成部３０について説明をする。
生成部３０は、変換部２０により生成された中間命令に対してコンパイルを実行して、命令コードを生成する。生成部３０は、例えば、中間命令であるプログラム６に対してコンパイルを実行し、プログラム７のような命令コードを生成する。
【００５１】
［装置動作］
次に、本発明の第一の実施の形態におけるコンパイル装置の動作について図３を用いて説明する。図３は、第一の実施の形態におけるコンパイル装置の動作の一例を示す図である。以下の説明においては、適宜図１、図２を参照する。また、第一の実施の形態では、コンパイル装置を動作させることによって、コンパイル方法が実施される。よって、本実施の形態におけるコンパイル方法の説明は、以下のコンパイル装置の動作説明に代える。
【００５２】
図３に示すように、最初に、取得部２１は、組み込み関数を用いて記述されたベクトル演算に用いるプログラムを取得する（ステップＡ１）。
【００５３】
次に、検出部２２は、ベクトル演算に用いるプログラムに記述されているベクトル命令を検出する（ステップＡ２）。
【００５４】
次に、引数追加部２３は、検出したベクトル命令の戻り値が、他のベクトル命令において既に使用されているか否かを判定する（ステップＡ３）。検出したベクトル命令の戻り値が、他のベクトル命令において既に使用されている場合（ステップＡ３：Ｙｅｓ）、引数追加部２３は、検出したベクトル命令に戻り値を表す引数を追加する（ステップＡ４）。また、検出したベクトル命令の戻り値が、他のベクトル命令において使用されていない場合（ステップＡ３：Ｎｏ）、ステップＡ５の処理に移行する。
【００５５】
次に、変換部２０は、プログラムのすべての行に対して、ステップＡ２からＡ４の処理を実行したか否かを判定する（ステップＡ５）。プログラムのすべての行に対してステップＡ２からＡ４の処理を実行した場合（ステップＡ５：Ｙｅｓ）、形式変換部２４は、引数追加部２３により生成されたプログラムを、静的単一代入形式の中間命令に変換する（ステップＡ６）。また、検出したベクトル命令に戻り値がない場合（ステップＡ５：Ｎｏ）、引数追加部２３は、次の行を選択する（ステップＡ７）。
【００５６】
次に、生成部３０は、変換部２０により中間命令に変換されたプログラムに対してコンパイルを実行し、命令コードを生成する（ステップＡ８）。例えば、生成部３０は、上述したプログラム７のような命令コードを生成する。
【００５７】
［第一の実施の形態の効果］
以上のように本実施の形態によれば、ベクトル演算に用いるプログラムにベクトル長を変更させる記述があっても、プログラムにおけるベクトル長の変更に関連する記述を変更した後、当該プログラムを静的単一代入形式に変換するため、期待した命令コードを生成することができる。
【００５８】
［プログラム］
第一の実施の形態におけるプログラムは、コンピュータに、図３に示すステップＡ１からＡ８を実行させるプログラムであればよい。このプログラムをコンピュータにインストールし、実行することによって、第一の実施の形態におけるコンパイル装置とコンパイル方法とを実現することができる。この場合、コンピュータのプロセッサは、変換部２０（取得部２１、検出部２２、引数追加部２３、形式変換部２４）、変換部３０として機能し、処理を行なう。
【００５９】
また、第一の実施の形態におけるプログラムは、複数のコンピュータによって構築されたコンピュータシステムによって実行されてもよい。この場合、例えば、各コンピュータが、それぞれ、変換部２０（取得部２１、検出部２２、引数追加部２３、形式変換部２４など）、変換部３０のいずれかとして機能してもよい。
【００６０】
（第二の実施の形態）
以下、本発明の第二の実施の形態について、図４から図５を参照しながら説明する。
【００６１】
［装置構成］
次に、図４を用いて、第二の実施の形態におけるコンパイル装置４０の構成について説明する。図４は、第二の実施の形態におけるコンパイル装置の一例を示す図である。
【００６２】
図４に示すように、コンパイル装置４０は、変換部２０と、生成部３０とを有する。また、変換部２０は、取得部２１、検出部４１、ベクトル長明示変換部４２、引数追加部４３、削除部４４、形式変換部２４を有する。
【００６３】
なお、取得部２１、形式変換部２４の説明は、第一の実施の形態において説明したので、これらについての説明は省略する。
【００６４】
検出部４１は、ベクトル演算に用いるプログラムに記述されているベクトル長設定命令と、ベクトル命令とを検出する。
【００６５】
ベクトル長明示変換部４２は、検出したベクトル命令をベクトル長明示型に変換する。具体的には、ベクトル長明示変換部４２は、まず、検出部２２が検出したベクトル命令を取得する。続いて、ベクトル長明示変換部４２は、取得したベクトル命令をベクトル長明示型に変換する。すなわち、ベクトル長明示変換部４２は、ベクトル長設定命令に設定されているベクトル長に基づいて、ベクトル長を表す引数を、取得したベクトル命令に追加する。
【００６６】
引数追加部４３は、検出したベクトル命令の戻り値が、他のベクトル命令で用いられている場合、ベクトル命令に戻り値を表す引数を追加する。
【００６７】
削除部４４は、プログラムからベクトル長設定命令を削除する。具体的には、削除部４４は、ベクトル長明示型のベクトル命令を有するプログラムから、検出したベクトル長設定命令を削除する。
【００６８】
プログラム２を用いてベクトル長明示型の変換について説明する。
検出部４１は、プログラム２のＬ１に記述されているベクトル長設定命令を検出した場合、Ｌ１に関連するＬ２、Ｌ３、Ｌ４に記述されているベクトル命令を検出する。
【００６９】
次に、ベクトル長明示変換部４２は、プログラム２のＬ１に記述されているベクトル長設定命令に設定されているベクトル長「２５６」に基づいて、Ｌ１に記述されているベクトル長設定命令に関連するＬ２、Ｌ３、Ｌ４それぞれに記述されているベクトル命令に、ベクトル長を表す引数「２５６」を追加し、ベクトル命令をベクトル長明示型に変換する。
【００７０】
次に、ベクトル長明示変換部４２は、Ｌ２、Ｌ３、Ｌ４に記述されているベクトル長明示型のベクトル命令それぞれには戻り値があるので、ベクトル長明示型のベクトル命令それぞれに仮引数「nil」を追加する。
【００７１】
なお、戻り値それぞれは、他のベクトル命令で用いられていないので、プログラム２のＬ２からＬ４の記述を、プログラム８のような記述に変更する。
【００７２】
［プロクラム８］
L1：  _ve_lvl(256);
L2：  __vr vx = __ve_vld_vss(8, px, 256, nil);
L3：  __vr vy = __ve_vld_vss(8, py, 256, nil);
L4：  __vr vz = __ve_vld_vss(8, pz, 256, nil);
【００７３】
次に、削除部４４は、ベクトル命令をベクトル長明示型に変換したので、プログラム８のＬ１に記述されているベクトル長設定命令は不要となるため、削除する。
【００７４】
続いて、検出部４１が、プログラム２のＬ５に記述されているベクトル長設定命令を検出した場合、Ｌ５に記述されているベクトル長設定命令に関連するＬ６に記述されているベクトル命令を検出する。
【００７５】
次に、ベクトル長明示変換部４２は、プログラム２のＬ５に記述されているベクトル長設定命令に設定されているベクトル長「１２８」に基づいて、Ｌ５に関連するＬ６のベクトル命令に、ベクトル長を表す引数「１２８」を追加し、ベクトル命令をベクトル長明示型に変換する。
【００７６】
次に、ベクトル長明示変換部４２は、Ｌ６に記述されているベクトル長明示型のベクトル命令には戻り値があるので、ベクトル長明示型のベクトル命令に仮引数を追加する。すなわち、プログラム２のＬ５、Ｌ６の記述は、プログラム９のような記述に変換される。
【００７７】
［プロクラム９］
L5：  _ve_lvl(128);
L6：  vz = _ve_vfaddd_vvv(vx, vy, 128, nil);
【００７８】
次に、引数追加部４３は、プログラム９のＬ６に記述されているベクトル命令において、ベクトル命令の結果を代入する戻り値「vz」が、プログラム２のＬ４において用いられているので、プログラム９のＬ６のベクトル命令の仮引数「nil」を、戻り値「vz」を表す引数に変更して、プログラム１０のような記述に変換する。
【００７９】
［プロクラム１０］
L5：  _ve_lvl(128);
L6：  vz = _ve_vfaddd_vvv(vx, vy, 128, vz);
【００８０】
次に、削除部４４は、ベクトル命令をベクトル長明示型に変換したので、プログラム１０のＬ５に記述されているベクトル長設定命令は不要となるため、削除する。
【００８１】
続いて、検出部４１が、プログラム２のＬ７に記述されているベクトル長設定命令を検出した場合、Ｌ７に関連するＬ８に記述されているベクトル命令を検出する。
【００８２】
次に、ベクトル長明示変換部４２は、プログラム２のＬ７に記述されているベクトル長設定命令に設定されているベクトル長「２５６」に基づいて、Ｌ７に関連するＬ８のベクトル命令に、ベクトル長を表す引数「２５６」を追加し、ベクトル命令をベクトル長明示型に変換する。
【００８３】
なお、Ｌ８に記述されているベクトル長明示型のベクトル命令には戻り値がないので、ベクトル長明示型のベクトル命令に仮引数「nil」を追加しないで、プログラム１１のような記述に変換する。。
【００８４】
［プロクラム１１］
L7：  _ve_lvl(256);
L8：  _ve_vst_vss(vz, 8, pout, 256);
【００８５】
次に、削除部４４は、ベクトル命令をベクトル長明示型に変換したので、プログラム１１のＬ７に記述されているベクトル長設定命令は不要となるため、削除する。
【００８６】
そして、形式変換部２４は、生成したプログラムを静的単一代入形式の中間命令に変換して、プログラム１２を生成する。
【００８７】
［プロクラム１２］
L1：  %vx = call __vevl_vld_vss(8, px, 256, nil)
L2：  %vy = call __vevl_vld_vss(8, py, 256, nil)
L3：  %vz = call __vevl_vld_vss(8, pz, 256, nil)
L4：  %vz1 = _vevl_vfaddd_vvv(%vx, %vy, 128, %vz)
L5：  call _vevl_vst_vss(%vz1, 8, pout, 256);
【００８８】
生成部３０について説明をする。
生成部３０は、変換部２０により生成された中間命令に対してコンパイルを実行して、命令コードを生成する。生成部３０は、例えば、中間命令であるプログラム１２に対してコンパイルを実行し、プログラム１３のような命令コードを生成する。
【００８９】
［プロクラム１３］
L1 ：  lvl       256
L2 ：  vld       %v1,... ; // 「...」はpxに対応するメモリアドレス
L3 ：  lvl       256
L4 ：  vld       %v2,... ; // 「...」はpyに対応するメモリアドレス
L5 ：  lvl       256
L6 ：  vld       %v3,... ; // 「...」はpzに対応するメモリアドレス
L7 ：  lvl       128
L8 ：  vfadd.d   %v3,%v1,%v2
L9 ：  lvl       256
L10：  vst       %v3,... ; // 「...」はpoutに対応するメモリアドレス
【００９０】
また、生成部３０は、コード命令の余分なベクトル長設定命令を削除してもよい。例えば、生成部３０は、プログラム１３のＬ３、Ｌ５の記述を削除して、プログラム７のような記述にする。
【００９１】
［装置動作］
次に、本発明の第二の実施の形態におけるコンパイル装置の動作について図５を用いて説明する。図５は、第二の実施の形態におけるコンパイル装置の動作の一例を示す図である。以下の説明においては、適宜図４を参照する。また、第二の実施の形態では、コンパイル装置を動作させることによって、コンパイル方法が実施される。よって、本実施の形態におけるコンパイル方法の説明は、以下のコンパイル装置の動作説明に代える。
【００９２】
図５に示すように、最初に、取得部２１は、組み込み関数を用いて記述されたベクトル演算に用いるプログラムを取得する（ステップＢ１）。
【００９３】
次に、検出部４１は、ベクトル演算に用いるプログラムに記述されているベクトル長設定命令を検出する（ステップＢ２）。図５の例では、検出部４１は、プログラムの先頭行から順に、選択された行にベクトル長設定命令があるか否かを判定する。ただし、ベクトル長設定命令の検出方法は、上述した検出方法に限定されるものではない。
【００９４】
次に、ベクトル長設定命令を検出した場合（ステップＢ２：Ｙｅｓ）、検出部４１は、検出されたベクトル長設定命令に関連するベクトル命令を検出する（ステップＢ３）。ベクトル長設定命令を検出できない場合（ステップＢ２：Ｎｏ）、次の行を選択する（ステップＢ４）。
【００９５】
次に、ベクトル長明示変換部４２は、ベクトル命令をベクトル長明示型に変換する（ステップＢ５）。具体的には、ステップＢ５において、ベクトル長明示変換部４２は、まず、検出部４２が検出したベクトル命令を取得する。
【００９６】
続いて、ステップＢ５において、ベクトル長明示変換部４２は、取得したベクトル命令をベクトル長明示型に変換する。すなわち、ステップＢ５において、ベクトル長明示変換部４２は、ベクトル長設定命令に設定されているベクトル長を表す引数を、取得したベクトル命令に追加する。
【００９７】
次に、ベクトル長明示変換部４２は、検出したベクトル命令に戻り値があるか否かを判定する（ステップＡ６）。検出したベクトル命令に戻り値がある場合（ステップＡ６：Ｙｅｓ）、ベクトル長明示変換部４２は、検出したベクトル命令に仮引数を追加する（ステップＢ７）。また、検出したベクトル命令に戻り値がない場合（ステップＢ６：Ｎｏ）、引数追加部４３は、検出したベクトル命令に仮引数を追加せず、次の行を選択する（ステップＢ４）。
【００９８】
次に、引数追加部４３は、検出したベクトル命令の戻り値が、他のベクトル命令において既に使用されているか否かを判定する（ステップＢ８）。検出したベクトル命令の戻り値が、他のベクトル命令において既に使用されている場合（ステップＢ８：Ｙｅｓ）、引数追加部４３は、検出したベクトル命令に戻り値を表す引数を追加する（ステップＢ９）。また、検出したベクトル命令の戻り値が、他のベクトル命令において使用されていない場合（ステップＢ８：Ｎｏ）、ステップＢ１０の処理に移行する。
【００９９】
次に、削除部４４は、プログラムからベクトル長設定命令を削除する（ステップＢ１０）。具体的には、ステップＢ１０において、削除部４４は、ベクトル長明示型のベクトル命令を有するプログラムから、ベクトル長設定命令を削除する。
【０１００】
次に、プログラムのすべての行に対して、ステップＢ１からＢ１０の処理を実行したか否かを判定する（ステップＢ１１）。
【０１０１】
次に、プログラムのすべての行に対してステップＢ１からＢ１０の処理を実行した場合（ステップＢ１１：Ｙｅｓ）、形式変換部２４は、引数追加部４３により生成されたプログラムを、静的単一代入形式の中間命令に変換する（ステップＢ１２）。
【０１０２】
次に、生成部３０は、変換部２０により中間命令に変換されたプログラムに対してコンパイルを実行し、命令コードを生成する（ステップＢ１３）。例えば、プログラム１３のような命令コードが生成される。
【０１０３】
なお、ステップＢ１３において、生成部３０は、コード命令の余分なベクトル長設定命令を削除してもよい。例えば、生成部３０は、プログラム１３のＬ３、Ｌ５の記述を削除して、プログラム７のような記述を生成する。
【０１０４】
［第二の実施の形態の効果］
以上のように本実施の形態によれば、コンパイルにおいて、ベクトル演算に用いるプログラムにベクトル長を変更させる記述があっても、プログラムにおけるベクトル長の変更に関連する記述を変更した後、当該プログラムを静的単一代入形式に変換する。そのため、コンパイル装置４０は、ベクトル演算に用いるプログラムにベクトル長が変更される記述があった場合でも、期待した命令コードを生成することができる。
【０１０５】
［プログラム］
第二の実施の形態におけるプログラムは、コンピュータに、図５に示すステップＢ１からＢ１３を実行させるプログラムであればよい。このプログラムをコンピュータにインストールし、実行することによって、第二の実施の形態におけるコンパイル装置とコンパイル方法とを実現することができる。この場合、コンピュータのプロセッサは、変換部２０（取得部２１、検出部４１、ベクトル長明示変換部４２、引数追加部４３、削除部４４、形式変換部２４など）、変換部３０として機能し、処理を行なう。
【０１０６】
また、第二の実施の形態におけるプログラムは、複数のコンピュータによって構築されたコンピュータシステムによって実行されてもよい。この場合、例えば、各コンピュータが、それぞれ、変換部２０（取得部２１、検出部４１、ベクトル長明示変換部４２、引数追加部４３、削除部４４、形式変換部２４など）、変換部３０のいずれかとして機能してもよい。
【０１０７】
（第三の実施の形態）
以下、本発明の第三の実施の形態について、図６から図７を参照しながら説明する。
【０１０８】
［装置構成］
次に、図６を用いて、第三の実施の形態におけるコンパイル装置６０の構成について説明する。図６は、第三の実施の形態におけるコンパイル装置の一例を示す図である。
【０１０９】
図６に示すように、コンパイル装置６０は、変換部２０と、生成部３０とを有する。また、変換部２０は、取得部２１、検出部２２、引数追加部２３、形式変換部２４に加え、マスク形式変換部６１を有する。生成部３０は、マスク形式修正部６２を有する。
【０１１０】
なお、取得部２１、検出部２２、引数追加部２３、形式変換部２４の説明は、第一の実施の形態において説明したので、これらについての説明は省略する。
【０１１１】
マスク形式変換部６１は、ベクトル長設定命令に設定されているベクトル長に基づいてマスクを生成し、生成したマスクを用いて、ベクトル長設定命令をマスク命令に変換する。また、マスク形式変換部６１は、ベクトル長設定命令に関連するベクトル命令に、マスクを表す引数を追加して、マスク付きベクトル命令に変換する。
【０１１２】
プログラム２を用いてマスク付き中間命令への変換について説明する。
検出部２２は、プログラム２のＬ６に記述されているベクトル命令を検出した場合、Ｌ６に記述されているベクトル命令には戻り値が、他のベクトル命令で用いられているので、ベクトル命令に戻り値を表す引数に追加して、プログラム１４のような記述に変換する。
【０１１３】
［プロクラム１４］
L5：  _ve_lvl(128);
L6：  vz = _ve_vfaddd_vvv(vx, vy, vz);
【０１１４】
次に、マスク形式変換部６１は、プログラム１４のＬ５に記述されているベクトル長設定命令に設定されているベクトル長「１２８」に基づいてマスクを生成し、生成したマスクを用いて、ベクトル長設定命令をマスク命令に変換する。
【０１１５】
また、マスク形式変換部６１は、プログラム１４のＬ６のベクトル命令に、マスクを表す引数「mask」を追加し、マスク付きベクトル命令に変換する。すなわち、プログラム１４の記述は、プログラム１５のような記述に変換される。
【０１１６】
［プロクラム１５］
L5：  mask = [1, 1, ……, 0, 0, ……]; // 1が128個、0が128個;
L6：  vz = _ve_vfaddd_vvv(vx, vy, mask, vz);
【０１１７】
そして、形式変換部２４は、生成したプログラム１５を静的単一代入形式の中間命令に変換して、プログラム１６を生成する。
【０１１８】
［プロクラム１６］
L5：  %mask = [1, 1, ……, 0, 0, ……] // 1が128個、0が128個
L6：  %vz1 = _vevl_vfaddd_vvv(%vx, %vy, %mask, %vz)
【０１１９】
プログラム１６のＬ５に記述されているマスク生成中間命令は、マスクの［０：１２７］ビットに１２８個の「１」が設定され、マスクの［１２８：２５５］ビットに１２８個の「０」が設定される。
【０１２０】
なお、プログラム１６のＬ６に記述されている戻り値「%vz1」に対して設定されているマスク「mask」は、戻り値「%vz1」の［０：１２７］に「１」が設定されているので、プログラム１６のＬ６の実行結果が代入される。対して、戻り値「%vz1」の［１２８：２５５］には「０」が設定されているので、プログラム１６のＬ６の実行結果は代入されず、元の値が残る。
【０１２１】
マスク形式修正部６２は、マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、マスク生成中間命令をベクトル長設定命令コードに修正する。
【０１２２】
具体的には、マスク形式修正部６２は、まず、中間命令からマスク生成中間命令を検出する。続いて、マスク形式修正部６２は、検出したマスク生成中間命令が、あらかじめ設定された形式である場合、マスク生成中間命令をベクトル長設定命令コードに修正する。
【０１２３】
ここで、あらかじめ設定されたマスクの形式とは、ｎ個（０＜ｎの整数）の「１」と、ｍ個（０＜ｍの整数）の「０」とから構成されているマスクである。
【０１２４】
例えば、マスク形式修正部６２が、プログラム１６のＬ５に記述されているマスク生成中間命令を検出した場合、プログラム１６のＬ５それぞれのマスク生成中間命令を、プログラム７のＬ５に記述されているようなベクトル長設定命令コードにする。
【０１２５】
また、マスク形式修正部６２は、マスク付きベクトル命令が静的単一代入形式に変換されたマスク付き中間命令からマスクを表す引数を削除するとともに、不要となったマスク生成中間命令を削除する。
【０１２６】
例えば、マスク形式修正部６２は、プログラム１６のＬ６に記述されているマスク付き中間命令からマスクを表す引数を削除する。更に、マスク形式修正部６２は、プログラム１６のＬ５に記述されている不要となったマスク生成中間命令を削除する。
【０１２７】
その後、生成部３０は、プログラム７に記述されているような命令コードを生成する。
【０１２８】
［装置動作］
次に、本発明の第三の実施の形態におけるコンパイル装置の動作について図７を用いて説明する。図７は、第三の実施の形態におけるコンパイル装置の動作の一例を示す図である。以下の説明においては、適宜図６を参照する。また、第三の実施の形態では、コンパイル装置を動作させることによって、コンパイル方法が実施される。よって、本実施の形態におけるコンパイル方法の説明は、以下のコンパイル装置の動作説明に代える。
【０１２９】
図７に示すように、最初に、ステップＡ１からＡ４の処理を実行する。ステップＡ１からＡ４の処理の説明については、第一の実施の形態において説明をしたので省略する。
【０１３０】
次に、マスク形式変換部６１は、ベクトル長設定命令に設定されているベクトル長に基づいてマスクを生成し、生成したマスクを用いて、ベクトル長設定命令をマスク命令に変換する（ステップＣ１）。また、ステップＣ１において、マスク形式変換部６１は、ベクトル長設定命令に関連するベクトル命令に、マスクを表す引数を追加して、マスク付きベクトル命令に変換する。
【０１３１】
次に、変換部２０は、プログラムのすべての行に対して、ステップＡ２からＡ４及びステップＣ１の処理を実行したか否かを判定する（ステップＡ５）。プログラムのすべての行に対してステップＡ２からＡ４及びステップＣ１の処理を実行した場合（ステップＡ５：Ｙｅｓ）、形式変換部２４は、生成されたプログラムを、静的単一代入形式の中間命令に変換する（ステップＡ６）。
【０１３２】
次に、マスク形式修正部６２は、マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、マスク生成中間命令をベクトル長設定命令コードに変換する（ステップＣ２）。
【０１３３】
また、ステップＣ２において、マスク形式修正部６２は、マスク付きベクトル命令が静的単一代入形式に変換されたマスク付き中間命令からマスクを表す引数を削除するとともに、不要となったマスク生成中間命令を削除する。
【０１３４】
次に、生成部３０は、変換部２０により中間命令に変換されたプログラムに対してコンパイルを実行し、命令コードを生成する（ステップＡ８）。例えば、プログラム７のような命令コードが生成される。
【０１３５】
［第三の実施の形態の効果］
以上のように本実施の形態によれば、コンパイルにおいて、ベクトル演算に用いるプログラムにベクトル長を変更させる記述があっても、プログラムにおけるベクトル長の変更に関連する記述を変更した後、当該プログラムを静的単一代入形式に変換する。そのため、コンパイル装置６０は、ベクトル演算に用いるプログラムにベクトル長が変更される記述があった場合でも、期待した命令コードを生成することができる。
【０１３６】
［プログラム］
第三の実施の形態におけるプログラムは、コンピュータに、図７に示すステップＡ１からＡ８及びステップＣ１、Ｃ２を実行させるプログラムであればよい。このプログラムをコンピュータにインストールし、実行することによって、第三の実施の形態におけるコンパイル装置とコンパイル方法とを実現することができる。この場合、コンピュータのプロセッサは、変換部２０（取得部２１、検出部２２、引数追加部２３、マスク形式変換部６１、形式変換部２４など）、変換部３０（マスク形式修正部６２など）として機能し、処理を行なう。
【０１３７】
また、第三の実施の形態におけるプログラムは、複数のコンピュータによって構築されたコンピュータシステムによって実行されてもよい。この場合、例えば、各コンピュータが、それぞれ、変換部２０（取得部２１、検出部２２、引数追加部２３、形式変換部２４、マスク形式変換部６１など）、変換部３０（マスク形式修正部６２など）のいずれかとして機能してもよい。
【０１３８】
（第四の実施の形態）
以下、本発明の第四の実施の形態について、図８から図９を参照しながら説明する。
【０１３９】
［装置構成］
次に、図８を用いて、第四の実施の形態におけるコンパイル装置８０の構成について説明する。図８は、第四の実施の形態におけるコンパイル装置の一例を示す図である。
【０１４０】
図８に示すように、コンパイル装置８０は、変換部２０と、生成部３０とを有する。また、変換部２０は、取得部２１、検出部２２、セレクト命令追加部８１、形式変換部２４を有する。生成部３０は、セレクト命令修正部８２を有する。
【０１４１】
なお、取得部２１、検出部２２、形式変換部２４の説明は、第一の実施の形態において説明したので、これらについての説明は省略する。
【０１４２】
セレクト命令追加部８１は、検出部２２が検出したベクトル命令の戻り値が、他のベクトル命令で用いられている場合、セレクト命令を追加する。セレクト命令は、要素を結合する命令である。例えば、プログラム１７のように定義される。
【０１４３】
［プロクラム１７］
c = SELECT cond, a, b  ⇒  c[i] = cond[i]? a[i]:b[i]
【０１４４】
プログラム２の例では、セレクト命令追加部８１は、プログラム２のＬ６のような記述を、プログラム１８のＬ６のような記述に変更する。
【０１４５】
［プロクラム１８］
L5：  _ve_lvl(128);
L6：  vz = _ve_vfaddd_vvv(vx, vy);
L7：  cond = [1, 1, ……, 0, 0, ……]; // 1が128個、0が128個;
L8：  c = SELECT cond a, b
【０１４６】
そして、形式変換部２４は、生成したプログラムを静的単一代入形式の中間命令に変換して、プログラム１９を生成する。
【０１４７】
［プロクラム１９］
L5 ：  call _ve_lvl(128)
L6 ：  %vz1 = _vevl_vfaddd_vvv(%vx, %vy)
L7 ：  %cond = [1, 1, ……, 0, 0, ……]
L8 ：  %vz2 = SELECT %cond, %vz1, %vz
【０１４８】
また、形式変換部２４は、プログラム２０のＬ５からＬ８の記述に限らず、例えば、プログラム２０に示すようなベクトル長明示型の記述を生成してもよい。
【０１４９】
［プロクラム２０］
L5：  %vz1 = _vevl_vfaddd_vvv(%vx, %vy, 128)
L6：  %cond = [1, 1, ……, 0, 0, ……]
L7：  %vz2 = SELECT %cond, %vz1, %vz
【０１５０】
更に、形式変換部２４は、例えば、プログラム２１に示すようなマスク付き形式の記述を生成してもよい。
【０１５１】
［プロクラム２１］
L5：  %vz1 = _vevl_vfaddd_vvv(%vx, %vy, %mask)
L6：  %mask = [1, 1, ……, 0, 0, ……]
L7：  %vz2 = SELECT %mask, %vz1, %vz
【０１５２】
セレクト命令修正部８２は、セレクト中間命令の引数と、引数に関連する中間命令とを用いて、セレクト中間命令をマスク付き中間命令に変換する。具体的には、セレクト命令修正部８２は、セレクト中間命令が有する、セレクト条件を表す引数と、戻り値を表す引数とに基づいて、セレクト中間命令をマスク付き中間命令に変換する。
【０１５３】
プログラム１９の例では、セレクト命令修正部８２は、まず、セレクト中間命令の戻り値「%vz1」が使用されている、プログラム１９のＬ６に記述されている中間命令を検出する。続いて、セレクト命令修正部８２は、プログラム１９のＬ６に記述されている中間命令の引数に、セレクト条件を表す引数「%cond」と戻り値を表す引数「%vz」とを追加する。
【０１５４】
続いて、セレクト命令修正部８２は、プログラム１９のＬ６に記述されている中間命令の右辺を、プログラム１９のＬ８に記述されている中間命令の右辺に変更する。その後、セレクト命令修正部８２は、プログラム１９のＬ５、Ｌ６の記述を削除する。すなわち、プログラム１９のＬ５からＬ８のような記述を、プログラム２２のＬ５、Ｌ６のような記述に変更する。ただし、セレクト中間命令のマスク付き中間命令への変換は、上述した変換方法に限定されるものではない。
【０１５５】
［プロクラム２２］
L5 ：  %cond = [1, 1, ……, 0, 0, ……]
L6 ：  %vz2 = _vevp_vfaddd_vvv(%vx, %vy, %cond, %vz)
【０１５６】
その後、生成部３０は、プログラム７に記述されているような命令コードを生成する。
【０１５７】
［装置動作］
次に、本発明の第四の実施の形態におけるコンパイル装置の動作について図９を用いて説明する。図９は、第四の実施の形態におけるコンパイル装置の動作の一例を示す図である。以下の説明においては、適宜図８を参照する。また、第四の実施の形態では、コンパイル装置を動作させることによって、コンパイル方法が実施される。よって、本実施の形態におけるコンパイル方法の説明は、以下のコンパイル装置の動作説明に代える。
【０１５８】
図９に示すように、最初に、ステップＡ１からＡ４の処理を実行する。ステップＡ１からＡ４の処理の説明については、第一の実施の形態において説明をしたので省略する。
【０１５９】
セレクト命令追加部８１は、ベクトル命令の戻り値が、他のベクトル命令で用いられている場合、セレクト命令を追加する（ステップＤ１）。プログラム２の例では、セレクト命令追加部８１は、プログラム２のＬ６のような記述を、プログラム１９のＬ６のような記述に変更する。
【０１６０】
次に、変換部２０は、プログラムのすべての行に対して、ステップＡ２からＡ４及びステップＤ１の処理を実行したか否かを判定する（ステップＡ５）。プログラムのすべての行に対してステップＡ２からＡ４及びステップＤ１の処理を実行した場合（ステップＡ５：Ｙｅｓ）、形式変換部２４は、生成されたプログラムを、静的単一代入形式の中間命令に変換する（ステップＡ６）。
【０１６１】
次に、セレクト命令修正部８２は、セレクト中間命令の引数と、引数に関連する中間命令とを用いて、セレクト中間命令をマスク付き中間命令に変換する（ステップＤ２）。具体的には、ステップＤ２において、セレクト命令修正部８２は、セレクト中間命令が有する、セレクト条件を表す引数と、戻り値を表す引数とに基づいて、セレクト中間命令をマスク付き中間命令に変換する。
【０１６２】
次に、生成部３０は、変換部２０により中間命令に変換されたプログラムに対してコンパイルを実行し、命令コードを生成する（ステップＡ８）。例えば、プログラム７のような命令コードが生成される。
【０１６３】
［第四の実施の形態の効果］
以上のように本実施の形態によれば、コンパイルにおいて、ベクトル演算に用いるプログラムにベクトル長を変更させる記述があっても、プログラムにおけるベクトル長の変更に関連する記述を変更した後、当該プログラムを静的単一代入形式に変換する。そのため、コンパイル装置８０は、ベクトル演算に用いるプログラムにベクトル長が変更される記述があった場合でも、期待した命令コードを生成することができる。
【０１６４】
［プログラム］
第四の実施の形態におけるプログラムは、コンピュータに、図９に示すステップＡ１からＡ８及びステップＤ１、Ｄ２を実行させるプログラムであればよい。このプログラムをコンピュータにインストールし、実行することによって、第四の実施の形態におけるコンパイル装置とコンパイル方法とを実現することができる。この場合、コンピュータのプロセッサは、変換部２０（取得部２１、検出部２２、形式変換部２４、セレクト命令追加部８１など）、変換部３０（セレクト命令修正部８２など）として機能し、処理を行なう。
【０１６５】
また、第四の実施の形態におけるプログラムは、複数のコンピュータによって構築されたコンピュータシステムによって実行されてもよい。この場合、例えば、各コンピュータが、それぞれ、変換部２０（取得部２１、検出部２２、形式変換部２４、セレクト命令追加部８１など）、変換部３０（セレクト命令修正部８２など）のいずれかとして機能してもよい。
【０１６６】
［物理構成］
ここで、第一から第四の実施の形態におけるプログラムを実行することによって、コンパイル装置を実現するコンピュータについて図１０を用いて説明する。図１０は、本発明の第一から第四の実施の形態におけるコンパイル装置を実現するコンピュータの一例を示す図である。
【０１６７】
図１０に示すように、コンピュータ１１０は、ＣＰＵ（Central Processing Unit）１１１と、メインメモリ１１２と、記憶装置１１３と、入力インターフェイス１１４と、表示コントローラ１１５と、データリーダ／ライタ１１６と、通信インターフェイス１１７とを備える。これらの各部は、バス１２１を介して、互いにデータ通信可能に接続される。なお、コンピュータ１１０は、ＣＰＵ１１１に加えて、又はＣＰＵ１１１に代えて、ＧＰＵ（Graphics Processing Unit）、又はＦＰＧＡ（Field-Programmable Gate Array）を備えていてもよい。
【０１６８】
ＣＰＵ１１１は、記憶装置１１３に格納された、本実施の形態におけるプログラム（コード）をメインメモリ１１２に展開し、これらを所定順序で実行することにより、各種の演算を実施する。メインメモリ１１２は、典型的には、ＤＲＡＭ（Dynamic Random Access Memory）などの揮発性の記憶装置である。また、本実施の形態におけるプログラムは、コンピュータ読み取り可能な記録媒体１２０に格納された状態で提供される。なお、本実施の形態におけるプログラムは、通信インターフェイス１１７を介して接続されたインターネット上で流通するものであってもよい。
【０１６９】
また、記憶装置１１３の具体例としては、ハードディスクドライブの他、フラッシュメモリ等の半導体記憶装置があげられる。入力インターフェイス１１４は、ＣＰＵ１１１と、キーボード及びマウスといった入力機器１１８との間のデータ伝送を仲介する。表示コントローラ１１５は、ディスプレイ装置１１９と接続され、ディスプレイ装置１１９での表示を制御する。
【０１７０】
データリーダ／ライタ１１６は、ＣＰＵ１１１と記録媒体１２０との間のデータ伝送を仲介し、記録媒体１２０からのプログラムの読み出し、及びコンピュータ１１０における処理結果の記録媒体１２０への書き込みを実行する。通信インターフェイス１１７は、ＣＰＵ１１１と、他のコンピュータとの間のデータ伝送を仲介する。
【０１７１】
また、記録媒体１２０の具体例としては、ＣＦ（Compact Flash（登録商標））及びＳＤ（Secure Digital）などの汎用的な半導体記憶デバイス、フレキシブルディスク（Flexible Disk）などの磁気記録媒体、又はＣＤ−ＲＯＭ（Compact Disk Read Only Memory）などの光学記録媒体があげられる。
【０１７２】
［付記］
以上の実施の形態に関し、更に以下の付記を開示する。上述した実施の形態の一部又は全部は、以下に記載する（付記１）から（付記１２）により表現することができるが、以下の記載に限定されるものではない。
【０１７３】
（付記１）
ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、変換部と、
変換された前記中間命令を用いて命令コードを生成する、生成部と、
を有することを特徴とするコンパイル装置。
【０１７４】
（付記２）
付記１に記載のコンパイル装置であって、
前記変換部は、前記ベクトル命令にベクトル長を表す引数を追加して、ベクトル長明示型のベクトル命令に変換し、ベクトル長設定命令を削除する、
を有することを特徴とするコンパイル装置。
【０１７５】
（付記３）
付記１に記載のコンパイル装置であって、
前記変換部は、ベクトル長に基づいてマスクを生成し、生成した前記マスクを用いて、ベクトル長設定命令をマスク命令に変換し、前記ベクトル命令に前記マスクを表す引数を追加して、マスク付きベクトル命令に変換し、
前記生成部は、前記マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、前記マスク生成中間命令をベクトル長設定命令コードに変換し、マスク付きベクトル命令が静的単一代入形式に変換された前記マスク付き中間命令から前記マスクを表す引数を削除し、前記マスク生成中間命令を削除する
ことを特徴とするコンパイル装置。
【０１７６】
（付記４）
ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、変換部と、
前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、生成部と、
を有することを特徴とするコンパイル装置。
【０１７７】
（付記５）
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、ステップと、
（ｂ）変換された前記中間命令を用いて命令コードを生成する、ステップと、
を有することを特徴とするコンパイル方法。
【０１７８】
（付記６）
付記５に記載のコンパイル方法であって、
前記（ａ）のステップにおいて、前記ベクトル命令にベクトル長を表す引数を追加して、ベクトル長明示型のベクトル命令に変換し、ベクトル長設定命令を削除する
ことを特徴とするコンパイル方法。
【０１７９】
（付記７）
付記５に記載のコンパイル方法であって、
前記（ａ）のステップにおいて、ベクトル長に基づいてマスクを生成し、生成した前記マスクを用いて、ベクトル長設定命令をマスク命令に変換し、前記ベクトル命令に、前記マスクを表す引数を追加して、マスク付きベクトル命令に変換し、
前記（ｂ）のステップにおいて、前記マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、前記マスク生成中間命令をベクトル長設定命令コードに変換し、マスク付きベクトル命令が静的単一代入形式に変換された前記マスク付き中間命令から前記マスクを表す引数を削除し、前記マスク生成中間命令を削除する
ことを特徴とするコンパイル方法。
【０１８０】
（付記８）
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、ステップと、
（ｂ）前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、ステップと、
を有することを特徴とするコンパイル方法。
【０１８１】
（付記９）
コンピュータに、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、前記ベクトル命令に前記戻り値を表す引数を追加し、前記戻り値を表す引数を追加した前記ベクトル命令を静的単一代入形式の中間命令に変換する、ステップと、
（ｂ）変換された前記中間命令を用いて命令コードを生成する、ステップと、
を実行させることを特徴とするプログラム。
【０１８２】
（付記１０）
付記９に記載のプログラムであって、
前記（ａ）のステップにおいて、前記ベクトル命令にベクトル長を表す引数を追加して、ベクトル長明示型のベクトル命令に変換し、ベクトル長設定命令を削除する
ことを特徴とするプログラム。
【０１８３】
（付記１１）
付記９に記載のプログラムであって、
前記（ａ）のステップにおいて、ベクトル長に基づいてマスクを生成し、生成した前記マスクを用いて、前記ベクトル長設定命令をマスク命令に変換し、前記ベクトル命令に、前記マスクを表す引数を追加して、マスク付きベクトル命令に変換し、
前記（ｂ）のステップにおいて、前記マスク命令が静的単一代入形式に変換されたマスク生成中間命令が、あらかじめ設定された形式である場合、前記マスク生成中間命令をベクトル長設定命令コードに変換し、マスク付きベクトル命令が静的単一代入形式に変換された前記マスク付き中間命令から前記マスクを表す引数を削除し、前記マスク生成中間命令を削除する
ことを特徴とするプログラム。
【０１８４】
（付記１２）
コンピュータに、
（ａ）ベクトル演算に用いるプログラムにおいて、組み込み関数により記述されたベクトル命令の戻り値が、他の前記ベクトル命令で用いられている場合、セレクト命令を追加し、前記セレクト命令を追加した前記ベクトル命令を静的単一代入形式のセレクト中間命令に変換する、ステップと、
（ｂ）前記セレクト中間命令の引数と、前記引数に関連する中間命令とを用いて、前記セレクト中間命令をマスク付き中間命令に変換し、変換された前記中間命令を用いて命令コードを生成する、ステップと、
を実行させることを特徴とするプログラム。
【産業上の利用可能性】
【０１８５】
以上のように本発明によれば、ベクトル演算に用いるプログラムにおいて、ベクトル長が変更される記述がある場合でも期待した命令コードを生成できる。本発明は、ベクトル演算プロセッサで用いるプログラムのコンパイルが必要な分野において有用である。
【符号の説明】
【０１８６】
１０、４０、６０、８０  コンパイル装置
２０  変換部
２１  取得部
２２、４１  検出部
２３、４３  引数追加部
２４  形式変換部
３０  生成部
４２  ベクトル長明示変換部
４４  削除部
６１  マスク形式変換部
６２  マスク形式修正部
８１  セレクト命令追加部
８２  セレクト命令修正部
１１０  コンピュータ
１１１  ＣＰＵ
１１２  メインメモリ
１１３  記憶装置
１１４  入力インターフェイス
１１５  表示コントローラ
１１６  データリーダ／ライタ
１１７  通信インターフェイス
１１８  入力機器
１１９  ディスプレイ装置
１２０  記録媒体
１２１  バス
【図１】
2020201530.tif 000003
【図２】
2020201530.tif 000004
【図３】
2020201530.tif 000005
【図４】
2020201530.tif 000006
【図５】
2020201530.tif 000007
【図６】
2020201530.tif 000008
【図７】
2020201530.tif 000009
【図８】
2020201530.tif 000010
【図９】
2020201530.tif 000011
【図１０】
2020201530.tif 000012