JP2006338616A - コンパイラ装置 - Google Patents

コンパイラ装置 Download PDF

Info

Publication number
JP2006338616A
JP2006338616A JP2005165999A JP2005165999A JP2006338616A JP 2006338616 A JP2006338616 A JP 2006338616A JP 2005165999 A JP2005165999 A JP 2005165999A JP 2005165999 A JP2005165999 A JP 2005165999A JP 2006338616 A JP2006338616 A JP 2006338616A
Authority
JP
Japan
Prior art keywords
instruction
circulation path
dependence
circuit
program
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
JP2005165999A
Other languages
English (en)
Inventor
Shohei Domoto
昌平 道本
Takehito Heiji
岳人 瓶子
Hajime Ogawa
一 小川
Teruo Kawabata
輝雄 川端
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.)
Panasonic Holdings Corp
Original Assignee
Matsushita Electric Industrial Co 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 Matsushita Electric Industrial Co Ltd filed Critical Matsushita Electric Industrial Co Ltd
Priority to JP2005165999A priority Critical patent/JP2006338616A/ja
Priority to US11/420,059 priority patent/US7856629B2/en
Priority to CNA200610093557XA priority patent/CN1877532A/zh
Publication of JP2006338616A publication Critical patent/JP2006338616A/ja
Priority to US13/616,573 priority patent/USRE45199E1/en
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)

Abstract

【課題】 ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供する。
【解決手段】 図2(a)に示す循環路のst命令に対してmov命令を挿入すると、図2(b)のようになる。すなわち、st命令の代わりに、st命令で用いられている運搬依存の媒介変数であるレジスタr1を未使用のレジスタr4に置き換えた命令「st (r4),r2」を使用し、元の媒介変数であるレジスタr1に格納された値をレジスタr4に格納する転送命令「mov r4,r1」を挿入する。このように、mov命令を循環路根に対して挿入することにより、循環路長が4サイクルの循環路を、循環路長が3サイクルの循環路と、循環路長が1サイクルの循環路との2つに分解することができ、ループ処理の開始間隔を小さくすることができる。
【選択図】 図2

Description

本発明は、C言語等の高級言語で記述されたソースプログラムを機械語プログラムに変換するコンパイラ装置に関し、特に、コンパイラ装置によるループ処理の高速化に関する。
コンパイラは、高級言語で記述されたソースプログラムを機械語の命令列よりなる機械語プログラムに変換する。コンパイラは、機械語プログラムへの変換の際に、機械語プログラムの実行効率を向上させるように命令の順序づけを行なう。これを「命令スケジューリング」という。
また、ループ処理の実行効率を如何に向上させるかは、言語処理系の技術分野において、古くから議論されてきた研究テーマの1つである。一般にループ処理は、for文、while文等の制御文と、0以上の演算式からなるボディとからなり、制御文にて規定された繰り返し条件が満たされるまで、ボディが繰り返し実行されることとなる。こうしたループ処理における実行単位は「イタレーション」と呼ばれ、イタレーションは制御文に示された繰り返し数と同じ数だけ派生することとなる。仮に制御文がボディを100回繰り返すよう記述されているのなら、当該ボディから100個のイタレーションが派生することとなる。
ループ処理の実行効率を向上させるには、かかる複数のイタレーションの全部又は一部を並列に実行させればよいことはいうまでもない。イタレーションの並列実行を実現するには、ループ処理のボディに対して、ソフトウェアパイプライニングと呼ばれる最適化手法を施すことが有効であることが、従来知られている(例えば、特許文献1参照。)。
ソフトウェアパイプライニングは、コンパイラがループボディをパイプラインに適合するような機械語命令に翻訳することにより、性能向上を図ろうとする最適化手法である。ソフトウェアパイプライニングがどのように行われるかについて図18を参照しながら説明する。
図18(a)は、ループボディの一例であり、このボディは命令A、命令B、命令Cからなる。図18(b)は、図18(a)に示す命令列を並列実行することなく3回繰り返した場合の一例を示す図である。例えば、命令A、命令B、命令Cおよびブランチ命令brはそれぞれ1サイクルで処理が終了するとした場合には、1回の繰返し処理(イタレーション)に4サイクルを要するため、3回のイタレーションでは、12サイクルを要することとなる。
これに対し、図18(c)は、図18(a)に示す命令列の3回のイタレーションをソフトウェアパイプライニングにより最適化し、並列実行した場合の一例を示す図である。この場合、イタレーションを跨って、命令Cと命令Aとを並列実行するようにし、ブランチ命令brと命令Bとを並列実行するように最適化が行なわれている。このため、並列実行しなかった場合に12サイクルを要していた処理時間を8サイクルまで短縮することができる。
なお、並列実行する命令の組み合わせは、命令間の依存関係や、機械語プログラムが実行されるプロセッサにおいて利用可能なハードウェア資源等により決定される。
また、あるイタレーションの実行を開始してから、次のイタレーションの実行を開始するまでの間隔は「開始間隔」と呼ばれ、この開始間隔が小さいほどループ処理に要する実行サイクル数が小さくなり、ループ処理を高速実行することができる。
特開平10−97423号公報
しかしながら、プロセッサが利用可能なハードウェア資源の制約が大きい場合には、開始間隔を小さくしたり、命令スケジューリングを適切に行なったりすることが困難であり、実行サイクル数削減の効果が小さいという問題がある。
図19は、この問題点を説明するための図である。ここでは、図18(a)に示した命令列をソフトウェアパイプライニングにより最適化した結果を示しており、命令Aおよび命令Bは同一のハードウェア資源Dを使用するものとする。図19(a)は、ハードウェア資源Dが1つしかない場合の最適化の結果を示す図であり、図19(b)は、ハードウェア資源Dが2つある場合の最適化の結果を示す図である。図19(a)に示すように、ハードウェア資源Dが1つしかない場合には、命令Aと命令Bとは並列実行することができない。このため、開始間隔を2よりも小さくすることができない。一方、ハードウェア資源Dが2つある場合には、図19(b)に示すように命令Aおよび命令Bを並列実行することができるため、開始間隔を1にすることができる。このように、コンピュータがどのようなアーキテクチャを有するかによって開始間隔には限界が存在する。したがって、ハードウェア資源の制約が理由で開始間隔が大きくなっている場合には、コンパイラによる最適化により開始間隔をこれ以上小さくすることは不可能である。
一方、イタレーションを跨いだ命令間のデータ依存である運搬依存が存在する場合には、開始間隔の最小値は、データ依存関係をグラフ化したデータ依存グラフ中の運搬依存を含む経路のサイクル数の最大値により決定される。このため、開始間隔を当該最大値未満にすることができず、当該最大値が大きいような場合には、ソフトウェアパイプライニングによる実行サイクル数削減の効果が小さいという問題もある。
図20は、この問題点を説明するための図である。図20(a)は、ループ内の命令間に存在するデータ依存関係をグラフ化したデータ依存グラフを示す図である。図20(b)は、図20(a)に示したデータ依存グラフに基づいてソフトウェアパイプライニングを行なった結果を示す図である。
ここで、データ依存について簡単に説明するが、データ依存は、「真の依存」、「逆依存」、「出力依存」という3つの依存に分類される。「真の依存」とは、先行する命令が定義した変数を後続する命令が使用する場合の依存関係を示す。「逆依存」とは、先行する命令が使用した変数を後続する命令が定義する場合の依存関係を示す。「出力依存」とは、先行する命令が定義した変数を後続する命令が再定義する場合の依存関係を示す。また、イタレーション間に存在するデータ依存を特に「運搬依存」という。したがって、運搬依存はボディの命令間に存在する依存関係ではない。運搬依存の具体例をいうと、あるイタレーション内の演算式の実行により導かれた値が、次巡以降のイタレーションにより使用されるために現れる依存関係であり、かかる依存関係が存在している場合、定義側の演算式の実行より、参照側の演算式が先行することは許されない。
図20(a)に示すように、ループ内の3つの命令(ld命令、add命令、st命令)間には、真の依存および逆依存が存在する。図中では、真の依存を実線矢印で示し、逆依存を破線矢印で示すこととする。
ここで、「ld r0,(r1+)」は、レジスタr1に格納されているアドレスのデータをメインメモリより読み出し、レジスタr0に格納した後、レジスタr1に格納されている値を1つインクリメントする命令である。「add r2,r0,r0」は、レジスタr0に格納されている値とレジスタr0に格納されている値とを加算し、加算結果をレジスタr2に格納する命令である。「st (r1),r2」は、レジスタr2に格納されている値をレジスタr1に格納されているメインメモリのアドレスに格納する命令である。
したがって、ld命令とadd命令との間には、レジスタr0を媒介変数として真の依存が存在する。すなわち、ld命令で定義されたレジスタr0がadd命令において参照されている。また、ld命令の実行を開始してからadd命令が実行可能になるまでのレイテンシは3サイクルであるものとする。したがって、これらを図中では「3(r0)」と記述することとする。
同様に、add命令とst命令との間には、レジスタr2を媒介変数として真の依存が存在する。また、2命令間のレイテンシは1サイクルであるものとする。したがって、図中では「1(r2)」と記述されている。
さらに、st命令とld命令との間には、レジスタr1を媒介変数とした運搬依存かつ逆依存が存在する。すなわち、st命令でレジスタr1に格納された値が参照されてから、ld命令でレジスタr1に格納された値が1つインクリメントされることによりレジスタr1が定義されている。また、本実施の形態では、運搬依存かつ逆依存のデータ依存関係を有する2命令間のレイテンシおよび運搬依存かつ出力依存のデータ依存関係を有する2命令間のレイテンシは各々0サイクルであるものとする。したがって、図中では「0(r1)」と記述されている。
このような運搬依存を含むデータ依存グラフの循環路を考えた場合に、その循環路のサイクル数は4(=3+1+0)サイクルとなる。また、この循環路には運搬依存が1つしか存在しないため依存距離が1である。ここで、「依存距離」とは、運搬依存がイタレーション間に存在する場合、その依存する命令間のイタレーション数の差を示す。したがって、あるイタレーションのld命令を実行してから次のイタレーションのld命令を実行するには、図20(b)に示すように少なくとも4サイクルの開始間隔をあけなければならず、開始間隔は運搬依存を含む依存グラフの循環路のサイクル数よりも短くすることができない。
本発明は、上述の課題を解決するためになされたものであり、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供することを目的とする。
上記目的を達成するために、本発明のある局面に係るコンパイラ装置は、ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換するコンパイラ装置であって、前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析手段と、前記中間プログラムを最適化する最適化手段と、最適化された前記中間プログラムを機械語プログラムに変換する変換手段とを備え、前記最適化手段は、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なうことを特徴とする。具体的には、前記最適化手段は、前記中間プログラム中に存在する命令間のデータ依存グラフを作成し、当該データ依存グラフ中より、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路である循環路を検出する循環路検出部と、検出された前記循環路に含まれる運搬依存の媒介変数をオペランドの一部とする前記転送命令を挿入する挿入部と、転送命令挿入後の前記中間プログラムに対してソフトウェアパイプライニングを施すソフトウェアパイプライニング部とを有することを特徴とする。
ループ処理に対して、転送命令を挿入することにより、元のループ処理におけるデータ依存グラフの閉路を、複数のデータ依存グラフの閉路に分割することができる。このため、元のループ処理におけるデータ依存グラフの閉路のサイクル数の最大値を小さくすることができる可能性がある。そのため、ループ処理における開始間隔を小さくし、ソフトウェアパイプライニングによる最適化を行なった後のループ処理の実行サイクル数を小さくすることができる可能性がある。よって、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供することができる。
例えば、前記挿入部は、検出された前記循環路における真の依存の依存先であって、かつ、運搬依存かつ逆依存の依存元となっている命令を選択する命令選択部と、選択された前記命令において参照されている第1のレジスタを第2のレジスタに置き換えることにより、当該命令を置換する命令置換部と、前記第1のレジスタに格納されている値を前記第2のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有していてもよい。また、前記挿入部は、検出された前記循環路における真の依存の依存元であって、かつ、運搬依存かつ逆依存の依存先となっている命令を選択する命令選択部と、選択された前記命令において定義されている第1のレジスタを第2のレジスタに置き換えることにより、当該命令を置換する命令置換部と、前記第2のレジスタに格納されている値を前記第1のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有していてもよい。
この構成によると、データ依存グラフの閉路において逆依存かつ運搬依存となっている依存関係を分断することにより、配置制約が緩和された新たな循環路を作成することができる。このため、ループ処理の実行サイクル数を小さくすることができる可能性がある。よって、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置を提供することができる。
好ましくは、前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計が最大の循環路を少なくとも1つ検出し、前記命令選択部は、前記レイテンシの合計が最大の循環路が複数存在する場合には、複数の循環路の運搬依存の依存元または依存先となっている命令のうち、最も多くの循環路の運搬依存の依存元または依存先となっている命令を選択する。
このように、最も多くの循環路の運搬依存の依存元または依存先となっている命令を選択した方が、より多くの循環路長を減少させることができる。このため、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができる。また、命令スケジューリングにおける命令の配置制約を緩和することもできる。
また、前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計である循環路長が最大の循環路を検出するようにしてもよい。
循環路における最大循環路長が、ループ処理における開始間隔の最小値を決定する。よって、そのような循環路を検出し、転送命令を挿入することにより、開始間隔を減少させることができる可能性がある。このため、ループ処理における実行サイクル数を削減することができる可能性がある。
好ましくは、前記循環路検出部は、資源制約を考慮した前記循環路長が最大の循環路を検出する。
ハードウェア資源等の資源制約を考慮した上での最大循環路長を有する循環路を検出することにより、真にボトルネックとなっている循環路の循環路長を小さくさせることができる。よって、ループ処理における実行サイクル数を減少させたり、命令スケジューリングにおける命令の配置制約を緩和したりすることができる。
また、2つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路以外の循環路を検出する。
2つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路に対して、転送命令を挿入したとしても、循環路長は短くならず、開始間隔を小さくすることができない。このため、このような循環路に対しては、循環路検出を行なわないようにすることにより、最適化処理の効果を向上させることができる。
また、前記循環路検出部は、真の依存の依存元であって、かつ、運搬依存かつ逆依存となっている命令からのレイテンシが、前記転送命令からのレイテンシよりも大きい循環路を検出することを特徴としてもよい。
転送命令を挿入することにより循環路長が大きくなる循環路を予め除去することができる。よって、高速化効率のよい、循環路の選択が可能となる。
本発明の他の局面に係るプログラムは、並列処理可能なプロセッサ用のプログラムであって、ループ処理の各イタレーションを並列実行させる命令と、前記ループ処理に関する依存グラフを作成した場合に、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路を形成する命令に使用されているオペランド間でデータを転送する命令である転送命令とをプロセッサに実行させるためのプログラムである。
このプログラムは、ループ処理中に転送命令が挿入されているため、転送命令が挿入されていないプログラムに比べ、開始間隔が小さくなっている。よって、非常に高速実行可能なプログラムを提供することができる。
なお、本発明は、このような特徴的な手段を備えるコンパイラ装置として実現することができるだけでなく、コンパイラ装置に含まれる特徴的な手段をステップとするコンパイル方法として実現したり、コンパイル方法に含まれる特長的なステップをコンピュータに実行させるコンパイラとして実現したりすることもできる。そして、そのようなコンパイラは、CD−ROM(Compact Disc-Read Only Memory)等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
本発明によると、ループ処理に対して、実行サイクル数の削減の効果が大きいソフトウェアパイプライニングによる最適化処理を施すことができるコンパイラ装置等を提供することができる。
近年、並列化処理可能なプロセッサが増えてきており、また、ループ処理は、プログラム中で頻出する処理でもある。したがって、このようなコンパイラ装置等により作成された機械語プログラムは、高速実行可能であり、その実用的価値は極めて大きい。
以下、図面を参照しながら本発明の実施の形態に係るコンパイラ装置について説明する。
図1は、コンパイラ装置の構成を示す機能ブロック図である。図1(a)はコンパイラ装置の全体の構成を示す機能ブロック図であり、図1(b)は、コンパイラ装置の一部であるソフトウェアパイプライニング部の構成を示す機能ブロック図である。
図1(a)に示されるように、コンパイラ装置202は、C言語等の高級言語で記述されたソースプログラム201を、プロセッサが実行可能な形式の機械語プログラム203に変換する装置であり、構文解析部204と、最適化部205と、出力部206とを備えている。本実施の形態では、コンパイラ装置202は、複数の命令を並列実行可能なプロセッサをターゲットプロセッサとしている。
構文解析部204は、入力されたソースプログラム201に対して構文解析処理を行い、中間言語で記述されたプログラム(以下、「中間プログラム」という。)を出力する処理部である。最適化部205は、中間プログラムに対して所定の最適化処理を施す処理部である。出力部206は、最適化処理が施された後の中間プログラムを機械語プログラム203に変換して出力する処理部である。
最適化部205は、第1最適化部207と、ソフトウェアパイプライニング部208と、第2最適化部209とを備えている。第1最適化部207および第2最適化部209で実行される最適化処理は一般的な最適化処理である。ソフトウェアパイプライニング部208は、中間プログラムに含まれるループ処理に対してソフトウェアパイプライニング処理を施して最適化する処理部である。
図1(b)に示されるように、ソフトウェアパイプライニング部208は、循環路解析部211と、命令選択部212と、転送命令挿入部213と、従来のソフトウェアパイプライニング部214とを備えている。
循環路解析部211は、中間プログラム中に存在する命令間のデータ依存グラフを作成し、当該データ依存グラフ中から循環路を解析する処理部である。なお、循環路の定義については後述する。命令選択部212は、循環路解析部211での解析結果に従い、データ依存グラフ中の転送命令を挿入する命令を選択する処理部である。「転送命令」とは、オペランド間でデータを転送可能な命令を示し、一般的には、いわゆるレジスタ間でデータを移動させるmov命令が考えられる。転送命令挿入部213は、命令選択部212で選択された命令に対して転送命令を挿入する処理部である。従来のソフトウェアパイプライニング部214は、転送命令が挿入された後の中間プログラムに対して従来と同様のソフトウェアパイプライニング処理を施す処理部である。
なお、コンパイラ装置202を構成する各処理部は、コンピュータ上で実行されるプログラムとして実現される。
ここで、以下の説明のために用語の定義を行なう。
(1)循環路
ある命令に関するデータ依存をたどり、最終的にもとの命令に戻るデータ依存グラフの閉路を示す。ただし、同一命令を複数たどらない。
(2)循環路長
循環路におけるデータ依存のレイテンシの合計を示す。
(3)資源制約考慮循環路
資源制約(ハードウェア資源や並列実行可能な命令数)を考慮した循環路を示す。
(4)資源制約考慮循環路長
資源制約考慮循環路におけるデータ依存のレイテンシの合計を示す。
(5)Longest Path
最長の循環路を示す。
(6)資源考慮Longest Path
最長の資源制約考慮循環路を示す。
(7)循環路葉
循環路における真の依存の依存先であって、かつ逆依存の依存元となっている命令を示す。
(8)循環路根
循環路における真の依存の依存元であって、かつ逆依存の依存先となっている命令を示す。
本発明では、循環路または資源制約考慮循環路の循環路葉または循環路根に転送命令を挿入することによりソフトウェアパイプライニングにおける実行性能を向上させることを主眼としている。したがって、ソフトウェアパイプライニング部208の実行する処理についてのみ詳細に説明を行なう。コンパイラ装置202のその他の処理部は、従来のコンパイラ装置に備えられている処理部と同様の機能を有する。このためその詳細な説明はここでは繰り返さない。
まず、循環路に対して転送命令を挿入することによる作用、効果について説明する。
図2は、循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。
図2(a)は、図20(a)に示したデータ依存グラフと同じ循環路であり、ループ内に3つの命令(ld命令、add命令、st命令)が含まれている循環路である。このデータ依存グラフは、循環路長が4サイクルである。一方、図2(b)は、図2(a)に示した循環路の循環路葉(st命令)に対して転送命令の一種であるmov命令を挿入した後の循環路を示している。すなわち、st命令の代わりに、st命令で用いられている運搬依存の媒介変数であるレジスタr1を未使用のレジスタr4に置き換えた命令「st (r4),r2」を使用し、元の媒介変数であるレジスタr1に格納された値をレジスタr4に格納する転送命令「mov r4,r1」を挿入する。このように、mov命令を循環路葉に対して挿入することにより、循環路長が4サイクルの循環路を、循環路長が3サイクルの循環路(ld命令とmov命令とから構成される循環路)と、循環路長が1サイクルの循環路(mov命令とst命令とから構成される循環路)との2つに分解することができる。すなわち、転送命令を挿入することにより元々存在した運搬依存を分断している。このように、ある運搬依存を分断することにより、新たな循環路を作成することを、本明細書中では「運搬依存斬り」という。
上述したようにソフトウェアパイプライニングの開始間隔の最小値は、Longest Pathの循環路長により決定される。したがって、図2(a)に示す循環路がループ処理におけるLongest Pathであるとした場合には、開始間隔が4であったものを開始間隔3にすることができる。
図3は、転送命令を挿入する前後のソフトウェアパイプライニングを行なった結果を示す図である。図3(a)は、転送命令を挿入する前にソフトウェアパイプライニングを行なった結果を示しており、開始間隔は4である。一方、図3(b)は、転送命令を挿入した後にソフトウェアパイプライニングを行なった結果を示しており、開始間隔が3になっている。転送命令を挿入することにより、1イタレーションあたりの実行サイクル数は増加する可能性があるものの、開始間隔が減少するために、ループ全体として見た場合には、実行サイクル数は削減される。この効果は、イタレーションの数が大きいほど大きい。
また、図2に示すように、st命令とld命令との間の依存距離が元々1であったものを2に増やす効果もある。このため、ソフトウェアパイプライニング時における命令の配置制約も緩和される。
図4は、図2(a)に示した循環路の循環路根(ld命令)に対して、mov命令を挿入した後の循環路を示す図である。すなわち、ld命令の変わりに、ld命令で用いられている媒介変数であるレジスタr1を未使用のレジスタr4に置き換えた命令「ld r0,(r4+)」を使用し、レジスタr4に格納された値を元の媒介変数であるレジスタr1に格納する転送命令「mov r4,r1」を挿入する。このように、mov命令を循環路根に対して挿入することにより、循環路長が4サイクルの循環路を、循環路長が3サイクルの循環路(ld命令とmov命令とから構成される循環路)と、循環路長が1サイクルの循環路(mov命令とst命令とから構成される循環路)との2つに分解することができる。
この場合も、図2および図3を用いて説明したように、開始間隔を3にできる可能性がある。
次に、図1(b)に示したソフトウェアパイプライニング部208が実行する処理の流れについて説明する。図5は、ソフトウェアパイプライニング部208が実行する処理のフローチャートである。循環路解析部211は、中間プログラムに含まれるループについて、データ依存グラフを作成し、データ依存グラフに存在する循環路を取得する(S400)。次に、命令選択部212は、循環路取得処理(S400)において取得されたループ内の全ての循環路を集合の要素とする循環路集合に設定する(S401)。命令選択部212は、循環路集合に含まれる循環路の中からLongest Pathを求める(S402)。命令選択部212は、転送命令を挿入することにより循環路長が大きくなるLongest Pathを循環路集合から除く(S403)。命令選択部212は、循環路集合に属するLongest Pathの循環路葉または循環路根から1つ選択する(S404)。転送命令挿入部213は選択された循環路葉または循環路根に対して転送命令を挿入する(S405)。従来のソフトウェアパイプライニング部214は、転送命令が挿入された後のループ処理に対してソフトウェアパイプライニング処理を実行する(S406)。
上述した図2および図3に示した例は、運搬依存かつ逆依存の依存関係を有するLongest Pathの循環路葉に転送命令を挿入し、ソフトウェアパイプライニングを行なった例を示したものである。また、図4に示した例は、運搬依存かつ逆依存の依存関係を有するLongest Pathの循環路根に転送命令を挿入し、ソフトウェアパイプライニングを行なった例を示したものである。データ依存には、上述のように、真の依存、逆依存および出力依存の3種類が存在する。このため、運搬依存にも同様に真の依存、逆依存および出力依存の3種類が存在する。
以下、運搬依存かつ逆依存の依存関係を有するLongest Pathに転送命令を挿入した場合、運搬依存かつ出力依存の依存関係を有するLongest Pathに転送命令を挿入した場合、および運搬依存かつ真の依存を有するLongest Pathに転送命令を挿入した場合の循環路長の変化について考察する。
[運搬依存かつ逆依存]
図6は、運搬依存かつ逆依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
図6(a)は、運搬依存かつ逆依存のデータ依存を伴う循環路の一例を示しており、命令A、B、CおよびDからなる循環路である。また、この循環路では命令Aを循環路根としており、命令Dを循環路葉としている。さらに、循環路葉Dと循環路根Aとの間には運搬依存かつ逆依存のデータ依存が存在するものとする。同図では、実線矢印は真の依存を示しており、破線矢印は逆依存を示している。例えば、命令Aの実行を開始してから命令Bが実行可能になるまでのレイテンシは4サイクルであるものとする。したがって、同図より、この循環路の循環路長は12サイクルであることが分かる。
図6(b)は、mov命令を図6(a)に示した循環路葉Dと循環路根A以外の命令に対して挿入した後の循環路を示している。ここでは、命令Bまたは命令Cに対してmov命令を挿入した後の循環路を示している。このように、循環路葉Dまたは循環路根A以外の命令にmov命令を挿入したとしても、命令Dと命令Aとの間に存在する運搬依存は元のままである。その上、mov命令を挿入することにより、mov命令の実行を開始してから命令Cを実行するまでのレイテンシ1サイクルが必要となるため、循環路長が12から13に増加している。このため、循環路長を小さくさせることができないため、開始間隔を減少させることができない。
これに対して、図6(c)は、mov命令を図6(a)に示した循環路葉Dに挿入した後の循環路を示している。この場合には、循環路葉Dにmov命令を挿入することにより、命令Dと命令Aとの間の運搬依存斬りが行なわれ、依存距離1の12サイクルの循環路がなくなり、4サイクルの循環路と1サイクルの循環路とに変更されている。このため、図6(a)に示した循環路がLongest Pathである場合には、開始間隔を12サイクルから4サイクルに短縮することができる可能性がある。ただし、ループ内に他の循環路が存在し、その循環路が5サイクル以上の循環路長を有する場合には、その循環路長が開始間隔の最小値となる。また、運搬依存斬りを行なうことにより命令の配置制約の緩和を図ることができる。
図7は、図6(a)に示した循環路根Aの真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の場合に、mov命令を循環路根Aに挿入した後の循環路を示している。この場合にも、図6(c)と同様に、運搬依存斬りが行なわれ、12サイクルの循環路がなくなり、4サイクルの循環路と9サイクルの循環路とに分解されている。よって、図6(a)に示した循環路がLongest Pathである場合には、開始間隔を12サイクルから9サイクルに短縮することができる可能性がある。また、命令の配置制約の緩和を図ることもできる。
[運搬依存かつ出力依存]
図8は、運搬依存かつ出力依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
図8(a)は、運搬依存かつ出力依存のデータ依存を伴う循環路の一例を示しており、ld命令および2つのadd命令からなる循環路である。図中では、真の依存を実線矢印で示し、出力依存を破線矢印で示すこととする。
ここで、「ld r0,(r1+)」は、レジスタr1に格納されているアドレスのデータをメインメモリより読み出し、レジスタr0に格納した後、レジスタr1に格納されている値を1つインクリメントする命令である。「add r2,r0,r0」は、レジスタr0に格納されている値とレジスタr0に格納されている値とを加算し、加算結果をレジスタr2に格納する命令である。「add r0,r2,r2」は、レジスタr2に格納されている値とレジスタr2に格納されている値とを加算し、加算結果をレジスタr0に格納する命令である。
したがって、「ld r0,(r1+)」と「add r2,r0,r0」との間には、レジスタr0を媒介変数として真の依存が存在する。すなわち、ld命令で定義されたレジスタr0がadd命令において参照されている。また、ld命令の実行を開始してからadd命令が実行可能になるまでのレイテンシは3サイクルであるものとする。したがって、これらを図中では「3(r0)」と記述されている。
同様に、「add r2,r0,r0」と「add r0,r2,r2」との間には、レジスタr2を媒介変数とした真の依存が存在する。また、2命令間のレイテンシは1サイクルであるものとする。したがって、図中では「1(r2)」と記述されている。
さらに、「add r0,r2,r2」と「ld r0,(r1+)」との間には、レジスタr0を媒介変数とした運搬依存かつ出力依存が存在する。すなわち、add命令でレジスタr0に格納される値が定義されてから、ld命令でレジスタr0に格納される値が再定義されている。また、上述のように、本実施の形態では運搬依存時のレイテンシは0サイクルであるものとしている。このため、図中では「0(r0)」と記述されている。
このような運搬依存を含む依存グラフの循環路を考えた場合に、その循環路長は4(=3+1+0)サイクルとなる。また、この循環路には運搬依存が1つしか存在しないため依存距離が1である。
この循環路には、上述の定義に当てはまる循環路根および循環路葉は存在しないが、巡回路葉に相当する命令、すなわち運搬依存の依存元となっている命令にmov命令を挿入することを考える。図8(b)は、図8(a)に示した循環路において運搬依存の依存元となっている命令「add r0,r2,r2」にmov命令を挿入した後の循環路を示している。すなわち、「add r0,r2,r2」の代わりに当該add命令で用いられている運搬依存の媒介変数であるレジスタr0を未使用のレジスタr3に置き換えた命令「add r3,r2,r2」を使用し、元の媒介変数であるレジスタr0に格納された値をレジスタr3に格納する転送命令「mov r3,r0」を挿入する。このように、mov命令を運搬依存の依存元となっている命令「add r0,r2,r2」に対して挿入することにより、add命令とld命令との間の運搬依存斬りが行なわれ、依存距離1の循環路がなくなってしまう。
図9は、図8(a)に示した循環路において、巡回路根に相当する命令、すなわち運搬依存の依存先となっている命令「ld r0,(r1+)」、にmov命令を挿入した後の循環路を示している。すなわち、「ld r0,(r1+)」の代わりに、当該ld命令で用いられている運搬依存の媒介変数であるレジスタr0を未使用のレジスタr3に置き換えた命令「ld r3,(r1+)」を使用し、レジスタr3に格納された値を元の媒介変数であるレジスタr0に格納する転送命令「mov r0,r3」を挿入する。このように、mov命令を循環路根に対して挿入することにより、add命令とld命令との間の運搬依存斬りが行なわれ、循環路長が4サイクルの循環路を、依存距離1では循環路長が3サイクルの循環路(ld命令とmov命令とから構成される循環路)と、循環路長が2サイクルの循環路(mov命令と、2つのadd命令とから構成される循環路)との2つに分解することができる。よって、図8(a)に示した循環路がLongest Pathである場合には、開始間隔を3サイクルに短縮することができる可能性がある。
[運搬依存かつ真の依存]
図10は、運搬依存かつ真の依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
図10(a)は、運搬依存かつ真の依存のデータ依存を伴う循環路の一例を示しており、mul命令および2つのadd命令からなる循環路である。図中では全ての依存関係が真の依存関係であり、それらを実線矢印で示している。
ここで、「mul r1,r0,r0」は、レジスタr0に格納されているデータと、レジスタr0に格納されているデータとを乗算し、乗算結果をレジスタr1に格納する命令である。「add r2,r1,r1」は、レジスタr1に格納されている値とレジスタr1に格納されている値とを加算し、加算結果をレジスタr2に格納する命令である。「add r0,r2,r2」は、レジスタr2に格納されている値とレジスタr2に格納されている値とを加算し、加算結果をレジスタr0に格納する命令である。
したがって、「mul r1,r0,r0」と「add r2,r1,r1」との間には、レジスタr1を媒介変数として真の依存が存在する。すなわち、mul命令で定義されたレジスタr1がadd命令において参照されている。また、mul命令の実行を開始してからadd命令が実行可能になるまでのレイテンシは4サイクルであるものとする。したがって、図中では「4(r1)」と記述されている。
同様に、「add r2,r1,r1」と「add r0,r2,r2」との間には、レジスタr2を媒介変数とした真の依存が存在する。また、2命令間のレイテンシは1サイクルであるものとする。したがって、図中では「1(r2)」と記述されている。
さらに、「add r0,r2,r2」と「mul r1,r0,r0」との間には、レジスタr0を媒介変数とした運搬依存かつ真の依存が存在する。また、2命令間のレイテンシは、1サイクルであるものとする。したがって、図中では「1(r0)」と記述されている。
このような運搬依存を含む依存グラフの循環路を考えた場合には、その循環路長は6(=4+1+1)サイクルとなる。
この循環路には、上述の定義に当てはまる循環路根および循環路葉は存在しない。すなわち、上述したように全てのデータ依存が真の依存である。したがって、循環路を構成する命令の1つであるmul命令に対して、mov命令の挿入を試みる。図10(b)は、図10(a)に示した循環路にmov命令を挿入した後の循環路を示している。すなわち、「mul r1,r0,r0」の代わりに当該mul命令で用いられている媒介変数であるr1を未使用のレジスタr3に置き換えた命令「mul r3,r0,r0」を使用し、レジスタr3に格納された値を元の媒介変数であるレジスタr1に格納する転送命令「mov r1,r3」を挿入する。mov命令の実行を開始してからadd命令が実行可能になるまでのレイテンシは1であるものとする。したがって、転送命令挿入後の循環路長は7(=4+1+1+1)サイクルとなる。このように、転送命令の挿入を行なっても、循環路長の減少を行なうことができない。むしろ、循環路長が大きくなりコードサイズが増加するのみである。なお、真の依存のみからなる循環路の場合には、どの位置に転送命令を挿入したとしても、循環路長の減少にはつながらない。したがって、このような場合には、最適化の効果を出すことができない。
[2つの命令からなる循環路]
次に、2つの命令からなる循環路に対して転送命令を挿入する場合について考察する。
図11は、2つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。
図11(a)は、運搬依存かつ逆依存を伴う循環路の一例を示しており、2つの命令AおよびBからなる循環路である。循環路長は4サイクルとしている。図中では、真の依存を実線矢印で示し、運搬依存かつ逆依存を破線矢印で示している。
図11(b)は、mov命令を図11(a)に示した循環路根に対して挿入した後の循環路を示している。mov命令を挿入することにより、運搬依存斬りが行なわれる。しかし、循環路長の最大値は4サイクルのままである。したがって、2命令からなる1つの循環路根に対して転送命令を挿入した場合には、開始間隔を短くすることができず、最適化の効果がない。むしろ、mov命令を挿入することにより、機械語プログラム203のコードサイズが増加し、実行性能の低下につながる。
一方、図12は、2つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路を2つ含む場合に、転送命令を挿入した場合の循環路の変化を示した図である。
図12(a)は、運搬依存かつ逆依存のデータ依存を伴う循環路の一例を示しており、命令AおよびBからなる循環路と、命令AおよびCからなる循環路とを示している。図中では、真の依存を実線矢印で示し、運搬依存かつ逆依存を破線矢印で示している。2つの循環路はともに、命令Aを共通の循環路根とし、循環路長が4サイクルである。
図12(b)は、mov命令を図12(a)に示した循環路根に挿入した後の循環路を示している。mov命令を挿入することにより、運搬依存斬りが行なわれ、図12(a)に示した循環路が、依存距離1では循環路長が4サイクルの循環路1つと循環路長が1サイクルの循環路2つとに変換される。この場合、循環路長の最大値は4サイクルのままであるため、開始間隔を短縮することができないが、循環路長が4サイクルの循環路の個数が2つから1つに減少している。このため、ソフトウェアパイプライニングにおける配置制約が緩和され、ソフトウェアパイプライニングが成功する蓋然性が向上する。
[資源制約を考慮した循環路]
次に、資源制約を考慮した循環路に転送命令を挿入する場合について考察する。
まず、同じ依存グラフであっても資源制約がない場合とある場合とにおけるLongest Pathを比較する。図13は、資源制約がない場合とある場合とにおけるLongest Pathの違いを説明するための図である。図13(a)は、資源制約がない場合の循環路を示す図であり、図13(b)は、資源制約考慮循環路を示す図である。なお、図13(a)および図13(b)における循環路においては、実線矢印で真の依存を示しており、実線矢印とは逆向きの図示しない運搬依存が必ず存在するものとする。図13(a)に示すように、資源制約がない場合には、命令e、fおよびgからなる循環路がLongest Pathとなり、その循環路長は7サイクルである。
一方、図13(b)に示す資源制約考慮循環路においては、命令a、bおよびcが同一資源dを使用し、当該資源dは1つしかないものとする。資源制約がない場合には、命令s、aおよびeからなる循環路(以下、「循環路a」という。)と、命令s、bおよびeからなる循環路(以下、「循環路b」という。)と、命令s、cおよびeからなる循環路(以下、「循環路c」という。)との循環路長は、各々6サイクルである。しかし、上述したように、命令a、bおよびcは1つしかない同一資源dを使用する。命令a、bおよびcの各々の実行を開始してから資源dを解放するまでのレイテンシを2サイクルと仮定する。この場合、命令a、bおよびcの順に実行順序に優先順位がつけられているものとする。
循環路aに含まれる命令を実行する際には、資源dが使用されていないため、命令aの実行時には資源の解放待ちをする必要がなく、資源制約考慮循環路長は6(=4+2+0)サイクルとなる。循環路bに含まれる命令を実行する際には、命令bが実行可能状態になったとしても命令aが資源を解放するまでの2サイクル待たなければ命令bを実行することができない。このため、循環路bの資源制約考慮循環路長は8(=4+2+2+0)サイクルとなる。循環路cに含まれる命令を実行する際には、命令cが実行可能状態になったとしても命令aおよび命令bが資源を解放するまでの4(=2+2)サイクル待たなければ命令cを実行することができない。このため、循環路cの資源制約考慮循環路長は10(=4+2+2+2+0)サイクルとなる。したがって、資源考慮Longest Pathは循環路cとなり、その資源制約考慮循環路長は10サイクルとなる。
このように、同じ依存グラフであっても資源制約がない場合とある場合とではLongest Pathが異なり、その循環路長も異なる。したがって、資源制約がある場合には、資源制約を考慮したうえでのLongest Path(資源考慮Longest Path)を求めることが必要である。
[Longest Pathを複数含む循環路]
次に、複数のLongest Pathを含む循環路に対して転送命令を挿入する場合について考察する。
図14は、複数のLongest Pathを含む循環路の循環路葉に対して転送命令を挿入した場合の循環路の変化を示した図である。図14では、実線矢印で真の依存を示しており、実線矢印とは逆向きの図示しない運搬依存が必ず存在するものとする。
図14(a)は、循環路長が6サイクルのLongest Pathを5つ含む循環路を示した図である。図14(a)では、特に、5つのLongest Pathを太線の実線矢印で示している。図示のように、命令bと命令aとの間に存在する運搬依存は、3つの循環路(命令a、mおよびbからなる循環路、命令a、nおよびbからなる循環路、命令a、oおよびbからなる循環路)に共通する運搬依存である。また、命令cと命令bとの間に存在する運搬依存は、2つの循環路(命令b、pおよびcからなる循環路、命令b、rおよびcからなる循環路)に共通する運搬依存である。
図14(b)は、命令bと命令aとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路葉bに対してmov命令を挿入した後の循環路を示している。太線の実線矢印は、図14(a)に示したLongest Pathが変化した後の循環路を示しており、循環路長が6サイクルの5つのLongest Pathが、依存距離1では循環路長が6サイクルのLongest Path2つと、循環路長が4サイクルの循環路1つと、循環路長が1サイクルの循環路1つとに変換される。
一方、図14(c)は、命令cと命令bとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路葉cに対してmov命令を挿入した後の循環路を示している。太線の実線矢印は、図14(a)に示したLongest Pathが変化した後の循環路を示しており、循環路長が6サイクルの5つのLongest Pathが、依存距離1では循環路長が6サイクルのLongest Path3つと、循環路長が4サイクルの循環路1つと、循環路長が1サイクルの循環路1つとに変換される。
このように、図14(b)のほうが、図14(c)に比べて、Longest Pathの数が少なくなっている。よって、循環路葉に対して転送命令を挿入する場合には、より長い循環路を多く持つ循環路葉に対して転送命令を挿入し、運搬依存斬りをした方が、長い循環路長を有する循環路の数を減らすことができる。このため、ソフトウェアパイプライニングにおける命令の配置制約が緩和される。
図15は、複数のLongest Pathを含む循環路の循環路根に対して転送命令を挿入した場合の循環路の変化を示した図である。図15の矢印の意味は、図14の矢印の意味と同じである。
図15(a)は、図14(a)に示した循環路の命令bと命令aとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路根aに対してmov命令を挿入した後の循環路を示している。但し、命令aと命令m,n,oとの間の真の依存と命令bと命令aとの間の運搬依存のそれぞれの原因になっているレジスタは同一の場合である。この図によると、循環路長が6サイクルの5つのLongest Pathが、依存距離1では循環路長が6サイクルのLongest Path2つと、循環路長が4サイクルの循環路1つと、循環路長が3サイクルの循環路3つとに変換される。
一方、図15(b)は、命令cと命令bとの間に存在する運搬依存の運搬依存斬りを行なうために、循環路根bに対してmov命令を挿入した後の循環路を示している。但し、命令bと命令p,rの間の真の依存と命令cと命令bの間の運搬依存のそれぞれの原因になっているレジスタは同一の場合である。この図によると、循環路長が6サイクルの5つのLongest Pathが、依存距離1では循環路長が6サイクルのLongest Path3つと、循環路長が4サイクルの循環路1つと、循環路長が3サイクルの循環路2つとに変換される。
このように、図15(a)の方が、図15(b)に比べて、Longest Pathの数が少なくなっている。よって、循環路根に対して転送命令を挿入する場合には、より長い循環路を多く持つ循環路根に対して転送命令を挿入し、運搬依存斬りをした方が、長い循環路長を有する循環路の数を減らすことができる。その結果、ソフトウェアパイプライニングにおける命令の配置制約が緩和される。
[運搬依存が複数ある循環路]
図16は、運搬依存が複数ある循環路に対して転送命令を挿入した場合の循環路の変化を示した図である。図中、真の依存を実線矢印で示し、運搬依存かつ逆依存を破線矢印で示している。
図16(a)は、2つの運搬依存を含む循環路を示し、より具体的には、命令cと命令bとの間および命令bと命令aとの間に各々運搬依存を有する循環路を示している。この循環路の循環路長は図示のように16サイクルである。
図16(b)は、図16(a)に示した循環路の循環路根aにmov命令を挿入した後の循環路を示しており、依存距離2の循環路長16サイクルの循環路が依存距離2では循環路長13サイクルの循環路と循環路長4サイクルの循環路とに分解される。但し、命令aと命令dの間の真の依存と命令bと命令aの間の運搬依存のそれぞれの原因になっているレジスタは同一の場合である。このように、循環路長の短縮が行なわれるため、ソフトウェアパイプライニングにおける命令の配置制約を緩和することができる。
一方、図16(c)は、図16(a)に示した循環路の循環路葉cにmov命令を挿入した後の循環路を示しており、依存距離2の循環路長16サイクルの循環路が無くなる。このように、ソフトウェアパイプライニングにおける命令の配置制約が緩和される。
以上説明したように、本発明によると、運搬依存かつ逆依存を少なくとも1つ含む循環路において、循環路根または循環路葉に転送命令を挿入することにより、循環路長を小さくしたり、ソフトウェアパイプライニング時の命令の配置制約を緩和したりすることができる。このため、Longest Pathまたは資源考慮Longest Pathの循環路長を小さくでき、かつループ処理の開始間隔を小さくできる場合には、高速化効率の良いソフトウェアパイプライニングを行なうことができる。
以上、本発明の実施の形態に係るコンパイラ装置について説明したが、本発明は、この実施の形態に限定されるものではない。
例えば、本運搬依存斬りを同一ループに対して複数回適用すると、より高速化効率の良いソフトウェアパイプライニングを行うことができる。
例えば、循環路集合の除去処理(図5のS403)において、循環路根からのレイテンシが転送命令によるレイテンシ以下である循環路を除去するようにしてもよい。このようにすることにより、転送命令を挿入することにより、循環路長が大きくなる循環路を予め除去することができる。よって、高速化効率の良い、循環路の選択が可能となる。
また、図2〜図4に示した例では、循環路葉または循環路根において、真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが異なる場合について説明を行なったが、2つのレジスタが同一のレジスタであってもよい。図17は、循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。
図17(a)に示す循環路は、3つの命令(ldm命令、add命令およびstm命令)を含む循環路である。この循環路においては、真の依存の媒介変数であるレジスタと運搬依存かつ逆依存の媒介変数であるレジスタとが、ともにレジスタr1である。図17(b)は、図17(a)に示した循環路の循環路根(ldm命令)に対してmov命令を挿入した後の循環路を示している。すなわち、ldm命令の変わりに、ldm命令で用いられている運搬依存の媒介変数であるレジスタr1を未使用のレジスタr6に置き換えた命令「ldm r0:r6,(r2+)」が使用され、レジスタr6に格納された値を元の媒介変数であるレジスタr1に格納する転送命令「mov r1,r6」が挿入される。このように、mov命令を循環路根に対して挿入することにより、循環路長が4サイクルの循環路を、循環路長が3サイクルの循環路と、循環路長が2サイクルの循環路との2つに分解することができる。この場合は、開始間隔を3にできる可能性がある。
本発明は、並列処理可能なプロセッサをターゲットプロセッサとするコンパイラ等に適用できる。
コンパイラ装置の構成を示す機能ブロック図である。 循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。 転送命令を挿入する前後のソフトウェアパイプライニングを行なった結果を示す図である。 図2(a)に示した循環路の循環路根(ld命令)に対して、mov命令を挿入した後の循環路を示す図である。 ソフトウェアパイプライニング部が実行する処理のフローチャートである。 運搬依存かつ逆依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。 図6(a)に示した循環路根Aの真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の場合に、mov命令を循環路根Aに挿入した後の循環路を示す図である。 運搬依存かつ出力依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。 図8(a)に示した循環路にmov命令を挿入した後の循環路を示す図である。 運搬依存かつ真の依存のデータ依存を伴う循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。 2つの命令からなる循環路に対して、転送命令を挿入した場合の循環路の変化を示した図である。 2つの命令からなる循環路を2つ含み場合に、転送命令を挿入した場合の循環路の変化を示した図である。 資源制約がない場合とある場合とにおけるLongest Pathの違いを説明するための図である。 複数のLongest Pathを含む循環路の循環路葉に対して転送命令を挿入した場合の循環路の変化を示した図である。 複数のLongest Pathを含む循環路の循環路根に対して転送命令を挿入した場合の循環路の変化を示した図である。 運搬依存が複数ある循環路に対して転送命令を挿入した場合の循環路の変化を示した図である。 循環路に対して転送命令を挿入した場合のデータ依存グラフの変化を示す図である。 ソフトウェアパイプライニングを説明するための図である。 従来の問題点を説明するための図である。 従来の問題点を説明するための図である。
符号の説明
201 ソースプログラム
202 コンパイラ装置
203 機械語プログラム
204 構文解析部
205 最適化部
206 出力部
207 第1最適化部
208 ソフトウェアパイプライニング部
209 第2最適化部
211 循環路解析部
212 命令選択部
213 転送命令挿入部
214 従来のソフトウェアパイプライニング部

Claims (13)

  1. ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換するコンパイラ装置であって、
    前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析手段と、
    前記中間プログラムを最適化する最適化手段と、
    最適化された前記中間プログラムを機械語プログラムに変換する変換手段とを備え、
    前記最適化手段は、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なう
    ことを特徴とするコンパイラ装置。
  2. 前記最適化手段は、
    前記中間プログラム中に存在する命令間のデータ依存グラフを作成し、当該データ依存グラフ中より、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路である循環路を検出する循環路検出部と、
    検出された前記循環路に含まれる運搬依存の媒介変数をオペランドの一部とする前記転送命令を挿入する挿入部と、
    転送命令挿入後の前記中間プログラムに対してソフトウェアパイプライニングを施すソフトウェアパイプライニング部とを有する
    ことを特徴とする請求項1に記載のコンパイラ装置。
  3. 前記挿入部は、
    検出された前記循環路における真の依存の依存先であって、かつ、運搬依存かつ逆依存の依存元となっている命令を選択する命令選択部と、
    選択された前記命令において使用されている第1のレジスタを第2のレジスタに置き換えることにより、当該命令を置換する命令置換部と、
    前記第1のレジスタに格納されている値を前記第2のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有する
    ことを特徴とする請求項2に記載のコンパイラ装置。
  4. 前記挿入部は、
    検出された前記循環路における真の依存の依存元であって、かつ、運搬依存かつ逆依存の依存先となっている命令を選択する命令選択部と、
    選択された前記命令において定義されている第1のレジスタを第2のレジスタに置き換えることにより、当該命令を置換する命令置換部と、
    前記第2のレジスタに格納されている値を前記第1のレジスタに転送する前記転送命令を挿入する転送命令挿入部とを有する
    ことを特徴とする請求項2に記載のコンパイラ装置。
  5. 前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計である循環路長が最大の循環路を検出する
    ことを特徴とする請求項2〜4のいずれか1項に記載のコンパイラ装置。
  6. 前記循環路検出部は、前記循環路におけるデータ依存のレイテンシの合計が最大の循環路を少なくとも1つ検出し、
    前記命令選択部は、前記レイテンシの合計が最大の循環路が複数存在する場合には、複数の循環路の運搬依存の依存元または依存先となっている命令のうち、最も多くの循環路の運搬依存の依存元または依存先となっている命令を選択する
    ことを特徴とする請求項3または4に記載のコンパイラ装置。
  7. 前記循環路検出部は、資源制約を考慮した前記循環路長が最大の循環路を検出する
    ことを特徴とする請求項5または6に記載のコンパイラ装置。
  8. 前記循環路検出部は、2つの命令からなり真の依存の原因となるレジスタと運搬依存かつ逆依存の原因となるレジスタとが同一の循環路以外の循環路を検出する
    ことを特徴とする請求項2〜4のいずれか1項に記載のコンパイラ装置。
  9. 前記循環路検出部は、真の依存の依存元であって、かつ運搬依存かつ逆依存の依存先となっている命令からのレイテンシが、前記転送命令からのレイテンシよりも大きい循環路を検出する
    ことを特徴とする請求項2に記載のコンパイラ装置。
  10. ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換するコンパイル方法であって、
    前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析ステップと、
    前記中間プログラムを最適化する最適化ステップと、
    最適化された前記中間プログラムを機械語プログラムに変換する変換ステップとを含み、
    前記最適化ステップでは、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なう
    ことを特徴とするコンパイル方法。
  11. コンピュータに、ソースプログラムを並列処理可能なプロセッサ用の機械語プログラムに変換させるコンパイラであって、
    前記ソースプログラムを構文解析し、中間言語で記述されたプログラムである中間プログラムに変換する構文解析ステップと、
    前記中間プログラムを最適化する最適化ステップと、
    最適化された前記中間プログラムを機械語プログラムに変換する変換ステップとをコンピュータに実行させ、
    前記最適化ステップでは、前記中間プログラムに含まれるループ処理中に、オペランド間でデータを転送する命令である転送命令を挿入することによりデータ依存関係を変更し、ソフトウェアパイプライニングを行なう
    ことを特徴とするコンパイラ。
  12. コンパイラを記録したコンピュータ読取可能な記録媒体であって、
    請求項11に記載のコンパイラを記録した
    ことを特徴とするコンピュータ読取可能な記録媒体。
  13. 並列処理可能なプロセッサ用のプログラムであって、
    ループ処理の各イタレーションを並列実行させる命令と、
    前記ループ処理に関する依存グラフを作成した場合に、ある命令に関するデータ依存をたどり、最終的にもとの命令に戻る閉路を形成する命令に使用されているオペランド間でデータを転送する命令である転送命令とを
    プロセッサに実行させるためのプログラム。
