JP2001325111A - 投機機構向けコンパイル方法 - Google Patents
投機機構向けコンパイル方法Info
- Publication number
- JP2001325111A JP2001325111A JP2000148588A JP2000148588A JP2001325111A JP 2001325111 A JP2001325111 A JP 2001325111A JP 2000148588 A JP2000148588 A JP 2000148588A JP 2000148588 A JP2000148588 A JP 2000148588A JP 2001325111 A JP2001325111 A JP 2001325111A
- Authority
- JP
- Japan
- Prior art keywords
- code
- speculative
- loop
- instruction
- check
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/445—Exploiting fine grain parallelism, i.e. parallelism at instruction level
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Advance Control (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】
【課題】ループのように繰り返し実行される部分に対し
て投機機構を利用したコードを生成する場合に、頻繁に
投機チェックにひっかかり回復コードに分岐するために
性能が低下するのを防ぐ。 【解決手段】投機命令および投機誤りをチェックするチ
ェック命令を有するプロセッサ向けのコードを生成する
コンパイラにおいて、(1)プログラム中の繰り返し実
行される部分に対し、投機命令およびチェック命令を使
用したコード(a)と、投機命令およびチェック命令を使
用しないコード(b)を含む、少なくとも2種類のパター
ンのコードを生成する処理と、(2)コード(a)の実行
中に投機誤りチェックにかかった回数が特定の条件を満
たす場合に、以降の繰り返しではコード(b)を実行する
ように、制御の移行を行うコードを生成する処理を含
む。
て投機機構を利用したコードを生成する場合に、頻繁に
投機チェックにひっかかり回復コードに分岐するために
性能が低下するのを防ぐ。 【解決手段】投機命令および投機誤りをチェックするチ
ェック命令を有するプロセッサ向けのコードを生成する
コンパイラにおいて、(1)プログラム中の繰り返し実
行される部分に対し、投機命令およびチェック命令を使
用したコード(a)と、投機命令およびチェック命令を使
用しないコード(b)を含む、少なくとも2種類のパター
ンのコードを生成する処理と、(2)コード(a)の実行
中に投機誤りチェックにかかった回数が特定の条件を満
たす場合に、以降の繰り返しではコード(b)を実行する
ように、制御の移行を行うコードを生成する処理を含
む。
Description
【0001】
【発明の属する技術分野】本発明は、計算機の利用技術
において、オブジェクトプログラムの実行時間を削減す
るコンパイル方法に関する。特に、投機機構を持つ計算
機向けのコンパイル方法に関する。
において、オブジェクトプログラムの実行時間を削減す
るコンパイル方法に関する。特に、投機機構を持つ計算
機向けのコンパイル方法に関する。
【0002】
【従来の技術】近年のマイクロプロセッサは、オブジェ
クトプログラムを高速に実行することを目的として、特
定の命令(主にロード命令)を投機的に実行する命令
(投機ロード命令)と、その投機実行が誤りであったか
どうかをチェックする命令(チェック命令)を備えてい
るものがある。これらを合わせて投機機構と呼ぶ。投機
機構およびそれらを用いた最適化方法については、たと
えばIntel: IA−64 Application Developers Architect
ure Guide, May 1999, Order Number: 245188−001の 1
0−4節および10−5節に記載がある。
クトプログラムを高速に実行することを目的として、特
定の命令(主にロード命令)を投機的に実行する命令
(投機ロード命令)と、その投機実行が誤りであったか
どうかをチェックする命令(チェック命令)を備えてい
るものがある。これらを合わせて投機機構と呼ぶ。投機
機構およびそれらを用いた最適化方法については、たと
えばIntel: IA−64 Application Developers Architect
ure Guide, May 1999, Order Number: 245188−001の 1
0−4節および10−5節に記載がある。
【0003】投機機構を用いた最適化の一例として、不
明なデータ依存関係がある場合のループ不変式移動があ
る。これを図2のプログラム片を用いて示す。図2のプ
ログラムはC言語で記載されており、(201)の条件condが
満たされている間、(202)〜(204)の文を繰り返し実行す
ることを意味するループである。(202)では、a+bの値を
計算し、cに代入する。(203)では、cの値を、pが表すア
ドレスで示されるメモリ(*p)に書きこむ。(204)で
は、pの値を更新する。
明なデータ依存関係がある場合のループ不変式移動があ
る。これを図2のプログラム片を用いて示す。図2のプ
ログラムはC言語で記載されており、(201)の条件condが
満たされている間、(202)〜(204)の文を繰り返し実行す
ることを意味するループである。(202)では、a+bの値を
計算し、cに代入する。(203)では、cの値を、pが表すア
ドレスで示されるメモリ(*p)に書きこむ。(204)で
は、pの値を更新する。
【0004】図1のプログラム片に対して、投機機構を
利用しないでオブジェクトコードを生成すると、図3の
ようになる。なお図3ではコードをわかりやすくするた
めに一部C言語の構文を用いて記述している。図3では
(301)の条件condが満たされている間、(302)〜(306)の
命令を繰り返し実行する。(302)では、変数aのアドレス
(&a)で示されるメモリ内容、即ちaの値をレジスタr1
へロードする。(303)では、同様にbの値をメモリからレ
ジスタr2へロードする。(304)ではr1とr2の和を計算
し、r3へ代入する。(305)では、r3の値をpが表すアドレ
スで示されるメモリにストアする。(306)では、pの値を
更新する。
利用しないでオブジェクトコードを生成すると、図3の
ようになる。なお図3ではコードをわかりやすくするた
めに一部C言語の構文を用いて記述している。図3では
(301)の条件condが満たされている間、(302)〜(306)の
命令を繰り返し実行する。(302)では、変数aのアドレス
(&a)で示されるメモリ内容、即ちaの値をレジスタr1
へロードする。(303)では、同様にbの値をメモリからレ
ジスタr2へロードする。(304)ではr1とr2の和を計算
し、r3へ代入する。(305)では、r3の値をpが表すアドレ
スで示されるメモリにストアする。(306)では、pの値を
更新する。
【0005】図3のコードでは、は、ループの繰り返し
で毎回同じ値を計算している、即ちループ不変式である
可能性が高いので、これらの命令をループ外に移動する
(ループに入る前に1度だけ計算をしておき、ループの
中では計算された値を使う)ようにすれば、実行時間が
短縮される。しかし、pが表すアドレスと、aまたはbの
アドレスが一致している場合には、このような移動はで
きない。すなわち、(305)のストア先のメモリのアドレ
スと、(302)または(303)でロードするメモリのアドレス
が一致していた場合、*pへの書き込みでaまたはbの値が
書きかえられるので、(302)から(304)で計算される値は
ループ不変でなくなり、(302)から(304)の命令をループ
外への移動することはできない。このように、不明なデ
ータ依存関係がある(ストア先のメモリのアドレスと、
ロードするメモリのアドレスが一致するかどうかがわか
らない)場合、一般にコンパイラはループ不変式移動を
行うことはできない。
で毎回同じ値を計算している、即ちループ不変式である
可能性が高いので、これらの命令をループ外に移動する
(ループに入る前に1度だけ計算をしておき、ループの
中では計算された値を使う)ようにすれば、実行時間が
短縮される。しかし、pが表すアドレスと、aまたはbの
アドレスが一致している場合には、このような移動はで
きない。すなわち、(305)のストア先のメモリのアドレ
スと、(302)または(303)でロードするメモリのアドレス
が一致していた場合、*pへの書き込みでaまたはbの値が
書きかえられるので、(302)から(304)で計算される値は
ループ不変でなくなり、(302)から(304)の命令をループ
外への移動することはできない。このように、不明なデ
ータ依存関係がある(ストア先のメモリのアドレスと、
ロードするメモリのアドレスが一致するかどうかがわか
らない)場合、一般にコンパイラはループ不変式移動を
行うことはできない。
【0006】一方、投機機構を利用した場合、図1のプ
ログラム片に対してループ不変式移動を行うことができ
る。これを図4に示す。図4では、aおよびbのロードと
加算が、ループ外に移動されている((401)〜(403))。
そのときのロード命令は通常のロード命令ではなく、投
機的なものであるのでld.a命令を用いている(aはadvan
cedを意味する)。またループ内では(405)と(406)命令
で投機ロードが不正でないかどうかをチェックするチェ
ック命令((405),(406))が置かれている。(405)のchk.
a r1, recover1は、r1に対するld.a命令から現在のchk.
a命令までの間に、la.dでロードしたメモリアドレスに
対するストアがあったかどうかをチェックする。あった
場合には、投機実行は誤りであったので、recover1((4
10))に分岐する。分岐先のrecover1では、(411)でaの
値をロードし直し、(412)でa+bを計算し直し、(413)で
チェック命令の次の命令(406)に戻る。(407)および(41
4)〜(417)も同様である。なお、(410)〜(413)および(41
4)〜(417)は、投機チェック命令で引っかかった(投機
実行が誤りであった)場合に実行をやり直すので、回復
コードと呼ばれる。
ログラム片に対してループ不変式移動を行うことができ
る。これを図4に示す。図4では、aおよびbのロードと
加算が、ループ外に移動されている((401)〜(403))。
そのときのロード命令は通常のロード命令ではなく、投
機的なものであるのでld.a命令を用いている(aはadvan
cedを意味する)。またループ内では(405)と(406)命令
で投機ロードが不正でないかどうかをチェックするチェ
ック命令((405),(406))が置かれている。(405)のchk.
a r1, recover1は、r1に対するld.a命令から現在のchk.
a命令までの間に、la.dでロードしたメモリアドレスに
対するストアがあったかどうかをチェックする。あった
場合には、投機実行は誤りであったので、recover1((4
10))に分岐する。分岐先のrecover1では、(411)でaの
値をロードし直し、(412)でa+bを計算し直し、(413)で
チェック命令の次の命令(406)に戻る。(407)および(41
4)〜(417)も同様である。なお、(410)〜(413)および(41
4)〜(417)は、投機チェック命令で引っかかった(投機
実行が誤りであった)場合に実行をやり直すので、回復
コードと呼ばれる。
【0007】図4のコードでは、投機チェックにひっか
かって回復コードに分岐しない限り、ループ中でロード
命令や加算命令が実行されることがないので、図3のコ
ードに比べて実行時間が短くなることが期待される(ル
ープ中の命令は図3に比べて1命令しか減少していない
が、一般にチェック命令はロード命令や加算命令に比べ
て少ないサイクル数で行えるので、命令数以上に効果が
あると期待される)。このように、投機機構を用いれ
ば、ロード命令とストア命令の間に不明な依存関係があ
る場合にも、ループ不変式移動を行える。また、ループ
不変式移動以外にも、ロード命令とストア命令の間に不
明な依存関係がある場合に、ロード命令を、ストア命令
を越えて移動するなどの命令スケジューリングが行える
ようにようになる。
かって回復コードに分岐しない限り、ループ中でロード
命令や加算命令が実行されることがないので、図3のコ
ードに比べて実行時間が短くなることが期待される(ル
ープ中の命令は図3に比べて1命令しか減少していない
が、一般にチェック命令はロード命令や加算命令に比べ
て少ないサイクル数で行えるので、命令数以上に効果が
あると期待される)。このように、投機機構を用いれ
ば、ロード命令とストア命令の間に不明な依存関係があ
る場合にも、ループ不変式移動を行える。また、ループ
不変式移動以外にも、ロード命令とストア命令の間に不
明な依存関係がある場合に、ロード命令を、ストア命令
を越えて移動するなどの命令スケジューリングが行える
ようにようになる。
【0008】
【発明が解決しようとする課題】従来技術ではしかしな
がら、投機チェック命令にひっかかって回復コードに分
岐することが頻繁に行われると、却って実行速度が低下
する可能性があるという問題がある。たとえば図4のコ
ードでは、(405)または(406)のchk.a命令で、回復コー
ドに分岐することが頻繁に行われると、分岐によるオー
バーヘッドや、再計算のため、性能が却って低下する可
能性がある。
がら、投機チェック命令にひっかかって回復コードに分
岐することが頻繁に行われると、却って実行速度が低下
する可能性があるという問題がある。たとえば図4のコ
ードでは、(405)または(406)のchk.a命令で、回復コー
ドに分岐することが頻繁に行われると、分岐によるオー
バーヘッドや、再計算のため、性能が却って低下する可
能性がある。
【0009】そこで本発明の目的は、投機機構を利用し
たコードを生成するコンパイラにおいて、図2のように
繰り返し実行される部分について、頻繁に投機チェック
にひっかかり回復コードに分岐することで性能が悪くな
る、ということが生じないコードを生成するコンパイル
方法を提供することである。
たコードを生成するコンパイラにおいて、図2のように
繰り返し実行される部分について、頻繁に投機チェック
にひっかかり回復コードに分岐することで性能が悪くな
る、ということが生じないコードを生成するコンパイル
方法を提供することである。
【0010】
【課題を解決するための手段】前記目的を達成するた
め、本発明のコンパイル方法では、以下を行う。
め、本発明のコンパイル方法では、以下を行う。
【0011】(1)コンパイラは、ループのように繰り
返し実行される部分に対し、投機機構(投機命令および
投機チェック命令)を利用したコード(a)と、投機機構
を利用しないコードの2種類のパターンのコード(b)を
生成する。最初は投機機構を利用したコード(a)を実行
するようにする。
返し実行される部分に対し、投機機構(投機命令および
投機チェック命令)を利用したコード(a)と、投機機構
を利用しないコードの2種類のパターンのコード(b)を
生成する。最初は投機機構を利用したコード(a)を実行
するようにする。
【0012】(2)投機機構を利用したコード(a)中の
投機チェック命令にひっかかった場合に実行される回復
コードでは、チェックにひっかかった回数をカウント
し、回数が上限値を越えている場合は、以降は投機機構
を利用しないパターンのコード(b)を実行するようにす
る。
投機チェック命令にひっかかった場合に実行される回復
コードでは、チェックにひっかかった回数をカウント
し、回数が上限値を越えている場合は、以降は投機機構
を利用しないパターンのコード(b)を実行するようにす
る。
【0013】これにより、投機チェックにひっかかる回
数がある値を超えた場合は、以降は投機機構を利用しな
いコードが実行されるので、頻繁に投機チェックにひっ
かかり回復コードに分岐することで性能が悪くなること
がなくなる。また投機チェックにひっかかる回数が少な
い場合には、投機機構を利用したコードが実行されるの
で、投機機構を利用しない場合より実行速度が速くな
る。なお回数の上限値を1にすれば、回数をカウントす
る必要はなくなる。また回数ではなく、チェックにひっ
かかった確率を用いてもよい。
数がある値を超えた場合は、以降は投機機構を利用しな
いコードが実行されるので、頻繁に投機チェックにひっ
かかり回復コードに分岐することで性能が悪くなること
がなくなる。また投機チェックにひっかかる回数が少な
い場合には、投機機構を利用したコードが実行されるの
で、投機機構を利用しない場合より実行速度が速くな
る。なお回数の上限値を1にすれば、回数をカウントす
る必要はなくなる。また回数ではなく、チェックにひっ
かかった確率を用いてもよい。
【0014】
【発明の実施の形態】以下、本発明の一実施例として、
投機機構を利用したループ不変式移動を行うコンパイラ
を説明する。
投機機構を利用したループ不変式移動を行うコンパイラ
を説明する。
【0015】図1は、本発明によるコンパイラが稼動す
る計算機システムの構成図である。図示するように、計
算機システムはCPU101、主記憶装置104、外部
記憶装置105、ディスプレイ装置102、キーボード
103より構成されている。外部記憶装置105にはソ
ースプログラム106、オブジェクトプログラム107
が格納される。主記憶装置104には、コンパイラ10
8と、コンパイル処理過程で必要となる中間コード10
9が保持される。コンパイル処理はCPU101がコン
パイラプログラム108を実行することにより行われ
る。キーボード103はユーザからのコマンドをコンパ
イラ108に与えるのに用いる。ディスプレイ装置10
2はコンパイルの終了またはエラーをユーザに知らせ
る。
る計算機システムの構成図である。図示するように、計
算機システムはCPU101、主記憶装置104、外部
記憶装置105、ディスプレイ装置102、キーボード
103より構成されている。外部記憶装置105にはソ
ースプログラム106、オブジェクトプログラム107
が格納される。主記憶装置104には、コンパイラ10
8と、コンパイル処理過程で必要となる中間コード10
9が保持される。コンパイル処理はCPU101がコン
パイラプログラム108を実行することにより行われ
る。キーボード103はユーザからのコマンドをコンパ
イラ108に与えるのに用いる。ディスプレイ装置10
2はコンパイルの終了またはエラーをユーザに知らせ
る。
【0016】図5は、コンパイル処理の流れを示したフ
ローチャートである。コンパイラの処理は、まずステッ
プ501で構文解析を行う。構文解析はソースプログラ
ム106を読み出し、コンパイラ内部で処理可能な中間
コード109を作成する。構文解析処理については、た
とえば「エイホ、セシィ、ウルマン著:コンパイラI
(サイエンス社、1990年)30頁〜74頁」に記載
されているので、ここでは詳しく説明しない。次にステ
ップ502で、ループ解析を行う。ループ解析処理につ
いても「エイホ、セシィ、ウルマン著:コンパイラII
(サイエンス社、1990年)734頁〜737頁」に
記載があるのでここでは詳しく説明しない。ループ解析
により、プログラムに含まれるループの集合が求められ
る。次にステップ503で、未処理のループがあるか調
べる。なければステップ506へ進み、オブジェクトコ
ードを生成して終了する。オブジェクトコード生成につ
いては、同じく「エイホ、セシィ、ウルマン著:コンパ
イラII(サイエンス社、1990年)624頁〜707
頁」に記載があるので、ここでは詳しく説明しない。未
処理のループがあればステップ504でループを1つ取
り出す。そしてステップ505で、投機機構を利用した
ループ不変式移動処理を行う。ステップ505の処理に
ついては図7を用いて詳しく説明する。この処理の後は
ステップ503から繰り返す。
ローチャートである。コンパイラの処理は、まずステッ
プ501で構文解析を行う。構文解析はソースプログラ
ム106を読み出し、コンパイラ内部で処理可能な中間
コード109を作成する。構文解析処理については、た
とえば「エイホ、セシィ、ウルマン著:コンパイラI
(サイエンス社、1990年)30頁〜74頁」に記載
されているので、ここでは詳しく説明しない。次にステ
ップ502で、ループ解析を行う。ループ解析処理につ
いても「エイホ、セシィ、ウルマン著:コンパイラII
(サイエンス社、1990年)734頁〜737頁」に
記載があるのでここでは詳しく説明しない。ループ解析
により、プログラムに含まれるループの集合が求められ
る。次にステップ503で、未処理のループがあるか調
べる。なければステップ506へ進み、オブジェクトコ
ードを生成して終了する。オブジェクトコード生成につ
いては、同じく「エイホ、セシィ、ウルマン著:コンパ
イラII(サイエンス社、1990年)624頁〜707
頁」に記載があるので、ここでは詳しく説明しない。未
処理のループがあればステップ504でループを1つ取
り出す。そしてステップ505で、投機機構を利用した
ループ不変式移動処理を行う。ステップ505の処理に
ついては図7を用いて詳しく説明する。この処理の後は
ステップ503から繰り返す。
【0017】図6は本実施例におけるコンパイラの中間
コードの例である。中間コードは構文解析501の処理
により作成される。図6の中間コードは図2のソースプ
ログラムに対応している。図6の中間コードは、基本ブ
ロック(Basic Block、BBと略される)を
エッジで結んだグラフで表現されている。(このような
グラフは制御フローグラフと呼ばれている。)601か
ら604は基本ブロックである。これらの基本ブロック
には、BB1からBB4までの番号がそれぞれ付けられ
ている。基本ブロックは途中で分岐や飛び込みのない、
一連のコード列を表している。エッジ(矢印)は基本ブ
ロック間の遷移を表している。たとえば基本ブロック6
01から602にエッジが張られているので、601が
終った後で、602へ制御が移ることを示している。基
本ブロックの解析方法や制御フローグラフの構成方法に
ついては前著(コンパイラII)642頁〜648頁に記
載されているので、ここでは詳しく述べない。各基本ブ
ロック中に書かれているものは実行文であり、その基本
ブロックに制御が移ったときに実行される。各文の左側
(S1〜S7)は文番号を表す。
コードの例である。中間コードは構文解析501の処理
により作成される。図6の中間コードは図2のソースプ
ログラムに対応している。図6の中間コードは、基本ブ
ロック(Basic Block、BBと略される)を
エッジで結んだグラフで表現されている。(このような
グラフは制御フローグラフと呼ばれている。)601か
ら604は基本ブロックである。これらの基本ブロック
には、BB1からBB4までの番号がそれぞれ付けられ
ている。基本ブロックは途中で分岐や飛び込みのない、
一連のコード列を表している。エッジ(矢印)は基本ブ
ロック間の遷移を表している。たとえば基本ブロック6
01から602にエッジが張られているので、601が
終った後で、602へ制御が移ることを示している。基
本ブロックの解析方法や制御フローグラフの構成方法に
ついては前著(コンパイラII)642頁〜648頁に記
載されているので、ここでは詳しく述べない。各基本ブ
ロック中に書かれているものは実行文であり、その基本
ブロックに制御が移ったときに実行される。各文の左側
(S1〜S7)は文番号を表す。
【0018】図7は投機機構を利用したループ不変式移
動処理505の流れを詳しく示したフローチャートであ
る。まずステップ701で、ループ中に未処理の文(命
令)があるか調べる。なければ終了する。あればステッ
プ702に進み、未処理の文を1つ取り出し、ステップ
703で、取り出した文がループ不変式であるか調べ
る。ループ不変式であるかどうかは、すべてのオペラン
ドがループ不変であるかを調べる。ロード命 令の場合
はロードするメモリアドレスがループ不変であるかを調
べる。ただしアドレスがループ不変であっても、明らか
なデータ依存(同じアドレスへのストア)がループ中に
あればループ不変でないとする。(不明なデータ依存の
ある場合はループ不変式とみなす。)ループ不変でなけ
ればステップ701から繰り返す。ループ不変であれ
ば、それがロード命令でかつ、不明なデータ依存がある
(ロードするメモリアドレスへのストアがループ中で実
行される可能性がある)か調べる、そうであればステッ
プ705に進む。ステップ705では、すでにループの
2重化(ループの複写)を行っているか調べる。2重化
を行っていない場合はステップ706に進み、ループの
2重化を行う。これは、元のループの後に、複写ループ
を作るもので、たとえば図6の中間コードでは、ステッ
プ706を行った後の中間コードは図8のようになる。
図8ではBB5(804)およびBB8(805)が複写されたルー
プを構成する。さらに元のループの前に、カウンタをゼ
ロクリアするコード(807のS15)を挿入する。次にステ
ップ707で、移動対象のロード命令をループ外に移動
する。その際、ロード命令を投機ロード命令(load.a)
に変更する。次にステップ708で、元のロード命令が
あった位置にチェック命令(chk.a)を置くとともに、
チェックにひっかかった場合の回復コードを作成する。
これを図9に示す。
動処理505の流れを詳しく示したフローチャートであ
る。まずステップ701で、ループ中に未処理の文(命
令)があるか調べる。なければ終了する。あればステッ
プ702に進み、未処理の文を1つ取り出し、ステップ
703で、取り出した文がループ不変式であるか調べ
る。ループ不変式であるかどうかは、すべてのオペラン
ドがループ不変であるかを調べる。ロード命 令の場合
はロードするメモリアドレスがループ不変であるかを調
べる。ただしアドレスがループ不変であっても、明らか
なデータ依存(同じアドレスへのストア)がループ中に
あればループ不変でないとする。(不明なデータ依存の
ある場合はループ不変式とみなす。)ループ不変でなけ
ればステップ701から繰り返す。ループ不変であれ
ば、それがロード命令でかつ、不明なデータ依存がある
(ロードするメモリアドレスへのストアがループ中で実
行される可能性がある)か調べる、そうであればステッ
プ705に進む。ステップ705では、すでにループの
2重化(ループの複写)を行っているか調べる。2重化
を行っていない場合はステップ706に進み、ループの
2重化を行う。これは、元のループの後に、複写ループ
を作るもので、たとえば図6の中間コードでは、ステッ
プ706を行った後の中間コードは図8のようになる。
図8ではBB5(804)およびBB8(805)が複写されたルー
プを構成する。さらに元のループの前に、カウンタをゼ
ロクリアするコード(807のS15)を挿入する。次にステ
ップ707で、移動対象のロード命令をループ外に移動
する。その際、ロード命令を投機ロード命令(load.a)
に変更する。次にステップ708で、元のロード命令が
あった位置にチェック命令(chk.a)を置くとともに、
チェックにひっかかった場合の回復コードを作成する。
これを図9に示す。
【0019】図9では、チェック命令(904のS16)から
回復コード(906)への分岐が作成されている。回復コ
ードの先頭では、カウンタをインクリメントし(906のS
17)、カウンタ値が一定値を超えた場合には複写ループ
へ分岐するコード(906のS18)が作成されている。カウ
ンタが一定値を超えていない場合にはaの再ロード(907
のS19)を行い、チェック命令の次の命令(905のS3)に
戻る。
回復コード(906)への分岐が作成されている。回復コ
ードの先頭では、カウンタをインクリメントし(906のS
17)、カウンタ値が一定値を超えた場合には複写ループ
へ分岐するコード(906のS18)が作成されている。カウ
ンタが一定値を超えていない場合にはaの再ロード(907
のS19)を行い、チェック命令の次の命令(905のS3)に
戻る。
【0020】図7の説明に戻る。ステップ705でルー
プの2重化をすでに行っている場合は、ステップ707
から処理を行う。図8の中間語の例では、最初のロード
命令(S2)の移動ではループの複写を行うが、2番目の
ロード命令(S3)の移動ではループ2重化処理はスキッ
プされる。ステップ709では、従来のループ不変式移
動と同様に、移動対象文をループ外に移動する。さら
に、ステップ710で、移動対象文で参照されるオペラ
ンドが、回復コード中で設定されているかどうかを調
べ、設定されている場合は、ステップ711で、回復コ
ードの該設定文の直後にも、命令をコピーする。たとえ
ば、905のS4の文(t3=t1+t2)をステップ709でルー
プ外に移動する場合、そのオペランドのt1, t2は回復コ
ードのS19(t1=load.a(&a))で中で設定されているの
で、その直後にもコピーされる。図7の処理を行うこと
により、図8の中間コードは最終的に図10のようにな
る。
プの2重化をすでに行っている場合は、ステップ707
から処理を行う。図8の中間語の例では、最初のロード
命令(S2)の移動ではループの複写を行うが、2番目の
ロード命令(S3)の移動ではループ2重化処理はスキッ
プされる。ステップ709では、従来のループ不変式移
動と同様に、移動対象文をループ外に移動する。さら
に、ステップ710で、移動対象文で参照されるオペラ
ンドが、回復コード中で設定されているかどうかを調
べ、設定されている場合は、ステップ711で、回復コ
ードの該設定文の直後にも、命令をコピーする。たとえ
ば、905のS4の文(t3=t1+t2)をステップ709でルー
プ外に移動する場合、そのオペランドのt1, t2は回復コ
ードのS19(t1=load.a(&a))で中で設定されているの
で、その直後にもコピーされる。図7の処理を行うこと
により、図8の中間コードは最終的に図10のようにな
る。
【0021】図11は、図10の中間語をオブジェクト
コードにしたもので、本発明のコンパイラにより生成さ
れるものである。ここでは図2,3と同様、コードをわ
かりやすくするために一部C言語の構文を用いて記述し
ている。図11のプログラムでは、投機機構を利用して
ループ不変式移動がされたループ(1105〜1110)と、投
機機構を利用しないループ(1112〜1118)の2つのルー
プがあり、最初は投機機構を利用したループが実行され
る。投機機構を利用したループ内の最初のチェック命令
(1106)にひっかかったときに分岐する回復コード(11
20〜1125)では、最初にカウンタ値を更新し(1121)、
それが一定値を超えた場合は、投機機構を利用しないル
ープに制御を移す(1122)。2つめのチェック命令(11
07)についても同様である。これにより、頻繁にチェッ
クにひっかかる場合には投機機構を利用しないループが
実行されるので、以降は、投機チェックからの回復のた
めに実行速度が低下することがない。また投機チェック
にひっかかる回数が少ない場合には、投機機構を利用し
たコード(ループ不変式移動がされている)が実行され
るので、投機機構を利用しない場合より実行速度が速く
なる。
コードにしたもので、本発明のコンパイラにより生成さ
れるものである。ここでは図2,3と同様、コードをわ
かりやすくするために一部C言語の構文を用いて記述し
ている。図11のプログラムでは、投機機構を利用して
ループ不変式移動がされたループ(1105〜1110)と、投
機機構を利用しないループ(1112〜1118)の2つのルー
プがあり、最初は投機機構を利用したループが実行され
る。投機機構を利用したループ内の最初のチェック命令
(1106)にひっかかったときに分岐する回復コード(11
20〜1125)では、最初にカウンタ値を更新し(1121)、
それが一定値を超えた場合は、投機機構を利用しないル
ープに制御を移す(1122)。2つめのチェック命令(11
07)についても同様である。これにより、頻繁にチェッ
クにひっかかる場合には投機機構を利用しないループが
実行されるので、以降は、投機チェックからの回復のた
めに実行速度が低下することがない。また投機チェック
にひっかかる回数が少ない場合には、投機機構を利用し
たコード(ループ不変式移動がされている)が実行され
るので、投機機構を利用しない場合より実行速度が速く
なる。
【0022】以上の実施例では、カウンタを用いて投機
チェックにひっかかった回数をカウントしていたが、投
機チェックにひっかかる回数の上限値を1にした場合
は、カウンタの更新処理は不要になる。すなわち、1度
でもチェックにひっかかった場合、直に投機コードを利
用しないコードに分岐すればよい。すなわち、ステップ
708では回復コードを生成せずに、チェック命令から
複写ループへ直接分岐するようにする。この場合に生成
されるオブジェクトコードは図12に示すようになる。
図12のプログラムでは、投機機構を利用してループ不
変式移動がされたループ(1204〜1209)と、投機機構を
利用しないループ(1211〜1217)の2つのループがあ
り、投機機構を利用したループ内のチェック命令(120
5、1206)にひっかかったときには、投機機構を利用し
ないループに直接分岐する。このようにすると、回復コ
ードでのカウンタ更新やカウンタ値の比較コードが不要
になるという利点がある。
チェックにひっかかった回数をカウントしていたが、投
機チェックにひっかかる回数の上限値を1にした場合
は、カウンタの更新処理は不要になる。すなわち、1度
でもチェックにひっかかった場合、直に投機コードを利
用しないコードに分岐すればよい。すなわち、ステップ
708では回復コードを生成せずに、チェック命令から
複写ループへ直接分岐するようにする。この場合に生成
されるオブジェクトコードは図12に示すようになる。
図12のプログラムでは、投機機構を利用してループ不
変式移動がされたループ(1204〜1209)と、投機機構を
利用しないループ(1211〜1217)の2つのループがあ
り、投機機構を利用したループ内のチェック命令(120
5、1206)にひっかかったときには、投機機構を利用し
ないループに直接分岐する。このようにすると、回復コ
ードでのカウンタ更新やカウンタ値の比較コードが不要
になるという利点がある。
【0023】また以上の実施例では、投機チェックにひ
っかかった回数を閾値にしていたが、回数ではなく、確
率(割合)を閾値にしてもよい。すなわち、ループの実
行回数をN、チェックにひっかかった回数をMとし、M/N
が一定値以上になっているかを調べる。この場合のオブ
ジェクトコードは図13に示すようになる。図13のプ
ログラムでは、投機機構を利用してループ不変式移動が
されたループ(1306〜1312)と、投機機構を利用しない
ループ(1315〜1321)の2つのループがあり、投機機構
を利用したループでは、ループの実行回数をカウントす
る(1307)。投機機構を利用したループ内の最初のチェ
ック命令(1308)にひっかかったときに分岐する回復コ
ード(1323〜1329)では、チェックにひっかかった回数
を表すカウンタ値を更新し(1324)、それをループ実行
回数で割り(1325)、割った値が一定値を超えた場合
は、投機機構を利用しないループに戻る(1326)。2つ
めのチェック命令(1309)も同様である。このようにし
た場合、ループ実行回数をカウントするオーバーヘッド
や除算のオーバーヘッドが加わるものの、チェックにひ
っかかる確率で判断ができるので、どちらのループを実
行すべきかをより精密に判断することが可能になるとい
う利点がある。
っかかった回数を閾値にしていたが、回数ではなく、確
率(割合)を閾値にしてもよい。すなわち、ループの実
行回数をN、チェックにひっかかった回数をMとし、M/N
が一定値以上になっているかを調べる。この場合のオブ
ジェクトコードは図13に示すようになる。図13のプ
ログラムでは、投機機構を利用してループ不変式移動が
されたループ(1306〜1312)と、投機機構を利用しない
ループ(1315〜1321)の2つのループがあり、投機機構
を利用したループでは、ループの実行回数をカウントす
る(1307)。投機機構を利用したループ内の最初のチェ
ック命令(1308)にひっかかったときに分岐する回復コ
ード(1323〜1329)では、チェックにひっかかった回数
を表すカウンタ値を更新し(1324)、それをループ実行
回数で割り(1325)、割った値が一定値を超えた場合
は、投機機構を利用しないループに戻る(1326)。2つ
めのチェック命令(1309)も同様である。このようにし
た場合、ループ実行回数をカウントするオーバーヘッド
や除算のオーバーヘッドが加わるものの、チェックにひ
っかかる確率で判断ができるので、どちらのループを実
行すべきかをより精密に判断することが可能になるとい
う利点がある。
【0024】以上の実施例は、投機機構を利用してルー
プ不変式移動を行う場合に本発明を適用したものであっ
たが、本発明はこれに限定されるものではなく、投機機
構を利用して、ループ内で命令を移動する(命令スケジ
ューリング)場合にも適用できる。命令スケジューリン
グは、命令の順序を並べ替えることにより、命令レイテ
ンシを隠蔽し、命令列の実行時間を削減する最適化であ
る。一般に、ストア命令と、後続するロード命令の間に
不明な依存関係がある場合(それぞれの命令で参照する
メモリアドレスが一致している可能性がある場合)は、
ロード命令をストア命令の前に移動することはできない
が、投機機構を利用すれば命令の順序を入れ替えること
ができる。すなわち、ストア命令の前に投機的ロード命
令を実行し、ストア命令の後でチェック命令を実行すれ
ばよい。ループに対してこのような投機機構を利用した
命令スケジューリングに本発明を適用した場合、投機機
構を利用したループと、投機機構を利用しないループの
2つのループコードを生成し、投機機構を利用したルー
プ内でのチェック命令にひっかかった回数がある条件を
満たす場合は、以降は投機機構を利用しないループに分
岐するようにする。これにより、投機チェックに頻繁に
ひっかかる場合の性能低下を防ぐことができる。
プ不変式移動を行う場合に本発明を適用したものであっ
たが、本発明はこれに限定されるものではなく、投機機
構を利用して、ループ内で命令を移動する(命令スケジ
ューリング)場合にも適用できる。命令スケジューリン
グは、命令の順序を並べ替えることにより、命令レイテ
ンシを隠蔽し、命令列の実行時間を削減する最適化であ
る。一般に、ストア命令と、後続するロード命令の間に
不明な依存関係がある場合(それぞれの命令で参照する
メモリアドレスが一致している可能性がある場合)は、
ロード命令をストア命令の前に移動することはできない
が、投機機構を利用すれば命令の順序を入れ替えること
ができる。すなわち、ストア命令の前に投機的ロード命
令を実行し、ストア命令の後でチェック命令を実行すれ
ばよい。ループに対してこのような投機機構を利用した
命令スケジューリングに本発明を適用した場合、投機機
構を利用したループと、投機機構を利用しないループの
2つのループコードを生成し、投機機構を利用したルー
プ内でのチェック命令にひっかかった回数がある条件を
満たす場合は、以降は投機機構を利用しないループに分
岐するようにする。これにより、投機チェックに頻繁に
ひっかかる場合の性能低下を防ぐことができる。
【0025】
【発明の効果】本発明のコンパイル方法によれば、ルー
プのように繰り返し実行される部分に対して投機機構を
利用したコードを生成する場合、頻繁に投機チェックに
ひっかかり回復コードに分岐するために性能が低下す
る、ということが発生しないコードを生成できる。
プのように繰り返し実行される部分に対して投機機構を
利用したコードを生成する場合、頻繁に投機チェックに
ひっかかり回復コードに分岐するために性能が低下す
る、ということが発生しないコードを生成できる。
【図1】本発明のコンパイラが稼動する計算機システム
の構成図。
の構成図。
【図2】ソースプログラム例を示す図。
【図3】投機機構を利用しない場合の従来技術の生成コ
ードを示す図。
ードを示す図。
【図4】投機機構を利用した場合の従来技術の生成コー
ドを示す図。
ドを示す図。
【図5】コンパイル処理の流れを示す図。
【図6】図2のプログラムの対する中間コードの例を示
す図。
す図。
【図7】本発明を適用したループ不変式移動処理の流れ
を示す図。
を示す図。
【図8】ループ2重化直後の中間コードの例を示す図。
【図9】最初のロード命令をループ外移動した直後の中
間語の例を示す図。
間語の例を示す図。
【図10】ループ不変式移動処理後の中間コードの例を
示す図。
示す図。
【図11】本発明を適用した場合の生成コードの例を示
す図。
す図。
【図12】本発明を適用した場合の別の生成コードの例
を示す図。
を示す図。
【図13】本発明を適用した場合の別の生成コードの例
を示す図。
を示す図。
Claims (7)
- 【請求項1】 投機命令および投機誤りをチェックする
チェック命令を有するプロセッサ向けのコードを生成す
るコンパイラにおいて、 (1)プログラム中の繰り返し実行される部分に対し、
投機命令およびチェック命令を使用したコード(a)と、
投機命令およびチェック命令を使用しないコード(b)を
含む、少なくとも2種類のパターンのコードを生成する
処理と、 (2)コード(a)の実行中に投機誤りチェックにかかっ
た回数が特定の条件を満たす場合に、以降の繰り返しで
はコード(b)を実行するように、制御の移行を行うコー
ドを生成する処理を含むことを特徴とする、投機機構向
けコンパイル方法。 - 【請求項2】 請求項1のコンパイル方法において、
(2)における特定の条件として、投機チェックにかか
った回数が一定値を超えることを条件とする、投機機構
向けコンパイル方法。 - 【請求項3】 請求項1のコンパイル方法において、
(2)における特定の条件として、繰り返し部分の実行
回数に対する、投機チェックにかかった回数の割合が一
定値を超えることを条件とする、投機機構向けコンパイ
ル方法。 - 【請求項4】 請求項1のコンパイル方法において、投
機チェックにかかった場合、カウンタを更新し、その値
が一定値を越えた場合には、コード(b)に制御を移すこ
とを特徴とする、投機機構向けコンパイル方法。 - 【請求項5】 請求項1のコンパイル方法において、投
機チェックにかかった場合、ただちにコード(b)に制御
を移すことを特徴とする、投機機構向けコンパイル方
法。 - 【請求項6】 請求項1のコンパイル方法を用いたコン
パイラ。 - 【請求項7】 請求項6のコンパイラを格納した記憶媒
体。
Priority Applications (2)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2000148588A JP2001325111A (ja) | 2000-05-16 | 2000-05-16 | 投機機構向けコンパイル方法 |
| US09/854,458 US20010044931A1 (en) | 2000-05-16 | 2001-05-15 | Compile method suitable for speculation mechanism |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2000148588A JP2001325111A (ja) | 2000-05-16 | 2000-05-16 | 投機機構向けコンパイル方法 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JP2001325111A true JP2001325111A (ja) | 2001-11-22 |
Family
ID=18654591
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2000148588A Pending JP2001325111A (ja) | 2000-05-16 | 2000-05-16 | 投機機構向けコンパイル方法 |
Country Status (2)
| Country | Link |
|---|---|
| US (1) | US20010044931A1 (ja) |
| JP (1) | JP2001325111A (ja) |
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2024061058A (ja) * | 2022-10-21 | 2024-05-07 | 株式会社デンソー | コンパイラ |
Families Citing this family (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US7774787B2 (en) * | 2005-01-11 | 2010-08-10 | Microsoft Corporation | Method for specifying and verifying multi-threaded object-oriented programs with invariants |
| US7590978B2 (en) * | 2005-04-15 | 2009-09-15 | Microsoft Corporation | Inferring object invariant method and system |
| US7559054B2 (en) * | 2005-04-19 | 2009-07-07 | Microsoft Corporation | Abstract interpretation with a congruence abstract domain and/or a heap succession abstract domain |
| CN101546287A (zh) * | 2008-03-26 | 2009-09-30 | 国际商业机器公司 | 代码修改方法和代码修改设备 |
| US8892946B2 (en) * | 2011-12-15 | 2014-11-18 | International Business Machines Corporation | Verifying speculative multithreading in an application |
Family Cites Families (17)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US5202995A (en) * | 1989-10-12 | 1993-04-13 | International Business Machines Corporation | Method for removing invariant branches from instruction loops of a computer program |
| JPH0820950B2 (ja) * | 1990-10-09 | 1996-03-04 | インターナショナル・ビジネス・マシーンズ・コーポレイション | マルチ予測型分岐予測機構 |
| US5454117A (en) * | 1993-08-25 | 1995-09-26 | Nexgen, Inc. | Configurable branch prediction for a processor performing speculative execution |
| US5761515A (en) * | 1996-03-14 | 1998-06-02 | International Business Machines Corporation | Branch on cache hit/miss for compiler-assisted miss delay tolerance |
| US6026426A (en) * | 1996-04-30 | 2000-02-15 | International Business Machines Corporation | Application programming interface unifying multiple mechanisms |
| US5854928A (en) * | 1996-10-10 | 1998-12-29 | Hewlett-Packard Company | Use of run-time code generation to create speculation recovery code in a computer system |
| US6631518B1 (en) * | 1997-03-19 | 2003-10-07 | International Business Machines Corporation | Generating and utilizing organized profile information |
| US6505296B2 (en) * | 1997-10-13 | 2003-01-07 | Hewlett-Packard Company | Emulated branch effected by trampoline mechanism |
| US6442585B1 (en) * | 1997-11-26 | 2002-08-27 | Compaq Computer Corporation | Method for scheduling contexts based on statistics of memory system interactions in a computer system |
| US6631514B1 (en) * | 1998-01-06 | 2003-10-07 | Hewlett-Packard Development, L.P. | Emulation system that uses dynamic binary translation and permits the safe speculation of trapping operations |
| US6658486B2 (en) * | 1998-02-25 | 2003-12-02 | Hewlett-Packard Development Company, L.P. | System and method for efficiently blocking event signals associated with an operating system |
| US6151706A (en) * | 1998-06-16 | 2000-11-21 | Silicon Graphics, Inc. | Method, system, and computer program product for extending sparse partial redundancy elimination to support speculative code motion within an optimizing compiler |
| US20020147969A1 (en) * | 1998-10-21 | 2002-10-10 | Richard A. Lethin | Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method |
| US6463579B1 (en) * | 1999-02-17 | 2002-10-08 | Intel Corporation | System and method for generating recovery code |
| US6640315B1 (en) * | 1999-06-26 | 2003-10-28 | Board Of Trustees Of The University Of Illinois | Method and apparatus for enhancing instruction level parallelism |
| US6502188B1 (en) * | 1999-11-16 | 2002-12-31 | Advanced Micro Devices, Inc. | Dynamic classification of conditional branches in global history branch prediction |
| US6823446B1 (en) * | 2000-04-13 | 2004-11-23 | International Business Machines Corporation | Apparatus and method for performing branch predictions using dual branch history tables and for updating such branch history tables |
-
2000
- 2000-05-16 JP JP2000148588A patent/JP2001325111A/ja active Pending
-
2001
- 2001-05-15 US US09/854,458 patent/US20010044931A1/en not_active Abandoned
Cited By (1)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2024061058A (ja) * | 2022-10-21 | 2024-05-07 | 株式会社デンソー | コンパイラ |
Also Published As
| Publication number | Publication date |
|---|---|
| US20010044931A1 (en) | 2001-11-22 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US8271832B2 (en) | Non-faulting and first-faulting instructions for processing vectors | |
| US8417921B2 (en) | Running-min and running-max instructions for processing vectors using a base value from a key element of an input vector | |
| US8359460B2 (en) | Running-sum instructions for processing vectors using a base value from a key element of an input vector | |
| Du et al. | A cost-driven compilation framework for speculative parallelization of sequential programs | |
| US9015690B2 (en) | Proactive loop fusion of non-adjacent loops with intervening control flow instructions | |
| US8793472B2 (en) | Vector index instruction for generating a result vector with incremental values based on a start value and an increment value | |
| US5692169A (en) | Method and system for deferring exceptions generated during speculative execution | |
| US6964043B2 (en) | Method, apparatus, and system to optimize frequently executed code and to use compiler transformation and hardware support to handle infrequently executed code | |
| US8959316B2 (en) | Actual instruction and actual-fault instructions for processing vectors | |
| US8447956B2 (en) | Running subtract and running divide instructions for processing vectors | |
| US8984262B2 (en) | Generate predicates instruction for processing vectors | |
| US8464031B2 (en) | Running unary operation instructions for processing vectors | |
| US8650383B2 (en) | Vector processing with predicate vector for setting element values based on key element position by executing remaining instruction | |
| US20100095286A1 (en) | Register reduction and liveness analysis techniques for program code | |
| US9182959B2 (en) | Predicate count and segment count instructions for processing vectors | |
| US20100325399A1 (en) | Vector test instruction for processing vectors | |
| CZ293714B6 (cs) | Způsob pro ošetřování výjimek u spekulativních instrukcí a zařízení k provádění tohoto způsobu | |
| US20110283092A1 (en) | Getfirst and assignlast instructions for processing vectors | |
| US20170010973A1 (en) | Processor with efficient processing of load-store instruction pairs | |
| US9575897B2 (en) | Processor with efficient processing of recurring load instructions from nearby memory addresses | |
| US10185561B2 (en) | Processor with efficient memory access | |
| JP2001325111A (ja) | 投機機構向けコンパイル方法 | |
| WO2017006235A1 (en) | Processor with efficient memory access | |
| JPH06290057A (ja) | ループ最適化方法 | |
| US20170010972A1 (en) | Processor with efficient processing of recurring load instructions |