JP4045802B2 - プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム - Google Patents

プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム Download PDF

Info

Publication number
JP4045802B2
JP4045802B2 JP2002001092A JP2002001092A JP4045802B2 JP 4045802 B2 JP4045802 B2 JP 4045802B2 JP 2002001092 A JP2002001092 A JP 2002001092A JP 2002001092 A JP2002001092 A JP 2002001092A JP 4045802 B2 JP4045802 B2 JP 4045802B2
Authority
JP
Japan
Prior art keywords
program
sub
assignment
operand
instruction
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2002001092A
Other languages
English (en)
Other versions
JP2003202991A5 (ja
JP2003202991A (ja
Inventor
順久 藤波
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sony Corp
Original Assignee
Sony Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sony Corp filed Critical Sony Corp
Priority to JP2002001092A priority Critical patent/JP4045802B2/ja
Publication of JP2003202991A publication Critical patent/JP2003202991A/ja
Publication of JP2003202991A5 publication Critical patent/JP2003202991A5/ja
Application granted granted Critical
Publication of JP4045802B2 publication Critical patent/JP4045802B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は、コンピュータ上で実行されるプログラム・コードを処理するプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに係り、特に、プログラマによって高級プログラミング言語形式で記述されたソース・コードを、対象とするアーキテクチャが実行可能な命令セットを用いて記述された形式すなわちオブジェクト・コードにコンパイル処理するプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに関する。
【0002】
さらに詳しくは、本発明は、プログラムのコンパイル時などにおいて実際の処理効率や処理速度を向上させるための最適化を行なうプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに係り、特に、複数のデータを同時に処理するためのSIMD(Single Instruction/Multiple Data)命令を含んだ命令セットを持つアーキテクチャを対象としてプログラムの最適化処理を行なうプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムに関する。
【0003】
【従来の技術】
昨今の技術革新に伴い、さまざまなアーキテクチャのコンピュータ・システムが開発され広汎に普及している。コンピュータは、コンピュータ可読形式で記述されたプログラム・コードを実行することによって、産業上のさまざまな制御や適用業務など、所望の処理を実行することができる。
【0004】
コンピュータ・プログラムは、一般に、プログラマによって高級プログラミング言語形式で記述されたソース・コードを、対象とするアーキテクチャが実行可能な命令セットを用いて記述された形式すなわちオブジェクト・コードに変換すなわちコンパイルして用いられる。そして、コンパイル処理時には、実際の処理効率を向上し処理の高速化を実現するために変更を加える「最適化」を行なうことが多い。
【0005】
ところで、近年のマイクロプロセッサのほとんどは、SIMD(Single Instruction/Multiple Data)型のマルチメディア向け拡張命令(以下、単に「SIMD命令」とする)を備えている。また、プロセッサ・メーカやサード・パーティーからは、SIMD命令を使ったコードを生成するコンパイラも提供されている。
【0006】
ここで言うSIMD命令とは、同じ演算を繰り返し実行するような処理を一括して行なえるような命令のことであり、より具体的には、大きなサイズのオペランドを小さな「サブオペランド」に分割して同種の演算を一斉に処理する。SIMD命令によれば、1つの命令で複数のデータに対して同じ種類の演算を一斉に行うようにして、プロセッサ全体のデータ処理能力を高めることができる。したがって、ソース・コード中で、本来は独立して記述されている同機能の命令を寄せ集めてSIMD命令に置き換えることにより、コードが持つ冗長性が削除され、プログラムの最適化を行なうことができる。
【0007】
例えば、音声や画像などのマルチメディア・データに対する処理、あるいは3次元グラフィックスなどにおいては、固定的なフォーマットのデータに対して、同じ種類の演算を繰り返し適用することが多い。そこで、SIMD命令を用いることによって、多量のデータに対して同じ種類の演算を一括して行なうことができ、プロセッサ全体のデータ処理能力を高めることができる。
【0008】
SIMDで取り扱われるデータの形式や命令セットは、プロセッサのアーキテクチャごとに異なるが、一般的には、1つの命令で64ビット(又は128ビット)のデータを一括して処理を行うことができる。この64ビットのデータ幅の中に、8、16、32ビット幅の整数型データ、あるいは32ビット幅の浮動小数点型データを複数詰め込んで、1つのSIMD命令ですべてのデータに対して同時に処理を行う。例えば画像処理ソフトウェアなどでは、64ビットのオペランドを各8ビットのサブオペランドに分割することにより、固定小数点データを8個同時に格納して、一度に8ピクセル分の処理を行なうことができる。
【0009】
先述したように、プログラムのコンパイル時に最適化が行なわれるので、コンパイラが同じ演算を繰り返し実行するような処理を1箇所にまとめてSIMD命令に置き換えることができれば都合がよい。
【0010】
しかしながら、コンパイラが自動的にSIMD命令を使ってくれる場面は極めて限定されており、従来から研究されているベクトル化の技術をそのまま適用したに過ぎないと言ってもよい。多くの場合、SIMD命令を使うためには、プログラマは、SIMD命令対応のコンパイラで拡張されたデータ型を明示的に使用するとともに、命令に対応する関数(intrinsic)を明示的に呼び出さなければならない。
【0011】
このような状況下では、これらの拡張機能に使用したプログラムは、高級言語で記述されているにも拘わらず、特定のSIMD命令セットに依存したものになってしまう。このため、プログラムを別のプロセッサ・アーキテクチャに移植して充分な性能を発揮させるためには、プログラム・コードの大幅な書き換えが必要となる。また、単にプログラムを改良する場合であっても、性能を落さないようにするには、SIMD命令セットの充分な知識が必要になる。すなわち、プログラムの移植性やメンテナンス性を著しく阻害する。
【0012】
【発明が解決しようとする課題】
本発明の目的は、コンパイル時などにおいて実際の処理効率や処理速度を向上させるための最適化を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することにある。
【0013】
本発明のさらなる目的は、複数のデータを同時に処理するためのSIMD(Single Instruction/Multiple Data)命令を含んだ命令セットを持つアーキテクチャを対象としてプログラムに対してコンパイルなどの処理を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することにある。
【0014】
本発明のさらなる目的は、SIMD命令の特徴を活かしたプログラムの最適化を自動的に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することにある。
【0015】
【課題を解決するための手段及び作用】
本発明は、上記課題を参酌してなされたものであり、その第1の側面は、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なうプログラム処理装置又はプログラム処理方法であって、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動部又はステップと、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当部又はステップと、
を具備することを特徴とするプログラム処理装置又はプログラム処理方法である。
【0016】
ここで、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令とは、例えばSIMD(Single Instruction/Multiple Data)型のマルチメディア向け拡張命令のことである。
【0017】
SIMD命令は、同じ演算を繰り返し実行するような処理を一括して行なうことができる。本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法は、例えば、高級プログラミング言語形式で記述されたソース・プログラムを対象とするアーキテクチャが実行可能なオブジェクト・プログラムに変換するためのコンパイラが備える機能モジュールの1つとして実装することができ、このコンパイル処理の過程において、SIMD命令を用いて最適化を行なうものである。
【0018】
本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法によれば、代入文移動部又はステップは、処理対照プログラムの中から同じ演算を異なるデータに適用しているものを見つけて、これらをparallel式を使って1箇所にまとめる。次いで、サブオペランド割当部又はステップは、parallel式を使って記述されている代入文のうちSIMD命令1つで処理できるものを抽出して、それが使用・定義する変数をSIMDレジスタに対するsubreg式に置き換える。このようにsubreg式に置き換えられた代入文の集まりは、SIMD命令と等価であり、プログラムの最適化が実現される。
【0019】
本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法は、プログラムを前記代入文移動部又はステップに投入する前に、プログラム中のif文をなくすif変換部又はステップをさらに備えていてもよい。if変換により、基本ブロックの数が減るという効果がある。SIMD命令を使ってプログラムの最適化を行う場合には、最適化手順の最初にif変換を行なうことにより、変換された論理演算も最適化の対象にすることができる。
【0020】
また、本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法は、プログラムを前記代入文移動部又はステップに投入する前に、基本ブロックで構成されるプログラムをDAGに変換するDAG変換部又はステップをさらに備えていてもよい。
【0021】
ここで、基本ブロックとは、プログラムを処理フローの分岐及び合流場所で分割することによって得られる単位のことである。また、DAG(Directed Acyclic Graph)は、有向で繰り返しのないグラフのことである。基本ブロック中の代入文は、DAGで表現することができる。
【0022】
基本ブロックをDAGに変換することによって、局所的な共通部分式を除去することができる。また、SIMD命令を使ってプログラムの最適化を行なう場合には、基本ブロックをDAGに変換することによって、特殊な演算を伴うSIMD命令を利用するためのパターン・マッチングを容易に行なえるように、細かい式を大きな式にまとめることができるという効果がある。
【0023】
また、本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法は、プログラムを前記代入文移動部又はステップに投入する前に、プログラムを有向で繰り返しのないグラフで表現したDAGを前記一斉処理命令で行なえる演算の単位に分解するDAG分解部又はステップをさらに備えていていもよい。
【0024】
また、プログラム中の代入文のうち、同じ演算を異なるデータに適用としているものをparallel式を使って1箇所にまとめる際に、代入文の位置を移動することになる。代入文の移動によってプログラムの意味が変わることのないように、前記代入文移動部又はステップは、所定の判定条件を満足したときのみ、代入文の移動を行なうようにすればよい。例えば、移動元の文の位置sから移動先の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合以外は、当該文の移動を許容しないようにすればよい。
【0025】
また、本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法は、前記代入文移動部又はステップによって並列実行する演算子を用いて1つにまとめられた代入文を、前記一斉処理命令の実行におけるオペランドの使用の制約に従って書き換える制約適用部又はステップをさらに備えていてもよい。
【0026】
また、前記サブオペランド割当部又はステップは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数を越える場合には、前記一斉処理命令1つで処理できる個数の代入文を取り出して、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てるようにしてもよい。
【0027】
また、前記サブオペランド割当部又はステップは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数以下の場合には、ダミーの代入文を付け加えてちょうど前記一斉処理命令1つで処理できる個数になるようにして、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てるようにしてもよい。
【0028】
あるいは、前記サブオペランド割当部又はステップは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数以下の場合には、代入文を該並列式から外して前記一斉処理命令への置き換えを諦めるようにしてもよい。例えば、ダミー命令の挿入によってSIMD命令を使っても、かえって命令のコストが大きくなる場合など最適化にならない場合には、SIMD命令の使用を諦める。
【0029】
また、本発明の第2の側面は、複数の代入文を含んだプログラムを処理するプログラム処理装置又はプログラム処理方法であって、
移動元の文の位置sから移動先の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合、又は、
移動先の文の位置sから移動元の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合、
以外は、当該文の移動を許容しない、
ことを特徴とするプログラム処理装置又はプログラム処理方法である。
【0030】
一般に、コンピュータ・プログラムのコンパイル時に行なう最適化処理やその他の局面において、プログラムの代入文の並びを移動させたい場合があるが、無制限に移動させてしまうと、プログラムの意味が同じでなくなってしまう危険がある。そこで、本発明の第2の側面に係るプログラム処理装置又はプログラム処理方法によれば、移動元の文の位置sから移動先の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合、又は、移動先の文の位置sから移動元の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合、以外は、当該文の移動を許容しないようにすることで、プログラムの意味の同一性を維持するようにした。
【0031】
また、本発明の第3の側面は、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ・システム上で実行するように記述されたコンピュータ・ソフトウェアをコンピュータ可読形式で物理的に格納した記憶媒体であって、前記コンピュータ・ソフトウェアは、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動ステップと、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当ステップと、
を具備することを特徴とする記憶媒体である。
【0032】
本発明の第3の側面に係る記憶媒体は、例えば、さまざまなプログラム・コードを実行可能な汎用コンピュータ・システムに対して、コンピュータ・ソフトウェアをコンピュータ可読な形式で提供する媒体である。このような媒体は、例えば、DVD(Digital Versatile Disc)、CD(Compact Disc)やFD(Flexible Disk)、MO(Magneto-Optical disc)などの着脱自在で可搬性の記憶媒体である。あるいは、ネットワーク(ネットワークは無線、有線の区別を問わない)などの伝送媒体などを経由してコンピュータ・ソフトウェアを特定のコンピュータ・システムに提供することも技術的に可能である。
【0033】
また、本発明の第3の側面に係る記憶媒体は、コンピュータ・システム上で所定のコンピュータ・ソフトウェアの機能を実現するための、コンピュータ・ソフトウェアと記憶媒体との構造上又は機能上の協働的関係を定義したものである。換言すれば、本発明の第3の側面に係る記憶媒体を介して所定のコンピュータ・ソフトウェアをコンピュータ・システムにインストールすることによって、コンピュータ・システム上では協働的作用が発揮され、本発明の第1の側面に係る画プログラム処理装置又はプログラム処理方法と同様の作用効果を得ることができる。
【0034】
また、本発明の第4の側面は、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ・システム上で実行するように記述されたコンピュータ・プログラムであって、
プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動ステップと、
該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当ステップと、
を具備することを特徴とするコンピュータ・プログラムである。
【0035】
本発明の第4の側面に係るコンピュータ・プログラムは、コンピュータ・システム上で所定の処理を実現するようにコンピュータ可読形式で記述されたコンピュータ・プログラムを定義したものである。換言すれば、本発明の第4の側面に係るコンピュータ・プログラムをコンピュータ・システムにインストールすることによって、コンピュータ・システム上では協働的作用が発揮され、本発明の第1の側面に係るプログラム処理装置又はプログラム処理方法と同様の作用効果を得ることができる。
【0036】
本発明のさらに他の目的、特徴や利点は、後述する本発明の実施形態や添付する図面に基づくより詳細な説明によって明らかになるであろう。
【0037】
【発明の実施の形態】
以下、図面を参照しながら本発明の実施形態について詳解する。
【0038】
A.SIMD命令の特徴
近年のマイクロプロセッサの持つSIMD命令で典型的なものは、大きなサイズのレジスタのデータを、小さなサイズのデータが複数集まったものとみなして、それぞれに対して同じ演算を行なう命令である。
【0039】
例えば、米インテル社製のx86系のマイクロプロセッサにおけるSIMD命令であるMMX(multimedia extension)命令では、下記の命令は、64ビット・レジスタMM0の内容を8個の8ビット数とみなし、64ビット・レジスタMM1に対応する8ビット数とそれぞれ加算して、その結果をレジスタMM0に格納する。
【0040】
【数3】
Figure 0004045802
【0041】
以下では、この8ビット数のような個々の演算対象のことを「サブオペランド」と呼ぶことにする。
【0042】
表1には、近年の代表的なマイクロプロセッサ・アーキテクチャがそれぞれ持つSIMD命令セットの幾つかの特徴を挙げている。
【0043】
【表1】
Figure 0004045802
【0044】
上表において使用レジスタの欄では、各アーキテクチャにおいて、SIMD命令で使えるレジスタ(以下、SIMDレジスタ)が、通常の整数レジスタと共通、通常の浮動小数点レジスタと共通、あるいは専用のレジスタがあるかの区別と、レジスタの個数を表している。
【0045】
また、データ型の欄では、各アーキテクチャにおいて、典型的な命令で扱えるサブオペランドのビット長(Fで始まるものは浮動小数点数)と個数を示している。
【0046】
また、比較演算結果の欄では、SIMD比較命令の結果がどこに入るかを示している。ビットマスクとなっている場合、SIMDレジスタの対応するサブオペランドのすべてのビットが1あるいはすべてのビットが0になることで比較結果が表現される。
【0047】
比較演算結果がビットマスクになる場合、SIMD論理演算命令と組み合わせれば、条件分岐命令なしで各サブオペランドに対する条件付実行を行なうことができる。比較演算結果が整数レジスタに入るVISの場合、条件付ストア命令を使うことで、同様の効果が得られる。
【0048】
上記の表1を参照する限りでは、SIMD命令を並列度の小さいベクトル命令の一種とみなして、ループのベクトル化を適用すればSIMD命令を活用することができると思料される。比較演算を使った条件付実行についても、if変換と同じようなことを行なえば対応可能である。
【0049】
しかしながら、SIMD命令とベクトル命令では、並列度とコストのバランスが相違する。
【0050】
ベクトル命令は、並列度が高いので、使用できれば大幅な速度向上を期待することができる反面、オーバーヘッドが大きいため、使用する場所をうまく選ぶ必要がある。一方、SIMD命令は、通常の命令と同程度のコストで実行することができるので、積極的に使用する意味があるが、並列度が低いので大幅な速度向上は難しい。略言すれば、SIMD命令には以下の特徴がある。
【0051】
(1)並列度はあまり大きくない。
(2)実行コストは低い。
【0052】
なお、SIMD命令には、上述した以外にも特徴的な命令が含まれている。例えば、次のようなものを挙げることができる。
【0053】
▲1▼飽和加減算
整数の加減算の結果がオーバーフローしたときに、そのビット数で表せる最大値又は最小値に飽和させる命令である。オーバーフローの判定は符号付き数として扱う命令もあれば、符号なし数として扱う命令もある。
【0054】
▲2▼最大最小
2つのオペランドの対応する各サブオペランドの大きい方あるいは小さい方を求める命令である。
【0055】
▲3▼飽和縮小
ビット数の小さいデータに変換する際に、変換後のビット数でははみ出す数を最大値又は最小値に飽和させる命令である。
【0056】
▲4▼混ぜ合わせ
2つのオペランド中のサブオペランドの幾つか(例えば下位半分)を、例えば交互に混ぜ合わせる命令である。その演算結果をビット数が2倍になったサブオペランドとみなすなら、他の命令と組み合わせて、ゼロ拡張や符号拡張を実現することができる。
【0057】
▲5▼乗算の上位
乗算の結果は元の2倍のビット数を必要とするが、その上位半分を取り出す命令である。乗算を符号付き数として扱う命令もあれば、符号なし数として扱う命令もある。
【0058】
▲6▼積和演算
乗算とその結果の加算を1つの命令で行なう命令である。
【0059】
▲7▼絶対差の和
2つのオペランドの対応するサブオペランドの差の絶対値をそれぞれ求めて加える命令である。結果は、元のサブオペランドよりビット数が大きくなる。
【0060】
表2には、上述したSIMD命令が表1に示したマイクロプロセッサ・アーキテクチャが持つ各SIMD命令セットに含まれているかどうかを一覧表示している。
【0061】
【表2】
Figure 0004045802
【0062】
これらSIMD命令の特徴を次のようにまとめることができる。すなわち、
【0063】
(1)特殊な演算子
通常の命令のような基本的な演算子ではなく、複合した演算や条件判断を含む演算を行なう。
【0064】
(2)データ・サイズの混合
入力と出力のサブオペランドのサイズや数が異なる命令がある。そのため、入力オペランド中の一部のサブオペランドしか使われなかったり、出力オペランド中の一部のサブオペランドだけ変更されたりすることもある。
【0065】
これらSIMD命令の活用は、ループのベクトル化とは別種の問題であり、従来のプログラム最適化方法の適用範囲外である。だからといってSIMD命令を活用することに効果が小さいという訳ではなく、うまく活用するならば、SIMD命令の並列度を越えた高速化を期待することができる。
【0066】
B.プログラム処理装置の構成
本実施形態に係るプログラム処理装置は、対象とするアーキテクチャが実行可能な命令セットを用いて記述された形式すなわちオブジェクト・コードにコンパイル処理する。また、コンパイル処理時には、実際の処理効率や処理速度を向上させるための最適化を行なう。とりわけ特徴的なのは、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対して同種の演算を一斉に処理するSIMD命令を用いてプログラムの最適化を自動的に行なう、という点である。
【0067】
図1には、本実施形態に係るプログラム処理装置100のハードウェア構成を模式的に示している。
【0068】
メイン・コントローラであるCPU(Central Processing Unit)101は、オペレーティング・システム(OS)の制御下で、各種のアプリケーションを実行する。
【0069】
本実施形態では、CPU101は、例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを実行することができる。また、本実施形態に係るコンパイラは、最適化処理を備えている。最適化処理部の中には、同じ演算を繰り返し実行するような処理を一括して行なえるSIMD命令を使った最適化部を含んでいるが、その処理の詳細については後述に譲る。
【0070】
図示の通り、CPU101は、バス108によって他の機器類(後述)と相互接続されている。
【0071】
主メモリ102は、CPU101において実行されるプログラム・コードをロードしたり、実行プログラムの作業データを一時保管するために使用される記憶装置であり、例えばDRAM(Dynamic RAM)のような半導体メモリが使用される。例えば、エディタ、コンパイラ、オブジェクト・プログラムなどが実行プログラムとして主メモリ102にロードされる。また、編集中・コンパイル中のソース・プログラムや、コンパイラがソース・プログラムをコンパイル処理中に生成するソース・プログラムの中間表現(中間表現は、基本ブロックに分割されることもあり、また、基本ブロックは、DAG(Directed Acyclic Graph)で表現されることもある)、コンパイル処理されたオブジェクト・プログラムなどが作業データとして主メモリ102に一時的に格納される。
【0072】
また、ROM(Read Only Memory)103は、データを恒久的に格納する半導体メモリであり、例えば、起動時の自己診断テスト(POST:Power On Self Test)や、ハードウェア入出力用のプログラム・コード(BIOS:Basic Input/Output System)などが書き込まれている。
【0073】
ディスプレイ・コントローラ104は、CPU101が発行する描画命令を実際に処理するための専用コントローラである。ディスプレイ・コントローラ103において処理された描画データは、例えばフレーム・バッファ(図示しない)に一旦書き込まれた後、ディスプレイ111によって画面出力される。
【0074】
ディスプレイ111の表示画面は、一般に、ユーザからの入力内容やその処理結果、あるいはエラーその他のシステム・メッセージをユーザに視覚的にフィードバックする役割を持つ。また、本実施形態においては、ディスプレイ111の表示画面には、ソース・プログラムを編集するためのエディタ画面や、コンパイル処理中の基本ブロックやDAG、中間表現などの経過データ、オブジェクト・プログラム、オブジェクト・プログラムによる実行内容などを表示出力するために利用される。
【0075】
入力機器インターフェース105は、キーボード112やマウス113などのユーザ入力機器を対話装置100に接続するための装置である。
【0076】
キーボード112やマウス113は、データやコマンドなどのユーザ入力をシステムに取り込む役割を持つ。本実施形態では、キーボード112やマウス113は、エディタの起動、エディタ画面でのソース・プログラムの入力・編集、コンパイラの起動、オブジェクト・プログラムの起動などをユーザが指示するために使用される。
【0077】
ネットワーク・インターフェース106は、Ethernetなどの所定の通信プロトコルに従って、システム100をLAN(Local Area Network)などの局所的ネットワーク、さらにはインターネットのような広域ネットワークに接続することができる。
【0078】
ネットワーク上では、複数のホスト端末(図示しない)がトランスペアレントな状態で接続され、分散コンピューティング環境が構築されている。ネットワーク上では、ソフトウェア・プログラムやデータ・コンテンツなどの配信サービスを行なうことができる。例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを、ネットワーク経由でダウンロードすることができる。また、コンパイル前のソース・プログラムやコンパイル処理後のオブジェクト・プログラムなどを、ネットワーク経由で他のホスト装置との間で配信・配布することができる。
【0079】
外部機器インターフェース107は、ハード・ディスク・ドライブ(HDD)114やメディア・ドライブ115などの外部装置を本プログラム処理装置100に接続するための装置である。
【0080】
HDD114は、記憶担体としての磁気ディスクを固定的に搭載した外部記憶装置であり(周知)、記憶容量やデータ転送速度などの点で他の外部記憶装置よりも優れている。ソフトウェア・プログラムを実行可能な状態でHDD114上に置くことを、プログラムのシステムへの「インストール」と呼ぶ。通常、HDD114には、CPU101が実行すべきオペレーティング・システムのプログラム・コードや、アプリケーション・プログラム、デバイス・ドライバなどが不揮発的に格納されている。例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを、HDD114上にインストールすることができる。また、編集中・コンパイル中のソース・プログラムや、コンパイラがソース・プログラムをコンパイル処理中に生成するソース・プログラムの中間表現(中間表現は、基本ブロックに分割されることもあり、また、基本ブロックは、DAG(Directed Acyclic Graph)で表現されることもある)、コンパイル処理されたオブジェクト・プログラムなどをHDD114上に蓄積しておいてもよい。
【0081】
メディア・ドライブ115は、CD(Compact Disc)やMO(Magneto-Optical disc)、DVD(Digital Versatile Disc)などの可搬型メディアを装填して、そのデータ記録面にアクセスするための装置である。
【0082】
可搬型メディアは、主として、ソフトウェア・プログラムやデータ・ファイルなどをコンピュータ可読形式のデータとしてバックアップすることや、これらをシステム間で移動(すなわち販売・流通・配布を含む)する目的で使用される。例えば、高級プログラミング言語を用いてソース・プログラムを作成・編集するためのエディタや、ソース・プログラムをオブジェクト・プログラムに変換するためのコンパイラ、コンパイラによって生成されたオブジェクト・プログラムなどを、これら可搬型メディアを利用して複数の機器間で物理的に流通・配布することができる。また、編集中・コンパイル中のソース・プログラムや、コンパイラがソース・プログラムをコンパイル処理中に生成する中間表現、コンパイル処理されたオブジェクト・プログラムなどを他の装置との間で交換するために、可搬型メディアを利用することができる。
【0083】
なお、図1に示すようなプログラム処理装置100の一例は、米IBM社のパーソナル・コンピュータ"PC/AT(Personal Computer/Advanced Technology)"の互換機又は後継機である。勿論、他のアーキテクチャで構成されるコンピュータを、本実施形態に係るプログラム処理装置100として適用することも可能である。
【0084】
C.SIMD命令を用いたプログラムの最適化
C−1.SIMD最適化の到達レベル
A項で既に述べたように、SIMD命令の特徴は以下の4つにまとめることができる。
【0085】
(1)あまり大きくない並列度
(2)低い実行コスト
(3)特殊な演算子
(4)データ・サイズの混合
【0086】
本発明者は、このようなSIMDの特徴を鑑みて、従来のベクトル化の適用を含めてSIMDによるプログラム最適化の到達度として以下の4つの到達レベルに定義した。
【0087】
レベル0: ループのベクトル化
レベル1: ループ以外でも、同じ演算の並列実行が可能なものをSIMD命令にする
レベル2: 特殊な演算子を持つ命令の利用
レベル3: データ・サイズの混合した演算をうまく扱う
【0088】
レベル0では、並列度が小さいために重要となる、前後の命令を含めたスケジューリングや、ループ融合などの他の最適化との相互作用の扱いを含めて考える。
【0089】
レベル1では、例えば、座標計算のように、ソース・プログラム上では別々の変数に対する演算として表現されているものであっても、変数をメモリやレジスタにうまく順次割り当てていくことにより、SIMD命令を適用する。SIMD命令の並列度が余る場合であっても、命令の実行コストが低いので、前後の命令を含めたスケジューリングをきちんと行なうことにより、高速化を期待することができる。
【0090】
レベル2は、サブオペランドの1つの結果だけを利用するような、単独の使用でも効果が出ることがあるが、レベル0やレベル1の使い方と組み合わせて使用することが期待される。通常の命令と比べて、SIMD命令は大幅な高速化を期待することができるが、SIMD命令を使える場面であるかどうかを判定することは難しい。例えば、飽和加減算をする場合のオーバーフローの判定は、より大きなビット長に拡張してから演算して判定するもの、ソース・オペランドと結果の符号や大小関係をしようするものなど、何通りかの方法があり、これらが同等であると判定できる式変形能力を要する。
【0091】
ここで、式変形能力の別の使い方としては、SIMD命令には特殊な演算子しかないもの、例えば、飽和縮小命令を、ビットマスク(すべて0又はすべて1)の単なる縮小命令として使うことが挙げられる。本発明者は、これもレベル2に含めて考えている。
【0092】
レベル3は、SIMD命令を単純に同じ操作の並列実行とみなせない場合である。サイズを混合した演算は、特殊な演算であるから、レベル2を含めて考えなければならない。
【0093】
C−2.本発明で目標とする最適化の到達度レベル
現状でSIMD命令を使ったコードを生成するコンパイラは、レベル0の自動化を相当程度達成しており、これはほぼ実用段階であると言ってもよい。
【0094】
一方、レベル1に関しては、例えば、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.)には、効果の限界の実験について報告されている。
【0095】
レベル2に関しては、Kevin Scott他著の上記論文中でも記載されているように、いまだ到達されていない。したがって、レベル3も未踏の領域である。
【0096】
本発明は、レベル2及びレベル3を実現することができるプログラム最適化を提案するものである。
【0097】
例えば、グーロー・シェーディング(Gouraud shading)の最内側ループに相当する処理をC言語形式で記述したプログラム・コードは以下のようになる。
【0098】
【数4】
Figure 0004045802
【0099】
本実施形態に係るコンパイラは、レベル2及びレベル3でSIMD命令を使ったコードを生成するものであり、上記のソース・プログラムを、MMX命令を使って以下のように最適化することができる。
【0100】
【数5】
Figure 0004045802
【0101】
上記のコンパイル・最適化後のコードでは、if変換を使ってループ内の条件分岐をなくし、4つのif文を並列実行しているとともに、MMX命令で使うのに都合のよい値、例えばsa+1,sr+1,sg+1,sb+1をループ不変式としてループ外で計算するようにしている。なお、引数やグローバル変数は、適当な順番で配置されていることを前提にしている。
【0102】
他方、MMXに対応したコンパイラである"Code=Warrior 6.0"で、以下に示す最適化オプションを指定してコンパイルしても、MMX命令は使用されない。
【0103】
【数6】
Figure 0004045802
【0104】
C−3.最適化のための中間表現
SIMD命令を使用するレベル2以上の最適化を実現するためには、演算子の意味を細かく分析したり、サブオペランドのサイズやオペランド中の位置を表現したりする必要がある。また、いろいろな最適化の相互影響を解析する必要も生ずる。そこで、本実施形態では、特定の目的に適した命令の表現を考えるのではなく、まず命令の意味を正確に表現することができるプログラムの中間表現を設計し、その上でプログラムの最適化を行なうようにしている。
【0105】
例えば、Jack Davidson及びChristopher Fraser共著の論文"Register Allocation and Exhaustive Peephole Optimization"(Software Practice and Experience, Vol.14, No.9, pp.857-866, September 1984)で提案されているプログラムの中間表現RTL(Register Transfer Language)は、移植性の高いコード最適化の実装によく使用されている。RTLでは、個々の命令の意味は式の形ですっかり表現され、中間表現の形式や解釈方法は命令セットに依存しない。このため、中間表現を操作するプログラムをアーキテクチャに依存しない形で作成することができる。
【0106】
RTLでは、レジスタ、あるいはメモリの内容を幾つか読み出して演算を行ない、その結果をレジスタあるいはメモリに代入する副作用として、マシン命令をとらえる。特別に指定されたものを除き、レジスタ又はメモリから内容を読み出した値は、直前に書き込んだ値である。プログラム・カウンタに対する変更をジャンプとみなすなどの幾つかの工夫により、たいていのマシン命令の意味をRTLで表すことができる(RTLで表せないものの代表例は、内部にループを含む命令である)。
【0107】
本実施形態では、SIMD命令を用いたプログラムのコンパイルを実現するために、中間表現としてRTLを使用する。RTLでSIMD命令を表現するために、GCC(GNU Compiler Collections:Richard M. Stallman著"Using and Porting the GNU Compiler Collection"(Free Software Foundation, July 1999.)を参照のこと)のRTLで使用されている演算子"parallel"及び"subreg"をほぼそのまま採用する。
【0108】
マシン命令は、高級言語の命令文とは異なり、不可分な複数の副作用が同時に発生することがある。このため、GCCでは、演算子parallelを使って表す。また、SIMD命令の複数のサブオペランドに対する変更も、この不可分な副作用の一種とみなすことができるので、parallelで表すことにする。
【0109】
また、サブオペランドは、演算子subregを使って明示的に表すことにした。subregt(rt1,n)は、t1型のレジスタrの、下位ビットから数えてn番のt型のデータを表す。なお、小さなレジスタがたくさんあるとみなす方法も考えられるが、サブオペランドのサイズと個数が命令によって異なるので、重なりの情報が別に必要となるため、本実施形態では採用していない。
【0110】
例えば、下記のMMX命令は図2に示すような中間表現になる。ここで、I16及びI64は、それぞれ16ビット、64ビットの整列型を表している。
【0111】
【数7】
Figure 0004045802
【0112】
C−4.最適化の手順
本実施形態では、コンパイラはソース・プログラムの最適化処理を行なうが、この際、SIMD命令を使った最適化処理を行なう点に特徴がある。SIMD命令を使った最適化処理部は、上述したRTLを使ってソース・コードを中間表現に変換するが、プログラムを中間表現する上で、図3に示すような手順でプログラム・コードの変換を行なっていくことで、並列に実行することができる操作を単に検出するだけでなく、特殊な演算子を使ったり、データ・サイズの混合した命令の一部を利用したプログラムの最適化を実現する。以下では、SIMD命令を使ったプログラム最適化における各ステップについて詳解する。
【0113】
C−4−1.論理演算を使ったif変換
if変換は、プログラム中のif文をなくす処理であり、基本ブロックの数が減るという効果がある。また、最適化手順の最初に行なうことにより、if変換により変換された論理演算も最適化の対象にすることができる。
【0114】
if文の条件式が比較演算で、結果をビットマスクとして得られる場合には、代入文が選択的に実行されるだけの単純なif文を、論理演算を使って同じ効果が得られるように変換する。
【0115】
比較式をc、代入対象をv、then節でvに代入される値をt、else節で代入される値をfとすれば(then節又はelse節にvへの代入文がなければ、t又はfはvとなる)、if文を以下に示すような代入文に変換することができる。
【0116】
【数8】
Figure 0004045802
【0117】
但し、上式において、bitand、bitor、bitnotはビット毎の論理積、論理和、論理否定をそれぞれ表す演算子である。また、代入文が"v:=v op w"の形をしている場合や、代入する値が特別な値ならば、変換結果を簡単にすることができる。例えば、
【0118】
【数9】
Figure 0004045802
【0119】
のような処理は、比較結果がビットマスクで、負の数を2の補数で表すという前提で、以下のようにif変換される。
【0120】
【数10】
Figure 0004045802
【0121】
ここで、比較結果と演算のビット長が異なる場合には、適当な変換演算を挿入する。
【0122】
if変換を最初に行なうのは、変換された論理演算も最適化の対象にするためである。
【0123】
C−4−2.基本ブロックをDAGに変換
基本ブロックとは、プログラムを処理フローの分岐及び合流場所で分割することによって得られるプログラム文の単位のことである。基本ブロックは、連続した文の列からなり、制御は先頭の文に与えられ、その後、途中で停止したり、途中で分岐したりしないで、最後の文から制御が離れる。
【0124】
また、DAG(Directed Acyclic Graph)は、有向で繰り返しのないグラフのことである。基本ブロック中の代入文は、DAGで表現することができる。基本ブロックをDAGに変換することによって、局所的な共通部分式を除去することができる。また、本実施形態においては、基本ブロックをDAGに変換することによって、特殊な演算を伴うSIMD命令を利用するためのパターン・マッチングを容易に行なえるように、細かい式を大きな式にまとめることができるという効果がある。
【0125】
例えば、
【0126】
【数11】
Figure 0004045802
【0127】
という基本ブロックがあった場合、ここでのcの値を他で使わないという前提で、
【0128】
【数12】
Figure 0004045802
【0129】
を意味するDAG(但し、2つあるx>=yは同じノードで表現される)に変換される。
【0130】
図4には、SIMD命令で行なうことができる特殊な演算子を含んだ基本ブロックの他の構成例を示している。但し、同図に示す例では、プログラムを構成する基本ブロックの集まりに、制御の流れに関する情報(矢印)を付け加えた流れグラフの形式となっている。また、"conv"は型変換演算子であり、"shr"は右シフト演算子である。なお、図中では型を省略しているが、乗算の上位を計算する部分にだけは型が付いている。
【0131】
また、図5には、図4に示した基本ブロックのうち、最右上のブロックをDAGに変換した例を示している。但し、":"(コロン)の後にあるのは、そのノードの値を持っている変数である。
【0132】
図5中で、破線で囲まれた箇所Aは、最大最小命令に相当し、SIMD命令に置き換えることができる特殊な命令である。同様に、一点鎖線で囲まれた箇所Bは、乗算の上位であり、SIMD命令に置き換えることができる特殊な命令である。
【0133】
DAGのパターン・マッチングにより、これらSIMD命令に置換可能かどうかを容易に判断することができる、という点を充分に理解されたい。
【0134】
C−4−3.DAGを分解
次いで、前項で生成したDAGを、SIMD命令で行なえる命令の単位に分解する。例えば、前述したDAGの例
【0135】
【数13】
Figure 0004045802
【0136】
では、2数の大きい方を求める命令すなわち最大最小命令があるので、分解されずに残される。
【0137】
また、図5に示したDAGの例では、最大最小、及び、乗算の上位という、SIMD命令で行なえる演算の単位がそれぞれ含まれているので、これらの部分が分解されずに残される。したがって、DAG全体としては以下のように分解される。
【0138】
【数14】
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
【0139】
但し、hは、分解のために新たに導入した変数である。dへの代入はaとbの最大であり、hへの代入はaとbの乗算の上位を表している。
【0140】
なお、中間表現の持つ演算子はすべて、分解された演算とみなすようにすることで、分解の失敗がないようにしておく。SIMD命令にできなかった演算は、後の段階で通常の命令になる。
【0141】
C−4−4.同じ演算を複数まとめる
次いで、DAGを分解してなる代入文のうち、同じ演算を異なるデータに適用しているものを見つけて、これらをRTL演算子"parallel"を使って1箇所にまとめる。
【0142】
その際、代入文の位置を移動することになるが、プログラムの意味が変わってしまわないようにする必要がある。本発明者は、代入文の移動によってプログラムの意味が変わらないことを判定するための幾つかの条件を考案した。
【0143】
まず、制御フロー・グラフ(プログラムを構成する基本ブロックの集まりに、制御の流れに関する情報(矢印)を付け加えたグラフ)中における移動元の文の位置と移動先の文の位置のうち、先のものをsとおき、後のものをtとおく。ここで、先と後は、同じ基本ブロック内なら簡単に決まるが、そうでないときは次のようにする。まず、移動元の文の位置をs、移動先の文の位置をtとおき、sからtまでの経路すべてを考えるとき、
【0144】
▲1▼経路上のs以外の位置で経路外からの合流がない。
▲2▼経路上のt以外の位置で経路外への分岐がない。
【0145】
という2つの条件をともに満たすときには、これで先と後が決まったことになる。満たさないときには、移動元の文の位置をt、移動先の文の位置をsとおき、sからtまでの経路すべてを考えるとき、条件▲1▼及び▲2▼をともに満たすときには、先と後が決まったことになる。満たさないときには、代入文を移動するとプログラムの意味が変わってしまうので、移動の対象としない。
【0146】
例えば、図6に示すような制御フロー・グラフのプログラムにおいて、基本ブロック間で代入文を移動する場合について検討してみる。
【0147】
同図に示すプログラムでは、同じ演算を異なるデータに適用している代入文として、基本ブロックB2内の代入文c:=a+aと、基本ブロックB4内の代入文d:=b+bを抽出することができる。ここで、基本ブロックB4内の代入文d:=b+bを、基本ブロックB2内の代入文c:=a+aの位置に移動することを考えてみる。
【0148】
まず、移動元の文である、基本ブロックB4内の代入文d:=b+bの位置sとし、移動先である、基本ブロックB2内の代入文c:=a+aの位置をtとしてみる。
【0149】
図6からも判るように、sからtに向かうすべての経路を考えると、経路上の位置s以外の位置でも、tにおいて経路外からの合流R2が存在する。また、経路上の位置t以外の位置でも、位置sにおいて経路外への分岐R5が存在する。
【0150】
したがって、上記の条件▲1▼及び▲2▼をいずれも満足しないので、これは正しい前後関係ではない。
【0151】
次いで、前後関係を入れ替え、移動元の文である、基本ブロックB4内の代入文d:=b+bの位置tとし、移動先である、基本ブロックB2内の代入文c:=a+aの位置sとしてみる。
【0152】
図6からも判るように、sからtに向かうすべての経路を考えると、経路上の位置sには、経路内からの合流R6の他に経路外からの合流R2を含むが、それ以外の位置では経路外からの合流はない。また、経路上の位置tには、経路内への分岐R6の他に経路外への分岐R7を含むが、それ以外の位置では経路外への分岐はない。
【0153】
したがって、上記の条件▲1▼及び▲2▼をともに満足するので、sが先、tが後であることがわかる。本図の例では、この前後関係の元で、後に述べる条件▲3▼及び▲4▼も満たしているため、基本ブロックB4内の代入文d:=b+bを基本ブロックB2内の代入文c:=a+aの位置まで移動することができる。このように代入文の移動を適用した結果の制御フロー・グラフを図7に示しておく。
【0154】
次に、図8に示すような制御フローグラフのプログラムにおいて、基本ブロック間で代入文を移動する場合について検討してみる。
【0155】
図示のプログラム中からは、同じ演算を異なるデータに適用している代入文として、基本ブロックB12内の代入文c:=a+aと、基本ブロックB15内の代入文d:=b+bが抽出される。ここで、基本ブロックB12内の代入文d:=b+bを、基本ブロックB15内の代入文c:=a+aの位置に移動することを考えてみる。
【0156】
ここで、基本ブロックB12内の代入文c:=a+aの位置をsとし、基本ブロックB15内の代入文d:=b+bの位置をtとした場合について考えてみる。
【0157】
図8からも判るように、経路上の位置t以外の位置でも、位置sにおいて経路外への分岐R18が存在する。すなわち、上記の条件▲2▼を満足しないので、これは正しい前後関係ではない。この例では、前後を入れ替えても、条件▲1▼及び▲2▼を満たさないので、前後関係を決めることができず、移動の対象としない。
【0158】
プログラムの前後関係を判定する上記の2つの条件▲1▼及び▲2▼を考慮した上で、移動したい代入文をaとしたときに、sからtへ向かういずれの経路においてもさらに以下に示す2つの条件を満たす場合に限り、代入文の移動を許可する。
【0159】
▲3▼aの使用(又は参照)する変数の定義がない
▲4▼aの定義する変数の使用(又は参照)はなく定義はaしかない。
【0160】
ここで、代入文aを"X=X+Z"とした場合、aの使用・参照する変数とはX並びにZのことであり、aの定義する変数はXのことである。
【0161】
例えば、以下に示すような複数の代入文からなるプログラムを考えた場合、
【0162】
【数15】
Figure 0004045802
【0163】
比較演算を含む各代入文は、プログラムの最初の位置まで移動することができる。同様に、減算を含む各代入文は、最後の位置に移動することができる。そして、同じ演算を異なるデータに適用しているそれぞれの代入文の塊を、parallelを使って、以下に示すように1箇所にまとめることができる。
【0164】
【数16】
Figure 0004045802
【0165】
上記に示した代入文の移動は、いずれも、プログラムの意味の同一性を判断するためのすべての条件▲1▼〜▲4▼を満足している、という点を充分理解されたい。
【0166】
parallel式でまとめるこの処理段階では、SIMD命令の並列度を考慮しないので、後の処理過程では、ここでまとめられた代入文の一部又は全部がSIMD命令にならない場合がある。
【0167】
なお、ベクトル化することが可能なループも、適当な回数だけ展開することで、この段階での処理に帰着することができる。
【0168】
C−4−5.命令とレジスタの制約の適用
ここまでの処理では、SIMD命令を適用するために、プログラム中で同じ演算を異なるデータに適用しているものを見つけて、parallelを使って1箇所にまとめられている。
【0169】
例えば、演算としてはSIMD命令で実行可能とされたものでも、結果を格納するレジスタがソースの一方と同じであることが必要な場合がある。また、比較が一方しか使えない場合や、特定のレジスタを必要としたりするなどの命令の制約がある場合がある。
【0170】
このため、命令セットによってはレジスタの使用に制約が課されていることがあるので、これを適用して、プログラムの一部を書き換える処理を行なう。また、適用した結果、挿入された命令がさらに適用の対象になることもあるので、適用は繰り返し行なう。
【0171】
SIMD加算命令のソース・オペランドの一方に加算結果が格納されるような命令セットの場合(例えば、MMX命令)、例えば以下に示すような加算命令からなるparallel式は、
【0172】
【数17】
Figure 0004045802
【0173】
t0,t1,t2,t3の古い値が以後使用されないという前提で、以下のように書き換えられる。また、s4,s8,s12,s16を使っている箇所も、t0,t1,t2,t3に書き換えられる。
【0174】
【数18】
Figure 0004045802
【0175】
また、SIMD比較命令でより大きいかどうかの判定はできないが、より小さいかどうかの判定ができるような命令セットの場合には、より大きいかどうかの判定を行なう複数の比較命令で構成された以下のparallel式は、
【0176】
【数19】
Figure 0004045802
【0177】
より小さいかどうかの判定を行なう比較命令に書き換えられた以下のparallel式に書き換えられる。
【0178】
【数20】
Figure 0004045802
【0179】
C−4−6.SIMDレジスタの割当
最後に、中間表現されたプログラム中でparallel式を使って1箇所にまとめられている代入文のうち、1つのSIMD命令で処理できるものを選んで、その代入文が使用又は定義する変数をそれぞれSIMDレジスタに対するsubreg式に置き換える。このようにしてsubreg式の繰り返しで構成されたparellel文(例えば、図2を参照のこと)は、中間表現であるが、SIMD命令に置き換わったすなわち最適化されたものと等価である。
【0180】
parallel式でまとめられた代入文からSIMD命令で処理できるものを取捨選択していく過程で、SIMD命令の並列性が余った場合には、ダミーの代入を付け加えてparallel内が1つのSIMD命令に対応するようにする。
【0181】
また、上述したレジスタの制約の適用ができないSIMD命令であれば、それを考慮してSIMDレジスタ中のサブオペランドの位置を決めるようにする。
【0182】
図9には、プログラム中からSIMD命令で処理できる代入文を選んで、代入文が使用又は定義する変数をSIMDレジスタに割り当てるための処理手順をフローチャートの形式で示している。但し、この処理に投入されるプログラムは、RTLで中間表現されたものであり、同じ演算を異なるデータに適用している複数の代入文がparallel分を使って1箇所にまとめられているものとする。以下、図示のフローチャートを参照しながら代入文が使用又は定義する変数をSIMDレジスタに割り当てるための処理について説明する。
【0183】
まず、プログラムの先頭から順に、処理対象となるparellel式を1つ取り出す(ステップS1)。もしプログラム中のすべてのparallel式について、以下に示すレジスタ割当処理が終了していれば(ステップS2)、本処理ルーチン全体を終了する。
【0184】
次いで、parallel式に含まれている代入文の個数が、代入文が適用する演算に対応するSIMD命令1つで処理できる数以下かどうかをチェックする(ステップS3)。
【0185】
parallel式に含まれている代入文の個数が、代入文が適用する演算に対応するSIMD命令1つで処理できる数を越える場合には、SIMD命令1つで処理できる個数の代入文を取り除いて、別のparallel式を作ってプログラムに挿入する(ステップS4)。
【0186】
そして、作ったparallel式に含まれる各代入文において使用又は定義している変数をSIMDレジスタに対するsubreg式にそれぞれ置換する(ステップS5)。レジスタの制約の適用(上述)ができなかったSIMD命令であれば、それを考慮して、SIMDレジスタ中のサブオペランドの位置を決めるようにする。
【0187】
その後、ステップS1に戻って、プログラム中の次のparallel式について、上述と同様のSIMDレジスタ割当処理を繰り返し実行する。
【0188】
他方、ステップS3において、parallel式に含まれている代入文の個数が、代入文が適用する演算に対応するSIMD命令1つで処理できる数以下と判断された場合には、さらに、代入文の個数が所定の閾値min_simd以上かどうかをチェックする(ステップS6)。
【0189】
parallel式に含まれる代入文の個数がmin_simd以上である場合には、ダミーの代入文を付け加えて、ちょうどSIMD命令1つで処理できる代入文の個数にしてから(ステップS7)、各代入文において使用又は定義している変数をSIMDレジスタに対するsubreg式にそれぞれ置換する(ステップS8)。レジスタの制約の適用(上述)ができなかったSIMD命令であれば、それを考慮して、SIMDレジスタ中のサブオペランドの位置を決めるようにする。
【0190】
その後、ステップS1に戻って、プログラム中の次のparallel式について、上述と同様のSIMDレジスタ割当処理を繰り返し実行する。
【0191】
また、parallel式に含まれる代入文の個数がmin_simd未満である場合には、parallel式を外して、これら代入文をSIMD命令に置き換えること、すなわち最適化することを諦める(ステップS9)。その後、ステップS1に戻って、プログラム中の次のparallel式について、上述と同様のSIMDレジスタ割当処理を繰り返し実行する。
【0192】
上記で使用された値min_simdは、ダミー文を挿入してSIMD命令にすることと、ダミー文を挿入せずSIMD命令にすることをあきらめることのいずれが最適であるかを判断するための閾値である。
【0193】
ここで、ステップS5及びS8において、代入文をSIMDレジスタに対するsubreg式に置き換えるための処理について詳解する。
【0194】
もし、SIMDレジスタがあふれた場合は、適当なロード・ストア命令を挿入する。
【0195】
また、使用又は定義の対象がメモリ上の値である場合にも、必要に応じてSIMDレジスタに対するロード・ストア命令を挿入する。この際、変数の並び順の制約が必要になることがあるときには、制約情報を生成する。
【0196】
また、SIMD命令にできない代入文との間で定義・使用関係があるときや、SIMD命令同士でも基本ブロックの境界などで調整が必要な場合は、調整命令や適当な変換命令を挿入する。挿入する命令のコストが大きいときには、SIMD命令を使うことを諦める。
【0197】
D.Coinsコンパイラとの接続
D−1.Coinsコンパイラの概要
「Coinsコンパイラ」は、文部科学省科学技術振興調整費による、並列コンパイラ向け共通インフラストラクチャの研究(2000年度より5年)で作成されているコンパイラの呼称である。Coinsコンパイラは、以下の2つの中間表現を用いている。
【0198】
(1)高水準中間表現HIR(High level Intermediate Representation)
抽象構造木に近い表現であり、ソース言語の構成要素と一対一に近い対応関係がある。HIRの文法は、ソース言語に依存しない。
【0199】
(2)低水準中間表現LIR(Low level Intermediate Representation)
レジスタやメモリの値の変更などを表す式の並びであり、マシン命令の意味を表現することができる。LIRの文法は、マシン非依存である。
【0200】
Coinsコンパイラは、Java言語で実装されているので、ホストマシン依存性に関しては、考慮する必要はほとんどない。Java以外の言語のコンパイラを作る場合には、型のサイズや演算子の違いを明確にしておく必要はあるが、C言語でC言語のクロスコンパイラを作る場合の問題に比べれば、ホストマシンは常に同一とみなすことができるので、扱いは容易である。
【0201】
HIRは、ソース言語に近いレベルでの処理を行なうためのものであり、ソース言語に依存した最適化、例えばC言語での副作用順序の変更はHIRで行なう。HIRの形式は、勿論、対象とするアーキテクチャ非依存であるが、生成されたHIRには、対象とするアーキテクチャに依存した値が含まれる。例えば、C言語ではintの大きさは実装によって異なるので、同じソース・プログラムから生成されたHIRであっても一通りではない。HIRの生成や変換を行う際には、各型のサイズやアラインメントなどが記録されたマシン・パラメータを参照する。
【0202】
また、LIRは、各種の最適化から、コード生成、マシン後レベルでの最適化まで使われるものがある。コード生成より前の段階では、LIRはマシン命令に対応しているのではなく、以下のような抽象化が行われている。
【0203】
▲1▼マシンの物理レジスタではなく、仮想レジスタを使える。仮想レジスタには数の制限はない。仮想レジスタは、パターン・マッチングでマッチしたマシン命令でのレジスタ使用の制約に基づいて、物理レジスタ割当で物理レジスタが割り当てられる。
【0204】
▲2▼ローカル変数はスタック・フレームを参照する式ではなく、FRAME式で表現される。FRAME式は、変数のアドレスを表す式であり、フレーム割当でフレーム・ポインタ(場合によっては、スタック・ポインタ)からの相対アドレスに変換される。
【0205】
▲3▼固定したアドレスに確保される変数(C言語の関数外で定義された変数など)は、STATIC式で表現される。
【0206】
LIRには、STATIC式、FRAME式で表される変数の型やアラインメントなどを保持するテーブルや、初期値のある、あるいは内、データ領域を表すデータ定義も含まれており、1つのコンパイル単位、あるいはオブジェクト・ファイル全体の情報を表現している。
【0207】
現在、CoinsコンパイラはSPARCプロセッサ用のCコンパイラの部分の作成が進んでおり、それは以下に示すような各フェーズに区分することができる。
【0208】
(1)ソース・プログラムをHIR−Cに変換
(2)C言語に依存したプログラム変換
(3)HIR−CをHIR−baseに変換
(4)高水準最適化
(5)HIR−baseをLIRに変換
(6)仮想レジスタ割付
(7)低水準最適化
(8)フレーム割当
(9)パターン・マッチング
(10)物理レジスタ割当
(11)マシン語レベルでの最適化
(12)アセンブラ・コード生成
【0209】
まず、C言語のソース・プログラムは、C言語独自の演算子などを表現するために拡張したHIR−Cに変換される。C言語に依存したプログラム変換を行った後、拡張部分のないHIRである、HIR−baseに変換される。
【0210】
HIR−base上で高水準最適化を行ってからは、LIRに変換される。LIRでは、まず仮想レジスタ割付を行ってから、低水準最適化を行い、フレーム割当、パターン・マッチング、物理レジスタ割当を経て、具体的なマシン命令を表すLIRに変換される。
【0211】
その後、命令スケジューリングなどのマシン語レベルの最適化を行い、最後にアセンブリ言語のプログラムが生成される。
【0212】
幾つかのある最適化は、実際には複数の最適化が適当な順序で必要に応じて繰り返し適用されることになる。また、他のフェーズも必要なら、何度も適用されることがある。
【0213】
D−2.Coinsコンパイラを利用する理由
SIMD命令を使った最適化は、独立した処理のように見えるが、コンパイラに通常組み込まれている、いろいろな解析結果を必要としている。例えば、以下に示すC言語のプログラムは、ループのベクトル化が可能である。
【0214】
【数21】
Figure 0004045802
【0215】
しかしながら、以下のように変わっただけで、ポインタの別名問題のため、ベクトル化は誤りとなる。
【0216】
【数22】
Figure 0004045802
【0217】
これをうまく扱うためには、ポインタ解析などの一般的な枠組みが別にあって、別名の問題のないものを仮想レジスタ割付の対象にするなどの前提が必要になる。
【0218】
ポインタ解析は、それだけで大きな研究対象であり、独立して開発するのは効率が悪く、インフラストラクチャとして利用するべきものである。他にも、手続き間最適化など、必要なものはいろいろある。そのため、Coinsコンパイラを利用して、上述した最適化を行うことにする。
【0219】
D−3.SIMD命令を使った最適化の組み込み方法
SIMD命令を使った最適化は、Coinsコンパイラで行われる以下の3箇所の最適化の1つあるいは複数で実現することになる。
【0220】
▲1▼高水準最適化
▲2▼低水準最適化
▲3▼マシン語レベルでの最適化
【0221】
まず、HIRではRTLに基づく方法を使用で気ないので、高水準最適化は除外される。
【0222】
次いで、マシン語レベルでの最適化を行なうと、フレーム割当や物理レジスタ割当の後になるため、物理レジスタやスタック・フレームにある値をSIMDレジスタに割り当て直すのは解析が難しい上、レジスタ割り当てがやり直しになってしまう。また、SIMDレジスタ割当では、SIMD命令にできなかったものを後で通常の命令にするという前提なので、通常のパターン・マッチングより先に済ませておく必要がある。
【0223】
結局、SIMD命令を使った最適化は、6つあるフェーズ(図3を参照のこと)をすべて低水準最適化の一部として実現することにする。この場合、その後のフェーズでは、SIMD物理レジスタやSIMD命令に対するsubreg式やparallel式を含むLIRを扱う必要が出てくる。現在のところ、これらを扱うための変更は、フレーム割当フェーズ以降に限り、SIMD命令を使った最適化を低水準最適化の最後で行なうこととしている。
【0224】
Coinsコンパイラを用いた実現では、以下のようなメリットがある。
【0225】
▲1▼SIMD命令のサブオペランドになりうる値が仮想レジスタにのっていると仮定して処理することができる。
▲2▼定数伝搬や別名解析が済んでいると仮定できる。
▲3▼SIMD命令にできなかった部分の処理を任せられる。
▲4▼変数の使用定義関係、生きている変数の解析などに、Coinsコンパイラのインフラストラクチャ部分を利用することができる。
【0226】
しかしながら、そのため、Coinsコンパイラに対して以下のような部分的な変更を加える必要がある。
【0227】
▲1▼SIMD命令を使った最適化で呼び出すコード解析部がparallel式に対応すること。
▲2▼フレーム割当以降のフェーズがSIMD物理レジスタとsubreg式に対応すること。
▲3▼マシン命令によくある偽の依存関係に対応すること(排他的論理輪を使ってゼロにするときは使用とはみなさないなど)。
▲4▼生成したSIMD命令を壊さないこと。
▲5▼変数の並びの制約をアドレス固定の変数の並びに反映させること。
【0228】
現在残っている問題点は、SIMD命令を使ったために、別の自明でない最適化が必要になるもの、例えばループ不変式の追い出しがこのままではできないことである。独自のループ最適化フェーズを実装する必要があるかもしれない。
【0229】
[追補]
以上、特定の実施形態を参照しながら、本発明について詳解してきた。しかしながら、本発明の要旨を逸脱しない範囲で当業者が該実施形態の修正や代用を成し得ることは自明である。すなわち、例示という形態で本発明を開示してきたのであり、本明細書の記載内容を限定的に解釈するべきではない。本発明の要旨を判断するためには、冒頭に記載した特許請求の範囲の欄を参酌すべきである。
【0230】
【発明の効果】
以上詳記したように、本発明によれば、コンパイル時などにおいて実際の処理効率や処理速度を向上させるための最適化を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することができる。
【0231】
また、本発明によれば、複数のデータを同時に処理するためのSIMD(Single Instruction/Multiple Data)命令を含んだ命令セットを持つアーキテクチャを対象としてプログラムに対してコンパイルなどの処理を好適に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することができる。
【0232】
また、本発明によれば、SIMD命令の特徴を活かしたプログラムの最適化を自動的に行なうことができる、優れたプログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラムを提供することができる。
【0233】
また、本発明によれば、特殊な演算子を持つ命令を利用するとともに、データ・サイズの混合した演算をうまく扱うことで、より難易度の高いSIMD命令を使用したプログラムの最適化を実現することができる。
【0234】
また、本発明によれば、元のプログラム・コードを中間表現に変換して、並列に実行できる操作を単に検出するだけでなく、特殊な演算子を使用したり、データ・サイズの混合した命令の一部を使用できるようにすることで、より難易度の高いSIMD命令を使用したプログラムの最適化を実現することができる。
【図面の簡単な説明】
【図1】本実施形態に係るプログラム処理装置100のハードウェア構成を模式的に示した図である。
【図2】MMX命令をRTLで中間表現した例を示した図である。
【図3】ソース・プログラムを中間表現するための手順を示したフローチャートである。
【図4】SIMD命令で行なうことができる特殊な演算子を含んだ基本ブロックの他の構成例を示した図である。
【図5】図4に示した基本ブロックのうち最右上のブロックをDAGに変換した例を示した図である。
【図6】プログラムの基本ブロック構成例を示した図である。
【図7】プログラムの基本ブロック構成例を示した図であり、より具体的には、図6に示したプログラムに対して代入文の移動を適用した結果を示した図である。
【図8】プログラムの基本ブロック構成例を示した図である。
【図9】プログラム中からSIMD命令で処理できる代入文を選んで、代入文が使用又は定義する変数をSIMDレジスタに割り当てるための処理手順を示したフローチャートである。
【符号の説明】
100…プログラム処理装置
101…CPU,
102…主メモリ,103…ROM
104…ディスプレイ・コントローラ
105…入力機器インターフェース
106…ネットワーク・インターフェース
107…外部機器インターフェース
108…バス
111…ディスプレイ
112…キーボード,113…マウス
114…ハード・ディスク装置
115…メディア・ドライブ

Claims (16)

  1. オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なうプログラム処理装置であって、
    プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動部と、
    該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当部と、
    を具備することを特徴とするプログラム処理装置。
  2. 前記代入文移動部に投入する前のプログラム中に含まれる、比較式をc、代入対象をv、then節でvに代入される値をt、else節で代入される値をfとしたif文を、tとcのビット毎の論理積をとるとともに、fとcのビット毎の論理否定との論理積をとり、これら論理積の論理輪をとった値をvに代入する式に変換することによって、プログラムを前記代入文移動部に投入する前にプログラム中のif文をなくすif変換部をさらに備える、
    ことを特徴とする請求項1に記載のプログラム処理装置。
  3. 前記代入文移動部は、移動元の文の位置sから移動先の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合以外は、当該文の移動を許容しない、
    ことを特徴とする請求項1に記載のプログラム処理装置。
  4. 前記代入文移動部によって並列実行する演算子を用いて1つにまとめられた代入文を前記一斉処理命令の実行におけるオペランドの使用の制約に従って書き換える制約適用部をさらに備える、
    ことを特徴とする請求項1に記載のプログラム処理装置。
  5. 前記サブオペランド割当部は、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数を越える場合には、前記一斉処理命令1つで処理できる個数の代入文を取り出して、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
    ことを特徴とする請求項1に記載のプログラム処理装置。
  6. 前記サブオペランド割当部は、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数以下の場合には、ダミーの代入文を付け加えてちょうど前記一斉処理命令1つで処理できる個数になるようにして、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
    ことを特徴とする請求項1に記載のプログラム処理装置。
  7. 前記サブオペランド割当部は、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数以下の場合には、代入文を該並列式から外して前記一斉処理命令への置き換えを諦める、
    ことを特徴とする請求項1に記載のプログラム処理装置。
  8. コンピュータを用いて構築されるプログラム処理システム上において、オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なうプログラム処理方法であって、
    前記コンピュータが備える代入文移動手段が、プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動ステップと、
    前記コンピュータが備えるサブオペランド割当手段が、該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当ステップと、
    を具備することを特徴とするプログラム処理方法。
  9. 前記コンピュータが備えるif変換手段が、前記代入文移動部に投入する前のプログラム中に含まれる、比較式をc、代入対象をv、then節でvに代入される値をt、else節で代入される値をfとしたif文を、tとcのビット毎の論理積をとるとともに、fとcのビット毎の論理否定との論理積をとり、これら論理積の論理輪をとった値をvに代入する式に変換することによって、プログラムを前記代入文移動部に投入する前にプログラム中のif文をなくすif変換ステップをさらに備える、
    ことを特徴とする請求項8に記載のプログラム処理方法。
  10. 前記代入文移動ステップでは、移動元の文の位置sから移動先の文の位置tまでのすべての経路を考えるとき、経路上のs以外の位置で経路外からの合流がなく、且つ、経路上のt以外の位置で経路外への分岐がない場合以外は、当該文の移動を許容しない、
    ことを特徴とする請求項8に記載のプログラム処理方法。
  11. 前記コンピュータが備える制約適用手段が、前記代入文移動ステップによって並列実行する演算子を用いて1つにまとめられた代入文を前記一斉処理命令の実行におけるオペランドの使用の制約に従って書き換える制約適用ステップをさらに備える、
    ことを特徴とする請求項8に記載のプログラム処理方法。
  12. 前記サブオペランド割当ステップでは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数を越える場合には、前記一斉処理命令1つで処理できる個数の代入文を取り出して、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
    ことを特徴とする請求項8に記載のプログラム処理方法。
  13. 前記サブオペランド割当ステップでは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数以下の場合には、ダミーの代入文を付け加えてちょうど前記一斉処理命令1つで処理できる個数になるようにして、各代入文において使用又は定義している変数をそれぞれ前記一斉処理命令のサブオペランドに割り当てる、
    ことを特徴とする請求項8に記載のプログラム処理方法。
  14. 前記サブオペランド割当ステップでは、該並列実行する演算子でまとめられた代入文の個数が前記一斉処理命令1つで処理できる数以下の場合には、代入文を該並列式から外して前記一斉処理命令への置き換えを諦める、
    ことを特徴とする請求項8に記載のプログラム処理方法。
  15. オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ上で実行するように記述されたコンピュータ・ソフトウェアをコンピュータ可読形式で物理的に格納した記憶媒体であって、前記コンピュータ・ソフトウェアは、前記コンピュータを、
    プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動手段と、
    該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当手段と、
    として機能させるための記憶媒体。
  16. オペランドを複数のサブオペランドに分割して複数のデータの集まりとみなして各サブオペランドに対する同種の演算を一斉に処理する一斉処理命令を用いてプログラムの最適化を行なう処理をコンピュータ上で実行するように記述されたコンピュータ・プログラムであって、前記コンピュータを、
    プログラム中の代入文で同じ演算を異なるデータに適用している箇所を探索して、一箇所に移動し、並列実行する演算子を用いて1つにまとめる代入文移動手段と、
    該並列実行する演算子でまとめられた各代入文が定義又は使用・参照する変数を前記一斉処理命令の各サブオペランドに割り当てるサブオペランド割当手段と、
    として機能させるためのコンピュータ・プログラム。
JP2002001092A 2002-01-08 2002-01-08 プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム Expired - Fee Related JP4045802B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2002001092A JP4045802B2 (ja) 2002-01-08 2002-01-08 プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2002001092A JP4045802B2 (ja) 2002-01-08 2002-01-08 プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム

Publications (3)

Publication Number Publication Date
JP2003202991A JP2003202991A (ja) 2003-07-18
JP2003202991A5 JP2003202991A5 (ja) 2005-06-02
JP4045802B2 true JP4045802B2 (ja) 2008-02-13

Family

ID=27641306

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2002001092A Expired - Fee Related JP4045802B2 (ja) 2002-01-08 2002-01-08 プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム

Country Status (1)

Country Link
JP (1) JP4045802B2 (ja)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7802076B2 (en) 2004-06-24 2010-09-21 Intel Corporation Method and apparatus to vectorize multiple input instructions
US7506326B2 (en) 2005-03-07 2009-03-17 International Business Machines Corporation Method and apparatus for choosing register classes and/or instruction categories
JP5014920B2 (ja) * 2007-08-17 2012-08-29 ラピスセミコンダクタ株式会社 回路設計方法、ならびにその方法により製造される集積回路
JP5438551B2 (ja) * 2009-04-23 2014-03-12 新日鉄住金ソリューションズ株式会社 情報処理装置、情報処理方法及びプログラム
JP5887811B2 (ja) * 2011-10-05 2016-03-16 富士通株式会社 コンパイル装置、コンパイル方法、コンパイルプログラム、記録媒体
JP5846006B2 (ja) * 2012-03-29 2016-01-20 富士通株式会社 プログラム、コード生成方法および情報処理装置
JP5846005B2 (ja) * 2012-03-29 2016-01-20 富士通株式会社 プログラム、コード生成方法および情報処理装置
JP5966509B2 (ja) * 2012-03-29 2016-08-10 富士通株式会社 プログラム、コード生成方法および情報処理装置
JP5939074B2 (ja) * 2012-07-31 2016-06-22 富士通株式会社 コード処理方法、情報処理装置およびプログラム
JP2015201119A (ja) 2014-04-10 2015-11-12 富士通株式会社 コンパイルプログラム、コンパイル方法およびコンパイル装置
JP7263994B2 (ja) * 2019-09-17 2023-04-25 富士通株式会社 情報処理方法及び最適化プログラム

Also Published As

Publication number Publication date
JP2003202991A (ja) 2003-07-18

Similar Documents

Publication Publication Date Title
Goossens et al. Embedded software in real-time signal processing systems: Design technologies
JP3896087B2 (ja) コンパイラ装置およびコンパイル方法
US7373642B2 (en) Defining instruction extensions in a standard programming language
US6113650A (en) Compiler for optimization in generating instruction sequence and compiling method
US8689199B2 (en) Optimizing compiler transforms for a high level shader language
US6651247B1 (en) Method, apparatus, and product for optimizing compiler with rotating register assignment to modulo scheduled code in SSA form
JP3327818B2 (ja) プログラム変換装置及び記録媒体
US20040025150A1 (en) Compiler, compiler apparatus and compilation method
JPH05143332A (ja) 命令スケジユーラを備えたコンピユータ・システム及び入力命令シーケンスを再スケジユールする方法
JP3299611B2 (ja) 資源割付装置
Özkan et al. FPGA-based accelerator design from a domain-specific language
Kudriavtsev et al. Generation of permutations for SIMD processors
JP4045802B2 (ja) プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム
JPH06250846A (ja) コンパイル装置
US11513806B2 (en) Method for vectorizing heapsort using horizontal aggregation SIMD instructions
US9383977B1 (en) Generation of compiler description from architecture description
US20090164773A1 (en) Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system
Amiri et al. FLOWER: A comprehensive dataflow compiler for high-level synthesis
Stitt et al. Techniques for synthesizing binaries to an advanced register/memory structure
Araujo et al. Code generation for fixed-point DSPs
DeVries A vectorizing SUIF compiler: implementation and performance.
Pol et al. Trimedia CPU64 application development environment
Suzuki et al. SIMD optimization in COINS compiler infrastructure
Kim et al. Experience with a retargetable compiler for a commercial network processor
Leupers Novel code optimization techniques for DSPs

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040818

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20040818

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20070713

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070724

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070921

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20071030

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20071112

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101130

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees