(57)【特許請求の範囲】
【請求項１】
オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なうプログラム処理装置であって、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動部と、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当部と、
を具備することを特徴とするプログラム処理装置。
【請求項２】
前記代入文移動部に投入する前のプログラム中に含まれる、比較式をｃ、代入対象をｖ、ｔｈｅｎ節でｖに代入される値をｔ、ｅｌｓｅ節で代入される値をｆとしたｉｆ文を、ｔとｃのビット毎の論理積をとるとともに、ｆとｃのビット毎の論理否定との論理積をとり、これら論理積の論理輪をとった値をｖに代入する式に変換することによって、プログラムを前記代入文移動部に投入する前にプログラム中のｉｆ文をなくすｉｆ変換部をさらに備える、
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項３】
前記代入文移動部は、移動元の文の位置ｓから移動先の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合以外は、当該文の移動を許容しない、
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項４】
前記代入文移動部によって並列実行する演算子を用いて１つにまとめられた代入文を前記一斉処理命令の実行におけるオペランドの使用の制約に従って書き換える制約適用部をさらに備える、
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項５】
前記サブオペランド割当部は、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数を越える場合には、前記一斉処理命令１つで処理できる個数の代入文を取り出して、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項６】
前記サブオペランド割当部は、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数以下の場合には、ダミーの代入文を付け加えてちょうど前記一斉処理命令１つで処理できる個数になるようにして、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項７】
前記サブオペランド割当部は、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数以下の場合には、代入文を該並列式から外して前記一斉処理命令への置き換えを諦める、
ことを特徴とする請求項１に記載のプログラム処理装置。
【請求項８】
コンピュータを用いて構築されるプログラム処理システム上において、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なうプログラム処理方法であって、
前記コンピュータが備える代入文移動手段が、プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動ステップと、
前記コンピュータが備えるサブオペランド割当手段が、該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当ステップと、
を具備することを特徴とするプログラム処理方法。
【請求項９】
前記コンピュータが備えるｉｆ変換手段が、前記代入文移動部に投入する前のプログラム中に含まれる、比較式をｃ、代入対象をｖ、ｔｈｅｎ節でｖに代入される値をｔ、ｅｌｓｅ節で代入される値をｆとしたｉｆ文を、ｔとｃのビット毎の論理積をとるとともに、ｆとｃのビット毎の論理否定との論理積をとり、これら論理積の論理輪をとった値をｖに代入する式に変換することによって、プログラムを前記代入文移動部に投入する前にプログラム中のｉｆ文をなくすｉｆ変換ステップをさらに備える、
ことを特徴とする請求項８に記載のプログラム処理方法。
【請求項１０】
前記代入文移動ステップでは、移動元の文の位置ｓから移動先の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合以外は、当該文の移動を許容しない、
ことを特徴とする請求項８に記載のプログラム処理方法。
【請求項１１】
前記コンピュータが備える制約適用手段が、前記代入文移動ステップによって並列実行する演算子を用いて１つにまとめられた代入文を前記一斉処理命令の実行におけるオペランドの使用の制約に従って書き換える制約適用ステップをさらに備える、
ことを特徴とする請求項８に記載のプログラム処理方法。
【請求項１２】
前記サブオペランド割当ステップでは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数を越える場合には、前記一斉処理命令１つで処理できる個数の代入文を取り出して、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
ことを特徴とする請求項８に記載のプログラム処理方法。
【請求項１３】
前記サブオペランド割当ステップでは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数以下の場合には、ダミーの代入文を付け加えてちょうど前記一斉処理命令１つで処理できる個数になるようにして、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
ことを特徴とする請求項８に記載のプログラム処理方法。
【請求項１４】
前記サブオペランド割当ステップでは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数以下の場合には、代入文を該並列式から外して前記一斉処理命令への置き換えを諦める、
ことを特徴とする請求項８に記載のプログラム処理方法。
【請求項１５】
オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ上で実行するように記述されたコンピュータ・ソフトウェアをコンピュータ可読形式で物理的に格納した記憶媒体であって、前記コンピュータ・ソフトウェアは、前記コンピュータを、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動手段と、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当手段と、
として機能させるための記憶媒体。
【請求項１６】
オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ上で実行するように記述されたコンピュータ・プログラムであって、前記コンピュータを、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動手段と、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当手段と、
として機能させるためのコンピュータ・プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータ上で実行されるプログラム・コードを処理するプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに係り、特に、プログラマによって高級プログラミング言語形式で記述されたソース・コードを、対象とするアーキテクチャが実行可能な命令セットを用いて記述された形式すなわちオブジェクト・コードにコンパイル処理するプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに関する。
【０００２】
さらに詳しくは、本発明は、プログラムのコンパイル時などにおいて実際の処理効率や処理速度を向上させるための最適化を行なうプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに係り、特に、複数のデータを同時に処理するためのＳＩＭＤ（Single Instruction／Multiple Data）命令を含んだ命令セットを持つアーキテクチャを対象としてプログラムの最適化処理を行なうプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに関する。
【０００３】
【従来の技術】
昨今の技術革新に伴い、さまざまなアーキテクチャのコンピュータ・システムが開発され広汎に普及している。コンピュータは、コンピュータ可読形式で記述されたプログラム・コードを実行することによって、産業上のさまざまな制御や適用業務など、所望の処理を実行することができる。
【０００４】
コンピュータ・プログラムは、一般に、プログラマによって高級プログラミング言語形式で記述されたソース・コードを、対象とするアーキテクチャが実行可能な命令セットを用いて記述された形式すなわちオブジェクト・コードに変換すなわちコンパイルして用いられる。そして、コンパイル処理時には、実際の処理効率を向上し処理の高速化を実現するために変更を加える「最適化」を行なうことが多い。
【０００５】
ところで、近年のマイクロプロセッサのほとんどは、ＳＩＭＤ（Single Instruction／Multiple Data）型のマルチメディア向け拡張命令（以下、単に「ＳＩＭＤ命令」とする）を備えている。また、プロセッサ・メーカやサード・パーティーからは、ＳＩＭＤ命令を使ったコードを生成するコンパイラも提供されている。
【０００６】
ここで言うＳＩＭＤ命令とは、同じ演算を繰り返し実行するような処理を一括して行なえるような命令のことであり、より具体的には、大きなサイズのオペランドを小さな「サブオペランド」に分割して同種の演算を一斉に処理する。ＳＩＭＤ命令によれば、１つの命令で複数のデータに対して同じ種類の演算を一斉に行うようにして、プロセッサ全体のデータ処理能力を高めることができる。したがって、ソース・コード中で、本来は独立して記述されている同機能の命令を寄せ集めてＳＩＭＤ命令に置き換えることにより、コードが持つ冗長性が削除され、プログラムの最適化を行なうことができる。
【０００７】
例えば、音声や画像などのマルチメディア・データに対する処理、あるいは３次元グラフィックスなどにおいては、固定的なフォーマットのデータに対して、同じ種類の演算を繰り返し適用することが多い。そこで、ＳＩＭＤ命令を用いることによって、多量のデータに対して同じ種類の演算を一括して行なうことができ、プロセッサ全体のデータ処理能力を高めることができる。
【０００８】
ＳＩＭＤで取り扱われるデータの形式や命令セットは、プロセッサのアーキテクチャごとに異なるが、一般的には、１つの命令で６４ビット（又は１２８ビット）のデータを一括して処理を行うことができる。この６４ビットのデータ幅の中に、８、１６、３２ビット幅の整数型データ、あるいは３２ビット幅の浮動小数点型データを複数詰め込んで、１つのＳＩＭＤ命令ですべてのデータに対して同時に処理を行う。例えば画像処理ソフトウェアなどでは、６４ビットのオペランドを各８ビットのサブオペランドに分割することにより、固定小数点データを８個同時に格納して、一度に８ピクセル分の処理を行なうことができる。
【０００９】
先述したように、プログラムのコンパイル時に最適化が行なわれるので、コンパイラが同じ演算を繰り返し実行するような処理を１箇所にまとめてＳＩＭＤ命令に置き換えることができれば都合がよい。
【００１０】
しかしながら、コンパイラが自動的にＳＩＭＤ命令を使ってくれる場面は極めて限定されており、従来から研究されているベクトル化の技術をそのまま適用したに過ぎないと言ってもよい。多くの場合、ＳＩＭＤ命令を使うためには、プログラマは、ＳＩＭＤ命令対応のコンパイラで拡張されたデータ型を明示的に使用するとともに、命令に対応する関数（intrinsic）を明示的に呼び出さなければならない。
【００１１】
このような状況下では、これらの拡張機能に使用したプログラムは、高級言語で記述されているにも拘わらず、特定のＳＩＭＤ命令セットに依存したものになってしまう。このため、プログラムを別のプロセッサ・アーキテクチャに移植して充分な性能を発揮させるためには、プログラム・コードの大幅な書き換えが必要となる。また、単にプログラムを改良する場合であっても、性能を落さないようにするには、ＳＩＭＤ命令セットの充分な知識が必要になる。すなわち、プログラムの移植性やメンテナンス性を著しく阻害する。
【００１２】
【発明が解決しようとする課題】
本発明の目的は、コンパイル時などにおいて実際の処理効率や処理速度を向上させるための最適化を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することにある。
【００１３】
本発明のさらなる目的は、複数のデータを同時に処理するためのＳＩＭＤ（Single Instruction／Multiple Data）命令を含んだ命令セットを持つアーキテクチャを対象としてプログラムに対してコンパイルなどの処理を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することにある。
【００１４】
本発明のさらなる目的は、ＳＩＭＤ命令の特徴を活かしたプログラムの最適化を自動的に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することにある。
【００１５】
【課題を解決するための手段及び作用】
本発明は、上記課題を参酌してなされたものであり、その第１の側面は、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なうプログラム処理装置又はプログラム処理方法であって、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動部又はステップと、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当部又はステップと、
を具備することを特徴とするプログラム処理装置又はプログラム処理方法である。
【００１６】
ここで、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令とは、例えばＳＩＭＤ（Single Instruction／Multiple Data）型のマルチメディア向け拡張命令のことである。
【００１７】
ＳＩＭＤ命令は、同じ演算を繰り返し実行するような処理を一括して行なうことができる。本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法は、例えば、高級プログラミング言語形式で記述されたソース・プログラムを対象とするアーキテクチャが実行可能なオブジェクト・プログラムに変換するためのコンパイラが備える機能モジュールの１つとして実装することができ、このコンパイル処理の過程において、ＳＩＭＤ命令を用いて最適化を行なうものである。
【００１８】
本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法によれば、代入文移動部又はステップは、処理対照プログラムの中から同じ演算を異なるデータに適用しているものを見つけて、これらをｐａｒａｌｌｅｌ式を使って１箇所にまとめる。次いで、サブオペランド割当部又はステップは、ｐａｒａｌｌｅｌ式を使って記述されている代入文のうちＳＩＭＤ命令１つで処理できるものを抽出して、それが使用・定義する変数をＳＩＭＤレジスタに対するｓｕｂｒｅｇ式に置き換える。このようにｓｕｂｒｅｇ式に置き換えられた代入文の集まりは、ＳＩＭＤ命令と等価であり、プログラムの最適化が実現される。
【００１９】
本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法は、プログラムを前記代入文移動部又はステップに投入する前に、プログラム中のｉｆ文をなくすｉｆ変換部又はステップをさらに備えていてもよい。ｉｆ変換により、基本ブロックの数が減るという効果がある。ＳＩＭＤ命令を使ってプログラムの最適化を行う場合には、最適化手順の最初にｉｆ変換を行なうことにより、変換された論理演算も最適化の対象にすることができる。
【００２０】
また、本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法は、プログラムを前記代入文移動部又はステップに投入する前に、基本ブロックで構成されるプログラムをＤＡＧに変換するＤＡＧ変換部又はステップをさらに備えていてもよい。
【００２１】
ここで、基本ブロックとは、プログラムを処理フローの分岐及び合流場所で分割することによって得られる単位のことである。また、ＤＡＧ（Directed Acyclic Graph）は、有向で繰り返しのないグラフのことである。基本ブロック中の代入文は、ＤＡＧで表現することができる。
【００２２】
基本ブロックをＤＡＧに変換することによって、局所的な共通部分式を除去することができる。また、ＳＩＭＤ命令を使ってプログラムの最適化を行なう場合には、基本ブロックをＤＡＧに変換することによって、特殊な演算を伴うＳＩＭＤ命令を利用するためのパターン・マッチングを容易に行なえるように、細かい式を大きな式にまとめることができるという効果がある。
【００２３】
また、本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法は、プログラムを前記代入文移動部又はステップに投入する前に、プログラムを有向で繰り返しのないグラフで表現したＤＡＧを前記一斉処理命令で行なえる演算の単位に分解するＤＡＧ分解部又はステップをさらに備えていていもよい。
【００２４】
また、プログラム中の代入文のうち、同じ演算を異なるデータに適用としているものをｐａｒａｌｌｅｌ式を使って１箇所にまとめる際に、代入文の位置を移動することになる。代入文の移動によってプログラムの意味が変わることのないように、前記代入文移動部又はステップは、所定の判定条件を満足したときのみ、代入文の移動を行なうようにすればよい。例えば、移動元の文の位置ｓから移動先の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合以外は、当該文の移動を許容しないようにすればよい。
【００２５】
また、本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法は、前記代入文移動部又はステップによって並列実行する演算子を用いて１つにまとめられた代入文を、前記一斉処理命令の実行におけるオペランドの使用の制約に従って書き換える制約適用部又はステップをさらに備えていてもよい。
【００２６】
また、前記サブオペランド割当部又はステップは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数を越える場合には、前記一斉処理命令１つで処理できる個数の代入文を取り出して、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てるようにしてもよい。
【００２７】
また、前記サブオペランド割当部又はステップは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数以下の場合には、ダミーの代入文を付け加えてちょうど前記一斉処理命令１つで処理できる個数になるようにして、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てるようにしてもよい。
【００２８】
あるいは、前記サブオペランド割当部又はステップは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令１つで処理できる数以下の場合には、代入文を該並列式から外して前記一斉処理命令への置き換えを諦めるようにしてもよい。例えば、ダミー命令の挿入によってＳＩＭＤ命令を使っても、かえって命令のコストが大きくなる場合など最適化にならない場合には、ＳＩＭＤ命令の使用を諦める。
【００２９】
また、本発明の第２の側面は、複数の代入文を含んだプログラムを処理するプログラム処理装置又はプログラム処理方法であって、
移動元の文の位置ｓから移動先の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合、又は、
移動先の文の位置ｓから移動元の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合、
以外は、当該文の移動を許容しない、
ことを特徴とするプログラム処理装置又はプログラム処理方法である。
【００３０】
一般に、コンピュータ・プログラムのコンパイル時に行なう最適化処理やその他の局面において、プログラムの代入文の並びを移動させたい場合があるが、無制限に移動させてしまうと、プログラムの意味が同じでなくなってしまう危険がある。そこで、本発明の第２の側面に係るプログラム処理装置又はプログラム処理方法によれば、移動元の文の位置ｓから移動先の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合、又は、移動先の文の位置ｓから移動元の文の位置ｔまでのすべての経路を考えるとき、経路上のｓ以外の位置で経路外からの合流がなく、且つ、経路上のｔ以外の位置で経路外への分岐がない場合、以外は、当該文の移動を許容しないようにすることで、プログラムの意味の同一性を維持するようにした。
【００３１】
また、本発明の第３の側面は、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ・システム上で実行するように記述されたコンピュータ・ソフトウェアをコンピュータ可読形式で物理的に格納した記憶媒体であって、前記コンピュータ・ソフトウェアは、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動ステップと、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当ステップと、
を具備することを特徴とする記憶媒体である。
【００３２】
本発明の第３の側面に係る記憶媒体は、例えば、さまざまなプログラム・コードを実行可能な汎用コンピュータ・システムに対して、コンピュータ・ソフトウェアをコンピュータ可読な形式で提供する媒体である。このような媒体は、例えば、ＤＶＤ（Digital Versatile Disc）、ＣＤ（Compact Disc）やＦＤ（Flexible Disk）、ＭＯ（Magneto-Optical disc）などの着脱自在で可搬性の記憶媒体である。あるいは、ネットワーク（ネットワークは無線、有線の区別を問わない）などの伝送媒体などを経由してコンピュータ・ソフトウェアを特定のコンピュータ・システムに提供することも技術的に可能である。
【００３３】
また、本発明の第３の側面に係る記憶媒体は、コンピュータ・システム上で所定のコンピュータ・ソフトウェアの機能を実現するための、コンピュータ・ソフトウェアと記憶媒体との構造上又は機能上の協働的関係を定義したものである。換言すれば、本発明の第３の側面に係る記憶媒体を介して所定のコンピュータ・ソフトウェアをコンピュータ・システムにインストールすることによって、コンピュータ・システム上では協働的作用が発揮され、本発明の第１の側面に係る画プログラム処理装置又はプログラム処理方法と同様の作用効果を得ることができる。
【００３４】
また、本発明の第４の側面は、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ・システム上で実行するように記述されたコンピュータ・プログラムであって、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて１つにまとめる代入文移動ステップと、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当ステップと、
を具備することを特徴とするコンピュータ・プログラムである。
【００３５】
本発明の第４の側面に係るコンピュータ・プログラムは、コンピュータ・システム上で所定の処理を実現するようにコンピュータ可読形式で記述されたコンピュータ・プログラムを定義したものである。換言すれば、本発明の第４の側面に係るコンピュータ・プログラムをコンピュータ・システムにインストールすることによって、コンピュータ・システム上では協働的作用が発揮され、本発明の第１の側面に係るプログラム処理装置又はプログラム処理方法と同様の作用効果を得ることができる。
【００３６】
本発明のさらに他の目的、特徴や利点は、後述する本発明の実施形態や添付する図面に基づくより詳細な説明によって明らかになるであろう。
【００３７】
【発明の実施の形態】
以下、図面を参照しながら本発明の実施形態について詳解する。
【００３８】
Ａ．ＳＩＭＤ命令の特徴
近年のマイクロプロセッサの持つＳＩＭＤ命令で典型的なものは、大きなサイズのレジスタのデータを、小さなサイズのデータが複数集まったものとみなして、それぞれに対して同じ演算を行なう命令である。
【００３９】
例えば、米インテル社製のｘ８６系のマイクロプロセッサにおけるＳＩＭＤ命令であるＭＭＸ（multimedia extension）命令では、下記の命令は、６４ビット・レジスタＭＭ０の内容を８個の８ビット数とみなし、６４ビット・レジスタＭＭ１に対応する８ビット数とそれぞれ加算して、その結果をレジスタＭＭ０に格納する。
【００４０】
【数３】
0004045802.tif 000002
【００４１】
以下では、この８ビット数のような個々の演算対象のことを「サブオペランド」と呼ぶことにする。
【００４２】
表１には、近年の代表的なマイクロプロセッサ・アーキテクチャがそれぞれ持つＳＩＭＤ命令セットの幾つかの特徴を挙げている。
【００４３】
【表１】
0004045802.tif 000003
【００４４】
上表において使用レジスタの欄では、各アーキテクチャにおいて、ＳＩＭＤ命令で使えるレジスタ（以下、ＳＩＭＤレジスタ）が、通常の整数レジスタと共通、通常の浮動小数点レジスタと共通、あるいは専用のレジスタがあるかの区別と、レジスタの個数を表している。
【００４５】
また、データ型の欄では、各アーキテクチャにおいて、典型的な命令で扱えるサブオペランドのビット長（Ｆで始まるものは浮動小数点数）と個数を示している。
【００４６】
また、比較演算結果の欄では、ＳＩＭＤ比較命令の結果がどこに入るかを示している。ビットマスクとなっている場合、ＳＩＭＤレジスタの対応するサブオペランドのすべてのビットが１あるいはすべてのビットが０になることで比較結果が表現される。
【００４７】
比較演算結果がビットマスクになる場合、ＳＩＭＤ論理演算命令と組み合わせれば、条件分岐命令なしで各サブオペランドに対する条件付実行を行なうことができる。比較演算結果が整数レジスタに入るＶＩＳの場合、条件付ストア命令を使うことで、同様の効果が得られる。
【００４８】
上記の表１を参照する限りでは、ＳＩＭＤ命令を並列度の小さいベクトル命令の一種とみなして、ループのベクトル化を適用すればＳＩＭＤ命令を活用することができると思料される。比較演算を使った条件付実行についても、ｉｆ変換と同じようなことを行なえば対応可能である。
【００４９】
しかしながら、ＳＩＭＤ命令とベクトル命令では、並列度とコストのバランスが相違する。
【００５０】
ベクトル命令は、並列度が高いので、使用できれば大幅な速度向上を期待することができる反面、オーバーヘッドが大きいため、使用する場所をうまく選ぶ必要がある。一方、ＳＩＭＤ命令は、通常の命令と同程度のコストで実行することができるので、積極的に使用する意味があるが、並列度が低いので大幅な速度向上は難しい。略言すれば、ＳＩＭＤ命令には以下の特徴がある。
【００５１】
（１）並列度はあまり大きくない。
（２）実行コストは低い。
【００５２】
なお、ＳＩＭＤ命令には、上述した以外にも特徴的な命令が含まれている。例えば、次のようなものを挙げることができる。
【００５３】
▲１▼飽和加減算
整数の加減算の結果がオーバーフローしたときに、そのビット数で表せる最大値又は最小値に飽和させる命令である。オーバーフローの判定は符号付き数として扱う命令もあれば、符号なし数として扱う命令もある。
【００５４】
▲２▼最大最小
２つのオペランドの対応する各サブオペランドの大きい方あるいは小さい方を求める命令である。
【００５５】
▲３▼飽和縮小
ビット数の小さいデータに変換する際に、変換後のビット数でははみ出す数を最大値又は最小値に飽和させる命令である。
【００５６】
▲４▼混ぜ合わせ
２つのオペランド中のサブオペランドの幾つか（例えば下位半分）を、例えば交互に混ぜ合わせる命令である。その演算結果をビット数が２倍になったサブオペランドとみなすなら、他の命令と組み合わせて、ゼロ拡張や符号拡張を実現することができる。
【００５７】
▲５▼乗算の上位
乗算の結果は元の２倍のビット数を必要とするが、その上位半分を取り出す命令である。乗算を符号付き数として扱う命令もあれば、符号なし数として扱う命令もある。
【００５８】
▲６▼積和演算
乗算とその結果の加算を１つの命令で行なう命令である。
【００５９】
▲７▼絶対差の和
２つのオペランドの対応するサブオペランドの差の絶対値をそれぞれ求めて加える命令である。結果は、元のサブオペランドよりビット数が大きくなる。
【００６０】
表２には、上述したＳＩＭＤ命令が表１に示したマイクロプロセッサ・アーキテクチャが持つ各ＳＩＭＤ命令セットに含まれているかどうかを一覧表示している。
【００６１】
【表２】
0004045802.tif 000004
【００６２】
これらＳＩＭＤ命令の特徴を次のようにまとめることができる。すなわち、
【００６３】
（１）特殊な演算子
通常の命令のような基本的な演算子ではなく、複合した演算や条件判断を含む演算を行なう。
【００６４】
（２）データ・サイズの混合
入力と出力のサブオペランドのサイズや数が異なる命令がある。そのため、入力オペランド中の一部のサブオペランドしか使われなかったり、出力オペランド中の一部のサブオペランドだけ変更されたりすることもある。
【００６５】
これらＳＩＭＤ命令の活用は、ループのベクトル化とは別種の問題であり、従来のプログラム最適化方法の適用範囲外である。だからといってＳＩＭＤ命令を活用することに効果が小さいという訳ではなく、うまく活用するならば、ＳＩＭＤ命令の並列度を越えた高速化を期待することができる。
【００６６】
Ｂ．プログラム処理装置の構成
本実施形態に係るプログラム処理装置は、対象とするアーキテクチャが実行可能な命令セットを用いて記述された形式すなわちオブジェクト・コードにコンパイル処理する。また、コンパイル処理時には、実際の処理効率や処理速度を向上させるための最適化を行なう。とりわけ特徴的なのは、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対して同種の演算を一斉に処理するＳＩＭＤ命令を用いてプログラムの最適化を自動的に行なう、という点である。
【００６７】
図１には、本実施形態に係るプログラム処理装置１００のハードウェア構成を模式的に示している。
【００６８】
メイン・コントローラであるＣＰＵ（Central Processing Unit）１０１は、オペレーティング・システム（ＯＳ）の制御下で、各種のアプリケーションを実行する。
【００６９】
本実施形態では、ＣＰＵ１０１は、例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを実行することができる。また、本実施形態に係るコンパイラは、最適化処理を備えている。最適化処理部の中には、同じ演算を繰り返し実行するような処理を一括して行なえるＳＩＭＤ命令を使った最適化部を含んでいるが、その処理の詳細については後述に譲る。
【００７０】
図示の通り、ＣＰＵ１０１は、バス１０８によって他の機器類（後述）と相互接続されている。
【００７１】
主メモリ１０２は、ＣＰＵ１０１において実行されるプログラム・コードをロードしたり、実行プログラムの作業データを一時保管するために使用される記憶装置であり、例えばＤＲＡＭ（Dynamic RAM）のような半導体メモリが使用される。例えば、エディタ、コンパイラ、オブジェクト・プログラムなどが実行プログラムとして主メモリ１０２にロードされる。また、編集中・コンパイル中のソース・プログラムや、コンパイラがソース・プログラムをコンパイル処理中に生成するソース・プログラムの中間表現（中間表現は、基本ブロックに分割されることもあり、また、基本ブロックは、ＤＡＧ（Directed Acyclic Graph）で表現されることもある）、コンパイル処理されたオブジェクト・プログラムなどが作業データとして主メモリ１０２に一時的に格納される。
【００７２】
また、ＲＯＭ（Read Only Memory）１０３は、データを恒久的に格納する半導体メモリであり、例えば、起動時の自己診断テスト（ＰＯＳＴ：Power On Self Test）や、ハードウェア入出力用のプログラム・コード（ＢＩＯＳ：Basic Input/Output System）などが書き込まれている。
【００７３】
ディスプレイ・コントローラ１０４は、ＣＰＵ１０１が発行する描画命令を実際に処理するための専用コントローラである。ディスプレイ・コントローラ１０３において処理された描画データは、例えばフレーム・バッファ（図示しない）に一旦書き込まれた後、ディスプレイ１１１によって画面出力される。
【００７４】
ディスプレイ１１１の表示画面は、一般に、ユーザからの入力内容やその処理結果、あるいはエラーその他のシステム・メッセージをユーザに視覚的にフィードバックする役割を持つ。また、本実施形態においては、ディスプレイ１１１の表示画面には、ソース・プログラムを編集するためのエディタ画面や、コンパイル処理中の基本ブロックやＤＡＧ、中間表現などの経過データ、オブジェクト・プログラム、オブジェクト・プログラムによる実行内容などを表示出力するために利用される。
【００７５】
入力機器インターフェース１０５は、キーボード１１２やマウス１１３などのユーザ入力機器を対話装置１００に接続するための装置である。
【００７６】
キーボード１１２やマウス１１３は、データやコマンドなどのユーザ入力をシステムに取り込む役割を持つ。本実施形態では、キーボード１１２やマウス１１３は、エディタの起動、エディタ画面でのソース・プログラムの入力・編集、コンパイラの起動、オブジェクト・プログラムの起動などをユーザが指示するために使用される。
【００７７】
ネットワーク・インターフェース１０６は、Ｅｔｈｅｒｎｅｔなどの所定の通信プロトコルに従って、システム１００をＬＡＮ（Local Area Network）などの局所的ネットワーク、さらにはインターネットのような広域ネットワークに接続することができる。
【００７８】
ネットワーク上では、複数のホスト端末（図示しない）がトランスペアレントな状態で接続され、分散コンピューティング環境が構築されている。ネットワーク上では、ソフトウェア・プログラムやデータ・コンテンツなどの配信サービスを行なうことができる。例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを、ネットワーク経由でダウンロードすることができる。また、コンパイル前のソース・プログラムやコンパイル処理後のオブジェクト・プログラムなどを、ネットワーク経由で他のホスト装置との間で配信・配布することができる。
【００７９】
外部機器インターフェース１０７は、ハード・ディスク・ドライブ（ＨＤＤ）１１４やメディア・ドライブ１１５などの外部装置を本プログラム処理装置１００に接続するための装置である。
【００８０】
ＨＤＤ１１４は、記憶担体としての磁気ディスクを固定的に搭載した外部記憶装置であり（周知）、記憶容量やデータ転送速度などの点で他の外部記憶装置よりも優れている。ソフトウェア・プログラムを実行可能な状態でＨＤＤ１１４上に置くことを、プログラムのシステムへの「インストール」と呼ぶ。通常、ＨＤＤ１１４には、ＣＰＵ１０１が実行すべきオペレーティング・システムのプログラム・コードや、アプリケーション・プログラム、デバイス・ドライバなどが不揮発的に格納されている。例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを、ＨＤＤ１１４上にインストールすることができる。また、編集中・コンパイル中のソース・プログラムや、コンパイラがソース・プログラムをコンパイル処理中に生成するソース・プログラムの中間表現（中間表現は、基本ブロックに分割されることもあり、また、基本ブロックは、ＤＡＧ（Directed Acyclic Graph）で表現されることもある）、コンパイル処理されたオブジェクト・プログラムなどをＨＤＤ１１４上に蓄積しておいてもよい。
【００８１】
メディア・ドライブ１１５は、ＣＤ（Compact Disc）やＭＯ（Magneto-Optical disc）、ＤＶＤ（Digital Versatile Disc）などの可搬型メディアを装填して、そのデータ記録面にアクセスするための装置である。
【００８２】
可搬型メディアは、主として、ソフトウェア・プログラムやデータ・ファイルなどをコンピュータ可読形式のデータとしてバックアップすることや、これらをシステム間で移動（すなわち販売・流通・配布を含む）する目的で使用される。例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを、これら可搬型メディアを利用して複数の機器間で物理的に流通・配布することができる。また、編集中・コンパイル中のソース・プログラムや、コンパイラがソース・プログラムをコンパイル処理中に生成する中間表現、コンパイル処理されたオブジェクト・プログラムなどを他の装置との間で交換するために、可搬型メディアを利用することができる。
【００８３】
なお、図１に示すようなプログラム処理装置１００の一例は、米ＩＢＭ社のパーソナル・コンピュータ"ＰＣ／ＡＴ（Personal Computer/Advanced Technology）"の互換機又は後継機である。勿論、他のアーキテクチャで構成されるコンピュータを、本実施形態に係るプログラム処理装置１００として適用することも可能である。
【００８４】
Ｃ．ＳＩＭＤ命令を用いたプログラムの最適化
Ｃ−１．ＳＩＭＤ最適化の到達レベル
Ａ項で既に述べたように、ＳＩＭＤ命令の特徴は以下の４つにまとめることができる。
【００８５】
（１）あまり大きくない並列度
（２）低い実行コスト
（３）特殊な演算子
（４）データ・サイズの混合
【００８６】
本発明者は、このようなＳＩＭＤの特徴を鑑みて、従来のベクトル化の適用を含めてＳＩＭＤによるプログラム最適化の到達度として以下の４つの到達レベルに定義した。
【００８７】
レベル０：  ループのベクトル化
レベル１：  ループ以外でも、同じ演算の並列実行が可能なものをＳＩＭＤ命令にする
レベル２：  特殊な演算子を持つ命令の利用
レベル３：  データ・サイズの混合した演算をうまく扱う
【００８８】
レベル０では、並列度が小さいために重要となる、前後の命令を含めたスケジューリングや、ループ融合などの他の最適化との相互作用の扱いを含めて考える。
【００８９】
レベル１では、例えば、座標計算のように、ソース・プログラム上では別々の変数に対する演算として表現されているものであっても、変数をメモリやレジスタにうまく順次割り当てていくことにより、ＳＩＭＤ命令を適用する。ＳＩＭＤ命令の並列度が余る場合であっても、命令の実行コストが低いので、前後の命令を含めたスケジューリングをきちんと行なうことにより、高速化を期待することができる。
【００９０】
レベル２は、サブオペランドの１つの結果だけを利用するような、単独の使用でも効果が出ることがあるが、レベル０やレベル１の使い方と組み合わせて使用することが期待される。通常の命令と比べて、ＳＩＭＤ命令は大幅な高速化を期待することができるが、ＳＩＭＤ命令を使える場面であるかどうかを判定することは難しい。例えば、飽和加減算をする場合のオーバーフローの判定は、より大きなビット長に拡張してから演算して判定するもの、ソース・オペランドと結果の符号や大小関係をしようするものなど、何通りかの方法があり、これらが同等であると判定できる式変形能力を要する。
【００９１】
ここで、式変形能力の別の使い方としては、ＳＩＭＤ命令には特殊な演算子しかないもの、例えば、飽和縮小命令を、ビットマスク（すべて０又はすべて１）の単なる縮小命令として使うことが挙げられる。本発明者は、これもレベル２に含めて考えている。
【００９２】
レベル３は、ＳＩＭＤ命令を単純に同じ操作の並列実行とみなせない場合である。サイズを混合した演算は、特殊な演算であるから、レベル２を含めて考えなければならない。
【００９３】
Ｃ−２．本発明で目標とする最適化の到達度レベル
現状でＳＩＭＤ命令を使ったコードを生成するコンパイラは、レベル０の自動化を相当程度達成しており、これはほぼ実用段階であると言ってもよい。
【００９４】
一方、レベル１に関しては、例えば、Samuel Larsen及びSaman Amarasinghe共著の論文" Exploiting Superword Level Parallelism with Multimedia Instruction Sets "（In Proceedings of the ACM SIGPLAN 2000 Conference on Programming Language Design and Implementation, June 2000）には、基本ブロック内に限定して適用した研究に関する報告がなされている。また、Kevin Scott及びJack Davidson共著の論文"Exploring the Limits of Sub-word Level Parallelism"（In Proceedings of 2000 International Conference Parallel Architectures and Compilation Techniques, October 2000.）には、効果の限界の実験について報告されている。
【００９５】
レベル２に関しては、Ｋｅｖｉｎ  Ｓｃｏｔｔ他著の上記論文中でも記載されているように、いまだ到達されていない。したがって、レベル３も未踏の領域である。
【００９６】
本発明は、レベル２及びレベル３を実現することができるプログラム最適化を提案するものである。
【００９７】
例えば、グーロー・シェーディング（Gouraud shading）の最内側ループに相当する処理をＣ言語形式で記述したプログラム・コードは以下のようになる。
【００９８】
【数４】
0004045802.tif 000005
【００９９】
本実施形態に係るコンパイラは、レベル２及びレベル３でＳＩＭＤ命令を使ったコードを生成するものであり、上記のソース・プログラムを、ＭＭＸ命令を使って以下のように最適化することができる。
【０１００】
【数５】
0004045802.tif 000006
【０１０１】
上記のコンパイル・最適化後のコードでは、ｉｆ変換を使ってループ内の条件分岐をなくし、４つのｉｆ文を並列実行しているとともに、ＭＭＸ命令で使うのに都合のよい値、例えばｓａ＋１，ｓｒ＋１，ｓｇ＋１，ｓｂ＋１をループ不変式としてループ外で計算するようにしている。なお、引数やグローバル変数は、適当な順番で配置されていることを前提にしている。
【０１０２】
他方、ＭＭＸに対応したコンパイラである"Ｃｏｄｅ＝Ｗａｒｒｉｏｒ  ６．０"で、以下に示す最適化オプションを指定してコンパイルしても、ＭＭＸ命令は使用されない。
【０１０３】
【数６】
0004045802.tif 000007
【０１０４】
Ｃ−３．最適化のための中間表現
ＳＩＭＤ命令を使用するレベル２以上の最適化を実現するためには、演算子の意味を細かく分析したり、サブオペランドのサイズやオペランド中の位置を表現したりする必要がある。また、いろいろな最適化の相互影響を解析する必要も生ずる。そこで、本実施形態では、特定の目的に適した命令の表現を考えるのではなく、まず命令の意味を正確に表現することができるプログラムの中間表現を設計し、その上でプログラムの最適化を行なうようにしている。
【０１０５】
例えば、Jack Davidson及びChristopher Fraser共著の論文"Register Allocation and Exhaustive Peephole Optimization"（Software Practice and Experience, Vol.14, No.9, pp.857-866, September 1984）で提案されているプログラムの中間表現ＲＴＬ（Register Transfer Language）は、移植性の高いコード最適化の実装によく使用されている。ＲＴＬでは、個々の命令の意味は式の形ですっかり表現され、中間表現の形式や解釈方法は命令セットに依存しない。このため、中間表現を操作するプログラムをアーキテクチャに依存しない形で作成することができる。
【０１０６】
ＲＴＬでは、レジスタ、あるいはメモリの内容を幾つか読み出して演算を行ない、その結果をレジスタあるいはメモリに代入する副作用として、マシン命令をとらえる。特別に指定されたものを除き、レジスタ又はメモリから内容を読み出した値は、直前に書き込んだ値である。プログラム・カウンタに対する変更をジャンプとみなすなどの幾つかの工夫により、たいていのマシン命令の意味をＲＴＬで表すことができる（ＲＴＬで表せないものの代表例は、内部にループを含む命令である）。
【０１０７】
本実施形態では、ＳＩＭＤ命令を用いたプログラムのコンパイルを実現するために、中間表現としてＲＴＬを使用する。ＲＴＬでＳＩＭＤ命令を表現するために、ＧＣＣ（GNU Compiler Collections：Richard M. Stallman著"Using and Porting the GNU Compiler Collection"（Free Software Foundation, July 1999.）を参照のこと）のＲＴＬで使用されている演算子"ｐａｒａｌｌｅｌ"及び"ｓｕｂｒｅｇ"をほぼそのまま採用する。
【０１０８】
マシン命令は、高級言語の命令文とは異なり、不可分な複数の副作用が同時に発生することがある。このため、ＧＣＣでは、演算子ｐａｒａｌｌｅｌを使って表す。また、ＳＩＭＤ命令の複数のサブオペランドに対する変更も、この不可分な副作用の一種とみなすことができるので、ｐａｒａｌｌｅｌで表すことにする。
【０１０９】
また、サブオペランドは、演算子ｓｕｂｒｅｇを使って明示的に表すことにした。ｓｕｂｒｅｇt（ｒt1，ｎ）は、ｔ１型のレジスタｒの、下位ビットから数えてｎ番のｔ型のデータを表す。なお、小さなレジスタがたくさんあるとみなす方法も考えられるが、サブオペランドのサイズと個数が命令によって異なるので、重なりの情報が別に必要となるため、本実施形態では採用していない。
【０１１０】
例えば、下記のＭＭＸ命令は図２に示すような中間表現になる。ここで、Ｉ１６及びＩ６４は、それぞれ１６ビット、６４ビットの整列型を表している。
【０１１１】
【数７】
0004045802.tif 000008
【０１１２】
Ｃ−４．最適化の手順
本実施形態では、コンパイラはソース・プログラムの最適化処理を行なうが、この際、ＳＩＭＤ命令を使った最適化処理を行なう点に特徴がある。ＳＩＭＤ命令を使った最適化処理部は、上述したＲＴＬを使ってソース・コードを中間表現に変換するが、プログラムを中間表現する上で、図３に示すような手順でプログラム・コードの変換を行なっていくことで、並列に実行することができる操作を単に検出するだけでなく、特殊な演算子を使ったり、データ・サイズの混合した命令の一部を利用したプログラムの最適化を実現する。以下では、ＳＩＭＤ命令を使ったプログラム最適化における各ステップについて詳解する。
【０１１３】
Ｃ−４−１．論理演算を使ったｉｆ変換
ｉｆ変換は、プログラム中のｉｆ文をなくす処理であり、基本ブロックの数が減るという効果がある。また、最適化手順の最初に行なうことにより、ｉｆ変換により変換された論理演算も最適化の対象にすることができる。
【０１１４】
ｉｆ文の条件式が比較演算で、結果をビットマスクとして得られる場合には、代入文が選択的に実行されるだけの単純なｉｆ文を、論理演算を使って同じ効果が得られるように変換する。
【０１１５】
比較式をｃ、代入対象をｖ、ｔｈｅｎ節でｖに代入される値をｔ、ｅｌｓｅ節で代入される値をｆとすれば（ｔｈｅｎ節又はｅｌｓｅ節にｖへの代入文がなければ、ｔ又はｆはｖとなる）、ｉｆ文を以下に示すような代入文に変換することができる。
【０１１６】
【数８】
0004045802.tif 000009
【０１１７】
但し、上式において、ｂｉｔａｎｄ、ｂｉｔｏｒ、ｂｉｔｎｏｔはビット毎の論理積、論理和、論理否定をそれぞれ表す演算子である。また、代入文が"ｖ：＝ｖ  ｏｐ  ｗ"の形をしている場合や、代入する値が特別な値ならば、変換結果を簡単にすることができる。例えば、
【０１１８】
【数９】
0004045802.tif 000010
【０１１９】
のような処理は、比較結果がビットマスクで、負の数を２の補数で表すという前提で、以下のようにｉｆ変換される。
【０１２０】
【数１０】
0004045802.tif 000011
【０１２１】
ここで、比較結果と演算のビット長が異なる場合には、適当な変換演算を挿入する。
【０１２２】
ｉｆ変換を最初に行なうのは、変換された論理演算も最適化の対象にするためである。
【０１２３】
Ｃ−４−２．基本ブロックをＤＡＧに変換
基本ブロックとは、プログラムを処理フローの分岐及び合流場所で分割することによって得られるプログラム文の単位のことである。基本ブロックは、連続した文の列からなり、制御は先頭の文に与えられ、その後、途中で停止したり、途中で分岐したりしないで、最後の文から制御が離れる。
【０１２４】
また、ＤＡＧ（Directed Acyclic Graph）は、有向で繰り返しのないグラフのことである。基本ブロック中の代入文は、ＤＡＧで表現することができる。基本ブロックをＤＡＧに変換することによって、局所的な共通部分式を除去することができる。また、本実施形態においては、基本ブロックをＤＡＧに変換することによって、特殊な演算を伴うＳＩＭＤ命令を利用するためのパターン・マッチングを容易に行なえるように、細かい式を大きな式にまとめることができるという効果がある。
【０１２５】
例えば、
【０１２６】
【数１１】
0004045802.tif 000012
【０１２７】
という基本ブロックがあった場合、ここでのｃの値を他で使わないという前提で、
【０１２８】
【数１２】
0004045802.tif 000013
【０１２９】
を意味するＤＡＧ（但し、２つあるｘ＞＝ｙは同じノードで表現される）に変換される。
【０１３０】
図４には、ＳＩＭＤ命令で行なうことができる特殊な演算子を含んだ基本ブロックの他の構成例を示している。但し、同図に示す例では、プログラムを構成する基本ブロックの集まりに、制御の流れに関する情報（矢印）を付け加えた流れグラフの形式となっている。また、"ｃｏｎｖ"は型変換演算子であり、"ｓｈｒ"は右シフト演算子である。なお、図中では型を省略しているが、乗算の上位を計算する部分にだけは型が付いている。
【０１３１】
また、図５には、図４に示した基本ブロックのうち、最右上のブロックをＤＡＧに変換した例を示している。但し、"："（コロン）の後にあるのは、そのノードの値を持っている変数である。
【０１３２】
図５中で、破線で囲まれた箇所Ａは、最大最小命令に相当し、ＳＩＭＤ命令に置き換えることができる特殊な命令である。同様に、一点鎖線で囲まれた箇所Ｂは、乗算の上位であり、ＳＩＭＤ命令に置き換えることができる特殊な命令である。
【０１３３】
ＤＡＧのパターン・マッチングにより、これらＳＩＭＤ命令に置換可能かどうかを容易に判断することができる、という点を充分に理解されたい。
【０１３４】
Ｃ−４−３．ＤＡＧを分解
次いで、前項で生成したＤＡＧを、ＳＩＭＤ命令で行なえる命令の単位に分解する。例えば、前述したＤＡＧの例
【０１３５】
【数１３】
0004045802.tif 000014
【０１３６】
では、２数の大きい方を求める命令すなわち最大最小命令があるので、分解されずに残される。
【０１３７】
また、図５に示したＤＡＧの例では、最大最小、及び、乗算の上位という、ＳＩＭＤ命令で行なえる演算の単位がそれぞれ含まれているので、これらの部分が分解されずに残される。したがって、ＤＡＧ全体としては以下のように分解される。
【０１３８】
【数１４】
d:=(a bitand (a>=b)) bitor (b bitand bitnot (a>=b))
e:d+a
h:=convI16(shrI32(convI32(a)*convI32(b),16))
g:=e-h
【０１３９】
但し、ｈは、分解のために新たに導入した変数である。ｄへの代入はａとｂの最大であり、ｈへの代入はａとｂの乗算の上位を表している。
【０１４０】
なお、中間表現の持つ演算子はすべて、分解された演算とみなすようにすることで、分解の失敗がないようにしておく。ＳＩＭＤ命令にできなかった演算は、後の段階で通常の命令になる。
【０１４１】
Ｃ−４−４．同じ演算を複数まとめる
次いで、ＤＡＧを分解してなる代入文のうち、同じ演算を異なるデータに適用しているものを見つけて、これらをＲＴＬ演算子"ｐａｒａｌｌｅｌ"を使って１箇所にまとめる。
【０１４２】
その際、代入文の位置を移動することになるが、プログラムの意味が変わってしまわないようにする必要がある。本発明者は、代入文の移動によってプログラムの意味が変わらないことを判定するための幾つかの条件を考案した。
【０１４３】
まず、制御フロー・グラフ（プログラムを構成する基本ブロックの集まりに、制御の流れに関する情報（矢印）を付け加えたグラフ）中における移動元の文の位置と移動先の文の位置のうち、先のものをｓとおき、後のものをｔとおく。ここで、先と後は、同じ基本ブロック内なら簡単に決まるが、そうでないときは次のようにする。まず、移動元の文の位置をｓ、移動先の文の位置をｔとおき、ｓからｔまでの経路すべてを考えるとき、
【０１４４】
▲１▼経路上のｓ以外の位置で経路外からの合流がない。
▲２▼経路上のｔ以外の位置で経路外への分岐がない。
【０１４５】
という２つの条件をともに満たすときには、これで先と後が決まったことになる。満たさないときには、移動元の文の位置をｔ、移動先の文の位置をｓとおき、ｓからｔまでの経路すべてを考えるとき、条件▲１▼及び▲２▼をともに満たすときには、先と後が決まったことになる。満たさないときには、代入文を移動するとプログラムの意味が変わってしまうので、移動の対象としない。
【０１４６】
例えば、図６に示すような制御フロー・グラフのプログラムにおいて、基本ブロック間で代入文を移動する場合について検討してみる。
【０１４７】
同図に示すプログラムでは、同じ演算を異なるデータに適用している代入文として、基本ブロックＢ２内の代入文ｃ：＝ａ＋ａと、基本ブロックＢ４内の代入文ｄ：＝ｂ＋ｂを抽出することができる。ここで、基本ブロックＢ４内の代入文ｄ：＝ｂ＋ｂを、基本ブロックＢ２内の代入文ｃ：＝ａ＋ａの位置に移動することを考えてみる。
【０１４８】
まず、移動元の文である、基本ブロックＢ４内の代入文ｄ：＝ｂ＋ｂの位置をｓとし、移動先である、基本ブロックＢ２内の代入文ｃ：＝ａ＋ａの位置をｔとしてみる。
【０１４９】
図６からも判るように、ｓからｔに向かうすべての経路を考えると、経路上の位置ｓ以外の位置でも、ｔにおいて経路外からの合流Ｒ２が存在する。また、経路上の位置ｔ以外の位置でも、位置ｓにおいて経路外への分岐Ｒ５が存在する。
【０１５０】
したがって、上記の条件▲１▼及び▲２▼をいずれも満足しないので、これは正しい前後関係ではない。
【０１５１】
次いで、前後関係を入れ替え、移動元の文である、基本ブロックＢ４内の代入文ｄ：＝ｂ＋ｂの位置をｔとし、移動先である、基本ブロックＢ２内の代入文ｃ：＝ａ＋ａの位置をｓとしてみる。
【０１５２】
図６からも判るように、ｓからｔに向かうすべての経路を考えると、経路上の位置ｓには、経路内からの合流Ｒ６の他に経路外からの合流Ｒ２を含むが、それ以外の位置では経路外からの合流はない。また、経路上の位置ｔには、経路内への分岐Ｒ６の他に経路外への分岐Ｒ７を含むが、それ以外の位置では経路外への分岐はない。
【０１５３】
したがって、上記の条件▲１▼及び▲２▼をともに満足するので、ｓが先、ｔが後であることがわかる。本図の例では、この前後関係の元で、後に述べる条件▲３▼及び▲４▼も満たしているため、基本ブロックＢ４内の代入文ｄ：＝ｂ＋ｂを基本ブロックＢ２内の代入文ｃ：＝ａ＋ａの位置まで移動することができる。このように代入文の移動を適用した結果の制御フロー・グラフを図７に示しておく。
【０１５４】
次に、図８に示すような制御フローグラフのプログラムにおいて、基本ブロック間で代入文を移動する場合について検討してみる。
【０１５５】
図示のプログラム中からは、同じ演算を異なるデータに適用している代入文として、基本ブロックＢ１２内の代入文ｃ：＝ａ＋ａと、基本ブロックＢ１５内の代入文ｄ：＝ｂ＋ｂが抽出される。ここで、基本ブロックＢ１２内の代入文ｄ：＝ｂ＋ｂを、基本ブロックＢ１５内の代入文ｃ：＝ａ＋ａの位置に移動することを考えてみる。
【０１５６】
ここで、基本ブロックＢ１２内の代入文ｃ：＝ａ＋ａの位置をｓとし、基本ブロックＢ１５内の代入文ｄ：＝ｂ＋ｂの位置をｔとした場合について考えてみる。
【０１５７】
図８からも判るように、経路上の位置ｔ以外の位置でも、位置ｓにおいて経路外への分岐Ｒ１８が存在する。すなわち、上記の条件▲２▼を満足しないので、これは正しい前後関係ではない。この例では、前後を入れ替えても、条件▲１▼及び▲２▼を満たさないので、前後関係を決めることができず、移動の対象としない。
【０１５８】
プログラムの前後関係を判定する上記の２つの条件▲１▼及び▲２▼を考慮した上で、移動したい代入文をａとしたときに、ｓからｔへ向かういずれの経路においてもさらに以下に示す２つの条件を満たす場合に限り、代入文の移動を許可する。
【０１５９】
▲３▼ａの使用（又は参照）する変数の定義がない
▲４▼ａの定義する変数の使用（又は参照）はなく定義はａしかない。
【０１６０】
ここで、代入文ａを"Ｘ＝Ｘ＋Ｚ"とした場合、ａの使用・参照する変数とはＸ並びにＺのことであり、ａの定義する変数はＸのことである。
【０１６１】
例えば、以下に示すような複数の代入文からなるプログラムを考えた場合、
【０１６２】
【数１５】
0004045802.tif 000015
【０１６３】
比較演算を含む各代入文は、プログラムの最初の位置まで移動することができる。同様に、減算を含む各代入文は、最後の位置に移動することができる。そして、同じ演算を異なるデータに適用しているそれぞれの代入文の塊を、ｐａｒａｌｌｅｌを使って、以下に示すように１箇所にまとめることができる。
【０１６４】
【数１６】
0004045802.tif 000016
【０１６５】
上記に示した代入文の移動は、いずれも、プログラムの意味の同一性を判断するためのすべての条件▲１▼〜▲４▼を満足している、という点を充分理解されたい。
【０１６６】
ｐａｒａｌｌｅｌ式でまとめるこの処理段階では、ＳＩＭＤ命令の並列度を考慮しないので、後の処理過程では、ここでまとめられた代入文の一部又は全部がＳＩＭＤ命令にならない場合がある。
【０１６７】
なお、ベクトル化することが可能なループも、適当な回数だけ展開することで、この段階での処理に帰着することができる。
【０１６８】
Ｃ−４−５．命令とレジスタの制約の適用
ここまでの処理では、ＳＩＭＤ命令を適用するために、プログラム中で同じ演算を異なるデータに適用しているものを見つけて、ｐａｒａｌｌｅｌを使って１箇所にまとめられている。
【０１６９】
例えば、演算としてはＳＩＭＤ命令で実行可能とされたものでも、結果を格納するレジスタがソースの一方と同じであることが必要な場合がある。また、比較が一方しか使えない場合や、特定のレジスタを必要としたりするなどの命令の制約がある場合がある。
【０１７０】
このため、命令セットによってはレジスタの使用に制約が課されていることがあるので、これを適用して、プログラムの一部を書き換える処理を行なう。また、適用した結果、挿入された命令がさらに適用の対象になることもあるので、適用は繰り返し行なう。
【０１７１】
ＳＩＭＤ加算命令のソース・オペランドの一方に加算結果が格納されるような命令セットの場合（例えば、ＭＭＸ命令）、例えば以下に示すような加算命令からなるｐａｒａｌｌｅｌ式は、
【０１７２】
【数１７】
0004045802.tif 000017
【０１７３】
ｔ０，ｔ１，ｔ２，ｔ３の古い値が以後使用されないという前提で、以下のように書き換えられる。また、ｓ４，ｓ８，ｓ１２，ｓ１６を使っている箇所も、ｔ０，ｔ１，ｔ２，ｔ３に書き換えられる。
【０１７４】
【数１８】
0004045802.tif 000018
【０１７５】
また、ＳＩＭＤ比較命令でより大きいかどうかの判定はできないが、より小さいかどうかの判定ができるような命令セットの場合には、より大きいかどうかの判定を行なう複数の比較命令で構成された以下のｐａｒａｌｌｅｌ式は、
【０１７６】
【数１９】
0004045802.tif 000019
【０１７７】
より小さいかどうかの判定を行なう比較命令に書き換えられた以下のｐａｒａｌｌｅｌ式に書き換えられる。
【０１７８】
【数２０】
0004045802.tif 000020
【０１７９】
Ｃ−４−６．ＳＩＭＤレジスタの割当
最後に、中間表現されたプログラム中でｐａｒａｌｌｅｌ式を使って１箇所にまとめられている代入文のうち、１つのＳＩＭＤ命令で処理できるものを選んで、その代入文が使用又は定義する変数をそれぞれＳＩＭＤレジスタに対するｓｕｂｒｅｇ式に置き換える。このようにしてｓｕｂｒｅｇ式の繰り返しで構成されたｐａｒｅｌｌｅｌ文（例えば、図２を参照のこと）は、中間表現であるが、ＳＩＭＤ命令に置き換わったすなわち最適化されたものと等価である。
【０１８０】
ｐａｒａｌｌｅｌ式でまとめられた代入文からＳＩＭＤ命令で処理できるものを取捨選択していく過程で、ＳＩＭＤ命令の並列性が余った場合には、ダミーの代入を付け加えてｐａｒａｌｌｅｌ内が１つのＳＩＭＤ命令に対応するようにする。
【０１８１】
また、上述したレジスタの制約の適用ができないＳＩＭＤ命令であれば、それを考慮してＳＩＭＤレジスタ中のサブオペランドの位置を決めるようにする。
【０１８２】
図９には、プログラム中からＳＩＭＤ命令で処理できる代入文を選んで、代入文が使用又は定義する変数をＳＩＭＤレジスタに割り当てるための処理手順をフローチャートの形式で示している。但し、この処理に投入されるプログラムは、ＲＴＬで中間表現されたものであり、同じ演算を異なるデータに適用している複数の代入文がｐａｒａｌｌｅｌ分を使って１箇所にまとめられているものとする。以下、図示のフローチャートを参照しながら代入文が使用又は定義する変数をＳＩＭＤレジスタに割り当てるための処理について説明する。
【０１８３】
まず、プログラムの先頭から順に、処理対象となるｐａｒｅｌｌｅｌ式を１つ取り出す（ステップＳ１）。もしプログラム中のすべてのｐａｒａｌｌｅｌ式について、以下に示すレジスタ割当処理が終了していれば（ステップＳ２）、本処理ルーチン全体を終了する。
【０１８４】
次いで、ｐａｒａｌｌｅｌ式に含まれている代入文の個数が、代入文が適用する演算に対応するＳＩＭＤ命令１つで処理できる数以下かどうかをチェックする（ステップＳ３）。
【０１８５】
ｐａｒａｌｌｅｌ式に含まれている代入文の個数が、代入文が適用する演算に対応するＳＩＭＤ命令１つで処理できる数を越える場合には、ＳＩＭＤ命令１つで処理できる個数の代入文を取り除いて、別のｐａｒａｌｌｅｌ式を作ってプログラムに挿入する（ステップＳ４）。
【０１８６】
そして、作ったｐａｒａｌｌｅｌ式に含まれる各代入文において使用又は定義している変数をＳＩＭＤレジスタに対するｓｕｂｒｅｇ式にそれぞれ置換する（ステップＳ５）。レジスタの制約の適用（上述）ができなかったＳＩＭＤ命令であれば、それを考慮して、ＳＩＭＤレジスタ中のサブオペランドの位置を決めるようにする。
【０１８７】
その後、ステップＳ１に戻って、プログラム中の次のｐａｒａｌｌｅｌ式について、上述と同様のＳＩＭＤレジスタ割当処理を繰り返し実行する。
【０１８８】
他方、ステップＳ３において、ｐａｒａｌｌｅｌ式に含まれている代入文の個数が、代入文が適用する演算に対応するＳＩＭＤ命令１つで処理できる数以下と判断された場合には、さらに、代入文の個数が所定の閾値ｍｉｎ_ｓｉｍｄ以上かどうかをチェックする（ステップＳ６）。
【０１８９】
ｐａｒａｌｌｅｌ式に含まれる代入文の個数がｍｉｎ_ｓｉｍｄ以上である場合には、ダミーの代入文を付け加えて、ちょうどＳＩＭＤ命令１つで処理できる代入文の個数にしてから（ステップＳ７）、各代入文において使用又は定義している変数をＳＩＭＤレジスタに対するｓｕｂｒｅｇ式にそれぞれ置換する（ステップＳ８）。レジスタの制約の適用（上述）ができなかったＳＩＭＤ命令であれば、それを考慮して、ＳＩＭＤレジスタ中のサブオペランドの位置を決めるようにする。
【０１９０】
その後、ステップＳ１に戻って、プログラム中の次のｐａｒａｌｌｅｌ式について、上述と同様のＳＩＭＤレジスタ割当処理を繰り返し実行する。
【０１９１】
また、ｐａｒａｌｌｅｌ式に含まれる代入文の個数がｍｉｎ_ｓｉｍｄ未満である場合には、ｐａｒａｌｌｅｌ式を外して、これら代入文をＳＩＭＤ命令に置き換えること、すなわち最適化することを諦める（ステップＳ９）。その後、ステップＳ１に戻って、プログラム中の次のｐａｒａｌｌｅｌ式について、上述と同様のＳＩＭＤレジスタ割当処理を繰り返し実行する。
【０１９２】
上記で使用された値ｍｉｎ_ｓｉｍｄは、ダミー文を挿入してＳＩＭＤ命令にすることと、ダミー文を挿入せずＳＩＭＤ命令にすることをあきらめることのいずれが最適であるかを判断するための閾値である。
【０１９３】
ここで、ステップＳ５及びＳ８において、代入文をＳＩＭＤレジスタに対するｓｕｂｒｅｇ式に置き換えるための処理について詳解する。
【０１９４】
もし、ＳＩＭＤレジスタがあふれた場合は、適当なロード・ストア命令を挿入する。
【０１９５】
また、使用又は定義の対象がメモリ上の値である場合にも、必要に応じてＳＩＭＤレジスタに対するロード・ストア命令を挿入する。この際、変数の並び順の制約が必要になることがあるときには、制約情報を生成する。
【０１９６】
また、ＳＩＭＤ命令にできない代入文との間で定義・使用関係があるときや、ＳＩＭＤ命令同士でも基本ブロックの境界などで調整が必要な場合は、調整命令や適当な変換命令を挿入する。挿入する命令のコストが大きいときには、ＳＩＭＤ命令を使うことを諦める。
【０１９７】
Ｄ．Ｃｏｉｎｓコンパイラとの接続
Ｄ−１．Ｃｏｉｎｓコンパイラの概要
「Ｃｏｉｎｓコンパイラ」は、文部科学省科学技術振興調整費による、並列コンパイラ向け共通インフラストラクチャの研究（２０００年度より５年）で作成されているコンパイラの呼称である。Ｃｏｉｎｓコンパイラは、以下の２つの中間表現を用いている。
【０１９８】
（１）高水準中間表現ＨＩＲ（High level Intermediate Representation）
抽象構造木に近い表現であり、ソース言語の構成要素と一対一に近い対応関係がある。ＨＩＲの文法は、ソース言語に依存しない。
【０１９９】
（２）低水準中間表現ＬＩＲ（Low level Intermediate Representation）
レジスタやメモリの値の変更などを表す式の並びであり、マシン命令の意味を表現することができる。ＬＩＲの文法は、マシン非依存である。
【０２００】
Ｃｏｉｎｓコンパイラは、Ｊａｖａ言語で実装されているので、ホストマシン依存性に関しては、考慮する必要はほとんどない。Ｊａｖａ以外の言語のコンパイラを作る場合には、型のサイズや演算子の違いを明確にしておく必要はあるが、Ｃ言語でＣ言語のクロスコンパイラを作る場合の問題に比べれば、ホストマシンは常に同一とみなすことができるので、扱いは容易である。
【０２０１】
ＨＩＲは、ソース言語に近いレベルでの処理を行なうためのものであり、ソース言語に依存した最適化、例えばＣ言語での副作用順序の変更はＨＩＲで行なう。ＨＩＲの形式は、勿論、対象とするアーキテクチャ非依存であるが、生成されたＨＩＲには、対象とするアーキテクチャに依存した値が含まれる。例えば、Ｃ言語ではｉｎｔの大きさは実装によって異なるので、同じソース・プログラムから生成されたＨＩＲであっても一通りではない。ＨＩＲの生成や変換を行う際には、各型のサイズやアラインメントなどが記録されたマシン・パラメータを参照する。
【０２０２】
また、ＬＩＲは、各種の最適化から、コード生成、マシン後レベルでの最適化まで使われるものがある。コード生成より前の段階では、ＬＩＲはマシン命令に対応しているのではなく、以下のような抽象化が行われている。
【０２０３】
▲１▼マシンの物理レジスタではなく、仮想レジスタを使える。仮想レジスタには数の制限はない。仮想レジスタは、パターン・マッチングでマッチしたマシン命令でのレジスタ使用の制約に基づいて、物理レジスタ割当で物理レジスタが割り当てられる。
【０２０４】
▲２▼ローカル変数はスタック・フレームを参照する式ではなく、ＦＲＡＭＥ式で表現される。ＦＲＡＭＥ式は、変数のアドレスを表す式であり、フレーム割当でフレーム・ポインタ（場合によっては、スタック・ポインタ）からの相対アドレスに変換される。
【０２０５】
▲３▼固定したアドレスに確保される変数（Ｃ言語の関数外で定義された変数など）は、ＳＴＡＴＩＣ式で表現される。
【０２０６】
ＬＩＲには、ＳＴＡＴＩＣ式、ＦＲＡＭＥ式で表される変数の型やアラインメントなどを保持するテーブルや、初期値のある、あるいは内、データ領域を表すデータ定義も含まれており、１つのコンパイル単位、あるいはオブジェクト・ファイル全体の情報を表現している。
【０２０７】
現在、ＣｏｉｎｓコンパイラはＳＰＡＲＣプロセッサ用のＣコンパイラの部分の作成が進んでおり、それは以下に示すような各フェーズに区分することができる。
【０２０８】
(１)ソース・プログラムをＨＩＲ−Ｃに変換
(２)Ｃ言語に依存したプログラム変換
(３)ＨＩＲ−ＣをＨＩＲ−ｂａｓｅに変換
(４)高水準最適化
(５)ＨＩＲ−ｂａｓｅをＬＩＲに変換
(６)仮想レジスタ割付
(７)低水準最適化
(８)フレーム割当
(９)パターン・マッチング
(10)物理レジスタ割当
(11)マシン語レベルでの最適化
(12)アセンブラ・コード生成
【０２０９】
まず、Ｃ言語のソース・プログラムは、Ｃ言語独自の演算子などを表現するために拡張したＨＩＲ−Ｃに変換される。Ｃ言語に依存したプログラム変換を行った後、拡張部分のないＨＩＲである、ＨＩＲ−ｂａｓｅに変換される。
【０２１０】
ＨＩＲ−ｂａｓｅ上で高水準最適化を行ってからは、ＬＩＲに変換される。ＬＩＲでは、まず仮想レジスタ割付を行ってから、低水準最適化を行い、フレーム割当、パターン・マッチング、物理レジスタ割当を経て、具体的なマシン命令を表すＬＩＲに変換される。
【０２１１】
その後、命令スケジューリングなどのマシン語レベルの最適化を行い、最後にアセンブリ言語のプログラムが生成される。
【０２１２】
幾つかのある最適化は、実際には複数の最適化が適当な順序で必要に応じて繰り返し適用されることになる。また、他のフェーズも必要なら、何度も適用されることがある。
【０２１３】
Ｄ−２．Ｃｏｉｎｓコンパイラを利用する理由
ＳＩＭＤ命令を使った最適化は、独立した処理のように見えるが、コンパイラに通常組み込まれている、いろいろな解析結果を必要としている。例えば、以下に示すＣ言語のプログラムは、ループのベクトル化が可能である。
【０２１４】
【数２１】
0004045802.tif 000021
【０２１５】
しかしながら、以下のように変わっただけで、ポインタの別名問題のため、ベクトル化は誤りとなる。
【０２１６】
【数２２】
0004045802.tif 000022
【０２１７】
これをうまく扱うためには、ポインタ解析などの一般的な枠組みが別にあって、別名の問題のないものを仮想レジスタ割付の対象にするなどの前提が必要になる。
【０２１８】
ポインタ解析は、それだけで大きな研究対象であり、独立して開発するのは効率が悪く、インフラストラクチャとして利用するべきものである。他にも、手続き間最適化など、必要なものはいろいろある。そのため、Ｃｏｉｎｓコンパイラを利用して、上述した最適化を行うことにする。
【０２１９】
Ｄ−３．ＳＩＭＤ命令を使った最適化の組み込み方法
ＳＩＭＤ命令を使った最適化は、Ｃｏｉｎｓコンパイラで行われる以下の３箇所の最適化の１つあるいは複数で実現することになる。
【０２２０】
▲１▼高水準最適化
▲２▼低水準最適化
▲３▼マシン語レベルでの最適化
【０２２１】
まず、ＨＩＲではＲＴＬに基づく方法を使用で気ないので、高水準最適化は除外される。
【０２２２】
次いで、マシン語レベルでの最適化を行なうと、フレーム割当や物理レジスタ割当の後になるため、物理レジスタやスタック・フレームにある値をＳＩＭＤレジスタに割り当て直すのは解析が難しい上、レジスタ割り当てがやり直しになってしまう。また、ＳＩＭＤレジスタ割当では、ＳＩＭＤ命令にできなかったものを後で通常の命令にするという前提なので、通常のパターン・マッチングより先に済ませておく必要がある。
【０２２３】
結局、ＳＩＭＤ命令を使った最適化は、６つあるフェーズ（図３を参照のこと）をすべて低水準最適化の一部として実現することにする。この場合、その後のフェーズでは、ＳＩＭＤ物理レジスタやＳＩＭＤ命令に対するｓｕｂｒｅｇ式やｐａｒａｌｌｅｌ式を含むＬＩＲを扱う必要が出てくる。現在のところ、これらを扱うための変更は、フレーム割当フェーズ以降に限り、ＳＩＭＤ命令を使った最適化を低水準最適化の最後で行なうこととしている。
【０２２４】
Ｃｏｉｎｓコンパイラを用いた実現では、以下のようなメリットがある。
【０２２５】
▲１▼ＳＩＭＤ命令のサブオペランドになりうる値が仮想レジスタにのっていると仮定して処理することができる。
▲２▼定数伝搬や別名解析が済んでいると仮定できる。
▲３▼ＳＩＭＤ命令にできなかった部分の処理を任せられる。
▲４▼変数の使用定義関係、生きている変数の解析などに、Ｃｏｉｎｓコンパイラのインフラストラクチャ部分を利用することができる。
【０２２６】
しかしながら、そのため、Ｃｏｉｎｓコンパイラに対して以下のような部分的な変更を加える必要がある。
【０２２７】
▲１▼ＳＩＭＤ命令を使った最適化で呼び出すコード解析部がｐａｒａｌｌｅｌ式に対応すること。
▲２▼フレーム割当以降のフェーズがＳＩＭＤ物理レジスタとｓｕｂｒｅｇ式に対応すること。
▲３▼マシン命令によくある偽の依存関係に対応すること（排他的論理輪を使ってゼロにするときは使用とはみなさないなど）。
▲４▼生成したＳＩＭＤ命令を壊さないこと。
▲５▼変数の並びの制約をアドレス固定の変数の並びに反映させること。
【０２２８】
現在残っている問題点は、ＳＩＭＤ命令を使ったために、別の自明でない最適化が必要になるもの、例えばループ不変式の追い出しがこのままではできないことである。独自のループ最適化フェーズを実装する必要があるかもしれない。
【０２２９】
［追補］
以上、特定の実施形態を参照しながら、本発明について詳解してきた。しかしながら、本発明の要旨を逸脱しない範囲で当業者が該実施形態の修正や代用を成し得ることは自明である。すなわち、例示という形態で本発明を開示してきたのであり、本明細書の記載内容を限定的に解釈するべきではない。本発明の要旨を判断するためには、冒頭に記載した特許請求の範囲の欄を参酌すべきである。
【０２３０】
【発明の効果】
以上詳記したように、本発明によれば、コンパイル時などにおいて実際の処理効率や処理速度を向上させるための最適化を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することができる。
【０２３１】
また、本発明によれば、複数のデータを同時に処理するためのＳＩＭＤ（Single Instruction／Multiple Data）命令を含んだ命令セットを持つアーキテクチャを対象としてプログラムに対してコンパイルなどの処理を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することができる。
【０２３２】
また、本発明によれば、ＳＩＭＤ命令の特徴を活かしたプログラムの最適化を自動的に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することができる。
【０２３３】
また、本発明によれば、特殊な演算子を持つ命令を利用するとともに、データ・サイズの混合した演算をうまく扱うことで、より難易度の高いＳＩＭＤ命令を使用したプログラムの最適化を実現することができる。
【０２３４】
また、本発明によれば、元のプログラム・コードを中間表現に変換して、並列に実行できる操作を単に検出するだけでなく、特殊な演算子を使用したり、データ・サイズの混合した命令の一部を使用できるようにすることで、より難易度の高いＳＩＭＤ命令を使用したプログラムの最適化を実現することができる。
【図面の簡単な説明】
【図１】本実施形態に係るプログラム処理装置１００のハードウェア構成を模式的に示した図である。
【図２】ＭＭＸ命令をＲＴＬで中間表現した例を示した図である。
【図３】ソース・プログラムを中間表現するための手順を示したフローチャートである。
【図４】ＳＩＭＤ命令で行なうことができる特殊な演算子を含んだ基本ブロックの他の構成例を示した図である。
【図５】図４に示した基本ブロックのうち最右上のブロックをＤＡＧに変換した例を示した図である。
【図６】プログラムの基本ブロック構成例を示した図である。
【図７】プログラムの基本ブロック構成例を示した図であり、より具体的には、図６に示したプログラムに対して代入文の移動を適用した結果を示した図である。
【図８】プログラムの基本ブロック構成例を示した図である。
【図９】プログラム中からＳＩＭＤ命令で処理できる代入文を選んで、代入文が使用又は定義する変数をＳＩＭＤレジスタに割り当てるための処理手順を示したフローチャートである。
【符号の説明】
１００…プログラム処理装置
１０１…ＣＰＵ，
１０２…主メモリ，１０３…ＲＯＭ
１０４…ディスプレイ・コントローラ
１０５…入力機器インターフェース
１０６…ネットワーク・インターフェース
１０７…外部機器インターフェース
１０８…バス
１１１…ディスプレイ
１１２…キーボード，１１３…マウス
１１４…ハード・ディスク装置
１１５…メディア・ドライブ
【図１】
0004045802.tif 000023
【図２】
0004045802.tif 000024
【図３】
0004045802.tif 000025
【図４】
0004045802.tif 000026
【図５】
0004045802.tif 000027
【図６】
0004045802.tif 000028
【図７】
0004045802.tif 000029
【図８】
0004045802.tif 000030
【図９】
0004045802.tif 000031