JP2005165999A 2005-06-06 2005-06-06 コンパイラ装置 Pending JP2006338616A (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2005165999A JP2006338616A (ja) 2005-06-06 2005-06-06 コンパイラ装置
US11/420,059 US7856629B2 (en) 2005-06-06 2006-05-24 Compiler apparatus
CNA200610093557XA CN1877532A (zh) 2005-06-06 2006-06-06 编译装置
US13/616,573 USRE45199E1 (en) 2005-06-06 2012-09-14 Compiler apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2005165999A JP2006338616A (ja) 2005-06-06 2005-06-06 コンパイラ装置

Publications (1)

Publication Number Publication Date
JP2006338616A true JP2006338616A (ja) 2006-12-14

Family

ID=37495584

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2005165999A Pending JP2006338616A (ja) 2005-06-06 2005-06-06 コンパイラ装置

Country Status (3)

Country Link
US (2) US7856629B2 (ja)
JP (1) JP2006338616A (ja)
CN (1) CN1877532A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011514592A (ja) * 2008-02-22 2011-05-06 クゥアルコム・インコーポレイテッド グラフィックス処理の命令レイテンシ減少のためのシステムおよび方法
CN115658079A (zh) * 2022-10-24 2023-01-31 上海繁易信息科技股份有限公司 一种功能块图转换为结构化文本的方法及相关设备

Families Citing this family (21)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4327864B2 (ja) * 2007-03-23 2009-09-09 株式会社東芝 録画予約処理装置および録画予約処理方法ならびに録画装置
JP5226328B2 (ja) * 2007-03-27 2013-07-03 パナソニック株式会社 コード変換装置
CN101446905B (zh) * 2008-12-29 2012-06-27 飞天诚信科技股份有限公司 编译方法
US8667474B2 (en) * 2009-06-19 2014-03-04 Microsoft Corporation Generation of parallel code representations
US8689191B2 (en) * 2010-03-05 2014-04-01 International Business Machines Corporation Correct refactoring of concurrent software
CN101944014B (zh) * 2010-09-15 2013-08-21 复旦大学 一种自动流水并行的实现方法
JP5148674B2 (ja) * 2010-09-27 2013-02-20 株式会社東芝 プログラム並列化装置およびプログラム
JP5687603B2 (ja) * 2011-11-09 2015-03-18 株式会社東芝 プログラム変換装置、プログラム変換方法、および変換プログラム
US9262139B2 (en) * 2013-01-07 2016-02-16 Advanced Micro Devices, Inc. Layered programming for heterogeneous devices
EP3008618B1 (en) 2013-06-14 2018-05-02 Intel Corporation Compiler optimization for complex exponential calculations
US9588769B2 (en) 2014-05-27 2017-03-07 Via Alliance Semiconductor Co., Ltd. Processor that leapfrogs MOV instructions
CN104615409B (zh) * 2014-05-27 2017-07-07 上海兆芯集成电路有限公司 跳越mov指令的处理器和由该处理器使用的方法
US9830134B2 (en) * 2015-06-15 2017-11-28 Qualcomm Incorporated Generating object code from intermediate code that includes hierarchical sub-routine information
US10002468B2 (en) 2016-09-02 2018-06-19 Echostar Technologies International Corporation Systems and methods for updating non-networked autonomous devices
US10175690B2 (en) 2016-09-02 2019-01-08 Echostar Technologies International Corporation Systems and methods for satellite-based on-board autonomous device deactivation
KR20180038875A (ko) * 2016-10-07 2018-04-17 삼성전자주식회사 데이터 입출력 유닛, 전자 장치 및 그 제어 방법들
CN108958940A (zh) * 2018-07-09 2018-12-07 苏州浪潮智能软件有限公司 一种计算机处理方法及装置
US11188656B2 (en) 2018-07-27 2021-11-30 Silicon Laboratories Inc. Secure software system for microcontroller or the like and method therefor
TW202022652A (zh) * 2018-11-30 2020-06-16 財團法人工業技術研究院 加工參數調整系統及加工參數調整方法
US20230205501A1 (en) * 2021-12-27 2023-06-29 SambaNova Systems, Inc. Compiler-based input synchronization for processor with variant stage latencies
US11714620B1 (en) 2022-01-14 2023-08-01 Triad National Security, Llc Decoupling loop dependencies using buffers to enable pipelining of loops

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05204659A (ja) * 1992-01-27 1993-08-13 Matsushita Electric Ind Co Ltd スケジュール装置

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3218932B2 (ja) * 1995-07-06 2001-10-15 株式会社日立製作所 データプリフェッチコード生成方法
US5920724A (en) 1996-03-28 1999-07-06 Intel Corporation Software pipelining a hyperblock loop
JPH1097423A (ja) 1996-09-20 1998-04-14 Hitachi Ltd ループ処理の並列実行制御に適したレジスタ構成を有するプロセッサ
JPH10228382A (ja) * 1997-02-14 1998-08-25 Nec Corp コンパイル方式
JP2000207223A (ja) * 1999-01-12 2000-07-28 Matsushita Electric Ind Co Ltd 並列処理向けのプログラム処理方法および装置、並びに並列処理向けのプログラム処理を実行するプログラムを記録した記録媒体および並列処理向けの命令列を記録した記録媒体
US6954927B2 (en) 1999-02-17 2005-10-11 Elbrus International Hardware supported software pipelined loop prologue optimization
JP4041248B2 (ja) * 1999-07-09 2008-01-30 松下電器産業株式会社 コンパイラ装置、コンパイルプログラムが記録されたコンピュータ読み取り可能な記録媒体及びコンパイル方法
JP3641997B2 (ja) * 2000-03-30 2005-04-27 日本電気株式会社 プログラム変換装置及び方法並びに記録媒体
US6941541B2 (en) * 2002-07-19 2005-09-06 Hewlett-Packard Development Company, L.P. Efficient pipelining of synthesized synchronous circuits
US7263692B2 (en) 2003-06-30 2007-08-28 Intel Corporation System and method for software-pipelining of loops with sparse matrix routines
JP4042972B2 (ja) * 2003-09-30 2008-02-06 インターナショナル・ビジネス・マシーンズ・コーポレーション 最適化コンパイラ、コンパイラプログラム、及び記録媒体
JP2006139553A (ja) 2004-11-12 2006-06-01 Matsushita Electric Ind Co Ltd 命令スケジューリング方法、および装置

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05204659A (ja) * 1992-01-27 1993-08-13 Matsushita Electric Ind Co Ltd スケジュール装置

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011514592A (ja) * 2008-02-22 2011-05-06 クゥアルコム・インコーポレイテッド グラフィックス処理の命令レイテンシ減少のためのシステムおよび方法
CN115658079A (zh) * 2022-10-24 2023-01-31 上海繁易信息科技股份有限公司 一种功能块图转换为结构化文本的方法及相关设备
CN115658079B (zh) * 2022-10-24 2023-10-13 上海繁易信息科技股份有限公司 一种功能块图转换为结构化文本的方法及相关设备

Also Published As

Publication number Publication date
CN1877532A (zh) 2006-12-13
US7856629B2 (en) 2010-12-21
US20060277529A1 (en) 2006-12-07
USRE45199E1 (en) 2014-10-14

Similar Documents

Publication Publication Date Title
JP2006338616A (ja) コンパイラ装置
US6760906B1 (en) Method and system for processing program for parallel processing purposes, storage medium having stored thereon program getting program processing executed for parallel processing purposes, and storage medium having stored thereon instruction set to be executed in parallel
JP4979875B2 (ja) リターゲッタブルコンパイルシステム及び方法
US8572586B2 (en) Optimized scalar promotion with load and splat SIMD instructions
JP4957729B2 (ja) プログラム並列化方法、プログラム並列化装置及びプログラム
JP3896087B2 (ja) コンパイラ装置およびコンパイル方法
US8893080B2 (en) Parallelization of dataflow actors with local state
JPH09282179A (ja) オーバーヘッド命令を最小限にする最適化コンパイラにおける命令スケジューリングの方法および装置
JP2006509275A (ja) シストリックソルバを作成するシステムおよび方法
JP2004302706A (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
Kudriavtsev et al. Generation of permutations for SIMD processors
US20050257200A1 (en) Generating code for a configurable microprocessor
JP2006196002A (ja) 非同期プログラムフローのモデリングを含むソフトウェアツール
JP3311381B2 (ja) コンパイラにおける命令スケジューリング処理方法
US9158511B2 (en) Scalable partial vectorization
JP2001125792A (ja) 最適化促進装置
JP3473391B2 (ja) プログラム処理方法、プログラム処理装置及び記録媒体
Schwarz et al. Engineering an optimized instruction set architecture for AMIDAR processors
Canedo et al. Compiling for reduced bit-width queue processors
Linders Compiler Vectorization for Coarse-Grained Reconfigurable Architectures
JP3323147B2 (ja) コンパイル装置、コンパイル方法およびコンパイラプログラムを記録した記録媒体
JP4721975B2 (ja) コンパイラ装置およびコンパイル方法
JP4032822B2 (ja) アセンブラプログラムのためのアドレス記述変換システム及びプログラム
JP6897213B2 (ja) コード生成装置、コード生成方法及びコード生成プログラム
JP2000222209A (ja) プロセッサ、コンパイル装置及びコンパイルプログラムを記録している記録媒体

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20080602

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100129

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110118

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110314

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20110628