(57)【特許請求の範囲】
【請求項１】
ソースプログラムをコンパイルするコンパイル処理方法において、
コンピュータを検出手段として機能させて、ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列の値であるデータが０である場合に実行を省略できる演算を持つものを検出する過程と、
前記コンピュータを判断手段として機能させて、上記検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列の値であるデータがループの回転により値の更新されないデータであるのかを判断する過程と、
前記コンピュータを挿入手段として機能させて、上記値の更新されないデータであることを判断した最内ループ文の直前に、疎行列の値であるデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する過程と、
前記コンピュータを並列化手段として機能させて、上記命令文を挿入した多重ループ文のうちの前記最内ループ分よりも外側のループ分について１回転毎にループを分割し、前記ソースプログラムをコンパイルして得られるプログラムを実行する複数の処理装置の各処理装置に、分割された各ループを割り当てて、前記各処理装置に割り当てた各ループの命令を実行させるようにサイクリック方式の形で並列化する過程とを備えることを、
特徴とするコンパイル処理方法。
【請求項２】
請求項１に記載のコンパイル処理方法において、
上記検出する過程では、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列の値であるデータが０である場合に実行を省略できる演算を持つものを検出し、
上記判断する過程では、上記検出した１重ループ文について、その１重ループ文の持つ演算の疎行列の値であるデータがループの回転により値の更新されないデータであるのかを判断し、
上記挿入する過程では、上記値の更新されないデータであることを判断した１重ループ文の直前に、疎行列の値であるデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、
上記並列化する過程では、上記命令文を挿入した１重ループ文を１回転毎にループを分割して複数の処理装置に周期的に命令を実行させるようにサイクリック方式の形で並列化することを、
特徴とするコンパイル処理方法。
【請求項３】
ソースプログラムをコンパイルするコンピュータによるコンパイル処理装置において、
ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列の値であるデータが０である場合に実行を省略できる演算を持つものを検出する検出手段と、
上記検出手段が検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列の値であるデータがループの回転により値の更新されないデータであるのかを判断する判断手段と、
上記判断手段が値の更新されないデータであることを判断した最内ループ文の直前に、疎行列の値であるデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する挿入手段と、
上記挿入手段が命令文を挿入した多重ループ文のうちの前記最内ループ分よりも外側のループ分について１回転毎にループを分割し、前記ソースプログラムをコンパイルして得られるプログラムを実行する複数の処理装置の各処理装置に、分割された各ループを割り当てて、前記各処理装置に割り当てた各ループの命令を実行させるようにサイクリック方式の形で並列化する並列化手段とを備えることを、
特徴とするコンパイル処理装置。
【請求項４】
請求項３に記載のコンパイル処理装置において、
上記検出手段は、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列の値であるデータが０である場合に実行を省略できる演算を持つものを検出し、
上記判断手段は、上記検出手段が検出した１重ループ文について、その１重ループ文の持つ演算の疎行列の値であるデータがループの回転により値の更新されないデータであるのかを判断し、
上記挿入手段は、上記判断手段が値の更新されないデータであることを判断した１重ループ文の直前に、疎行列の値であるデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、
上記並列化手段は、上記挿入手段が命令文を挿入した１重ループ文を１回転毎にループを分割して複数の処理装置に周期的に命令を実行させるようにサイクリック方式の形で並列化することを、
特徴とするコンパイル処理装置。
【請求項５】
ソースプログラムをコンパイルするコンパイル処理プログラムにおいて、
コンピュータを、
ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列の値であるデータが０である場合に実行を省略できる演算を持つものを検出する処理を行う検出手段と、
上記検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列の値であるデータがループの回転により値の更新されないデータであるのかを判断する処理を行う判断手段と、
上記値の更新されないデータであることを判断した最内ループ文の直前に、疎行列の値であるデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する処理を行う挿入手段と、
上記命令文を挿入した多重ループ文のうちの前記最内ループ分よりも外側のループ分について１回転毎にループを分割し、前記ソースプログラムをコンパイルして得られるプログラムを実行する複数の処理装置の各処理装置に、分割された各ループを割り当てて、前記各処理装置に割り当てた各ループの命令を実行させるようにサイクリック方式の形で並列化する並列化手段と
して機能させるためのコンパイル処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムをコンパイルするコンパイル処理方法及びその装置と、そのコンパイル処理方法の実現に用いられるコンパイル処理プログラムとに関し、特に、ソースプログラムが疎行列の演算を実行するループを持つ場合に、その実行時間を短縮できるようにするコンパイル処理方法及びその装置と、そのコンパイル処理方法の実現に用いられるコンパイル処理プログラムとに関する。
【背景技術】
【０００２】
従来技術では、ソースプログラムが疎行列（０を多く持つ行列）の演算を実行するループを持つ場合に、実行不要な演算があるにもかかわらず、それを実行していることから実行時間が長くなるという問題がある。
【０００３】
例えば、
ＤＯ  Ｊ＝１，Ｎ
ＤＯ  Ｉ＝１，Ｍ
Ａ（Ｉ，Ｊ）＝Ａ（Ｉ，Ｊ）＋Ｂ（Ｊ）＊Ｃ
ＥＮＤＤＯ
ＥＮＤＤＯ
という行列Ｂの演算を実行する２重ループでは、図７に示すように、内側ループをＭ回実行することになる。
【０００４】
この場合に、従来技術では、行列Ｂが疎行列であるのか否かを考慮しないで、そのまま内側ループをＭ回実行するようにしている。しかるに、Ｂ（Ｊ）の値が０である場合、内側ループの演算結果は“Ａ（Ｉ，Ｊ）”となり、内側ループは演算不要ということを意味する。
【０００５】
行列Ｂが疎行列である場合、Ｂ（Ｊ）の値は０である場合が多い。これから、従来技術のように、行列Ｂが疎行列であるのか否かを考慮しないで、そのまま内側ループをＭ回実行するようにしていると、演算不要な場合が多いにも関わらず内側ループを実行することになることから、その実行時間が長くなるという問題があるのである。
【０００６】
この問題は、上述の２重ループを単純に並列化しても解決できない問題である。
【０００７】
すなわち、通常、このような多重ループは一番外側の次元で並列化されることになるので、このループを２つのＣＰＵ１，２の並列プロセッサ向けに並列化すると、ＣＰＵ１とＣＰＵ２とでは、それぞれ図８に示すようなループが実行されることになる。
【０００８】
このように並列化した場合の実行時間は、ｎ並列で実行した場合、
ＭＡＸ（ＣＰＵ１の実行時間 ,ＣＰＵ２の実行時間 ,・・ ,ＣＰＵｎの実行時間）
で求めることができる。
【０００９】
これから、内側ループの実行時間をＴとすると、上述の２重ループの実行時間は、
並列化しない場合  ：  Ｔ＊Ｎ
並列化する場合    ：  Ｔ＊（Ｎ／２）
となる。
【００１０】
このように、ソースプログラムが２重ループなどのような多重ループを持つ場合には、それを並列化することで実行時間を大幅に短縮できるようになる。
【００１１】
しかしながら、このような並列化を行っても、個々のＣＰＵでは演算不要な場合が多いにも関わらずそのまま内側ループを実行するということに変わりはなく、これから、実行時間が長くなるという問題は解決できないことになる。
【００１２】
ここで、本発明に関連する従来技術として、下記に示す特許文献１，２がある。
【００１３】
この特許文献１に記載された発明では、大部分の行列要素が０であるという特性をもつスパース行列（疎行列）の行列演算を実行する場合に、前処理でスパース行列の演算過程で現れる全ての非零要素位置を検出してビットマップを作成し、このビットマップが示す行列要素位置のみを計算して無駄のない反復行列求解を行うようにしている。
【００１４】
また、特許文献２に記載された発明では、複数のタスクを複数のプロセッサ上で並行して実行することで手続内ループの実行速度の向上を図るときにあって、割り当てられたループの実行を終えたプロセッサが未処理のループの実行を行うようにすることで、その実行速度の向上を一層確かなものにするようにしている。
【特許文献１】特開昭６０−２４７７８２号公報
【特許文献２】特開平３−２１８５５６号公報
【発明の開示】
【発明が解決しようとする課題】
【００１５】
上述したように、従来技術では、ソースプログラムが疎行列の演算を実行するループを持つ場合に、実行不要な演算が含まれているものの、そのようなことを考えずに、そのままソースプログラムをコンパイルするようにしている。
【００１６】
これから、従来技術に従っていると、ソースプログラムが疎行列の演算を実行するループを持つ場合に、実行不要な演算があるにもかかわらず、それを実行していることから実行時間が長くなるという問題がある。
【００１７】
本発明はかかる事情に鑑みてなされたものであって、ソースプログラムをコンパイルするときにあって、ソースプログラムが疎行列の演算を実行するループを持つ場合に、その実行時間を短縮できるようにする新たなコンパイル処理技術の提供を目的とする。
【課題を解決するための手段】
【００１８】
この目的を達成するために、本発明のコンパイル処理装置は、（１）ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出する検出手段と、（２）検出手段が検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断する判断手段と、（３）判断手段が値の更新されないデータであることを判断した最内ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する挿入手段と、（４）挿入手段が命令文を挿入した多重ループ文をサイクリック方式の形で並列化する並列化手段とを備えるように構成する。
【００１９】
このように構成されるときにあって、検出手段は、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出することがある。
【００２０】
この場合には、判断手段は、検出手段が検出した１重ループ文について、その１重ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断し、挿入手段は、判断手段が値の更新されないデータであることを判断した１重ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、並列化手段は、挿入手段が命令文を挿入した１重ループ文をサイクリック方式の形で並列化するように処理する。
【００２１】
以上の各処理手段が動作することで実現される本発明のコンパイル処理方法はコンピュータプログラムでも実現できるものであり、このコンピュータプログラムは、適当なコンピュータ読み取り可能な記録媒体に記録して提供されたり、ネットワークを介して提供され、本発明を実施する際にインストールされてＣＰＵなどの制御手段上で動作することにより本発明を実現することになる。
【００２２】
このように構成される本発明のコンパイル処理装置では、ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出すると、その検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断する。
【００２３】
続いて、その値の更新されないデータであることを判断した最内ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入して、その命令文を挿入した多重ループ文をサイクリック方式の形で並列化する。
【００２４】
このようにして、本発明のコンパイル処理装置では、
ＤＯ  Ｊ＝１，Ｎ
ＤＯ  Ｉ＝１，Ｍ
Ａ（Ｉ，Ｊ）＝Ａ（Ｉ，Ｊ）＋Ｂ（Ｊ）＊Ｃ
ＥＮＤＤＯ
ＥＮＤＤＯ
という疎行列Ｂの演算を実行する２重ループ文で説明するならば、図１（ａ）に示すように、疎行列ＢのデータＢ（Ｊ）が０である場合には内側ループ文の実行を省略でき、かつ、このデータＢ（Ｊ）が内側ループの回転により値が更新されないので、この内側ループ文の直前に、Ｂ（Ｊ）の値が０であるのかを検査して、０である場合には内側ループ文を実行しないようにするという命令文（図中に示す＊部分の命令文）を挿入するという構成を採る。
【００２５】
このように、本発明のコンパイル処理装置では、ソースプログラムに対して不要な演算の実行を省略可能にする命令文を挿入することで不要な演算を実行しないで済むようにし、これにより実行時間の短縮を図るようにするという構成を採るものである。
【００２６】
しかるに、図１（ｂ）に示すように、
ＤＯ  Ｉ＝１，Ｍ
Ａ（Ｉ）＝Ａ（Ｉ）＋Ｂ（Ｉ）＊Ｃ
ＥＮＤＤＯ
という１重ループ文に上記の命令文（図中に示す＊部分の命令文：不要な演算の実行を省略可能にする命令文）を挿入すると、Ｂ（Ｉ）の値が０であるかどうかに関わらずに、ループが１回転する毎に、この命令文を実行しなければならないことから、Ｂ（Ｉ）の値がほとんど０であっても、この命令文を実行することによるオーバヘッドにより実行時間を短縮することが難しくなる。
【００２７】
これから、本発明のコンパイル処理装置では、１重ループ文については原則として上記の命令文を挿入しないことになるが、図１（ｃ）に示すように、１重ループ文ではあるものの、そのループ内で演算データがスカラーデータであることにより不変である場合には、上述した多重ループ文の最内ループ文と同様に、上記の命令文をループの外に出せることで、その命令文の前の演算（図中の：で表した部分）に紛れて実行できることになることから、その命令文（図中に示す＊部分の命令文）を実行することによるオーバヘッドを意識する必要はない。
【００２８】
そこで、本発明のコンパイル処理装置では、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出すると、その検出した１重ループ文について、その１重ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断し、その値の更新されないデータであることを判断した１重ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、その命令文を挿入した１重ループ文をサイクリック方式の形で並列化するようにしている。
【００２９】
一方、ソースプログラムが多重ループを持つ場合には、それを並列化することで実行時間を大幅に短縮できるようになる。
【００３０】
例えば、
ＤＯ  Ｊ＝１，Ｎ
ＤＯ  Ｉ＝１，Ｍ
Ａ（Ｉ，Ｊ）＝Ａ（Ｉ，Ｊ）＋Ｂ（Ｊ）＊Ｃ
ＥＮＤＤＯ
ＥＮＤＤＯ
という疎行列Ｂの演算を実行する２重ループについて、２つのＣＰＵ１，２の並列プロセッサ向けに並列化すると、図８に示すようなループが実行されることになり、上述したように、ＣＰＵ台数に応じて実行時間を大幅に短縮できるようになる。
【００３１】
しかしながら、例えば、疎行列ＢのデータＢ（Ｊ）の値の内、前半の値は全て０で、後半の値は全て０以外であったとすると、ＣＰＵ２では内側ループの演算を“Ｎ／２”回実行しなければならないのに対して、ＣＰＵ１では内側ループの演算を全く実行しなくてもよいことになる。
【００３２】
この場合、図７に示すような通常の方式（均等に分割して並列化する方式）で並列化を行っていると、その実行時間は、一番長いＣＰＵ実行時間により決められることになるので、内側ループの実行時間をＴとすると、その実行時間は“Ｔ＊（Ｎ／２）”となり、結局のところＣＰＵ台数に基づく効果でしか実行時間を短縮できないことになる。
【００３３】
そこで、本発明のコンパイル処理装置では、多重ループ文や１重ループ文を並列化する場合に、疎行列の０の出現位置が偏ることがある場合を考慮して、それらのループ文をサイクリック方式の形で並列化するようにしている。
【００３４】
このサイクリック方式の並列化では、２つのＣＰＵ１，２の並列プロセッサ向けに並列化する場合には、例えば、Ｊ＝１，３，５，・・・についてはＣＰＵ１で実行し、Ｊ＝２，４，６，・・・についてはＣＰＵ２で実行するというように、１回転毎にループを分割して他方のＣＰＵに実行させるという構成を採る。
【００３５】
これから、疎行列ＢのデータＢ（Ｊ）の値の内、前半の値は全て０で、後半の値は全て０以外であったとすると、ＣＰＵ１とＣＰＵ２とで平均してループの実行を行えるようになることから、内側ループの実行時間をＴとすると、その実行時間は“Ｔ＊（Ｎ／２）＊（１／２）”となり、図８に示すような通常の方式で並列化を行うのに比べて、その実行時間を短縮できることになる。
【００３６】
なお、疎行列の０の出現位置が偏らない場合には、通常の方式で並列化を行う場合の実行時間と、サイクリック方式で並列化を行う場合の実行時間とに差はなく、したがって、サイクリック方式で並列化を行うことによる不利益は生じないない。
【発明の効果】
【００３７】
以上説明したように、本発明よれば、ソースプログラムをコンパイルするときにあって、ソースプログラムが疎行列の演算を実行するループを持つ場合に、その実行時間を大幅に短縮できるようになる。
【発明を実施するための最良の形態】
【００３８】
以下、実施の形態に従って本発明を詳細に説明する。
【００３９】
図２に、本発明を具備するコンパイル処理装置１の一実施形態例を図示する。
【００４０】
この図に示すように、本発明のコンパイル処理装置１は、ソースプログラム２をコンパイルすることでオブジェクトプログラム３を生成するために、ソースプログラム２を入力するプログラム入力部１０と、プログラム入力部１０の入力したソースプログラム２の最適化処理を実行する最適化処理部１１と、最適化処理部１１の最適化処理結果に基づいてオブジェクトプログラム３を生成するオブジェクト生成部１２とを備える。
【００４１】
最適化処理部１１は、本発明を実現するために、検出部１１０と、判断部１１１と、挿入部１１２と、並列化部１１３とを備える。
【００４２】
この検出部１１０は、ソースプログラム２に記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出したり、ソースプログラム２に記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出するという処理を行う。
【００４３】
判断部１１１は、検出部１１０が検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断したり、検出部１１０が検出した１重ループ文について、その１重ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断するという処理を行う。
【００４４】
挿入部１１２は、判断部１１１が値の更新されないデータであることを判断した最内ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入したり、判断部１１１が値の更新されないデータであることを判断した１重ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入するという処理を行う。
【００４５】
並列化部１１３は、挿入部１１２が命令文を挿入した多重ループ文を図３に示すような形態であるサイクリック方式の形で並列化したり、挿入部１１２が命令文を挿入した１重ループ文を図３に示すような形態であるサイクリック方式の形で並列化するという処理を行う。
【００４６】
ここで、ソースプログラム２に記述される行列の中に含まれる行列（配列）の内、どれが疎行列であり、どれが疎行列でないということについては、例えば、ソースプログラム２に記述される情報に従って取得したり、プログラマからの入力情報に従って取得することになる。
【００４７】
図４及び図５に、最適化処理部１１が本発明を実現するために実行する処理フローの一実施形態例を図示する。
【００４８】
次に、この処理フローに従って、本発明により実現されるコンパイル最適化処理について説明する。
【００４９】
最適化処理部１１は、ソースプログラム２を受け取ると、本発明を実現するために、図４及び図５の処理フローに示すように、先ず最初に、ステップ１０で、ソースプログラム２に未処理のループ文が残っているのか否かを判断して、未処理のループ文が残っていることを判断するときには、ステップ１１に進んで、ソースプログラム２に記述される未処理のループ文を１つ選択する。
【００５０】
続いて、ステップ１２で、その選択したループ文が多重ループ文であるのか１重ループ文であるのかを判断して、多重ループ文であることを判断するときには、ステップ１３に進んで、その多重ループ文の最内ループ文内に、疎行列Ｂについての演算である
Ａ＝Ａ＋Ｂ＊Ｃ，Ａ＝Ａ−Ｂ＊Ｃ，Ａ＝Ａ＋Ｂ／Ｃ，Ａ＝Ａ−Ｂ／Ｃ
という演算パターンがあるのかを調べる。
【００５１】
ここで、これらの演算パターンは、疎行列Ｂのデータが０である場合に、その実行を省略できる演算パターンを示している。
【００５２】
したがって、このステップ１３では、選択した多重ループ文の最内ループ文に、疎行列Ｂを含み、かつ、その疎行列Ｂのデータが０である場合に実行を省略できる演算が含まれているのかを調べるのである。
【００５３】
続いて、ステップ１４で、ステップ１３のチェック処理に従って、選択した多重ループ文の最内ループ文に上述の演算パターンが存在しないことを判断するときには、実行を省略できる演算が含まれていないので、次のループ文を処理すべくステップ１０に戻る。
【００５４】
一方、ステップ１４で上述の演算パターンが存在することを判断するときには、ステップ１５に進んで、最内ループ文に記述される疎行列Ｂに該当する演算データは、最内ループが回転しても値が更新されない不変のデータ（ベクトルデータ）であるのかを調べる。
【００５５】
続いて、ステップ１６で、ステップ１５のチェック処理に従って、最内ループ文に記述される疎行列Ｂに該当する演算データが不変のデータでないことを判断するときには、ステップ１７で説明する命令文を挿入すると、いちいちその命令文を実行しなければならないことにより実行時間がかえって長くなることを考慮して、次のループ文を処理すべくステップ１０に戻る。
【００５６】
一方、ステップ１６で不変のデータであることを判断するときには、ステップ１７に進んで、最内ループ文の直前に、演算データの値が０であるのかを検査して、０である場合には、最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する。
【００５７】
すなわち、図６中の＊１で示すように、
ＩＦ（Ｂ（ｋ−１）．ＥＱ  ．０）  ＧＯＴＯ  １０
という命令文を挿入したり、図６中の＊２で示すように、
ＩＦ（Ｂ（ｋ）．ＥＱ  ．０）  ＧＯＴＯ  ２０
という命令文を挿入するのである。
【００５８】
続いて、ステップ１８で、ステップ１１で選択した多重ループのループ文（ステップ１７の処理に従って命令文が挿入されている）をサイクリック方式で並列化してから、次のループ文を処理すべくステップ１０に戻る。
【００５９】
一方、ステップ１２で、選択したループ文が１重ループ文であることを判断するときには、ステップ１９に進んで、その１重ループ文内に、疎行列Ｂについての演算である
Ａ＝Ａ＋Ｂ＊Ｃ，Ａ＝Ａ−Ｂ＊Ｃ，Ａ＝Ａ＋Ｂ／Ｃ，Ａ＝Ａ−Ｂ／Ｃ
という演算パターンがあるのかを調べる。
【００６０】
ここで、これらの演算パターンは、疎行列Ｂのデータが０である場合に、その実行を省略できる演算パターンを示している。
【００６１】
したがって、このステップ１９では、選択した１重ループ文に、疎行列Ｂを含み、かつ、その疎行列Ｂのデータが０である場合に実行を省略できる演算が含まれているのかを調べるのである。
【００６２】
続いて、ステップ２０で、ステップ１９のチェック処理に従って、選択した１重ループ文に上述の演算パターンが存在しないことを判断するときには、実行を省略できる演算が含まれていないので、次のループ文を処理すべくステップ１０に戻る。
【００６３】
一方、ステップ２０で上述の演算パターンが存在することを判断するときには、ステップ２１に進んで、１重ループ文に記述される疎行列Ｂに該当する演算データは、１重ループが回転しても値が更新されない不変のデータ（スカラデータ）であるのかを調べる。
【００６４】
続いて、ステップ２２で、ステップ２１のチェック処理に従って、１重ループ文に記述される疎行列Ｂに該当する演算データが不変のデータでないことを判断するときには、ステップ２３で説明する命令文を挿入すると、いちいちその命令文を実行しなければならないことにより実行時間がかえって長くなることを考慮して、次のループ文を処理すべくステップ１０に戻る。
【００６５】
一方、ステップ２２で不変のデータであることを判断するときには、ステップ２３に進んで、１重ループ文の直前に、演算データの値が０であるのかを検査して、０である場合には、１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する。
【００６６】
続いて、ステップ２４で、ステップ１１で選択した１重ループのループ文（ステップ２３の処理に従って命令文が挿入されている）をサイクリック方式で並列化してから、次のループ文を処理すべくステップ１０に戻る。
【００６７】
このようにして、ステップ１０〜ステップ２４の処理を繰り返していくことで、ステップ１０で、ソースプログラム２に記述される全てのループ文を処理したことを判断すると、本発明によるコンパイルの最適化処理を終了する。
【００６８】
以上に説明したように、本発明のコンパイル処理装置１は、疎行列の性質を考慮して、ソースプログラム２に対して不要な演算の実行を省略可能にする命令文を挿入することで不要な演算を実行しないで済むようにし、これにより実行時間の短縮を実現するのである。
【００６９】
そして、本発明のコンパイル処理装置１は、この命令文を挿入したソースプログラム２を並列化することで実行時間の短縮を図るときに、疎行列の０の出現位置に偏りがあるような場合に、その実行時間の短縮を図れないことが起こることを考慮して、通常の均等に分割する方式に基づいた並列化を行うのではなくて、サイクリック方式に基づいた並列化を行うようにし、これにより並列化で実行時間の短縮を図るときに、その実行時間の短縮をより大きなものとすることを実現するのである。
【００７０】
（付記１）ソースプログラムをコンパイルするコンパイル処理方法において、ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出する過程と、上記検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断する過程と、上記値の更新されないデータであることを判断した最内ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する過程と、上記命令文を挿入した多重ループ文をサイクリック方式の形で並列化する過程とを備えることを、特徴とするコンパイル処理方法。
【００７１】
（付記２）付記１に記載のコンパイル処理方法において、上記検出する過程では、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出し、上記判断する過程では、上記検出した１重ループ文について、その１重ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断し、上記挿入する過程では、上記値の更新されないデータであることを判断した１重ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、上記並列化する過程では、上記命令文を挿入した１重ループ文をサイクリック方式の形で並列化することを、特徴とするコンパイル処理方法。
【００７２】
（付記３）ソースプログラムをコンパイルするコンパイル処理装置において、ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出する検出手段と、上記検出手段が検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断する判断手段と、上記判断手段が値の更新されないデータであることを判断した最内ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する挿入手段と、上記挿入手段が命令文を挿入した多重ループ文をサイクリック方式の形で並列化する並列化手段とを備えることを、特徴とするコンパイル処理装置。
【００７３】
（付記４）付記３に記載のコンパイル処理装置において、上記検出手段は、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出し、上記判断手段は、上記検出手段が検出した１重ループ文について、その１重ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断し、上記挿入手段は、上記判断手段が値の更新されないデータであることを判断した１重ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、上記並列化手段は、上記挿入手段が命令文を挿入した１重ループ文をサイクリック方式の形で並列化することを、特徴とするコンパイル処理装置。
【００７４】
（付記５）ソースプログラムをコンパイルするコンパイル処理プログラムにおいて、ソースプログラムに記述される多重ループ文について、その多重ループ文の最内ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出する処理と、上記検出した多重ループ文の最内ループ文について、その最内ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断する処理と、上記値の更新されないデータであることを判断した最内ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には最内ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入する処理と、上記命令文を挿入した多重ループ文をサイクリック方式の形で並列化する処理とをコンピュータに実行させるためのコンパイル処理プログラム。
【００７５】
（付記６）付記５に記載のコンパイル処理プログラムにおいて、上記検出する処理では、ソースプログラムに記述される１重ループ文について、その１重ループ文に、疎行列を含み、かつ、その疎行列のデータが０である場合に実行を省略できる演算を持つものを検出し、上記判断する処理では、上記検出した１重ループ文について、その１重ループ文の持つ演算の疎行列のデータがループの回転により値の更新されないデータであるのかを判断し、上記挿入する処理では、上記値の更新されないデータであることを判断した１重ループ文の直前に、疎行列のデータが０であるのかを検査して、０である場合には１重ループ文内の演算を行わずに次の回転に進むことを指示する命令文を挿入し、上記並列化する処理では、上記命令文を挿入した１重ループ文をサイクリック方式の形で並列化することを、特徴とするコンパイル処理プログラム。
【図面の簡単な説明】
【００７６】
【図１】本発明の説明するためのソースプログラムの説明図である。
【図２】本発明のコンパイル処理装置の一実施形態例である。
【図３】サイクリック方式による並列化の説明図である。
【図４】最適化処理部の実行する処理フローの一実施形態例である。
【図５】最適化処理部の実行する処理フローの一実施形態例である。
【図６】本発明による命令文挿入の説明図である。
【図７】従来技術を説明するためのソースプログラムの説明図である。
【図８】従来技術を説明するためのソースプログラムの説明図である。
【符号の説明】
【００７７】
１      コンパイル処理装置
２      ソースプログラム
３      オブジェクトプログラム
１０    プログラム入力部
１１    最適化処理部
１２    オブジェクト生成部
１１０  検出部
１１１  判断部
１１２  挿入部
１１３  並列化部
【図１】
0004819442.tif 000002
【図２】
0004819442.tif 000003
【図３】
0004819442.tif 000004
【図４】
0004819442.tif 000005
【図５】
0004819442.tif 000006
【図６】
0004819442.tif 000007
【図７】
0004819442.tif 000008
【図８】
0004819442.tif 000009