JPH09231089A - コンパイラにおけるコードを最適化する装置 - Google Patents

コンパイラにおけるコードを最適化する装置

Info

Publication number
JPH09231089A
JPH09231089A JP9001826A JP182697A JPH09231089A JP H09231089 A JPH09231089 A JP H09231089A JP 9001826 A JP9001826 A JP 9001826A JP 182697 A JP182697 A JP 182697A JP H09231089 A JPH09231089 A JP H09231089A
Authority
JP
Japan
Prior art keywords
optimizer
code
multiplication
value
product
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.)
Withdrawn
Application number
JP9001826A
Other languages
English (en)
Inventor
Enrich Benittsu Manuel
マニュエル・エンリック・ベニッツ
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.)
HP Inc
Original Assignee
Hewlett Packard Co
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 Hewlett Packard Co filed Critical Hewlett Packard Co
Publication of JPH09231089A publication Critical patent/JPH09231089A/ja
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

(57)【要約】 【課題】 比較的遅い乗算演算を実施するコンピュー
タのコンパイル・システムにおいて、コンパイルされる
コードのパフォーマンスを改善する。 【解決手段】コンパイラは、積の値のテーブル(すなわ
ち第1のエントリとして倍数×0、その第2のエントリ
として倍数×1、その第3のエントリとして倍数×2等
を含むテーブル)を使用することによって乗算演算を実
施することが有利であるときを自動的に判断し、乗算演
算を、一定でない乗数の値によって索引付けられるテー
ブル・ルックアップに変換する。この変換は、そうする
ことが有利であると認められるときのみ実施される。変
換を実行することは、プログラムが実際に走るときに積
のテーブルが初期化されることを必要とするが、それは
乗算演算が行われる位置よりも少ない頻度で使用される
位置で行われる。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】この発明はコンピュータに関
し、特に、コンピュータで実現される整数演算に関す
る。
【0002】
【従来の技術】大部分の整数演算はコンピュータによっ
て、1プロセッサ・サイクルで実施されるが、乗算のよ
うな演算は、終えるために通常3またはそれ以上のサイ
クルを要する。したがって整数を乗じることは、現代の
コンピュータで実施するには比較的費用がかかる演算で
ある。
【0003】いくつかのコンピュータ・アーキテクチャ
では、算術論理ユニット(ALU)によって提供される整数
の乗算演算はなく、乗算演算は、シフト、加算および減
算の長いシーケンスとして(まさに人が長い乗算を手で
実施するように)、または整数値を浮動小数点ユニット
(FPU)へ移してそこで乗算演算を実施することによっ
て、実施される。このため、コンパイル・システムが乗
算を除去したり、それらのコストを低減させることがで
きるように自動的に実施するコードの改良変換が重要で
ある。
【0004】乗算演算のコストを低減するために、多く
の方法が記述され、実現されている。おそらく最も古く
最も一般的に実現される方法は、乗数の一方がゼロ(そ
の積もまたゼロ)または1(その積はもう一方の乗数と同
じ値)のどちらかであると知られている乗算を除去する
代数変換である。同様によくあるのは、その乗数が両方
とも既知の一定の値である乗算を、適当な積の値を具体
化(instantiate)するもっと安価なコード・シーケンス
と置き換える定数畳込み変換(constant folding transf
ormation)である。
【0005】またよく知られているのは、乗数の一方が
既知の2の累乗(例えば2、4、8、16)である乗算
を、未知の乗数の各ビットを2を底とする既知の乗数の
値の対数ずつシフトさせる「左シフト」の演算と置き換
えて、所望の積を与える変換である。この簡単な観察(o
bservation)は加算および減算と組み合わせられること
ができ、乗数の一方が既知の一定の値である乗算を、シ
フト、加算および減算命令のより速いシーケンスに変換
する(R. Bernsteinの「Multiplication by Integer Con
stants, Software-Practice And Experience」 (Vol. 1
6(7), pp. 641-652, 1986年)を参照)。
【0006】最後に、ソースコードがコンパイル・シス
テムによって処理される時に両方の乗数の値が未知であ
り、対象のアーキテクチャにおいて速い浮動小数点の乗
算演算が利用可能であるケースでは、整数の乗算は、整
数の乗数を適当な浮動小数点数値に変えて、その浮動小
数点数値を乗じて浮動小数点の積を作り、この値をその
整数表示に戻すというコード・シーケンスに変換される
ことができる。
【0007】
【発明が解決しようとする課題】比較的遅い乗算演算を
実施するコンピュータのコンパイル・システムがコンパ
イルされるコードのパフォーマンスを改善することがで
きるケースを増加させる技術を提供することが有利であ
る。
【0008】
【課題を解決するための手段】ここで述べられる発明
は、コンパイル・システムが、いくつかのケースで、乗
算の乗数の一方が連続的に多数回使用される間一定であ
ると判断することができる、という観察に基づく。積の
値のテーブル(例えばその第1のエントリとしてscale_f
actor×0、その第2のエントリとしてscale_factor×
1、その第3のエントリとしてscale_factor×2等を含
むテーブル)を使用して乗算演算を実施するのが有利で
あるときを自動的に判断するコンパイラが開示される。
コンパイラは、その乗算演算を、一定でない乗数の値に
よって索引付けられるテーブル・ルックアップ(lookup)
に変換するオプティマイザを提供する。この変換は、そ
うすることが有利であると認められるときのみ実施され
る。変換を実施することは、プログラムが実際に走ると
きに積のテーブルが初期化されることを必要とするが、
それは乗算演算が行われる位置よりも少ない頻度で使用
される位置で行われる。
【0009】
【発明の実施の形態】この発明は、同じ係数を幾度も乗
じる演算を実施するには著しい計算コストがかかるとい
う事実を有利に利用する。例えば画像データ圧縮のJP
EG標準に精通する当業者によく知られているタイプの
平滑化アルゴリズムでは、ピクセル値はかなり小さい、
すなわちそれぞれのピクセルは0と255の間の値をと
りうる。この値は、28個の異なった値を提供する8ビ
ットに収まる。8つの異なったピクセルを調べる平滑化
アルゴリズムで、これらの8つの値が平滑化アルゴリズ
ムに従って合計されるとき、最大の起こりうる値はおよ
そ2000である。このように平滑化の値は、0と20
00の間である。したがってこのようなアルゴリズム
は、かなり小さい値があって、費用がかかる乗算演算が
同じ係数で何度も実施されるケースを例証する。
【0010】通常の乗算で、乗算演算はおよそ80プロ
セッサ・サイクルまで及ぶことがありえる。この発明
は、ソースコードのコンパイル中にそのような反復的な
乗算を認識し、そのような頻繁に直面する乗算演算の代
わりに用いられるテーブルを生成するオプティマイザを
提供する。そのようなテーブルは、テーブルのそれぞれ
の連続した係数がそれ自身に加算される係数であるの
で、組み立てるのがかなり速い。このように、テーブル
はゼロから始まって、係数、そしてその係数はそれ自体
に加算されて2倍になり、そしてその係数は再びそれ自
体に加算されて3倍になるという具合である。したがっ
てこのようなテーブルを組み立てることは非常に安価な
演算である。あまりに大きいテーブルは、通常非常に制
限されたサイズであるキャッシュ・メモリに非常に多く
のスペースを取りうるので、テーブルはかなり小さいこ
とが好ましい。たとえキャッシュ・メモリが相当大きく
とってあるとしても、テーブルはキャッシュ内の他の有
用な値を投げ出すほど大きくならないことが望ましい。
【0011】テーブルがいったん組み立てられると、乗
算演算を実施することは、乗数の値が制限されている値
すなわち0と255の間にあるより狭い値を取得して、
その値をテーブルへの索引として使用することを含む簡
単なタスクである。これは、その値がキャッシュにある
場合、テーブルが組み立てられた後の一つの索引ロード
演算で行われる。それは、自動的にキャッシュに入れら
れる。現代のプロセッサで、この演算は、その一片の情
報を取り戻すのに2ないし3サイクルを費やすだけであ
る。このように、この発明は、計算上費用がかかる乗算
演算を計算上安価なロード演算と置き換える。
【0012】さまざまな演算で必要とされる係数が幾度
も同じになるならば、直ちにテーブルを組み立てるので
はなく、コードは、コールからコールまで存続するメモ
リの中のテーブルを保持するように最適化される。新し
い係数に直面すると、(ここで説明するように最適化の
結果としての)コードは、テーブルが最後に組み立てら
れた時に同じ係数が使用されたかどうか知るために見
る。答えがイエスであれば、わざわざテーブルを組み立
てる必要はない。この発明は、乗算演算が同じ種類の係
数によって幾度も実施され、乗数の一方がその値の範囲
にかなり制限される傾向がある任意のアルゴリズムに適
用されうることが評価されるべきである。
【0013】この発明の別の利点は、ある人がプログラ
ム・ソースコードに戻ってコードがどのように操作する
か理解することがより簡単であるような分かりやすい方
法で、プログラマーがプログラムをコード化することが
できるということである。これに対して、プログラマー
が乗算演算を除去するために趣向を凝らした(fancy)こ
とを手で行おうとする場合、ソースコードは理解するの
がより難しいものに変わる。
【0014】しかしそのような最適化をコンパイラが行
うとき、プログラマーはコードに対するそのような変化
に気付かない。プログラマーに言わせれば、コンパイラ
はさまざまな特性を活用し、最適化の機会が存在すると
ころを見つけ出し、プログラマーのために難しい仕事を
行う。従ってプログラマーは、対象のコンピュータ・ア
ーキテクチャ上のパフォーマンスの障害がどこにあるか
心配する必要がない。
【0015】図1は、プロセッサ・キャッシュを含むユ
ニプロセッサ・コンピュータ・アーキテクチャ10のブ
ロック概略図である。図の中で、プロセッサ11はシス
テム・バス15と連絡するキャッシュ12を含む。ま
た、システム・メモリ13および1つまたは複数のI/
O装置14もシステム・バスと連絡する。
【0016】コンパイル演算において、ユーザーはコン
ピュータ上で走るプログラムであるソースコード・プロ
グラムをコンパイラに提出(submit)する。コンパイラは
ソースコードを受け付け、そのコードを処理し、対象の
コンピュータ・アーキテクチャ(例えばコンピュータ・
アーキテクチャ10)に関して最適化される実行可能な
ファイルを生成する。
【0017】図2は、例えば図1に示されるコンピュー
タ・アーキテクチャ10に関連して使用されうるよう
な、ソフトウェア・コンパイラ20のブロック概略図で
ある。コンパイラのフロントエンド要素21はソースコ
ード・ファイル(100)を読み取り、それを高レベルの中
間表現(110)に翻訳する。高レベル・オプティマイザ2
2は、高レベルの中間表現110をより効率的な形式に
最適化する。コード・ジェネレータ23は、最適化され
た高レベルの中間表現を低レベルの中間表現(120)に翻
訳する。低レベル・オプティマイザ24は、低レベルの
中間表現(120)をより効率的な(マシーンで実行可能な)
形式に変える。最後にオブジェクトファイル・ジェネレ
ータ25は、最適化された低レベルの中間表現をオブジ
ェクトファイル(141)に書き出す。
【0018】オブジェクトファイル(141)は他のオブジ
ェクトファイル(140)と一緒にリンカー26によって処
理され、コンピュータ10上で走ることができる実行可
能なファイル(150)を生成する。ここで述べられる発明
で、実行可能なファイル(150)はコンパイラ(20)および
リンカー(26)によって用意(instrument)されることがで
き、それがコンピュータ10上で走らされるとき、実行
プロファイル(160)が生成され、それは低レベルの中間
表現(120)をより良く最適化するために低レベル・オプ
ティマイザ24によって使用されることができると仮定
される。コンパイラ20は以下でより詳細に述べられ
る。
【0019】ここで述べられる発明は、コンパイル・シ
ステムが、いくつかのケースで、乗算の乗数の一方が連
続的に多数回使用される間一定であると判断することが
できる、という観察に基づく。この1つの例は、ある行
列の中のすべての要素に一つの倍数を適用するプログラ
ム・サブルーチンである。このようなサブルーチンは、
それがCプログラミング言語でコード化されるとすれ
ば、以下のように見えうる。
【0020】
【表1】
【0021】この例で、scale_factorの値はすぐにはわ
からないが、洗練されたコンパイル・システムは、それ
がROWS×COLUMNSの連続的な乗算にわたって一定である
と判断することができる。
【0022】この発明は、そのようなケースを見つけ
て、積の値のテーブル(例えば、その第1のエントリと
してscale_factor×0、その第2のエントリとしてscal
e_factor×1、その第3のエントリとしてscale_factor
×2等を含むテーブル)を使用して乗算を実施し、その
乗算を、一定でない乗数の値によって索引付けられるテ
ーブル・ルックアップに変換するのが有利であるときを
判断する。この変換が有利であると認められると、この
発明はそれを実施することに進む。その変換を実施する
ことは、プログラムが実際に走るときに積のテーブルが
初期化されることを必要とするが、それは乗算が行われ
る位置よりもずっと少ない頻度で使用される位置で行わ
れうる。
【0023】この発明はサブルーチンを変更し、その結
果サブルーチンは以下のコードによって示されるように
ふるまう。
【0024】
【表2】
【0025】したがって実行するのに大体80プロセッ
サ・サイクルまでかかる長い演算のシーケンスを通常必
要とする乗算演算は、マイクロ・アーキテクチャに基づ
いて、1ないし3のわずかなプロセッサ・サイクルでそ
れぞれの積を提供する単純な3命令のシーケンスに変え
られることができる。
【0026】この発明が考慮し、その有効性に欠くこと
のできない2つの関連する重要な点(issues)がある。第
1点は、積のテーブルがサブルーチンの複数の呼び出し
にわたって持続するように割り当てられ、そしてscale_
factorの引き数を通る値が積のテーブルを初期化するの
に最後に使用されたものと同じ値である場合は、サブル
ーチンが呼び出されるたびに積のテーブルを再度初期化
する必要がないということである。
【0027】product_table[1]の中の値がscale_factor
と等しい場合は初期化ループを迂回するように、単純な
チェックが初期化コードに加えられることができる。こ
の技法はメモイゼーション(memoization)と呼ばれ、こ
の発明の有効性を高めるために使用される良く知られた
技法である。
【0028】第2の重要な点は、積のテーブルを初期化
し、保持するために必要とされる時間と空間の量であ
る。上述の例では、MAXINT(符号付きの整数の変数に収
まる最大値)はROWS×COLUMNSより小さいと仮定される。
16ビットのアーキテクチャであればこれはいくらかあ
りそうであるが、32ビットおよび64ビットのマシー
ンでは全くありそうになく、そのようなテーブルを保持
するのに必要とされる空間の量は非常に大きい。この問
題には2つの異なった解法があり、その両方がこの発明
に取り入れられる。
【0029】第1の解法は、それぞれの乗数を調べて、
それらの一方が取りうる値の範囲が、表示可能な値の全
体の範囲よりも本質的に小さいか判断しようとすること
である。これは、乗数の型が「short」または「char」
であるときはほとんど生じない。そのような機会を見つ
ける見込みを増やすために、この発明の実施例は、それ
ぞれの演算がそれらが保持しうる値の範囲でもつことが
できる変数と効果を慎重に、計画的に追跡する。
【0030】この発明の実施例が使用する第2の解法
は、大きい値の範囲を2つまたはそれ以上の要素に分割
し、それぞれの要素と関連する積の値に個別にアクセス
し、それらを合わせてもとの状態に組み立てることであ
る。これが前の例にどのように適用されるかより良く説
明するために、この例は前の例と語義上(semantically)
同等であって、この技法の使用を以下のように示す。
【0031】
【表3】 void scale_matrix (int A[ROWS][COLUMNS], (int scale_factor) { int l,j; int product_table [(MAXINT + 1) / 65536]; int x, product, low_part, high_part, multiplier; product = 0; if (product_table [1]!= scale_factor){ for (x = 0; x <= MAXINT / 65536; x = x + 1){ product_table[x] = product; product = product + scale_factor; } } for (i = 0; i < ROWS; i = i + 1) for (j = 0; j < COLUMNS;j =j + 1){ if (A[l][j] >= 0)
【0032】このコードはより多くの乗算を含むように
見えるが、これらはすべてが2の一定乗(65,536は2の
16乗である)によるものであり、バイナリ・コンピュ
ータは、非常に安価なシフト演算を使用してこれらの演
算を実施することができる。したがって必要とされる積
のテーブルのサイズは、第1の例で使用される積のテー
ブルのたった65,536分の1のサイズである。
【0033】演算で、コンパイラはプログラムにテーブ
ルの余地を残しておくように命じる。テーブル自体は、
その係数および乗数が知られるまで組み立てられること
ができない。したがってコンパイラはコードをプログラ
ムに挿入し、そして実行時にテーブルを組み立てる。こ
うしてこの発明は、コンパイラの低レベル・オプティマ
イザに組み込まれ、コードを実行時プログラムに加える
ことによってそのプログラムにテーブルを計算させ、こ
のテーブルのためにメモリに空間を残しておくことによ
り、反復的な乗算を回避するツールを提供する。この発
明はコードを最適化して、安価なメモリ・ルックアッ
プ、例えばキャッシュ・ルックアップを使用することに
よって費用がかかる乗算を回避する。こうしてオプティ
マイザは、この特定の変換を最適化されているコードに
適用する機会を捜して見つけ、その変換を実施するコー
ドを代用する。
【0034】図3は、低レベル・オプティマイザで実施
される演算を示す高レベルのブロック図である。この発
明の好ましい実施例で、低レベル・オプティマイザ24
は、低レベルのRISCコード(300)、すなわちRIS
Cプロセッサ・ベースのマシーンによってもう少しで実
行される状態にあるコードを受け取る。オプティマイザ
は、コードを取得し、オプティマイザがコードを理解す
る助けとなる補助的なデータ構造を生成する。そしてオ
プティマイザは、対象のコンピュータ・アーキテクチ
ャ、例えばこの発明の好ましい実施例の特定のRISC
ベースのアーキテクチャ上で非常に速く走る最終的な最
適化されたRISC命令ストリーム(400)が生成される
ようなコードの変換/修正を開始する。
【0035】ここで述べられるRISCコンパイラは、
特定のRISCアーキテクチャ(この発明の好ましい実
施例では、カリフォルニア州パロアルトのヒューレット
・パッカード社が所有するPA-RISCアーキテクチャ)のニ
ュアンス(nuances)を理解する、マシーン特定のオプテ
ィマイザを用いて実現される。この発明は低レベル・オ
プティマイザに関連して述べられるが、この発明はまた
ソースコードをソースコード・レベルで見るプリプロセ
ッサすなわち高レベル・オプティマイザとして容易に適
用できることも認められるべきである。しかしそのよう
な適用は、特定の対象のマシーンについて多くを知って
いるマシーン特定のオプティマイザの特定のコード・シ
ーケンスに限られるので、一般に低レベル・オプティマ
イザでこの発明を実現することが好ましい。したがって
低レベル・オプティマイザは、ここで教示される変換を
適用することが有利であるとき、そうすることが有利で
ないときを一層知りやすい。
【0036】低レベル・オプティマイザ24がオリジナ
ルの低レベルRISC命令ストリーム(300)を受け取る
と、コード・シーケンスはナイーブ(naive)であると考
えられる。すなわちコード・シーケンスは、それらが実
施する傾向があるファンクションを実施するのにかなり
の量の時間とエネルギーをかけるように、それらが実施
している演算についてあまり賢明でないと考えられる。
低レベル・オプティマイザによって典型的に実施される
第1のステップは、命令ストリームを、複数の基礎ブロ
ック(310)すなわちシーケンスの終わりにのみ出口があ
ってシーケンスの始まり以外にコードに入る道をもたな
いコードのシーケンスに分割することである。こうして
コードは、より良く理解することができるようにカプセ
ル化される。
【0037】そしてオプティマイザはこれらの基礎ブロ
ック上にさまざまな最適化を実施する。例として、オプ
ティマイザは、例えば3または4の命令が使用される場
合、そしてただ1つの命令を使用することが可能な場合
に、冗長である命令シーケンスを調べる(320)。この型
のパターン・マッチングは、共通の部分式の除去と呼ば
れる。
【0038】次にオプティマイザは間隔の組み立て(33
0)と呼ばれる演算を実施し、コード構造をより高レベル
の構造の観点で解読するために、そこで基礎ブロック構
造が調べられる。例として、オプティマイザは、例えば
ループのような構造を見つけようとし、もし見つかれば
ステートメントする。またこの演算は、最適化されるコ
ードについて、どこで値が生成され、どこで値が消費さ
れ、どれくらい値が持続するか判断するデータフロー解
析を実施する助けとなる。
【0039】次にオプティマイザは、メモリ参照を調べ
るメモリ・ウェブ(web)を組み立てる(340)。したがって
メモリ参照を去る特定のローカルまたはグローバルの変
数がある場合は、例えばそのようなローカル変数を取得
し、それをレジスタへ推進し(すなわちレジスタ推進を
実施し)、その結果そのような変数について計算上費用
がかかるメモリへの参照を実施しなければならないこと
とは反対に、その変数をレジスタで保有するということ
が多くの場合望ましい。従ってオプティマイザは、変数
が定義されているところ、およびそのような変数が使用
されるところを識別するデータ構造であるウェブを組み
立てる。
【0040】次にオプティマイザは、それぞれのループ
に行くことによってループ解析(350)を実施し、そのル
ープがおこなっていることを判断する。多くのプログラ
ムはそれらのほとんどの時間をループの中で費やすの
で、最適化においてループは重要である。そのため多く
のオプティマイザは慣習的にループに注目し、ループの
速度を上げようとする。
【0041】実際に、この発明の好ましい実施例に関連
してここで教示される変換は、典型的に、プログラムは
ループの中にあって、そこでプログラムはループの境界
内で特定の演算を何度も実施しようとしているという仮
定で操作する。ある意味で、オプティマイザはループ構
造を知る必要はないが、変換はループ解析フェーズの一
部でありえる。むしろ変数が設定され、定義されている
ところと、他の一点と対比したときのある一点で演算を
実施する特定のコストを知るだけでよい。例えばさまざ
まな演算を実施することの方が、完全な乗算を実施する
ことよりも計算上費用がかからない点でテーブルを組み
立てることが望ましい。したがってある演算がループの
中にあれば、典型的にそれはより費用がかかる演算であ
ると考えられる。
【0042】慣習的に、ループを見つけることは、プロ
グラムの構造を見ることによって達成される。ここで開
示されるオプティマイザは、実際にプログラムに入って
組み立て、ユーザーにプログラムを走らせる能力をも
ち、そしてプログラムが走るとき、プログラムは走って
いる間にその時間を費やしているところ、例えばどの命
令が他よりも頻繁に実行されるか判断する。そしてここ
で開示されるオプティマイザは、プログラムが実際にど
こで時間を費やしているか、またどの命令が他と比較し
て計算上費用がかかるかについてより正確な情報を用い
てプログラムがリコンパイルされうるように、その情報
をフィードバックする。
【0043】ここで開示されるオプティマイザは、この
種のフィードバック情報を使用することにより、どの特
定の乗算演算を変換するか、どの乗算演算をそれが頻繁
に実行されないから無視するかについて、事実上より賢
い判断をすることができる。特に、プログラムのあるセ
グメントがループのように見えることがありえるが、そ
れはそのプログラム・セグメントが何回も実行されよう
としていることを意味しない。それは一度だけ実行され
るか、全く実行されないかでありえる。このように、ル
ープを追いかけて、その後ループが実行されないことを
実行時に見つけ出すリスクがある。多くの資源が適用さ
れてループを最適化しようとしたが、そのような経費に
ついて利益はなかった。こういうわけで、ここで開示さ
れるフィードバック方式は、オプティマイザに非常によ
り良いコードを生成させることができる。
【0044】レジスタ・ウェブ・ビルダー(360)は、特
定のレジスタが、レジスタの存続期間にわたって定義さ
れ、使用されるあらゆる点を識別する定義-使用(def-us
e)チェーンと呼ばれるものを組み立てる(410)。図3
は、その部分要素に分けられるコンパイラのレジスタ・
ウェブ要素を示す。ここで開示される変換は、レジスタ
・ウェブの部分要素およびオプティマイザ24のオプテ
ィマイザ・フェーズ(360)として操作することが好まし
い。
【0045】最初にオプティマイザは、プログラムで使
用されるすべてのレジスタに関する定義-使用ウェブを
組み立てる(410)。それらのウェブが調べられて(420)、
特定のウェブがその関連しうる制限された値の組をもつ
場合に、それらのインスタンス(instances)を見つけ
る。プログラムが、文字のみ保持することができる特定
のタイプのレジスタからロードしており、例えば文字が
ワードと比較してかなり小さい0と255の間の値のみ
もつ場合、オプティマイザは、文字がこの所与の値の組
をもつことを知って記憶する。2つの文字が続いて一緒
に加算されるとき、結果は0と510の間の値をとりう
ることが分かる。このように定義-使用レジスタ・ウェ
ブは、この情報の迅速な伝達を可能にし、それによって
オプティマイザの残りにその情報を示すデータベース/
構造を提供する。
【0046】またオプティマイザは、定数を伝達して、
冗長な演算を除去する(430)。例えば特定のウェブがそ
の中にある定数の値のみもつことができるならば、その
ウェブが定義されるところ全てで、それは同じ定数を与
えられる。オプティマイザはそのウェブが使用されるす
べての点に行き、その点でその定数を置き換えることが
できるのでより良いコードを取り出すことができる。
【0047】またオプティマイザは、冗長な演算を除去
する。例えば特定のウェブが0と255の間の値しかも
たず、そのウェブに関して比較演算が、255より大き
い値を生じるもう一つのウェブに対して実行される場
合、オプティマイザはこれが無用な演算であることを知
る。なぜならウェブは、その値が255より大きい状態
なることは決してありえないからである。こうしてオプ
ティマイザは、実際のウェブに影響を及ぼさないと分か
っている演算を除去する。
【0048】それからオプティマイザは、乗算演算が実
行されようとしているコード内の場所を見つける(44
0)。オプティマイザは、例えば2つのソース・ウェブ、
ウェブ1とウェブ2を識別することによって乗算演算を
識別する。オプティマイザは、範囲が制限され、ある結
果を生成しているウェブを捜す。それからオプティマイ
ザは、他のウェブが潜在的にいくつかの異なった値を持
つか、言い換えると他のウェブがずっと広いか、すなわ
ちそれが第1のウェブより相当大きい値をより広い範囲
にわたって保持することができるかを知るために、戻っ
て他のウェブを見る。
【0049】そしてオプティマイザは、この特定のウェ
ブが定義されうるコード内の位置を識別する。オプティ
マイザは、この特定の命令で、命令が何回実行されよう
としているかについて判断することができる。この情報
は、ループ解析の一部であり、コードを走らせることか
ら得られるフィードバックである。
【0050】そしてオプティマイザは、この特定の命令
がどれくらい頻繁に実行されようとしているかについて
知る。例えばオプティマイザが、この命令が多数回実行
されると期待するならば、オプティマイザは戻って、こ
のウェブが実際に定義されているところを見つける。例
えばそのウェブが一カ所にのみ定義され、この場所が1
0回だけ実行されるならば、オプティマイザは、上述さ
れた変換を実施することに潜在的な利益があると判断す
る。なぜなら、この点でコードをプログラムに挿入し、
オプティマイザが10回だけ実行されるテーブルを組み
立てるならば、その変換は、最適化プロセスの間にほん
の数ステップを実施することにより実際に多数の乗算演
算の速度を上げるからである。
【0051】この発明を実現する重要な考慮は、コスト
の解析および利益についての観念、すなわち「この点で
この変換を実施することが有利であるか?」ということ
である。オプティマイザは、ウェブ内の演算が定義され
ている位置を見て、積のテーブルが変換により除去され
る実際の乗算演算の数よりも少ない頻度で使用される場
所に挿入されるかどうかと比べ、コードが乗算演算を実
施する回数を判断しようとすることによって、変換をア
サートすべきところを判断する。
【0052】また、より大きいテーブルは組み立てるの
により多くの時間を必要とする場合に、オプティマイザ
はテーブルのサイズを知ることをその判断の根拠とす
る。したがってオプティマイザはいったん変換を実施す
ると、それは戻ってウェブを再度調べ、例えば以前示さ
れなかった、示される定数が現在あるか、また範囲につ
いて以前判断されたよりも多くが知られているか判断す
ることができる。こうして新しくすべきことがないと認
識される点に至るまで続くある程度の量の反復がある。
【0053】オプティマイザはできる限りの最良のコー
ドの最適化を判断した後、反復をやめ、擬似命令(450)
を拡張する。例えば乗算演算は、そのような命令に直面
したときにコードを取得し、直接それを走らせることが
可能ではないので、擬似命令である。例えば、整数の乗
算演算は対象のマシーンによって支援されない。そのよ
うな演算は、命令ストリームの一部としてコードに入れ
られる。オプティマイザが、この乗算にについてできる
ことがない点に至ると、システムはこの乗算演算を実施
することに専念する。オプティマイザは、乗算演算を実
施するファンクションをコールすることによって、その
ような演算を実施する必要があるかどうか判断しようと
する。乗じられる値の一方が定数であれば、その乗算演
算を実施するより良い方法を見つけることが可能であ
る。
【0054】最後にオプティマイザはコピーを捜して、
ここで述べたことのように、変換を実施する結果として
現われる傾向がある冗長なコピーを除去する(460)。こ
うしてオプティマイザは、2つのレジスタを同じ値を保
持するように向けるのではなく、値の一つのインスタン
スのみを格納する。
【0055】それからコンパイラは命令のスケジューリ
ング(370)を実施し、待ち時間、すなわち値が生成され
る前にプログラムがそれを使用しようとする場合に関連
する、いくつかの問題を除去するように命令を並べ換え
る。
【0056】次にコンパイラはカラーリング(coloring)
・レジスタ割付け(380)を実施する。オプティマイザ
は、ここまでは疑似レジスタ上に操作していたが、レジ
スタは現在真のレジスタである。この方法は、最適化の
間に無制限の数の疑似レジスタを使用することが可能で
あるために採用され、この無制限の数のレジスタは、最
適化プロセスの終わりに、対象のマシーンで利用可能な
非常に制限されるレジスタ組にマップされる。
【0057】オプティマイザによって実施される最後の
演算は、ピープホール(peephole)および枝の最適化(39
0)の演算である。ピープホールの最適化は、たった1つ
の命令と置き換えられる3か4の命令のシーケンスを捜
す単純でよく知られた変換を適用する。分岐の最適化
は、例えば再び分岐する他の分岐に向かう分岐がある場
所を捜す。最適化は、中間のステップを通り抜けずに、
直接最後の点に向かう。
【0058】最適化された命令ストリームは、この例で
はRISC命令ストリームであり、オプティマイザによ
って出力される(400)。
【0059】この発明の一つの利点は、比較的遅い乗算
演算を実施するコンピュータのコンパイル・システムが
コードのパフォーマンスをめざましく改善することがで
きるケースを増加させるということである。上述の例か
ら、熟練したプログラマーが、これらの機会を利用する
ためにソースコードを書き換えることは可能である。た
とえプログラマーがこのアルゴリズムの変換の技巧を理
解するとしても、彼らは、それを実現するための時間に
価値があると考えない、または価値があると考えてそれ
を正しく得るために困難な時間をもつ、またはこの技法
の適用によって不明瞭にされることを望まない、または
そうすることが有益か判断するに十分なことをマイクロ
・アーキテクチャに関して知らない、ということのいず
れかである。
【0060】この発明の使用によりコンパイル・システ
ムにこの変換を自動的に実施させることによって、プロ
グラマーは彼らの注意を他の問題に集中させることがで
き、経験の浅いプログラマーは彼らのシステムにからよ
り高いパフォーマンスを得ることができ、最終的なソー
スコードはより理解しやすくなり、そして最も効果的な
積のテーブルのサイズおよび乗数の分割要素は、コンパ
イル・システムがコードを生成するように依頼される特
定のマイクロ・アーキテクチャのコンパイル・システム
によって自動的に選択される。
【0061】本発明は例として次の実施態様を含む。 (1)プログラム可能なマシーン(10)で実現される、一
つの命令ストリームから最適化される命令ストリームを
生成することが操作可能なコンパイラ(20)においてコー
ドを最適化する装置であって、コンパイル中に、少なく
とも一つの乗算演算をテーブル・ルックアップとして実
施するのが有利であるときを自動的に判断する手段(34
0、350、360)と、乗算演算を、一定でない乗数の値によ
って索引付けられる積の値のテーブルに変換する手段(4
40)と、上記乗算演算を上記積の値のテーブルと置き換
える手段(450)と、を備える上記装置。
【0062】(2)さらに、上記コード構造を見て、プ
ログラムを組み立て、ユーザーに上記プログラムを走ら
せて、上記プログラムが走らされるときどのプログラム
命令が他よりも頻繁に実行されるか判断することによっ
てループ解析(350)を実施する手段を備え、上記ループ
解析手段は、上記プログラムが、上記プログラム命令は
計算上より費用がかかるということについてより多くの
正確な情報を用いてリコンパイルされうるように、上記
プログラムを走らせることによって生成される情報をフ
ィードバックする、上記(1)の装置。
【0063】(3)さらに、どの特定の乗算演算を変換
するか、またどの乗算演算をそれらがあまり頻繁に実行
されないから無視するか判断する手段(440)を含む、上
記(1)および(2)の装置。 (4)さらに、特定のレジスタが定義され、上記レジス
タの存続期間にわたって使用されるあらゆる点を識別す
るように、上記プログラムで使用されるすべてのレジス
タの定義-使用ウェブを組み立てるレジスタ・ウェブ・
ビルダー(360、410)を備える、上記(1)ないし(3)のいず
れかの装置。 (5)さらに、特定のウェブが、それが関連しうる制限
された値の組をもつインスタンスを見つけるために上記
定義-使用ウェブを調べて、上記オプティマイザへその
ようなインスタンスの迅速な伝達を可能にするデータベ
ース/構造を提供する手段(420)を備える、上記(4)の装
置。
【0064】(6)さらに、定数を伝達し、冗長な演算
を除去する手段(430)を備える、上記(1)ないし(4)のい
ずれかの装置。 (7)さらに、乗算演算が実施されるようとしている上
記プログラムの中の場所を見つける手段(440)を備え
る、上記(1)ないし(4)の装置。
【0065】(8)上記見つける手段がさらに、2つの
ソース・ウェブの第1のウェブが範囲で制限され、上記
ウェブの第2のウェブが非常により広い範囲にわたって
上記第1のウェブより非常に大きい値を保有する、2つ
のソース・ウェブを識別することによって乗算演算を識
別する手段(440)を備える、上記(7)の装置。 (9)上記見つける手段がさらに、特定のウェブが定義
される上記プログラムの中の位置を識別し、命令が何回
実行されるか判断し、そのような命令について乗算演算
の変換を実施することが有利であるか判断する手段(44
0)を備える、上記(7)または(8)のいずれかの装置。
【0066】(10)さらに、上記ウェブを再度調べる
手段(420)を備える、上記(1)ないし(9)のいずれかの装
置。 (11)さらに、擬似命令を拡張する手段(450)を備え
る、上記(1)ないし(10)のいずれかの装置。 (12)さらに、乗算演算の変換を実施する結果として
生成される冗長なコピーを除去する手段(460)を備え
る、上記(1)ないし(11)のいずれかの装置。 (13)上記積のテーブルは、そのようなコンパイル・
システムによって生成されるプログラムが対象のプロセ
ッサによって乗算演算が行われる位置より少ない頻度で
使用される位置で走らされるときに初期化されうる、上
記(1)ないし(12)のいずれかの装置。
【0067】(14)上記積のテーブルはそれが上記変
換される乗算演算の複数の呼び出しにわたって持続する
ように割り当てられるので、変換される乗算演算が呼び
出される毎に上記積のテーブルを再初期化する必要がな
い、上記(1)ないし(13)のいずれかの装置。 (15)広い値の範囲が2またはそれ以上の要素に分割
され、それぞれの要素と関連する積の値が個別にアクセ
スされ、上記2またはそれ以上の要素が一緒にもとの状
態に組み立てられる、上記(1)ないし(14)のいずれかの
装置。 (16)上記コンパイル・システムがコードをプログラ
ムに挿入し、それによって上記プログラムが実行時に上
記テーブルを組み立てる、上記(1)ないし(15)のいずれ
かの装置。
【0068】
【発明の効果】本発明によると、比較的遅い乗算演算を
実施するコンピュータのコンパイル・システムにおい
て、コンパイルされるコードのパフォーマンスを改善す
ることができる。
【図面の簡単な説明】
【図1】ユニプロセッサ・コンピュータ・アーキテクチ
ャの概略ブロック図。
【図2】例えば図1に示されるコンピュータ・アーキテ
クチャと関連して使用されうる、ソフトウェア・コンパ
イラの概略ブロック図。
【図3】この発明に従って、乗算の乗数の一方が連続的
に多数回使用される間一定であると判断することができ
るコンパイル・システムのブロック図。
【符号の説明】
24 低レベル・オプティマイザ 340 メモリ・ウェブ・ビルダーおよびレジスタ・
プロモータ 350 ループ解析およびオプティマイザ 360 レジスタ・ウェブ・ビルダーおよびオプティ
マイザ

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】プログラム可能なマシーンで実現され、一
    つの命令ストリームから最適化される命令ストリームを
    生成するように操作可能なコンパイラにおいてコードを
    最適化する装置であって、 コンパイル中に、少なくとも一つの乗算演算をテーブル
    ・ルックアップとして実施することが有利であるときを
    自動的に判断する手段と、 乗算演算を、一定でない乗数の値によって索引付けられ
    る積の値のテーブルに変換する手段と、 上記乗算演算を上記積の値のテーブルと置き換える手段
    と、を備える上記装置。
JP9001826A 1996-01-22 1997-01-09 コンパイラにおけるコードを最適化する装置 Withdrawn JPH09231089A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US589,213 1996-01-22
US08/589,213 US5907711A (en) 1996-01-22 1996-01-22 Method and apparatus for transforming multiplications into product table lookup references

Publications (1)

Publication Number Publication Date
JPH09231089A true JPH09231089A (ja) 1997-09-05

Family

ID=24357093

Family Applications (1)

Application Number Title Priority Date Filing Date
JP9001826A Withdrawn JPH09231089A (ja) 1996-01-22 1997-01-09 コンパイラにおけるコードを最適化する装置

Country Status (2)

Country Link
US (1) US5907711A (ja)
JP (1) JPH09231089A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008547086A (ja) * 2005-06-15 2008-12-25 インターレース・システムズ・インコーポレイテッド 大きなデータセットの解析中に整合性を維持するための方法および装置
JP2015527642A (ja) * 2012-07-06 2015-09-17 コーニンクレッカ フィリップス エヌ ヴェ 算術及び論理ユニットを伴わないコンピュータプロセッサ及びシステム

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2319888A1 (en) * 2000-09-18 2002-03-18 Ibm Canada Limited-Ibm Canada Limitee Method for generating instruction sequences for integer multiplication
US7065757B2 (en) * 2001-09-28 2006-06-20 Hewlett-Packard Development Company, L.P. Efficient compilation of family of related functions
US7370120B2 (en) * 2001-12-07 2008-05-06 Propel Software Corporation Method and system for reducing network latency in data communication
US7647356B2 (en) * 2004-05-07 2010-01-12 Oracle International Corporation Methods and apparatus for facilitating analysis of large data sets
US7797690B2 (en) * 2005-03-15 2010-09-14 International Business Machines Corporation System, method and program product to optimize code during run time
US8248660B2 (en) * 2007-12-14 2012-08-21 Qualcomm Incorporated Efficient diffusion dithering using dyadic rationals
US8806452B2 (en) * 2011-11-10 2014-08-12 International Business Machines Corporation Transformation of computer programs and eliminating errors
US8904371B2 (en) * 2012-06-19 2014-12-02 Telefonaktiebolaget L M Ericsson (Publ) Data handling among actors in a dataflow programming environment

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5428793A (en) * 1989-11-13 1995-06-27 Hewlett-Packard Company Method and apparatus for compiling computer programs with interproceduural register allocation
US5539907A (en) * 1994-03-01 1996-07-23 Digital Equipment Corporation System for monitoring computer system performance
US5696971A (en) * 1994-12-23 1997-12-09 Recursive Technologies Associates Recursive functions optimizier (RFO) for compliers of high-level programming languages
US5655122A (en) * 1995-04-05 1997-08-05 Sequent Computer Systems, Inc. Optimizing compiler with static prediction of branch probability, branch frequency and function frequency
US5689711A (en) * 1995-04-21 1997-11-18 Bardasz; Theodore Method and apparatus for representing data dependencies in software modeling systems

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008547086A (ja) * 2005-06-15 2008-12-25 インターレース・システムズ・インコーポレイテッド 大きなデータセットの解析中に整合性を維持するための方法および装置
JP2015527642A (ja) * 2012-07-06 2015-09-17 コーニンクレッカ フィリップス エヌ ヴェ 算術及び論理ユニットを伴わないコンピュータプロセッサ及びシステム

Also Published As

Publication number Publication date
US5907711A (en) 1999-05-25

Similar Documents

Publication Publication Date Title
Krall Efficient JavaVM just-in-time compilation
US7725883B1 (en) Program interpreter
Fernandez Simple and effective link-time optimization of Modula-3 programs
US5857104A (en) Synthetic dynamic branch prediction
US5966537A (en) Method and apparatus for dynamically optimizing an executable computer program using input data
US8024718B2 (en) System and method for optimizing source code
US5797013A (en) Intelligent loop unrolling
US6289505B1 (en) Method, apparatus and computer programmed product for binary re-optimization using a high level language compiler
US6078744A (en) Method and apparatus for improving compiler performance during subsequent compilations of a source program
Ramamoorthy et al. A high-level language for horizontal microprogramming
US7877741B2 (en) Method and corresponding apparatus for compiling high-level languages into specific processor architectures
US6249910B1 (en) Apparatus and method for incrementally update static single assignment form for cloned variable name definitions
EP0267796B1 (en) Method for improved code generation in reduced instruction set computers
JPH01108638A (ja) 並列化コンパイル方式
JP2001167060A (ja) タスク並列化方法
Cierniak et al. Just‐in‐time optimizations for high‐performance Java programs
JPH09231089A (ja) コンパイラにおけるコードを最適化する装置
Das et al. Index array flattening through program transformation
US20030126589A1 (en) Providing parallel computing reduction operations
Lin et al. SIMPLE performance results in ZPL
EP0180077B1 (en) A data processing machine for compiling computer programs
Liao et al. Code generation and optimization techniques for embedded digital signal processors
Chamberlain et al. Array language support for wavefront and pipelined computations
Ben Asher et al. The effect of unrolling and inlining for Python bytecode optimizations
Ernst Serializing parallel programs by removing redundant computation

Legal Events

Date Code Title Description
A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20060317