(57)【特許請求の範囲】
【請求項１】
ソースプログラム中の多重ループをベクトル化する装置において、
ソースプログラム中の多重ループに含まれる演算式中の複数の配列について配列の次元数が同一でないおよび配列の大きさが同一でない一方あるいは両者に該当する配列を検出する検出手段と、
上記検出された配列について他の配列の次元数および大きさと同一にした空きの配列を作成して複写し新たな配列を生成する複写手段と、
上記生成した配列で複写前の配列を置き換える置換手段と、
上記置き換えた後の配列を用いて上記多重ループを展開する展開手段と
を備えたことを特徴とする多重ループのベクトル化装置。
【請求項２】
ソースプログラム中の多重ループをベクトル化する装置において、
ソースプログラム中の多重ループに含まれる演算式中の複数の配列について配列の次元数が同一でないおよび定義された配列と処理対象の配列の大きさが異なる一方あるいは両者に該当する配列を検出する検出手段と、
上記検出された配列について他の配列の次元数および大きさと同一にした空きの配列を作成して複写し新たな配列を生成する複写手段と、
上記生成した配列で複写前の配列を置き換える置換手段と、
上記置き換えた後の配列を用いて上記多重ループを展開する展開手段と
を備えたことを特徴とする多重ループのベクトル化装置。
【請求項３】
上記検出する配列は、上記演算式中の複数の配列について、最大の次数および大きさの配列と異なる次数あるいは大きさを持つ配列としたことを特徴とする請求項１あるいは請求項２記載の多重ループのベクトル化装置。
【請求項４】
上記複写手段が複写時に元の多重ループの範囲内のみ複写するように元のループの回転数でマスクして複写することを特徴とする請求項１あるいは請求項２あるいは請求項３記載の多重ループのベクトル化装置。
【請求項５】
上記展開手段が展開した後の配列について、同一のループ回転数のループが他にあったときに当該他のループ内に移動し、まとめることを特徴とする請求項１ないし請求項４のいずれかに記載の多重ループのベクトル化装置。
【請求項６】
ソースプログラム中の多重ループに含まれる演算式中の複数の配列について配列の次元数が同一でないおよび配列の大きさが同一でない一方あるいは両者に該当する配列を検出する検出手段と、
上記検出された配列について他の配列の次元数および大きさと同一にした空きの配列を作成して複写し新たな配列を生成する複写手段と、
上記生成した配列で複写前の配列を置き換える置換手段と、
上記置き換えた後の配列を用いて上記多重ループを展開する展開手段と
して機能させるプログラムをコンピュータ読取り可能に記録した記録媒体。
【請求項７】
ソースプログラム中の多重ループに含まれる演算式中の複数の配列について配列の次元数が同一でないおよび定義された配列と処理対象の配列の大きさが異なる一方あるいは両者に該当する配列を検出する検出手段と、
上記検出された配列について他の配列の次元数および大きさと同一にした空きの配列を作成して複写し新たな配列を生成する複写手段と、
上記生成した配列で複写前の配列を置き換える置換手段と、
上記置き換えた後の配列を用いて上記多重ループを展開する展開手段と
して機能させるプログラムをコンピュータ読取り可能に記録した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ソースプログラム中の多重ループをベクトル化するベクトル化装置および記録媒体に関するものである。
【０００２】
【従来の技術】
従来、ベクトル処理方式の計算機で高速に演算を行うために、ベクトル長は重要な要素である。２重ループを１重ループに変換し、実質的なベクトル長を長くして高速化する方法は、図９の（ａ）、（ｂ）に示すように多重ループの１重化として知られている。以下図９の（ａ）、（ｂ）の従来技術について簡単に説明する。
【０００３】
図９の（ａ）、（ｂ）は、従来技術の説明図を示す。
図９の（ａ）は２重ループを含むソースプログラム例を示し、図９の（ｂ）は従来の１重ループに変換した後のソースプログラム例を示す。
【０００４】
この従来の方法は、図９の（ａ）のソースプログラム中の
0003657414.tif 000002
という記述により、Ａ（Ｉ，Ｊ）＝Ｂ（Ｉ，Ｊ）＊Ｃ（Ｉ，Ｊ）という演算をＩについて１から１００まで繰り返してその結果を配列に格納し、次にＪについて１から１００まで繰り返してその結果を配列に格納し、ここでは、２重ループで演算を行うものである。この２重ループについて、従来は図９の（ｂ）に示すように、
0003657414.tif 000003
という記述により、Ａ（ＩＪ）＝Ｂ（ＩＪ）＊Ｃ（ＩＪ）という演算をＩＪについて１から１００００まで繰り返して配列に格納し、ここでは１重ループにして高速演算を行うものである。
【０００５】
【発明が解決しようとする課題】
上述した従来の図９の（ａ）の２重ループを図９の（ｂ）の１重ループに変換して高速演算を行うには、ループ内の演算する全ての配列の添字の次元数が同一、かつ各配列の添字の大きさが同一でないと、２重ループを１重ループに変換できなく、
（１）  次元数が異なる配列を含む多重ループ（図９の（ｃ）の場合）を少ないループにして高速化できないという問題があった。
【０００６】
（２）  宣言の大きさが異なる配列（添字の大きさが異なる配列）を含む多重ループ（図９の（ｄ）の場合）を少ないループにして高速化できないという問題があった。
【０００７】
本発明は、これらの問題を解決するため、処理対象の多重ループ内で次元の異なる配列や宣言の大きさの異なる配列があっても同一の次元および大きさに複写した後に少ないループ数に展開し演算を行い、演算対象ループ内で異なる次元や大きさを持つ配列が含まれていても少ないループ数にして配列の高速演算を実現することを目的としている。
【０００８】
【課題を解決するための手段】
図１を参照して課題を解決するための手段を説明する。
図１において、ソースプログラム１は、多重ループを少ないループにする対象のソースプログラムである。
【０００９】
コンパイラ２は、ソースプログラムをコンパイルするものであって、ここでは、多重ループを少ないループに変換などするものであり、ベクトル化手段４などから構成されるものである。
【００１０】
ベクトル化手段４は、ソースプログラム１をベクトル化するものであって、ここでは、多重ループを少ないループなどにするものであり、次元不一致配列検出手段５、次元不一致配列複写手段６、複写ループ最適化手段７、通常のベクトル化実施手段８などから構成されるものである。
【００１１】
次元不一致検出手段５は、ソースプログラム（実際はソースプログラムを解析して生成した中間言、以下同様）の処理対象中の多重ループ内の配列の次元および大きさが異なる配列を検出するものである。
【００１２】
次元不一致配列複写手段６は、次元不一致検出手段５によって検出された配列について、同一の次元および大きさなどにして複写して新たな配列を生成するものである。この生成した配列は、元の配列と置換する（後述する図３など参照）。
【００１３】
複写ループ最適化手段７は、同一の回転数のループが他にあったときに当該他のループ内に移動し、まとめるものである。
通常のベクトル化実施手段８は、多重ループを少ないループに変換するものである。
【００１４】
次に、動作を説明する。
次元不一致検出手段５がソースプログラム（中間言）１中の多重ループに含まれる配列の次元数が同一でないおよび配列の大きさが同一でない一方あるいは両者に該当する配列を検出し、次元不一致配列複写手段６が検出された配列について次元数および大きさを同一にして複写し新たな配列を生成し、生成した配列で複写前の配列を置き換えた後、通常のベクトル化実施手段８が置き換えた後の配列を用いて多重ループを展開し、この展開した後のループで演算を高速に行い得るようにしている。
【００１５】
また、次元不一致検出手段５がソースプログラム（中間言）１中の多重ループに含まれる配列の次元数が同一でないおよび定義した配列と処理対象の配列の大きさが異なる一方あるいは両者に該当する配列を検出し、次元不一致配列複写手段６が検出された配列について次元数および大きさを同一にして複写し新たな配列を生成し、生成した配列で複写前の配列を置き換えた後、通常のベクトル化実施手段８が置き換えた後の配列を用いて多重ループを展開し、この展開した後のループで演算を高速に行い得るようにしている。
【００１６】
これらの際に、次元不一致複写手段６が複写時に元の多重ループの範囲内のみ複写するようにもとのループの回転数でマスクして複写し、新たな配列を生成するようにしている。
【００１７】
また、複写ループ最適化手段７が展開した後の配列について、同一のループ回転数のループが他にあったときに当該他のループ内に移動し、まとめるようにしている。
【００１８】
従って、処理対象の多重ループ内で次元の異なる配列や宣言の大きさの異なる配列があっても同一の次元および大きさに複写した後に少ないループ数に展開し高速演算を行い得るようにすることにより、演算対象ループ内で異なる次元や大きさを持つ配列が含まれていても少ないループ数にして配列の高速演算を実現することが可能となる。
【００１９】
【発明の実施の形態】
次に、図１から図８を用いて本発明の実施の形態および動作を順次詳細に説明する。
【００２０】
図１は、本発明のシステム構成図を示す。
図１において、ソースプログラム１は、多重ループを少ないループにする対象のソースプログラムであって、例えば後述する図５の（ａ）に記載するような、多重ループを含むソースプログラムである。
【００２１】
コンパイラ２は、ソースプログラム１をコンパイルして実行可能形式のオブジェクトプログラム１０を生成するものであって、ソースプログラム解析手段３、ベクトル化手段４、およびオブジェクト生成手段９などから構成されるものである。
【００２２】
ソースプログラム解析手段３は、ソースプログラム１を形態素解析および構文解析などして中間言に展開するものである。以下ソースプログラム１を解析して展開した中間言をもとにベクトル化手段４によってベクトル化を実際には行うが、説明を判りやすくするために中間言を含めてソースプログラムと呼ぶ。
【００２３】
ベクトル化手段４は、ソースプログラム解析手段３によってソースプログラムを解析して展開した中間言（ソースプログラム）中の多重ループを少ないループ数に変換し、ベクトル化を行うものであって、次元不一致配列検出手段５、次元不一致配列複写手段６、複写ループ最適化手段７、通常のベクトル化実施手段８などから構成されるものである。
【００２４】
次元不一致配列検出手段５は、ソースプログラム（中間言）の対象の多重ループ中から配列の次元が異なる、および配列の大きさが異なる配列を検出するものである。この検出した配列を含む多重ループは、既述した図９の（ｃ）あるいは（ｄ）の多重ループであって、従来は１重化が不可能なものである。
【００２５】
次元不一致配列複写手段６は、次元不一致配列検出手段５によって検出した従来の１重化不可能な多重ループ中の配列（処理対象の配列）について、配列の次元数を同一、および配列の大きさを同一にして元の配列にマスクをかけて複写するものである（後述する図３の（ｂ）および図４参照）。
【００２６】
複写ループ最適化手段７は、次元不一致配列複写手段６によって定義した配列に対して、処理対象の配列の次元数を同一および大きさを同一に複写した後の新たな配列で元の配列を置換した後に、回転数が同じ他の多重ループがあったときにそれに移動してまとめ、最適化を行うものである。
【００２７】
通常のベクトル化実施手段８は、複写ループ最適化手段７によって最適化した後に、通常のベクトル化を行い、例えば後述する図３の（ｄ）に示すように展開してベクトル化を行うものである。
【００２８】
オブジェクト生成手段９は、ベクトル化した後のソースプログラム（中間言）を実行可能形式のオブジェクトプログラムに変換するものである。
オブジェクトプログラム１０は、実行可能形式のプログラムである。
【００２９】
次に、図２のフローチャートに示す順序に従い、図１の構成の全体の動作を詳細に説明する。
図２は、本発明の動作説明フローチャートを示す。
【００３０】
図２において、Ｓ１は、最適化制御行が有効であるか判別する。これは、例えば後述する図５の（ａ）のソースプログラム中の▲１▼に示すように、処理対象の多重ループの先頭に、図示の下記の最適化制御行
！ｏｃｌ  ｖｃｔ（ｖｏｌ）
が指定されているか判別する。ＹＥＳの場合には、Ｓ２以降に進む。ＮＯの場合には、最適化制御行の指定が無いのでＳ８に進む。
【００３１】
Ｓ２は、Ｓ１で最適化制御行の指定があったので、それに続く多重ループ内に次元の異なる配列が存在するかを調べる。
Ｓ３は、次元不一致の配列が存在し、図８の条件をクリアーしている（条件１を満たし、かつ条件２と条件３のうちの少なくとも一方を満たしている）か判別する。ＹＥＳの場合には、１重化が可能と判明したので、Ｓ４に進む。一方、ＮＯの場合には、１重化が不可能と判明したので、Ｓ８に進む。
【００３２】
Ｓ４は、Ｓ３のＹＥＳで１重化が可能と判明したので、多重ループの外側に次元を一致させるためにＳＶＴ（コンパイラが生成する内部領域）に複写するループを作成する（図４を用いて後述する）。
【００３３】
Ｓ５は、宣言の大きさが異なる配列が存在するか判別する。ＹＥＳの場合には、Ｓ６に進む。ＮＯの場合には、一重化可能な配列の大きさであったので、Ｓ７に進む。
【００３４】
Ｓ６は、Ｓ５のＹＥＳで宣言の大きさが異なる配列（正確には定義（宣言）された配列の大きさよりも、処理対象の配列の大きさが小さい配列）について、もとの多重ループの配列の大きさでマスクを生成する。これにより、次のＳ７の複写時に元の配列の大きさのみの値が複写されることとなる。
【００３５】
Ｓ７は、次元不一致の配列をＳＶＴ（コンパイラが生成する内部領域）に複写し、もとの多重ループの参照と置き換える。これにより、複写して新規に生成した配列と元の配列を置換し、１重化可能な多重ループに変換できたこととなる（後述する図３の（ｂ）、（ｃ）参照）。
【００３６】
Ｓ８は、新規に作成した多重ループが最適化可能か判別する。これは、Ｓ７で置換して新規に作成した多重ループを他の回転数の同一のグループに、まとめることが可能か判別する。ＹＥＳの場合には、Ｓ９で新規に作成した多重ループを最適な位置に移動する。また、他の多重ループと融合する。これは、回転数が同一の他の多重ループ内に移動してまとめて１つにする。一方、Ｓ８のＮＯの場合には、終了する。
【００３７】
以上のように、ソースプログラム中に図５の（ａ）の▲１▼の最適化制御行が記述されていたときにこれに続く多重ループに含まれる配列の次元が異なる、および定義された配列の大きさと処理対象の配列の大きさが異なるか判別し、いずれか一方のときに、更に１重化可能か判別（図８の条件１を満たし、かつ条件２あるいは条件２のうちの少なくとも一方を満たすか判別）し、１重化可能と判明した場合に、多重ループ内の配列の次元を同一および配列の大きさを同一にして複写し、この複写した新規の配列をもとの配列と置換して１重化可能にし、更に他の多重ループに回転数が同一のものがあればその中に移動してまとめて最適化を行うことが可能となる。これらにより、従来は多重ループの最適化が不可能な図９の（ｃ）、（ｄ）のような配列の次元が異なるおよび配列の大きさが異なる場合でも多重ループを１重化し、高速演算を実現することが可能となる。以下順次詳細に説明する。
【００３８】
図３は、本発明の概念説明図を示す。これは、図２で説明した多重ループを１重化するときの概念を模式的に示したものである。
図３の（ａ）は、処理対象を示す。ここでは、後述する図５の（ａ）のソースプログラム中の▲１▼の最適化制御行に続く多重ループ
0003657414.tif 000004
を模式的に表示したものである。Ａ（Ｉ，Ｊ）が左端を表し、Ｂ（Ｉ，Ｊ）が中央を表し、右端がＣ（Ｉ）を表す。
【００３９】
図３の（ｂ）は、複写を示す。これは、既述した図２のＳ４ないしＳ７の前段で複写した様子を示す。即ち、図３の（ａ）のもとのＣ（Ｉ）について、配列の次元数と配列の大きさをともに、定義された配列Ａ（Ｉ，Ｊ）、Ｂ（Ｉ，Ｊ）の次元数Ｉ＝１００、大きさＪ＝１００と同一にしてマスクをかけて複写した様子を示す。
【００４０】
図３の（ｃ）は、置換した様子を示す。これは、図３の（ｂ）で複写した配列で元の配列を置換した後の様子を示す。
図３の（ｄ）は、図３の（ｃ）の配列をそれぞれ展開した様子を示す。
【００４１】
図３の（ｅ）は、図３の（ｄ）の展開した後のベクトルを演算（Ａ＝Ｂ＊Ｃ）した演算結果の様子を示す。
以上のように、図５の（ａ）のソースプログラム中で▲１▼の最適化制御行を指定すると、自動的に多重ループ中の配列を図３の（ａ）に示すように取り出し、次元および大きさの異なる配列を同一の次元および大きさに複写し元の配列と置換し、これを展開して演算処理することにより、多重ループを１重化して高速化を図ることが可能となる。
【００４２】
図４は、本発明の複写処理フローチャートを示す。これは、既述した図２のＳ４ないしＳ７の複写処理の詳細フローチャートである。
図４において、Ｓ１１は、次元が同じか判別する。ＹＥＳの場合には、Ｓ１３に進む。ＮＯの場合には、次元を同じにし、Ｓ１３に進む。
【００４３】
Ｓ１３は、大きが違うか、または処理対象が大きいか判別する。これは、定義された配列の大きさと、処理対象の配列の大きさとを比較し、大きさが違うか、または処理対象が大きいが判別する。ＹＥＳの場合には、Ｓ１５に進む。ＮＯの場合には、Ｓ１４で処理対象の配列の大きさを定義した配列の大きさと同じにし、Ｓ１５に進む。
【００４４】
Ｓ１５は、複写する。これは、既述した図３の（ｂ）に示すように、図３の（ａ）のＣ（Ｉ）について、他の配列（Ａ（Ｉ，Ｊ）、Ｂ（Ｉ，Ｊ））と次元数と大きさを同一にして複写する（この際、元の配列の大きさでマスクして新たな配列に複写する）。
【００４５】
以上によって、定義された配列の次元数、配列の大きさと、処理対象の配列の次元数、配列の大きさとを比較し、次元数を同一、処理対象の配列の大きさが定義した配列の大きさよりも小さいときに同一にし、元の大きさでマスクをかけて複写を行うことが可能となる。これにより、多重ループ内の配列の次元数、大きさが異なっても同一にし複写した後に置換し、多重ループを１重化可能にすることができる。
【００４６】
図５は、本発明の説明図（その１）を示す。
図５の（ａ）は、ソースプログラムの例を示す。これは、ソースプログラム１の例であって、１行目および２行目が配列Ａ、Ｂ、Ｃの定義を示す。
【００４７】
▲１▼の行が、既述した最適化制御行の指示である。それに続く５行が多重ループである。
▲２▼のＣ（Ｉ）が、多重ループ内で配列の大きさが異なるものである。この▲２▼のＣ（Ｉ）について、既述した図４のフローチャートに従い、複写すると図３の（ｂ）に示すようになる。
【００４８】
図５の（ｂ）は、図５の（ａ）の多重ループを１重化した後のソースプログラムの例を示す。ここでは、処理対象の多重ループの直前に新規の多重ループを作成する。ループの回転数は次元数が異なる場合は元の多重ループの回転数とし、配列の大きさが異なる場合は元の多重ループ内で定義された配列の大きさとする（▲３▼の部分）。
【００４９】
また、▲４▼の部分は、コンパイラが生成する内部領域ＳＶＴに、次元不一致の配列を同一（次元および大きさを同一）にして複写したものである（図４のフローチャートに従い、図３の（ｂ）のように複写したものである）。
【００５０】
図６は、本発明の説明図（その２）を示す。
図６の（ａ）は、多重ループ内の配列Ｃの宣言の大きさが配列Ａと異なるため１重化できないソースプログラムの例を示す。
【００５１】
図６の（ｂ）は、図６の（ａ）の多重ループを１重化可能にしたソースプログラムの例を示す。
▲５▼の部分は、図６の（ａ）の配列Ｃの大きさが配列Ａと異なるため、複写時にもとの回転数でマスクをかけることで配列Ｃの領域外アクセスを防いだものである。
【００５２】
・２行目と３行目は、配列Ａの宣言の大きさが、ここでは回転数と図示のようにしたものである。
・下段の３行は、全ての配列で同じ宣言形状になったので、１重化可能になったものである。
【００５３】
図７は、本発明の説明図（その３）を示す。
図７の（ａ）は、次元の異なる配列を含む中間言の例を示す。中間言の各行の内容を右側に記載する。これは、既述した図５の（ｂ）のソースプログラムの中間言のイメージ例である。
【００５４】
図７の（ｂ）は、図７の（ａ）の次元の異なる配列を含む中間言について１重化した後の中間言の例を示す。図中に各行の内容を右側に記載する。
同様に、大きさが異なる配列を含む多重ループの場合についても同じようにして中間言で表現できる。
【００５５】
図８は、本発明の説明図（その４）を示す。これは、配列の次元数および大きさが異なる以外の１重化が可能となるための条件であって、条件１を満たし、かつ条件２を満たすあるいは条件３を満たす場合に、１重化可能と判断する条件である（既述した図２のＳ３の図８の条件に対応する）。
【００５６】
条件１：
・ループ構造及びループの添字が１重化可能か
・配列の添字が１重化可能か
条件２：
・次元の数が異なる配列は多重ループ内で定義されていないか
・次元の数が異なる配列の添字は対象多重ループのｄｏ変数か
条件３：
・宣言の大きさが異なる配列は多重ループ内で定義されていないか
・宣言の大きさが異なる配列の添字は対象多重ループのｄｏ変数か
【００５７】
【発明の効果】
以上説明したように、本発明によれば、処理対象の多重ループ内で次元の異なる配列や宣言の大きさの異なる配列があっても同一の次元および大きさに複写した後に少ないループ数に展開し高速演算を行う構成を採用しているため、演算対象ループ内で異なる次元や大きさを持つ配列が含まれていても少ないループ数（例えば１重化）にして配列の高速演算を実現できる。
【図面の簡単な説明】
【図１】本発明のシステム構成図である。
【図２】本発明の動作説明フローチャートである。
【図３】本発明の概念説明図である。
【図４】本発明の複写処理フローチャートである。
【図５】本発明の説明図（その１）である。
【図６】本発明の説明図（その２）である。
【図７】本発明の説明図（その３）である。
【図８】本発明の説明図（その４）である。
【図９】従来技術の説明図である。
【符号の説明】
１：ソースプログラム
２：コンパイラ
３：ソースプログラム解析手段
４：ベクトル化手段
５：次元不一致配列検出手段
６：次元不一致配列複写手段
７：複写ループ最適化手段
８：通常のベクトル化実施手段
９：オブジェクト生成手段
１０：オブジェクトプログラム
【図１】
0003657414.tif 000005
【図２】
0003657414.tif 000006
【図３】
0003657414.tif 000007
【図４】
0003657414.tif 000008
【図５】
0003657414.tif 000009
【図６】
0003657414.tif 000010
【図７】
0003657414.tif 000011
【図８】
0003657414.tif 000012
【図９】
0003657414.tif 000013