JPH07306790A - ループ最適化方式 - Google Patents

ループ最適化方式

Info

Publication number
JPH07306790A
JPH07306790A JP6100466A JP10046694A JPH07306790A JP H07306790 A JPH07306790 A JP H07306790A JP 6100466 A JP6100466 A JP 6100466A JP 10046694 A JP10046694 A JP 10046694A JP H07306790 A JPH07306790 A JP H07306790A
Authority
JP
Japan
Prior art keywords
prefetch
loop
load
optimization
pipelining
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.)
Pending
Application number
JP6100466A
Other languages
English (en)
Inventor
Toru Kawasaki
徹 川崎
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.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP6100466A priority Critical patent/JPH07306790A/ja
Publication of JPH07306790A publication Critical patent/JPH07306790A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Advance Control (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

(57)【要約】 【目的】キャッシュミスペナルティーを動的に削減する
のに有効なプリフェッチロード命令の発行による最適化
を、コンパイラが自動的に適否を判断して実施できるよ
うにすることによって、適用を容易にする。 【構成】ソフトウェアパイプライニング最適化の解析パ
ス(105)で、プリフェッチロードの適用に必要な対象の
数やデータ型、及び必要レジスタ数といった情報を収集
する。パイプライニング対象ループを選択(106)した
後、107のプリフェッチロード実施選択で、大域的レジ
スタ割付け(109)を阻害しないように展開方法を決定
し、プリフェッチロード同士の距離を概ね等間隔にする
為に、展開数を対象数で割って、対象数個の部分に分け
る。その後、パイプライニング変換後の中間語コード出
力(108)時に、分割された各部分の直前にプリフェッチ
ロード指示の中間語を挿入する。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】情報処理に係わり、特に、アプリ
ケーションプログラムの実行性能を向上させる方式に関
する。
【0002】
【従来の技術】これまでに、パイプライン制御を行う計
算機に対するプログラムの実行性能を向上するものとし
て、ソフトウェアパイプライニング最適化が適用されて
きた。ソフトウェアパイプライニングとは、与えられた
独立な機能ユニット間の並列性を利用するために命令列
を再構成する事であり、このことで命令実行をオーバー
ラップさせ、性能向上を図るものである。この技術を実
際のコンパイラに適用した例として、Sridhar Ramakris
hman,"Software Pipelining in PA-RISC Compilers",He
wlett-Packard Journal,June 1992等がある。
【0003】 に対する繰返し中のオブジェクト load a[i],R1 load c[i],R2 mult b,R2,R3 add R1,R3,R4 store R4,a[i] では、レジスタが依存するため、たとえ機能ユニットが
十分にあってもこれらの命令を同時に実行することはで
きない。そこで、このオブジェクトをロード、掛け算、
足し算、ストア、の4つのグループに分けた上で、4回展
開したループの中で並べ替えると、繰り返し1回に相当
するオブジェクトは次のようになり、レジスタの依存を
なくすことができる。
【0004】 load a[i+3],R1 load c[i+3],R2 mult b,R3,R4 add R5,R6,R7 store R8,a[i] この最適化によって、必要レジスタ数とオブジェクト量
が増加するが、機能ユニットを効率的に利用することが
可能になる。
【0005】また従来、キャッシュに載らないデータを
アクセスする場合の実行性能向上を図る手法として、プ
リフェッチロードを用いた最適化が提唱されてきた。こ
れは後方で用いるデータのロード命令を予め発行するこ
とで、このデータをメモリからキャッシュに持ってくる
までの処理を、命令実行にオーバーラップさせて、動的
なキャッシュミスペナルティーを削減する手法である。
この方式を適応した事例として、Anne Rogers,Kai L
i,"Software Support for Specculative Loads",ASPLOS
V,Sept '92などが報告されている。この論文は、例え
ばレジスタm個を使う次のループ のようにすることで、ロードしたレジスタを使用する迄
の時間を長くして、この間でキャッシュミス処理と命令
実行をオーバーラップさせることが可能である、と報告
している。
【0006】しかし、この論文は、幾つかのテストケー
スについてプリフェッチロードをハンドパッチで挿入し
て、その効果を検証したものであり、実際のコンパイラ
に対する適応については言及がない。
【0007】
【発明が解決しようとする課題】ワーキングセットが大
きいアプリケーションプログラムでは、アクセスするデ
ータがキャッシュに載らなかったときにかかる処理時間
が全体の実行時間をも支配する傾向があるため、プリフ
ェッチロードの発行によるキャッシュミス処理時間の削
減は、性能向上に大きな効果がある。しかし、従来技術
では、プリフェッチロードをコンパイラに発行させるこ
とには配慮されていなかったため、実際にコンパイラの
ユーザがこの最適化を適用させる事はほとんど不可能で
あった。
【0008】本発明は、上記欠点を解消し、ソフトウェ
アパイプライニングの実施ループに対して、コンパイラ
が適否を自動的に判断した上でプリフェッチロードを発
行することで、この最適化を効率的に適用することを目
的とする。
【0009】
【課題を解決するための手段】本方式では上記の目的
を、ソフトウェアパイプライニング最適化を行う処理に
手を加えることで実現する。この処理は、ソースプログ
ラムに対応する中間語を走査しながら、ループの制御変
数やサイズを計算するとともに、依存の見つかった時点
で中間語を切り分けていき、走査後これらの情報に基づ
いて、最適化実施の可否を判断し、適当と判断したルー
プについては切り分けた中間語コードを再構成すること
によって、パイプライニング変換した中間語コードを出
力する。
【0010】本方式では、中間語走査時に、順次アクセ
スする独立した領域を見つけると、これをプリフェッチ
ロードの対象として、その数をカウントする。またこの
とき、中間コードから推定した必要レジスタ数も計算す
る。ループがパイプライニング可能と判断された後に、
これらの情報を参照してプリフェッチロードの挿入箇所
を決定する。
【0011】プリフェッチロードの数が一つであれば、
これをループの先頭に配置する。複数ある場合には、展
開数をその数で割って、分割された各展開の先頭にそれ
ぞれ配置する。
【0012】以上の処理を、既存のパイプライニング最
適化処理に組み込むことで実装できるので、コンパイラ
の最適化処理そのものに対する負担の増加を最小限に留
めることが可能である。
【0013】
【作用】プリフェッチロードが実際にキャッシュミスを
起こせば、その処理が後続の命令にオーバーラップして
行われる。このため、次のキャッシュミスまでに十分な
命令数があれば、発生したキャッシュミスによるプロセ
ッサのストールを理想的にはゼロにできる。また、キャ
ッシュミスを隠しきるだけの命令数がない場合でも、プ
リフェッチロード同士の距離は概ね等間隔になっている
ので、どのロードがキャッシュミスを起こすかが予測で
きず、また命令実行にオーバーラップできるキャッシュ
ミス処理が1段しかない以上は、並列に実行できるコー
ド部分の期待値は最大であり、何れの場合にしても、オ
ブジェクトコードの実行性能を大幅に向上させる。
【0014】一方、元々キャッシュに載っているデータ
に対するプリフェッチロードは無駄な命令になるが、プ
リフェッチロードの発行は、コンパイラオプションで抑
止することが可能であるし、たとえ無駄になったとして
も、ループ展開した上で必要最小限のプリフェッチロー
ドしか発行していないので、性能劣化は最小に抑えるこ
とができる。
【0015】
【実施例】以下、本発明の実施例を図に基づいて説明す
る。図1は本発明の一実施例を示すものである。コンパ
イラは図1にあるようにソースコードの字句解析・構文
解析(101)、意味解析・中間コード生成(102)、大域的最
適化(103)、と進行する。ここまでの処理、及び大域的
レジスタ割付け(109)以降の処理は従来からのものと変
わりない。また、この例では、大域的最適化の後でソフ
トウェアパイプライニング最適化(104)を実施してい
る。
【0016】本発明は、このソフトウェアパイプライニ
ング最適化(104)の処理に改良を加える事であり、複数
のプリフェッチロードを挿入する場合として、図2のコ
ード片を例にとって説明する。このプリフェッチロード
発行の最適化は、ユーザによるオプション指定があった
ときだけ行われ、実行されるループの回数が少ないとき
には適用しない。尚、この例ではfloat型は4バイト、キ
ャッシュのライン長は32バイト、汎用レジスタ、浮動小
数点数用レジスタとも32本ずつとする。ループの繰返し
数Nはコンパイル時には未知であるものとする。
【0017】ソフトウェアパイプライニング最適化処理
(104)は、まず中間語の解析(105)を行い、制御変数やル
ープの構造から、106のパイプライニング実施選択の処
理で最適化を行うかどうか決定する。図2のコード片
は、105で中間語をコード走査する段階までに、図3にあ
るような中間語になっている。走査中に制御変数を添字
に持つ配列や、ループ中で更新される中身の参照を伴う
ポインタ変数を見つけると、これをプリフェッチロード
対象としてカウントしていく。図2の例では、配列a及び
cがこれに相当するので、対象は2つになる。同時にこの
パスでは、変数や定数の数からレジスタの必要数も算定
する。図2の例では、浮動小数点数用レジスタの方が条
件が厳しく、二つのロードと掛け算のターゲット(図3、
301,302)、及び変数bにレジスタが必要である。変数bは
ループ内では定数扱いできるので、展開数にかかわらず
同じレジスタを割り付けられるため、定数としてカウン
トしておく。
【0018】105で収集した情報をもとに、パイプライ
ニング実施選択(106)の処理で、パイプライニング最適
化を実施するかどうかが決定される。この結果ループが
最適化の対象になった場合、これまでに集めた情報か
ら、プリフェッチロードの挿入方法を、107で決定す
る。107の処理の流れを図4に示した。詳細な処理は以下
[1]〜[3]に示す順序で行い、107を終了した後、変換後
中間コード出力(108)の処理で、プリフェッチロード指
示の中間語コードを挿入したものを出力する。
【0019】[1] 最適な展開数とレジスタ資源からくる
展開数の制限値を比較して、展開方法を決定する。まず
401で最適な展開数を、キャッシュのライン長を、繰り
返し一回あたりで参照されるプリフェッチロード対象領
域の幅で割ることで算定する。図2の例では、ライン長
が32バイトで、4バイトの配列メンバを1つずつアクセス
しているので、32/4で8になる。つぎに、後方の大域的
レジスタ割付け(109)で、レジスタが不足しないよう
に、402で必要レジスタ数から展開の制限値を算定す
る。変数の数をv,定数の数をc,割付け可能なレジスタ数
をmとすると、最大展開数は次の不等式 n × v + c ≦ m を満たす最大の自然数nにほかならない。図2の例では、
v=3,c=1,m=32であるから最大展開数nは10となる。この
結果403の比較が成立するので、最適展開数でループ展
開を行う(404)。仮に不成立な場合でも、プリフェッチ
ロードがループ展開を必要としている理由は、従来のも
のとは異なるので、図5にあるように可能な回数の展開
を繰り返すことで、最適展開数分のコードを繰り返し1
回で実行できるようする(405)。図5は、最適展開数8を4
展開分のコード(501,502)を2回繰り返すことで実現して
いる例で、501,502で同じレジスタセットが使えるよう
にしている。
【0020】[2] プリフェッチロードの数から、挿入位
置を決定する。まず、プリフェッチロードの数をチェッ
ク(406)して、もし1つならループの先頭に配置(407)す
る。プリフェッチロードが複数あるならば、展開数をプ
リフェッチロードの数で割って(408)、なるべく等間隔
に配置する。図2の例ではプリフェッチロードが2個ある
ので、図6のように、4展開ずつコード配置して、各部分
(602,604)の先頭に配列a,cに対応するプリフェッチロー
ド(601,603)を挿入する。このことで、挿入されたプリ
フェッチロードは概ね等間隔になり、かつ、そこで命令
スケジュールの単位を切るようにすれば、命令スケジュ
ーラ(図1,110)はそれ以上の意識を持たなくても、この
間隔を維持することが可能である。
【0021】尤も、この方法は実現の一例であり、命令
スケジュール(110)がループ中のプリフェッチロードを
等間隔に配置しなおす設計も可能である。
【0022】[3] 次に409でプリフェッチの幅を決定す
る。これはハードウェア機構に大きく依存するが、通常
はプリフェッチしたロケーションをアクセスするまでに
キャッシュミス処理が終わるだけの余裕があれば十分で
ある。ただし、もしプリフェッチロードが他のキャッシ
ュミス処理中に現われた場合は無効命令化されるように
ハードウェアサポートされていれば、1ライン長程度幅
を大きめにとる。
【0023】尚、この例では対象計算機がサポートして
いる命令並列性は比較的低いと仮定している。このた
め、ソフトウェアパイプライニングが要求するループ展
開数は403の比較対象より小さいので、ここでは折り込
んでいない。また、同じ理由から、大域的レジスタ割付
け(109)はレジスタ数最小に割付けるものとして、必要
レジスタ数を推定している。もっと高い命令並列性を持
つ計算機に対しては、これらのバランスは、大きく変更
されることに配慮が必要である。
【0024】
【発明の効果】本発明によれば、プリフェッチロードの
発行による最適化が、コンパイラによって自動的に実施
できるため、キャッシュミスによって起こるプロセッサ
ストールを動的に削減し、オブジェクトコードの実行性
能を大幅に向上することができる。
【図面の簡単な説明】
【図1】本発明で採用したコンパイラの構成図である。
【図2】本発明の具体例を説明するためのソースプログ
ラムを示す図である。
【図3】図2のソースプログラムに対する中間コードの
モデルを示す図である
【図4】プリフェッチロードの実施を判断する部分の構
成図である。
【図5】最適なプリフェッチロードの出力に必要なルー
プ展開数がレジスタ資源の制約により確保できない場合
の展開方法を示す図である。
【図6】図2のソースプログラムに対する変換後中間コ
ードのモデルを示す図である。
【符号の説明】
104・・・ソフトウェアパイプライニング最適化処理 105・・・解析 106・・・パイプライニング実施選択 107・・・プリフェッチロード実施選択 108・・・変換後中間コード出力

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】パイプライン制御を行なう計算機を対象と
    するコンパイラにおいて、コンパイラがループにソフト
    ウェアパイプライニングを施す時点で、データプリフェ
    ッチのロード命令をオブジェクト中に挿入することによ
    り、実行時のキャッシュミスペナルティーを削減する方
    法。
JP6100466A 1994-05-16 1994-05-16 ループ最適化方式 Pending JPH07306790A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP6100466A JPH07306790A (ja) 1994-05-16 1994-05-16 ループ最適化方式

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP6100466A JPH07306790A (ja) 1994-05-16 1994-05-16 ループ最適化方式

Publications (1)

Publication Number Publication Date
JPH07306790A true JPH07306790A (ja) 1995-11-21

Family

ID=14274692

Family Applications (1)

Application Number Title Priority Date Filing Date
JP6100466A Pending JPH07306790A (ja) 1994-05-16 1994-05-16 ループ最適化方式

Country Status (1)

Country Link
JP (1) JPH07306790A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6260116B1 (en) 1998-07-01 2001-07-10 International Business Machines Corporation System and method for prefetching data
JPWO2005078579A1 (ja) * 2004-02-12 2007-10-18 松下電器産業株式会社 プログラム変換装置およびプログラム変換方法
CN103299277A (zh) * 2011-12-31 2013-09-11 华为技术有限公司 Gpu系统及其处理方法
US9971695B2 (en) 2014-10-03 2018-05-15 Fujitsu Limited Apparatus and method for consolidating memory access prediction information to prefetch cache memory data

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6260116B1 (en) 1998-07-01 2001-07-10 International Business Machines Corporation System and method for prefetching data
JPWO2005078579A1 (ja) * 2004-02-12 2007-10-18 松下電器産業株式会社 プログラム変換装置およびプログラム変換方法
CN103299277A (zh) * 2011-12-31 2013-09-11 华为技术有限公司 Gpu系统及其处理方法
CN103299277B (zh) * 2011-12-31 2016-11-09 华为技术有限公司 Gpu系统及其处理方法
US9971695B2 (en) 2014-10-03 2018-05-15 Fujitsu Limited Apparatus and method for consolidating memory access prediction information to prefetch cache memory data

Similar Documents

Publication Publication Date Title
US5797013A (en) Intelligent loop unrolling
US6675374B2 (en) Insertion of prefetch instructions into computer program code
US9798528B2 (en) Software solution for cooperative memory-side and processor-side data prefetching
US6401187B1 (en) Memory access optimizing method
Luk Tolerating memory latency through software-controlled pre-execution in simultaneous multithreading processors
US6192515B1 (en) Method for software pipelining nested loops
US5901308A (en) Software mechanism for reducing exceptions generated by speculatively scheduled instructions
US5530964A (en) Optimizing assembled code for execution using execution statistics collection, without inserting instructions in the code and reorganizing the code based on the statistics collected
US5379393A (en) Cache memory system for vector processing
US6754893B2 (en) Method for collapsing the prolog and epilog of software pipelined loops
US5537620A (en) Redundant load elimination on optimizing compilers
US5850553A (en) Reducing the number of executed branch instructions in a code sequence
US20050044538A1 (en) Interprocedural computing code optimization method and system
US5901318A (en) Method and system for optimizing code
JPWO1999030231A1 (ja) メモリアクセス最適化方法
Mueller et al. Avoiding unconditional jumps by code replication
US7155707B2 (en) Compiling computer programs including branch instructions
Dubey et al. Branch strategies: Modeling and optimization
JPH07306790A (ja) ループ最適化方式
US20020066089A1 (en) Compiling computer programs including branch instructions
Besnard et al. A framework for automatic and parameterizable memoization
Kazi et al. Coarse-grained thread pipelining: A speculative parallel execution model for shared-memory multiprocessors
Kelefouras et al. A methodology for speeding up fast fourier transform focusing on memory architecture utilization
John et al. A comparative evaluation of software techniques to hide memory latency
JPH06290057A (ja) ループ最適化方法