JP4783005B2 - プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。 - Google Patents

プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。 Download PDF

Info

Publication number
JP4783005B2
JP4783005B2 JP2004341236A JP2004341236A JP4783005B2 JP 4783005 B2 JP4783005 B2 JP 4783005B2 JP 2004341236 A JP2004341236 A JP 2004341236A JP 2004341236 A JP2004341236 A JP 2004341236A JP 4783005 B2 JP4783005 B2 JP 4783005B2
Authority
JP
Japan
Prior art keywords
execution
program
code
code string
execution path
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2004341236A
Other languages
English (en)
Other versions
JP2006154971A (ja
JP2006154971A5 (ja
Inventor
文博 畑野
旭 田中
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Panasonic Corp
Panasonic Holdings Corp
Original Assignee
Panasonic Corp
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 Panasonic Corp, Matsushita Electric Industrial Co Ltd filed Critical Panasonic Corp
Priority to JP2004341236A priority Critical patent/JP4783005B2/ja
Priority to US11/269,705 priority patent/US20060130012A1/en
Priority to CNB2005101236116A priority patent/CN100562849C/zh
Publication of JP2006154971A publication Critical patent/JP2006154971A/ja
Publication of JP2006154971A5 publication Critical patent/JP2006154971A5/ja
Application granted granted Critical
Publication of JP4783005B2 publication Critical patent/JP4783005B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

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/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code

Description

本発明は、コンパイラによるプログラムの最適化に関し、特に、プログラム内の実行経路とその実行頻度に着目した最適化に関する。
ソースプログラムを実行形式に変換するコンパイラ装置において、コンパイラ装置によって生成された実行プログラムがターゲットのハードウェア上において実行されて、その実行結果がより早く出るように種々の工夫がなされてきた。
コンパイラ装置によって生成された実行プログラムの結果が速く出るようにコンパイラ装置は命令のスケジューリングを行うが、そのスケジューリング方法の一つにプログラム中の命令を並べ替えて命令の並列度を上げて実行速度を向上させる広域スケジューリング法があり、その広域スケジューリング法の一つにトレーススケジューリング法というものがある。
プログラムにおいて条件分岐を含まずに連続的に処理される命令郡を基本ブロックと呼び、従来においてもこの基本ブロック内における命令の実行順序の変更を行って、命令の並列度を上げて、実行プログラムの実行時間が短縮されてきた。なお、基本ブロックの最後には条件分岐命令を含んでも良い。
トレーススケジューリング法は、この基本ブロックを拡張するべく、条件分岐命令を跨いで一つの基本ブロックから条件分岐命令によって派生する複数の基本ブロックの一つを当該条件分岐命令が存在しないかのように結合、拡張し、拡張された基本ブロック内においてその命令を並べ替えるスケジューリング方法である。元の基本ブロックを拡張した形になるので命令のスケジューリングの自由度が上がり、更にプログラムの実行時間は短縮されることになる。ただし、拡張した基本ブロックの実行経路がプログラムにおいて実際に実行されない場合に備え、値の整合性を保つべく保証用のコードが必要となる。プログラムにおいて、この基本ブロックによる拡張が行われ最適化が施された実行経路を通る場合には実行結果はソースプログラムをそのままコーディングした実行プログラムよりも早く実行結果を得ることができる。その技術を利用した技術が特許文献1に記されている。なお、基本ブロックの拡張は、基本的にプログラムにおいて実行頻度の高い実行経路上の基本ブロックに対して適用される。
例えば図20(a)にあるように、元のソースプログラムの一部分が同図のように分岐するプログラムがあったとする。この図20(a)のフローグラフにおいて、基本ブロックA2001、B2002、C2003を通る実行経路の実行頻度が高いものとする。それに基づき、このプログラムにトレーススケジューリングを適用すると例えば図20(b)のように、例えば、基本ブロックA2001と基本ブロックB2002を入れ替えることで実行速度が早くなり、基本ブロックB2012、A2011、C2013を含む実行経路2010をこのプログラムが通る場合にはプログラム全体の実行時間は短縮される。
特開平11−96005号公報
ところで前述したようにトレーススケジューリング法においては基本ブロック内の命令順序を入れ替えたりするので、このフローグラフにおいて他の実行経路を通った場合に実行結果の整合をとる為に保証コードを生成しなければならなくなる。
例えば、図20(b)においては、ブロックA’2018がそれに相当する。図20(b)では、ブロックB2012から、図20(a)と同じようにそのままブロックD2004に分岐させるとブロックA2001の演算がなされていないことになるので、ブロックA2001の命令に相当する保証コードとしてブロックA’2018をつけて、図20(b)においてブロックB2012、A’2018、D2014、E2015を通る経路が実行経路である場合の値の整合性を保つ。
本発明においては、上記のような保証コードを用いずに、特定の実行経路において基本ブロックの拡張を行って最適化を施したプログラムを生成するプログラム変換装置であるところのコンパイラ装置を提供することを目的とする。
上記課題を解決するため、本発明に係るプログラム変換装置であるところのコンパイラ装置は、条件分岐を含むソースプログラムを変換して、2以上の命令を並列して実行できるコンピュータを対象とする目的プログラムを生成するプログラム変換装置であって、前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定手段と、前記区間にある全ての命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成手段と、前記実行経路指定手段によって指定される実行経路上の命令群だけに相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成手段と、前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成手段と、前記第一コード列と、前記第二コード列とを、前記コンピュータに並列実行させるように、かつ、前記第二コード列において他の実行経路への分岐条件が成立しない場合には前記第二コード列に継続して前記第三コード列を実行させ、前記第二コード列において他の実行経路への分岐条件が成立する場合には第一コード列に継続して第三コード列を実行させるように編成した目的プログラムを生成する目的プログラム生成手段とを備えることを特徴とする。
ここで、相当するとは、ソースプログラムの命令の内容と略同一の内容であることを言う。但し、前記コンピュータのメモリの形態などによって、アクセスするレジスタなどはさまざまに変化する。また、実行経路とは、連続的に実行される命令群のことであり、プログラム中で条件分岐命令の条件によって実行される命令が枝分かれして変化する場合には、その枝の一つのみを指す。また、生成される目的プログラムは、中間コードの場合もあるし、前記コンピュータで実行できるような実行形式プログラムである場合もある。中間コードとはソースプログラムから実行プログラムに変換する際に、コンパイラ装置が扱いやすいように生成されるコードで、その内容はソースプログラムに相当する。
これにより、本発明に係るコンパイラ装置によって生成される実行プログラムは、元のソースプログラムを前記コンピュータが実行できるようにそのまま最適化を施さずに変換した前記第一コード列を含むプログラムを前記コンピュータが有する第一プロセッサエレメントに実行させ、特定の実行経路、即ち、実行経路指定手段によって指定された実行経路に関しては最適化を施して前記コンピュータが有する第二プロセッサエレメントに実行させるので、特定の実行経路以外の経路を通る際に値の整合性を保つために必要とされる上記のような保証コードを用いずに、特定の実行経路に関して最適化を施したプログラムを生成することができる。
また、前記区間において実行経路が前記実行経路指定手段によって指定された実行経路を通る場合に第二コードの終了が早くなり、それに合わせて第三コードの実行開始が早くなり、結果、プログラム全体の実行時間は短縮される。
また、第一プロセッサエレメントが元のソースプログラムに相当するプログラムを実行するので値の整合性もとれる。
また、前記プログラム変換装置において、前記目的プログラム生成手段は、前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コード列の後に含んで編成された目的プログラムを生成することとしてよい。
これにより、第一コードの方が実行結果が早く出た場合に、第二コードを実行しているプロセッサエレメントに、第二コードを停止させ、その後、当該プロセッサエレメントに別の処理を割り振るプログラム編成にすれば、資源の有効活用を行える。
また、前記プログラム変換装置は更に、前記ソースプログラムを実行形式に変換した実行プログラムをコンピュータに実行させることで、前記区間において実行された頻度が高い順に、当該頻度が第一位の実行経路を当該コンピュータから取得する実行経路取得手段を備え、前記実行経路指定手段は、前記取得手段により取得された前記第一位の実行経路を指定することとしてよい。
これにより、これによりコンパイラ装置は、実行頻度の高い実行経路を最適化することができるので、この実行頻度の高い実行経路をプログラムが通る場合に、このコンパイラ装置によって生成されるプログラムの結果が出るタイミングが早くなる。
また、前記プログラム変換装置は更に、前記コンピュータが並列実行可能な命令数mを取得する命令上限取得手段を備え、前記実行経路取得手段は更に、前記区間における実行頻度が第2位以下の実行経路を取得し、前記実行経路指定手段は、前記実行経路を前記命令数mに基づき、前記実行経路取得手段によって取得された、第一位から第n(n=m−1)位までの実行経路を指定し、前記第二コード列生成手段は、前記実行経路指定手段によって指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、前記目的プログラム生成手段は、前記第一コード列と前記第二コード列生成手段により生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成することとしてよい。
これにより複数の実行頻度の高い実行経路をそれぞれ別のスレッドとして立ち上げて実行することができ、プログラム全体のターゲットハードウェア上における実行時間を短縮できるプログラムを生成できる。
また、前記プログラム変換装置において前記第二コード列生成手段は更に、前記第二コード列生成手段により生成された第一位から第n位のn個のコードのうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成することとしてよい。
これにより、他のプロセッサエレメントで実行しているスレッドを停止することができ、自スレッドが、処理を終えていて条件分岐が自スレッドの実行経路を通った場合に、そのことを他のプロセッサエレメントに知らせ、他のプロセッサエレメントで実行されているスレッドを停止することができるプログラムを生成できる。
また、前記プログラム変換装置は更に、前記コンピュータのメモリの形態が、前記コンピュータの全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型であるか、前記コンピュータの全てのプロセッサエレメントが固有のメモリを有するメモリ分散型かであるかのいずれの形態のメモリを使用しているかの情報を取得するメモリ情報取得手段を備え、前記目的プログラム生成手段は、前記メモリ情報取得手段により取得したメモリ情報に基づき、メモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成することとしてよい。
ここで独立した変数として扱うとは、第一コード列と第二コード列でソースプログラム中の同一の変数を参照する場合に、その値を異なるレジスタに格納して演算を行うことをいう。
これにより、メモリ共有型のコンピュータにおいてプログラムの演算結果を保証することができるようになる。
また、前記プログラム変換装置において、前記目的プログラム生成手段は、前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成することとしてもよい。
これにより、生成されるスレッドが扱う演算データのみが異なる場合に、スレッドを保持し残しているので、演算に必要なデータのみをプロセッサエレメントに渡せばよく、逐次プロセッサエレメントにスレッドの内容と扱うデータの両方を渡すという非効率性を省け、また、目的プログラムの実行時間の短縮にもつながる。
また、前記プログラム変換装置は更に、前記目的プログラムを前記コンピュータに適合するように機械語に変換する機械語変換手段を備えることとしてよい。
これにより、目的プログラムが中間コードであった場合に対象とするコンピュータの機械語に合わせた実行プログラムを生成できる。
また、条件分岐を含むソースプログラムを実行形式である実行形式プログラムに変換して、かつ、2以上の命令を並列して実行できるプログラム変換実行装置であって、前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定手段と、前記区間にある全ての条件分岐を含んだ命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成手段と、前記第一コード列を含む第一プログラムを実行する実行手段と、前記実行手段が前記第一プログラムを実行することにより得られた前記区間における実行経路のうち実行頻度が高い順に、当該実行頻度が第一位の実行経路を取得する取得手段と、前記取得手段によって取得された実行経路を前記実行経路指定手段によって指定し、当該実行経路上の命令群に相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成手段と、前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成手段と、前記第一コード列と、前記第二コード列とを、並列実行するように、かつ、前記第二コード列において他の実行経路への条件分岐が発生しない場合には前記第二コード列に継続して前記第三コード列を実行し、前記第二コード列において他の実行経路への条件分岐が発生する場合には前記第一コード列に継続して前記第三コード列を実行するように編成した目的プログラムを生成する目的プログラム生成手段とを備え、前記実行手段は前記第一プログラムを実行する代わりに前記目的プログラムを実行することとしてよい。
これにより、プログラムを生成しながら実行できるプログラム変換実行装置において、実行頻度の高い実行経路を通る場合に、プログラムの実行時間が短縮される。
また、従来において、保証コードはフローグラフが複雑になるほどに、保証コードの内容も複雑化する。プログラムを逐次解釈実行するインタプリタにおいて部分的なコードの実行性能を上げるために所謂ジャストインタイムコンパイル、つまり動的コンパイル技術が用いられるコンパイラ装置においては、この保証コードの生成は時間のロスになることがあるが、本発明においては保証コードを生成しないので、そういった問題もなくなる。
また、前記プログラム変換実行装置において、前記目的プログラム生成手段は、前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コードの後に含んで編成されたプログラムを生成することとしてよい。
これにより、第一コードの方が実行結果が早く出た場合に、第二コードを実行しているプロセッサエレメントに、第二コードを停止させ、その後、別の処理を割り振ってやれば、資源の有効活用になる。
また、前記プログラム変換実行装置は更に、当該プログラム変換実行装置が並列実行可能な命令数mを取得する命令上限取得手段を備え、前記実行経路取得手段は更に、前記区間における実行頻度が第2位以下の実行経路を取得し、前記実行経路指定手段は、前記実行経路を前記命令数mに基づき、前記実行経路取得手段によって取得された、第一位から第n(n=m−1)位までの実行経路を指定し、前記第二コード生成手段は、前記実行経路指定手段によって指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、前記目的プログラム生成手段は、前記第一コード列と前記第二コード列生成手段により生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成することとしてよい。
これにより、複数の実行頻度の高い実行経路をそれぞれ別のスレッドとして立ち上げて実行することができ、プログラム全体のターゲットハードウェア上における実行時間を短縮できる。
また、前記プログラム変換実行装置において、前記第二コード列生成手段は更に、前記第二コード列生成手段により生成された第一位から第n位のn個のコード列のうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成することとしてよい。
これにより、自スレッドが実行される条件が成立している場合に、他のプロセッサエレメントが実行している他スレッドを停止させ、その後のプログラム上の処理を行うことで資源の有効活用が可能となる。
また、前記プログラム変換実行装置において前記目的プログラム生成手段は、自機のメモリの形態が、全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成することとしてよい。
これにより、このプログラム変換実行装置が、メモリ共有型であっても、メモリ分散型であっても、それに対応してプログラム中の値を格納するレジスタ割り振りを考慮したプログラムを生成できる。
また、前記プログラム変換実行装置において、前記目的プログラム生成手段は、前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成することとしてもよい。
これにより、生成されるスレッドが扱う演算データのみが異なる場合に、スレッドを保持し残しているので、演算に必要なデータのみをプロセッサエレメントに渡せばよく、逐次プロセッサエレメントにスレッドの内容と扱うデータの両方を渡すという非効率性を省け、また、目的プログラムの実行時間の短縮にもつながる。
また、条件分岐を含むソースプログラムを変換して、2以上の命令を並列して実行できるコンピュータを対象とする目的プログラムを生成するプログラム変換方法であって、前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定ステップと、前記区間にある全ての命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成ステップと、前記実行経路指定ステップにおいて指定される実行経路上の命令群だけに相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成ステップと、前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成ステップと、前記第一コード列と、前記第二コード列とを、前記コンピュータに並列実行させるように、かつ、前記第二コード列において他の実行経路への分岐条件が成立しない場合には前記第二コード列に継続して前記第三コード列を実行させ、前記第二コード列において他の実行経路への分岐条件が成立する場合には第一コード列に継続して第三コード列を実行させるように編成した目的プログラムを生成する目的プログラム生成ステップとを備えることとしてもよい。
この方法により、前記第一コードと特定の実行経路に関して最適化が施された前記第二コードを並列実行させることができる目的プログラムを生成することができる。
また、前記プログラム生成方法において、前記目的プログラム生成ステップでは、前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コード列の後に含んで編成された目的プログラムを生成することとしてもよい。
この方法より、第一コードの方の実行結果が早く出た場合に第二コードを実行しているプロセッサエレメントに、第二コードを停止させる目的プログラムを生成することができる。
また、前記プログラム変換方法は更に、前記ソースプログラムを実行形式に変換した実行プログラムをコンピュータに実行させることで、前記区間において実行された頻度が高い順に、当該頻度が第一位の実行経路を当該コンピュータから取得する実行経路取得ステップを備え、前記実行経路指定ステップは、前記取得手段により取得された前記第一位の実行経路を指定することとしてもよい。
この方法により、実行頻度の最も高い実行経路を最適化して、この実行頻度の高い実行経路の内容を並列実行させる目的プログラムを生成することができる。
また、前記プログラム変換方法は更に、前記コンピュータが並列実行可能な命令数mを取得する命令上限取得ステップを備え、前記実行経路取得ステップは更に、前記区間における実行頻度が第2位以下の実行経路を取得し、前記実行経路指定ステップは、前記実行経路を前記命令数mに基づき、前記実行経路取得手段によって取得された、第一位から第n(n=m−1)位までの実行経路を指定し、前記第二コード列生成ステップは、前記実行経路指定手段によって指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、前記目的プログラム生成ステップは、前記第一コード列と前記第二コード列生成手段により生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成することとしてもよい。
この方法により、複数の実行頻度の高い実行経路に関して最適化し、この複数の実行頻度の高い実行経路の内容を並列実行させる目的プログラムを生成することができる。
また、前記プログラム変換方法において、前記第二コード列生成ステップは更に、前記第二コード列生成ステップにより生成された第一位から第n位のn個のコードのうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成することとしてもよい。
この方法により、自スレッドが、処理を終えていて条件分岐により自スレッドの実行経路を通った場合に、他のプロセッサエレメントで実行されているスレッドを停止することができるプログラムを生成することができる。
また、前記プログラム変換方法は更に、前記コンピュータのメモリの形態が、前記コンピュータの全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型であるか、前記コンピュータの全てのプロセッサエレメントが固有のメモリを有するメモリ分散型かであるかのいずれの形態のメモリを使用しているかの情報を取得するメモリ情報取得ステップを備え、前記目的プログラム生成手段は、前記メモリ情報取得手段により取得したメモリ情報に基づき、メモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成することとしてもよい。
この方法により、メモリ共有型のコンピュータにおいて演算結果を保証できる目的プログラムを生成できるようになる。
また、前記プログラム変換方法において、前記目的プログラム生成ステップは、前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成することとしてもよい。
この方法により、スレッドを消去せず、保持しておき再利用することが可能な目的プログラムを生成することができる。
また、前記プログラム変換方法は更に、前記目的プログラムを前記コンピュータに適合するように機械語に変換する機械語変換ステップを備えることとしてもよい。
この方法により、目的プログラムが中間コードであった場合に、対象とするコンピュータの機械語にあわせた実行プログラムを生成することができる。
また、条件分岐を含むソースプログラムを実行形式である実行形式プログラムに変換して、かつ、2以上の命令を並列して実行できるプログラム変換実行方法であって、前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定ステップと、前記区間にある全ての条件分岐を含んだ命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成ステップと、前記第一コード列を含む第一プログラムを実行する実行ステップと、前記実行ステップが前記第一プログラムを実行することにより得られた前記区間における実行経路のうち実行頻度が高い順に、当該実行頻度が第一位の実行経路を取得する取得ステップと、前記取得ステップによって取得された実行経路を前記実行経路指定ステップによって指定し、当該実行経路上の命令群に相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成ステップと、前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成ステップと、前記第一コード列と、前記第二コード列とを、並列実行するように、かつ、前記第二コード列において他の実行経路への条件分岐が発生しない場合には前記第二コード列に継続して前記第三コード列を実行し、前記第二コード列において他の実行経路への条件分岐が発生する場合には前記第一コード列に継続して前記第三コード列を実行するように編成した目的プログラムを生成する目的プログラム生成ステップとを備え、前記実行手段は前記第一プログラムを実行する代わりに前記目的プログラムを実行することとしてもよい。
この方法により、プログラムを生成しながら、実行頻度の高い実行経路の内容を並列実行させながら実行できる目的プログラムを生成することができる。
また、前記目的プログラム生成ステップは、前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コードの後に含んで編成されたプログラムを生成することとしてもよい。
この方法により、第一コードの実行結果が早く出た場合に、第二コードを実行しているプロセッサエレメントに第二コードを停止させるプログラムを生成できる。
また、前記プログラム変換実行方法は更に、当該プログラム変換実行方法が並列実行可能な命令数mを取得する命令上限取得ステップを備え、前記実行経路取得ステップは更に、
前記区間における実行頻度が第2位以下の実行経路を取得し、前記実行経路指定ステップは、前記実行経路を前記命令数mに基づき、前記実行経路取得手段によって取得された、第一位から第n(n=m−1)位までの実行経路を指定し、前記第二コード生成ステップは、前記実行経路指定手段によって指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、前記目的プログラム生成ステップは、前記第一コード列と前記第二コード列生成手段により生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成することとしてもよい。
この方法により、複数の実行頻度の高い実行経路をそれぞれ別のスレッドとして立ち上げて実行する目的プログラムを生成することができる。
また、前記プログラム実行変換方法において、前記第二コード列生成ステップは更に、 前記第二コード列生成ステップにより生成された第一位から第n位のn個のコード列のうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成することとしてもよい。
この方法により、一つのスレッドが実行される条件が成立している場合に、他のスレッドを停止する目的プログラムを生成することができる。
また、前記プログラム実行変換方法において、前記目的プログラム生成ステップは、自機のメモリの形態が、全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成することとしてもよい。
この方法により、メモリ共有型、メモリ分散型に対応した目的プログラムを生成することができる。
また、前記プログラム変換実行変換方法であって、前記目的プログラム生成ステップは、前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成することとしてもよい。
この方法により、スレッドを消去せず、保持しておき再利用することが可能な目的プログラムを生成することができる。
以下、本発明に係るプログラム変換装置であるところのコンパイラ装置の実施の形態を図面を用いながら説明していく。
<第一の実施形態>
第一の実施形態におけるコンパイラ装置は、メモリ共有型のコンピュータを対象とする実行プログラムを生成する。
<概要>
本発明の概要を図2および図3を用いて説明する。
本発明に係るコンパイラ装置において、ソースプログラムの一部分が図2におけるフローグラフのような分岐の形態を持つソースプログラムであったとし、これを本発明のコンパイラ装置によって実行形式に変換するとする。
なお、ブロックI200、J202、K203、L206、Q204、S205、T208、U207、X201はそれぞれ基本ブロックである。基本ブロックはその途中に分岐を含まない命令列のことである。但し、基本ブロックの最後には分岐があっても良い。また、このコンパイラ装置によって生成される実行プログラムは、2以上の処理を同時に実行できるコンピュータを対象としている。
図2のフローグラフにおいて実行経路は、ブロックI200→J202→Q204を通る実行経路、ブロックI200→J202→K203→S205→T208を通る実行経路、ブロックI200→X201を通る実行経路、ブロックI200→J202→K203→S205→U207を通る実行経路、ブロックI200→J202→K203→L206を通る実行経路、の5つがあり、それぞれこの順で実行頻度が高いものとする。
そこで、このうち実行頻度の高いものを連続的に実行される命令群にして、実行形式プログラムを生成し、それぞれと、元のソースプログラムをそのまま実行形式に変換したものとを、別々のプロセッサエレメントに並列実行させるプログラムを作成する。つまり、図3のように、まず、ソースプログラムをそのまま実行コードにしたスレッド300の実行を第一のプロセッサエレメントに実行させ、以下順に実行頻度一位の実行経路のスレッド301を第二のプロセッサエレメントが、実行頻度第二位の実行経路のスレッド302を第三のプロセッサエレメントが実行し、以下プロセッサエレメントの数の許す限り、また生成可能なスレッドの数の許す限りスレッドを立ち上げ、各プロセッサに実行させるような編成のプログラムを生成する。また、各スレッドにおいて、そのスレッドが成立する条件が整った場合には、自スレッド以外のスレッドを停止させ、自身のスレッドの演算結果によって得られた値を反映させるコミット処理を行う。
これにより保証コードを必要とせず、並列実行しているスレッドの中には元となるプログラムをそのまま実行形式に移したスレッド300も実行されるので値の整合性についての問題ない。また、生成された実行経路301〜303のいずれかを通って本プログラムが実行される場合には、実行結果のでるタイミングはスレッド300だけを実行するよりも早くなりプログラム全体の実行時間も短縮できる。
<構成>
本発明に係るコンパイラ装置100の構成を図1のブロック図を用いて説明する。本発明に係るコンパイラ装置100は、解析部101、実行経路指定部102、最適化部103、コード変換部104からなる。
コンパイラ装置100は、MPU(Micro Processing Unit)、ROM(Read Only Memory)、RAM(Random Access Memory)、ハードディスク装置を含んで実現されるコンピュータシステムである。ハードディスク装置又は、ROMに搭載されるコンピュータプログラムにより、本コンパイラ装置は目的とする実行プログラムを作成する。また、RAMを用いて各部間のデータの受け渡しなどが行われる。
解析部101は、ソースプログラムの分岐や実行内容を解析し、ソースプログラムに記入されている「分岐」や「繰り返し」などの情報を取得する機能を有し、解析によって得られた情報である解析情報105を実行経路指定部102に渡す。
実行経路指定部102は、解析部101からの実行経路の識別子等を含む解析情報105と、実行プログラムに変換するソースプログラム上の実行経路の実行頻度に関する情報140を取得し、その情報を基に、取得した実行経路のうち実行頻度の高い実行経路を指定し、その内容を最適化部103に送信する機能を有する。
最適化部103は、基本的に入力されたソースプログラム110の命令の実行順序や実行プログラムの生成のための最適化を行う機能を有し、解析部101、及び実行経路指定部102から取得した情報を基に、実行頻度の高い実行経路から他の実行経路への分岐が発生しないようにして、命令の実行順序に関する最適化を施す機能を有する。
コード変換部104は、最適化部103によって最適化が施されたコードをそれぞれのプロセッサエレメントに割り振った実際に実行する実行プログラム120をターゲットハードウェア130に適合するように生成する機能を有する。生成された実行プログラム120は、ターゲットハードウェア130に渡される。
ターゲットハードウェア130に渡された実行プログラム120は、ターゲットハードウェア130上において実行される。そして実行プログラム120を実行することによって実行プログラム120の実行経路に関する情報が実行経路の実行頻度の情報140として実行経路102に送信される。ここで実行経路に関する情報とは、分岐によって派生する複数の実行経路のうち実際にどの経路を通ったのかを示す情報である。なお、ターゲットハードウェア130は、複数のプロセッサエレメントを有するので同時に2以上の処理を実行できる。また、ターゲットハードウェア130のメモリ形態にはメモリ共有型とメモリ分散型の2通りが考えられ、第一の実施形態においてはメモリ共有型として説明する。
ここで簡単にメモリ共有型とメモリ分散型とについて説明しておく。
メモリ共有型は、図4(a)にあるように、複数のプロセッサエレメント400〜402が一つのメモリ403に接続されている。それぞれのプロセッサエレメント400〜402は、メモリ403から必要なデータをロードし、それぞれのレジスタに格納して演算を行い、演算後、その結果に基づきメモリ403に格納されているデータを更新する形態をとっている。
メモリ分散型は、図4(b)にあるように、複数のプロセッサエレメントそれぞれにメモリが接続されている形態のことでプロセッサエレメント410はメモリ413に、プロセッサエレメント411はメモリ414に、プロセッサエレメント412はメモリ415に接続されている。また、各プロセッサエレメントで行われた演算結果は実行されたプログラムに基づき、その値が各メモリに反映されるように設定されている。例えばプロセッサエレメント410で演算結果が出たときにはメモリ413だけでなく、メモリ414及びメモリ415に格納されているデータも更新される。
なお、どちらの場合もプロセッサエレメントを3個として図示し説明したが、その数はいくつであっても良い。
<データ>
コンパイラ装置100に入力されるデータには、実行経路の実行頻度の情報140と、ターゲットハードウェア130のハードウェアの仕様と、ソースプログラム110とがある。以下それらのデータに関する説明を行う。
コンパイラ装置100に入力される実行経路の実行頻度に関する情報140は、解析部101によって解析され作成された実行経路の識別子と、その実行経路の識別子に対応して、実際にターゲットハードウェア130若しくはその他の実行プログラムを実行できるハードウェア上において実行されることでその実行経路が何回実行されたかの回数とで構成された情報である。その回数が最も多いものを実行頻度一位としており、以下順に実行頻度二位、三位・・・となっており、この情報はまずターゲットハードウェア130のRAMに記憶され、その後にコンパイラ装置100に渡され、コンパイラ装置100のRAMに記憶される。
また、ターゲットハードウェア130の仕様の情報に関しては、メモリの形態に関してはメモリ共有型の場合は0、メモリ分散型の場合には1の2値で管理されており、それがメモリ情報としてコンパイラ装置100にターゲットハードウェア130から入力されコンパイラ装置100のRAMに記憶される。また、同時実行可能な命令数の情報は、ターゲットハードウェア130の有するプロセッサエレメントの数に関する情報であり、その情報もコンパイラ装置100に入力され、RAMに記憶される。
ソースプログラム110は、図5(a)に示すように記述されているプログラムである。
本実施形態においては、ソースプログラム110の一例として、図5(a)に示す部分ソースプログラム510をコンパイラ装置が変換するものとして説明する。以下、入力される部分ソースプログラム510の内容、及びそれを元に本コンパイラ装置によって作成されるコードの説明を行っていく。
まず図5(a)のソースプログラムの内容について説明する。以降の図6〜図10のコードはこのソースプログラムの内容、若しくは内容の一部を実行するために変換されたコードである。
図5(a)は、ソースプログラムのある部分の抜粋の一例であり、この区間におけるプログラムはソースプログラムの全体の中において何度も使用されるものとする。この部分ソースプログラム510を、フローグラフの形式に書き換えると図5(b)のように表される。この部分ソースプログラム510の内容を図5(b)のフローグラフを用いて説明する。
まず、命令ブロック500においてxにaとbの値を加算した値を格納し、分岐ブロック505においてxが0以上であるかどうかを判定する。
命令ブロック500において得られたxが0以下(分岐ブロック505のno)ならば、ブロック504に進み、xに命令ブロック500において得られたxの値をマイナス値にして格納する。命令ブロック500において得られたxが0以上(分岐ブロック505のyes)ならば、命令ブロック501に進み、yに命令ブロック500において得られたxの値からcを引いた値を格納する。
命令ブロック501を実行した後、分岐ブロック506においてが10以上であるかどうかを判定する。が10以上(分岐ブロック506のyes)ならば、命令ブロック502に進み、に命令ブロック501で得られたyから10引いた値を格納する。が10以下(分岐ブロック506のno)ならば、命令ブロック503に進み、に命令ブロック500において得られたxの値に10足した値を格納する。
以上が部分ソースプログラム510の実行内容である。なお、a、b、cの値は、この部分ソースプログラム510の前部分において既に与えられているものとする。また、この部分ソースプログラム510中の条件分岐によって派生する3つの実行経路のうち最も実行頻度の高い実行経路が、実行経路551であり、その次に実行頻度の高い実行経路が実行経路552であるとする。これは予めソースプログラムに最適化を施さずに変換した実行プログラムをターゲットハードウェア130上で実行することによって、実行頻度の情報を得ることができる。
図6〜図10に記したコードは、コンパイラ装置100から出力されるプログラムをアセンブラコードで表記したものであり、図5(a)のソースプログラムを元に生成される。図10のスレッド1000がメインスレッドで、図7のスレッド700、図8のスレッド800、図9のスレッド900はメインスレッドの中で使用されていて、それぞれのスレッドは、コードには記していないが、ターゲットハードウェア130上にて別のプロセッサエレメントで実行される構成になっている。
部分ソースプログラム510に最適化を施さずにそのままアセンブラコードに変換すると図6のスレッド600になる。なお、これらのコードは基本的に上から順に処理されていくものとする。また、各コードの命令の意味に関しては後述する。
スレッド600の内容を簡単に説明すると、コード601、609、617、622、627、632はラベルコードで、プログラム中の分岐において命令が飛ぶ先の指定に用いられる。
コード602〜608は、図5(b)のフローグラフにおいて、ブロック500、及びブロック505の命令の内容をコード化したものである。
コード610〜616は、図5(b)のフローグラフにおいて、ブロック501、及びブロック506の命令の内容をコード化したものである。
コード618〜621は、図5(b)のフローグラフにおいて、ブロック502の命令の内容をコード化したものである。
コード623〜626は、図5(b)のフローグラフにおいて、ブロック503の命令の内容をコード化したものである。
コード628〜631は、図5(b)のフローグラフにおいて、ブロック504の命令の内容をコード化したものである。
そして、コード633、634は、このスレッド600が終了した際の処理を行うコードである。
本発明に係るコンパイラ装置はスレッド600以外に、実行頻度の高い実行経路に関して、その実行経路上の命令を実行できるように変換、生成したスレッドが図7〜図9に示すコード列である。
図7には、図5の実行頻度一位の実行経路551上の命令群をコード化したスレッド700を記してある。コード701、713、719はそれぞれラベルコードである。コード702〜712は、図5のブロック500、501、502を他の実行経路に分岐しないようにコード化した内容になっており、ブロック505、506がこの実行経路を通るかどうかの2択に変えたコードを含んでいる。
コード714、715は実行経路511を通る場合に他のプロセッサエレメントで実行されているスレッドを停止させるコードである。
コード717、718は、実行経路551が実行されたときにコードを反映させる処理になる。この反映処理は、実行経路551の出口で生存していて、かつ実行経路551で変更されているデータが対象になる。
コード720、721はこのスレッド700の終了処理である。
図8には、実行経路552上の命令をアセンブラコードに変換したスレッド800を記してある。
コード801、814、817、820はそれぞれラベルコードである。
またコード802〜813は図5におけるブロック500、501、503の命令をコード化した内容になっている。コード815、816は実行経路552を通ることが確定した場合に、他のプロセッサエレメントで実行されているスレッドを停止させ、コード821、822はスレッド800終了処理を行っている。また、コード818、819は、実行経路552が実行されたときにコードを反映させる処理になる。
図9には、図5におけるブロック500、504を通る実行経路を通る場合の最適化されたコードであるスレッド900を記してある。
コード901、909、912、914はそれぞれラベルコードである。
またコード902〜908は図5におけるブロック500、504の命令をコード化した内容になっている。コード910、911はこの実行経路を通ることが確定した場合に、他のプロセッサエレメントで実行されているスレッドを停止させ、コード915、916はスレッド900の終了処理を行っている。また、コード913は、ブロック500、504が実行されたときにコードを反映させる処理になる。
図7のコード702〜712、図8のコード802〜813、図9の902〜908において同じメモリへの格納処理が生じる場合、各スレッドでの値の保証ができなくなり、プログラム作成者の望む結果が得られないことがあるため、メモリ共有型では別のメモリ領域への格納処理に変えることがある。
図10には、図6〜9のように生成される各スレッドをターゲットハードウェアに並列実行させるための、スレッド制御のためのコード列を示している。このスレッド1000がメモリ共有型のコンピュータを対象とした場合のメインスレッドということになる。
コード1001〜1004においては、解析部101から得た解析情報と、実行経路の実行頻度の情報を基に、実行頻度の高かった実行経路に関するスレッドを生成している。ここでは、ターゲットハードウェアは、十分なプロセッサエレメントを有するものとして、全ての実行経路のスレッドを立ち上げている。
ラベルコード1005から実行されるコード1006〜1008はスレッドの開始を各プロセッサエレメントに行わせるコードである。ラベルコード1009から実行されるコード1010〜1012は、実行されているスレッドから終了したかどうかの返答を待つコードである。ラベルコード1013から実行されるコード1014〜1016は、全スレッドの終了後、それぞれのスレッドを破棄し、プロセッサエレメントを自由にするコードである。
この図10のメインコードとスレッド600、スレッド700、スレッド800、スレッド900を含んだ実行プログラムをコンパイラ装置100は生成する。なお、スレッド600、スレッド700、スレッド800、スレッド900は並列実行される。
ここから、生成されるプログラムに使用され、図6〜図14及び図21に用いられているコードの説明を行う。
図6は、ソースプログラムをそのまま、特に最適化を施さずに変換したコード列を示した図であり、図7、図8、図9はそれぞれ順に、ターゲットハードウェア130のメモリ形態がメモリ共有型である場合における、部分ソースプログラム510の実行経路551、552、そしてブロック501、504を通る実行経路に関して最適化したコード列であり、図12、図13、図14はメモリ分散型である場合のコード列である。また、図21は、ターゲットハードウェアのメモリ形態がメモリ分散型である場合のメインスレッドである。
図10は、ターゲットハードウェア130の並列実行可能な命令数が既知である場合のメモリ共有型のメインスレッドを示したコード列であり、図11は、未知の場合のメインスレッドを示したコード列である。
なお、以下において番地は、プロセッサ上の命令の番地であり、レジスタの番地であったり、そのレジスタに格納されている値であったりする。
「mov (番地1),(番地2)」は、(番地1)の値を(番地2)のレジスタに格納するコードである。例えば図6のコード602においては、aが示す番地の値がレジスタD1に格納される。
「add (番地1),(番地2)」は、(番地1)の値と(番地2)の値とを加算し、その結果で得られた値で(番地2)の値を更新するコードである。例えば図6のコード604においては、レジスタD1に格納されている値と、レジスタD0に格納されている値を加算し、計算結果の値でレジスタD0の値を更新する。
「sub (番地1),(番地2)」は、(番地2)の値から(番地1)の値を減算し、その結果で得られた値で(番地2)の値を更新するコードである。例えば図6のコード612においては、レジスタD0に格納されている値からレジスタD1に格納されている値を減算し、その計算結果をレジスタD0に格納している。
「cmp (番地1),(番地2)」は、(番地1)の値と(番地2)とを比較するコードである。例えば図6のコード606においては、0とレジスタD0に格納されている値とを比較している。
「bge (番地3)」は、直前の比較コード cmp (番地1),(番地2) の比較において、(番地2)の値が(番地1)の値以上であった場合に、(番地3)に指定されるコードに命令を飛ばすコードである。それ以外の場合には次のコードを続行する。例えば、図6のコード607においては、その前のコード606の比較を受けてレジスタD0に格納されている値が0以上であった場合に、コード608を実行させずにコード609に飛び、以降のコードを実行することになる。
「blt (番地3)」は、直前の比較コード cmp (番地1),(番地2) の比較において、(番地2)の値が(番地1)の値よりも小さい場合に、(番地3)に指定されるコードに命令を飛ばすコードである。それ以外の場合には以降のコードを続行する。例えば、図7のコード706においては、その前のコード705の比較を受けて、レジスタD0に格納されている値が0よりも小さい場合に、コード707からコード719までは実行されずにコード720に飛び、以降のコードが実行されることになる。
「jmp (番地1)」は、(番地1)で指定されるコードに命令を飛ばすコードである。例えば、図6のコード608においては、コード609以下、コード626までを実行させずにコード627に飛び、以降のコードを実行することになる。
「not (番地1)」は、(番地1)の値をビット反転した(1の補数)値にして、その値で(番地1)を更新するコードである。例えば、図6のコード629においては、レジスタD0に格納されている値をビット反転した(1の補数)値にして、レジスタD0に格納しなおしている。
「inc (番地1)」は、(番地1)の値に1加算して、その値で(番地1)を更新するコードである。例えば図6のコード630においては、レジスタD0に格納されている値に1足して、D0+1の値をレジスタD0に格納しなおしている。
「dec (番地1)」は、(番地1)の値から1減算して、その値で(番地1)を更新するコードである。例えば、図11のコード1113においてはレジスタD1に格納されている値から1引いた、D1−1の値をレジスタD1格納しなおしている。
「clr (番地1)」は、(番地1)の値をクリアするコードでその値を0にするコードである。例えば、図6のコード633においてはレジスタD0の値をクリアし、レジスタD0の値を初期化している。
「asl (番地1),(番地2)」は、ターゲットハードウェアで使用されている命令語長の違いによる番地のずれを防ぐためのコードであり、主にコード間の遷移を行う場合に必要となる。プログラムにおいては各命令の番地は、命令語長の単位で管理されており、例えば、命令語長が8bitであった場合には、命令1の番地が0であった場合に、その次に続く命令2の番地は8になる。命令1の次の命令2に移行したい場合に、単純に命令1の番地に1足しても命令2の番地にならないので命令2は実行されず、番地の整合性が取れなくなる。このコードの実質的内容はというと、命令語長の値を(番地2)の値にかけて、(番地2)のレジスタに格納することがこのコードの内容である。
「ret」は、スレッドからプログラムのメインへの復帰を実行する実行するコードである。
次に、スレッド制御のためのコードの内容について説明する。
「_createthread (番地1),(番地2)」は、スレッドを生成するコードであり、(番地1)から始まるプロセスを生成する。その実行状態の情報は(番地2)に更新される。例えば、図10のコード1002においては、LABEL500−501−502で始まるスレッド、即ち図7のスレッド700を生成し、その実行情報はTHREAD500−501−502に格納される。
「#beginthread (番地)」は、スレッドの開始コードで、(番地)のスレッドの実行開始を促がす。例えば、図10のコード1006においては、LABEL500−501−502で始まるスレッド、即ち図7のコード列で示されるスレッド700を実行する。
「#endthread」は、スレッドの終了コードで、現在実行しているスレッドを終了状態に設定し、スレッドが終了したことを示す情報を返す。例えば、図7のコード720においてはスレッド700を終了し、終了したことを示す情報をプログラムのメインに返す。
「_deletethread (番地)」は、スレッドの破棄コードで、(番地)から始まるスレッドを破棄する。例えば、図10もコード1014においては、LABEL500−501−502のスレッド、つまりスレッド900を破棄する。
「_killthread (番地)」は、他のプロセッサエレメントで実行されているスレッドの強制終了コードで、(番地)から始まるスレッドを停止させる。例えば、図7のコード714においては、LABEL500−501−503で始まるスレッド、即ち、図8のスレッド800の実行を、実行途中であっても中止させる。
「#waitthread (番地)」は、スレッドの終了を待つコードで、(番地)から始まるスレッドの実行結果の終了を待つ。この終了は上記#endthreadからの情報によって知ることができる。例えば、図10のコード1010においては、THREAD500−504の終了を待っている。
「#commit (番地1)」は、メインプログラム、若しくはスレッドプロセスで生成した情報(番地1)を、メインプログラムと全てのスレッドプロセスに反映させるコードである。
「_broadcast (番地1),(番地2)」は、ターゲットハードウェアのメモリ管理方式が分散型である場合に、各プロセッサエレメントに接続されているメモリに実行結果を反映させるコードである。スレッドの実行結果の値(番地1)で、全てのスレッドの(番地2)の値を更新する。
「_getparallelnum (番地)」は、ターゲットハードウェアが同時実行可能なスレッドの数を(番地)に返すコードで、ターゲットハードウェアの並列実行可能なプロセッサエレメントの数を取得するために必要なコードで、特にコンパイル時にターゲットハードウェアの並列実行可能なプロセッサエレメントの数が分からない場合に必要となる。
<動作>
本コンパイラ装置によって生成される実行プログラムの生成における本コンパイラ装置の動作を実行プログラムの生成手順に沿ってフローチャートを用いながら説明する。
まず、コンパイラ装置100に入力された、ソースプログラム110は、解析部101によって、その中の分岐や繰り返しに関する情報を取得し、それを元にどのような実行経路があるかを検出し、後に実行経路を特定できるように実行経路を識別子化する。
一度ソースプログラム110は、最適化部103、コード変換部104を通じて、特別な最適化を施さずに実行プログラムに変換されて、ターゲットハードウェア130上において実際に実行されて実行経路の実行頻度に関する情報を得る。この実行経路の実行頻度の取得方法に関して、図15のフローチャートを用いて説明する。
部分ソースプログラム510の中の実行経路の実行頻度を計測するために、最適化部103は、ソースプログラムをそのまま最適化処理などを施さずに、プロファイリング用コードを組み込んで実行コードを作成し、作成された実行コードはコード変換部104によってターゲットハードウェア130上において実行できるような実行プログラムに変換、生成される(ステップS1500)。ここでプロファイリング用コードはソースプログラム上で条件分岐があった場合にその分岐においてどちらの分岐に進んだかを検出するためのコードであり、識別子化した実行経路に関して、その実行経路を一回通るたびに1カウント加算するコードである。このプロファイリングコードを挿入すると実行速度は遅くなるので、最終的に生成される実行プログラムには当然このプロファイリングコードは組み込まれない。
その後に作成された当該実行プログラムをターゲットハードウェア130上で実行し、実行経路の実行頻度を計測する(ステップS1502)。解析部101によって作成されている実行経路の識別子に、その実行経路が実行された回数を加算していき、その情報をターゲットハードウェアのメモリに記憶させ、これを実行経路の実行頻度の情報140とする。そして取得した実行経路の実行頻度の情報140はコンパイラ装置100の実行経路指定部102に渡され、それを基に、実際の目的とする実行プログラムは作成される。
ここで、実行経路の実行頻度に関する情報140をコンパイラ装置140に渡す際に、ターゲットハードウェア130のハードウェアの仕様に関する情報も渡す。このターゲットハードウェア130のハードウェアの仕様には、ターゲットハードウェア130の並列実行可能なプロセッサエレメントの数と、ターゲットハードウェア130のメモリ形態に関する情報がある。これらの情報は元からターゲットハードウェア130のROMに記憶されており、それがコンパイラ装置100に送信される。
その後に、実際の目的とする実行プログラムの生成を行う。その生成手順に関して図19のフローチャートを用いて説明する。
まずコンパイラ装置100は、大本のソースプログラムをそのまま実行形式に出来るコードに変換した第一コードを作成する(ステップS1901)。そして、実行経路指定部102は、ターゲットハードウェア130から取得した実行経路の実行頻度に関する情報140に基づき、その実行頻度の高かった、即ち実行回数の多かった優先実行経路を実行頻度の高い順に抽出し(S1905)、それとターゲットハードウェア130の並列実行可能なプロセッサエレメントの数により、優先実行経路上の命令を最適化した第二コードを生成する(S1907)。この第二コードはターゲットハードウェア130の並列実行可能なプロセッサエレメントの数より1少ない数まで生成されて良く、実行経路によって内容を変えて生成されて良く、実行頻度の回数の多かった実行経路の順に、それぞれの実行経路上の命令に対応するスレッドを生成して、その実行経路上の命令が最適化される。例えば、ターゲットハードウェア130の並列実行可能なプロセッサエレメントの数が4であった場合には、実行頻度第一位から第三位までの実行経路のスレッドを生成する。第一コードには複数の第二コードを制御するコードも含まれている。
そして、生成された第一コードと第二コードを並列実行させる編成にしたコードをコード変換部104がターゲットハードウェア130上において実行できるように実行プログラムを生成する(S1909)。
この動作を具体的に図5(a)の部分ソースプログラム510を実行プログラムに変換するとして、その過程において生成されるコード等を用い説明する。
まず、コンパイラ装置100には、図5(a)にある部分ソースプログラム510を含むソースプログラムが入力される。解析部101は、部分ソースプログラム510を解析し、その実行経路が、図5(b)のフローグラフにおけるブロック500、501、502を通る経路、ブロック500、501、503を通る経路、ブロック500、504を通る経路の3つの経路があることを解析し、それぞれの実行経路を識別子化する。最適化部103は、最適化を施さずに、コード変換部104は、部分ソースプログラム551をそのままアセンブラコードにしたスレッド600のコード列を生成し、これにプロファイリングコードを挿入した実行プログラムを生成する。当該実行プログラムをターゲットハードウェア130が実行し、その実行によってカウンティングされた実行経路の実行頻度の情報を、例えば、実行経路500−501−502:24回、実行経路500−501−503:15回、実行経路500−504:3回という情報として、コンパイラ装置100に渡される。また、ターゲットハードウェア130のハードウェアの仕様に関する情報も渡す。ここではターゲットハードウェアのプロセッサエレメントの数は例えば4としたら並列実行可能なプロセッサエレメントの数として4を、そしてメモリの形態がメモリ共有型であるのでメモリ情報として0をコンパイラ装置100に渡す。
コンパイラ装置100の実行経路指定部102は、実行経路の実行頻度の情報140を受け取り、最適化部103、コード変換部104はこれに基づき、メインスレッド1000を生成する。ターゲットハードウェア130の並列実行可能なプロセッサエレメントの数が4であるので、並列実行できるスレッドはメインスレッドを含めて4になり、メインスレッド内において、4つのスレッド600、700、800、900が生成される。それぞれのスレッド600、700、800、900はターゲットハードウェア130上の別のプロセッサエレメントで実行されるように編成されたコードを最終的に生成し、コード変換部104は、ターゲットハードウェア130が実行できるように実行プログラム120を生成する。
<第二の実施形態>
第二の実施形態においては、ターゲットハードウェアのメモリ形態がメモリ分散型であった場合について、主に、第一の実施形態と異なる点を説明する。
その主な違いは、プロセッサエレメントそれぞれにメモリが接続され、プロセッサエレメントはそれぞれのメモリの値を使用するため、メモリ共有型のような値のメモリアクセス競合による性能の低下の恐れがなくなることにある。
その違いを示すために図12〜図14及び図21のコード列を用意した。図12のスレッド1200の実行内容は、図7のスレッド700に、図13のスレッド1300の実行内容は、図8のスレッド800に、図14のスレッド1400の実行内容は、図9のスレッド900に、相当する。図21は、メモリ分散型の場合のメインスレッドである。
ターゲットハードウェア130のメモリの形態がメモリ共有型であった場合には、図7〜図9におけるコード702、802、902のように逐一aの値をレジスタに格納しなおさなければならなかったが、メモリ分散型ではそのようにする必要はなく、例えば、図21にあるメモリ分散型の場合のメインスレッドのように、メインスレッドにおいて各プロセッサエレメントの各レジスタにブロードキャストすることで、処理を省略することができる。そのためのコードが図21におけるコード2104〜2107である。
コード2105では、コード2101〜2103で生成されたスレッドにaの値を各プロセッサエレメントのメモリのレジスタD0に格納するように各スレッドを実行しているプロセッサエレメントに通達する。
コード2106では、コード2101〜2103で生成されたスレッドにbの値を各プロセッサエレメントのメモリのレジスタD1に格納するように各スレッドを実行しているプロセッサエレメントに通達する。
コード2107では、コード2101〜2103で生成されたスレッドにcの値を各プロセッサエレメントのメモリのレジスタD2に格納するように各スレッドを実行しているプロセッサエレメントに通達する。
また、各スレッドで実行された実行結果が、そのスレッドの実行条件が成立した場合に、メインスレッドが走っているプロセッサエレメントに接続されているメモリに、その実行結果を反映させる必要があり、それが「_commit」ではじまるコードになる。例えば図12においては、コード1215やコード1216がそれにあたる。これにより、スレッドの実行結果が反映されるようになる。
ターゲットハードウェアのメモリ形態がメモリ分散型である場合、スレッド2100、1200、1300、1400を含んで編成された実行プログラムが生成される。これにより、ターゲットハードウェア130のメモリ形態がメモリ分散型であっても実行プログラムは、値の整合がとれ、正常に実行される。
メモリ分散型のハードウェアを対象とした場合の実行プログラムの実行手順について、主にスレッドの制御に関する部分を、図17のフローチャートを用いて説明する。
まず、他のプロセッサエレメントにおいて実行されるスレッドを生成する(ステップS1700)。つまり、スレッド1200、1300、1400を生成する。それぞれにおけるこの前部分において得られたデータを各スレッドを実行するプロセッサエレメントのメモリに送信し、記憶させる(ステップS1701)。その後に、各スレッドを実行し(ステップS1702)、スレッドが終了した後(ステップS1703)に、そのスレッドの成立条件が成立している場合(ステップS1704)に、プログラムのメインへの値の反映を行う(ステップS1705)。そして、その後に自スレッドの破棄を行う(ステップS1705)。
<第三の実施形態>
第一、及び第二の実施形態においては、ターゲットハードウェアの並列実行可能な処理の数がコンパイラ装置には既知の物として説明してきたが、ターゲットハードウェアが並列実行可能なプロセッサエレメントの数が分からない場合もある。つまり、実行経路の実行頻度に関する情報、及びターゲットハードウェアのメモリ形態が予めコンパイラ装置に与えられており、いきなり実行プログラムをターゲットハードウェアに実行させたい場合などである。この場合メインプログラムの中に、当該プロセッサエレメントの数を取得するコードを組み込み、それと生成されるスレッドの数との整合を採るためのコードも組み込む必要が出てくる。そのために必要なコード列を図11に示してあり、その実行内容を説明する。なお、ここでは、ソースプログラムは図6にあるものであり、生成されるスレッドは図7〜9の3つであるものとして説明する。
ターゲットハードウェアのプロセッサエレメントの数を取得し、コンパイラによって生成されるスレッドの数との整合をとるコードがラベル1105から始まるコード1106〜1118に記されている。
まず、コンパイラによって生成されるスレッドの数mを取得し、その数mをレジスタD0に格納する(コード1106)。次にターゲットハードウェアの並列実行可能なプロセッサエレメントの数nを取得し、その値をレジスタD1に格納する(コード1107)。そしてレジスタD0に格納されたmとレジスタD1に格納されたnの値を比較し(コード1108)、n≧mならばラベルコード1111に飛び(コード1109)、n<mならばラベルコード1113に飛ぶ(コード1110)。
n≧mの場合には、特に問題はなく、mの値をレジスタD1に格納する(コード1112)。
n<mの場合には、生成されたスレッドの数mの方が並列実行可能な命令数nを上回っているため、すべてのスレッドを実行できない。
そこで、まず、レジスタD1に格納されている値nから1引いた数をD1に格納しなおす(コード1114)。このn−1の数が必要とする実行可能なスレッドの数である。一つ余るプロセッサエレメントは、元のプログラムをそのままコードにした図6のコードを実行する。
次に命令の番地計算を行うために、n−1の値に命令語長、例えば8bitなら8をかけ(コード1115)、P_POINTERの番地をレジスタD2に格納する(コード1116)。レジスタD2に格納された値からレジスタD1に格納された値を引いて、算出された値でレジスタD2を更新する(コード1117)。そして、レジスタD2に格納されている番地の値に命令を飛ばす(コード1118)。このD2に格納されている値によって以下のどのスレッドから開始するのかを決定する。例えば、ターゲットハードウェアの並列実行可能数が2であった場合には、コード1122から開始する。並列実行可能数が3の場合には、コード1121から開始する。コード1120〜コード1122に関しては下から順に実行頻度の高かった実行経路を実行するスレッド開始のコードになっている。
このスレッド1100をメインスレッドにすることにより、ターゲットハードウェアの並列実行可能数を得ていない場合であってもこのコンパイラ装置は、実行プログラムを生成できる。なお、コード1124以降のコードは、全てを図示していないが、図10におけるコード1012以降のコードと同様の構成とする。
ターゲットハードウェアの性能が分からない場合に、その性能を取得する必要があり、その流れを図16のフローチャートに簡単に示しておいた。
まず、コンパイラ装置100の最適化部103がターゲットハードウェア130に関して、同時並列実行可能な処理数が未知であるか、既知であるかを判定する(ステップS1601)。これは、ターゲットハードウェア130、その仕様に関する情報を得ているか、いないかで判断する。未知である場合には、この第三の実施形態において説明した図11のコードを実行プログラムの中に組み込む。そしてターゲットハードウェア130のメモリ形態がメモリ共有型か、メモリ分散型であるかの情報を得て(ステップS1603)それを元に実行プログラムを作成する。
<第四の実施形態>
第四の実施形態においては、上記実施の形態と異なり、図18にある機能ブロック図にあるように、上記実施の形態におけるコンパイラ装置にプログラムを実行できる実行部1807を組み込んだプログラム変換実行装置1800の実施の形態を示す。
その主な差は、図18において、プログラム変換実行装置1800はその内部に、実行プログラム格納部1806と実行部1807を組み込んだことにあり、これにより、ターゲットハードウェアに予め一度プログラムを実行して実行頻度情報を得るためにハードウェアと接続して実行させる手間をはぶけ、自機によって実行頻度情報を取得でき、かつプログラム実行結果を得ることも可能となる。
実行プログラム格納部1806は、コード変換部1805によって生成された実行プログラムを記憶しておく機能を有し、RAMを含んで構成される。
実行部1807は、実行プログラム格納部1806から実行プログラムを読み出し、当該実行プログラムを実行する機能を有し、MPU、ROM、RAMを含んで構成され、図1におけるターゲットハードウェア130と同等の働きをする。なお、このCPUは複数のプロセッサエレメントで構成されている。
生成されるコードに関しては第一〜第三の実施形態におけるものと変わらない。また、第四の実施形態においては、プログラムを変換しながら実行するインタプリタとしても使用できるようになる。
<補足>
なお、上記第一の実施形態及び第二の実施形態においては、ターゲットハードウェアは生成されるスレッド全てを実行できるだけの十分な数のプロセッサエレメントを有するものとして説明したが、例えばプロセッサエレメントの数が少なく2個とかの場合には、スレッド600とスレッド700だけが並列実行されるようにメインスレッドは構成される。この場合、図10においてはコード1003、1004、1007、1008、1011、1012、1015、1016は不要になる。
また、上記実施の形態においては第一コード、つまり概要の図3のスレッド300の実行速度は、通常、他のスレッドよりも遅いことを想定して、実行プログラムは作成されているが、速い場合も考慮にいれて、スレッド300の最後に、他のスレッドを停止させるコードを含んでも良い。
また、上記実施の形態においてはターゲットハードウェアが複数のプロセッサエレメントを内包するように記述したが、例えば、一台のパソコンを一つのプロセッサエレメントと見立てて、複数のパソコンをネットワークを介して接続して並列実行する形をとっても良い。
また、上記実施の形態において一つのスレッドが成立した場合に、他のプロセッサエレメントは実行していたスレッドを停止し、普通はスレッドと演算データを消去し、次に割り振られるスレッドを実行するが、同一のスレッドが何度も実行される場合には、逐次スレッドを割り振ることは非効率的であり、生成される目的プログラムの実行速度の低下を招くこともある。そこで、次に実行するスレッドが割り振られたスレッドと同内容であり、与えられる演算用データ値だけが異なる場合には、当該スレッドは破棄せずに保持しておき、スレッドを実行するのに必要な演算データだけがメインスレッドからブロードキャストされるようなコードを生成を含んだ目的プログラムを生成することとしても良い。
本発明に係るコンパイラ装置は、大容量計算を要するプログラムが必要とされる分野においてその計算結果がより早く出るようなプログラムの生成に活用できる。
本発明のコンパイラ装置の構成を示したブロック図である。 本発明の概念を説明するためのフローグラフを示した説明図である。 本発明の概要を説明するための概要図である。 プロセッサエレメントとメモリの関係を示した関係図である。 本発明の内容を説明するために用意したソースプログラムとそのフローグラフである。 図5のソースプログラムをそのままアセンブラコードに変換したコード列である。 ターゲットハードウェアがメモリ共有型の場合の実行経路500−501−502のコード列である。 ターゲットハードウェアがメモリ共有型の場合の実行経路500−501−503のコード列である。 ターゲットハードウェアがメモリ共有型の場合の実行経路500−504のコード列である。 ターゲットハードウェアがメモリ共有型の場合のスレッド制御コードである。 ターゲットハードウェアの並列実行可能なプロセッサエレメントの数が未知の場合の制御コードである。 ターゲットハードウェアがメモリ分散型の場合の実行経路500−501−502のコード列である。 ターゲットハードウェアがメモリ分散型の場合の実行経路500−501−503のコード列である。 ターゲットハードウェアがメモリ分散型の場合の実行経路500−504のコード列である。 実行頻度を検出するための手順を示したフローチャートである。 ターゲットハードウェアの性能の違いによるコードの変化を示すフローチャートである。 メモリ分散型におけるスレッド生成から値の反映までを示したフローチャートである。 プログラム変換実行装置1800の機能ブロック図である。 本発明のプログラム変換装置の動作を示したフローチャートである。 従来技術におけるトレーススケジューリングの説明に用いる説明図である。 ターゲットハードウェアがメモリ分散型の場合のスレッド制御コードである。
符号の説明
100 コンパイラ装置
101 解析部
102 実行経路指定部
103 最適化部
104 コード変換部
105 解析情報
120 実行プログラム
130 ターゲットハードウェア
140 実行経路の実行頻度の情報
400、401、402、410、411、412 プロセッサエレメント
403、413、414、415 メモリ
500、501、502、503、504 命令ブロック
505、506 分岐ブロック
510 部分ソースプログラム
511 実行頻度一位の実行経路
512 実行頻度二位の実行経路
1806 実行プログラム格納部
1807 実行部

Claims (28)

  1. 条件分岐を含むソースプログラムを変換して、2以上の命令を並列して実行できるコンピュータを対象とする目的プログラムを生成するプログラム変換装置であって、
    前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定手段と、
    前記区間にある全ての命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成手段と、
    前記実行経路指定手段によって指定される実行経路上の命令群だけに相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成手段と、
    前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成手段と、
    前記第一コード列と、前記第二コード列とを、前記コンピュータに並列実行させるように、かつ、前記第二コード列において他の実行経路への分岐条件が成立しない場合には前記第二コード列に継続して前記第三コード列を実行させ、前記第二コード列において他の実行経路への分岐条件が成立する場合には第一コード列に継続して第三コード列を実行させるように編成した目的プログラムを生成する目的プログラム生成手段とを備える
    ことを特徴とするプログラム変換装置。
  2. 前記目的プログラム生成手段は、
    前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コード列の後に含んで編成された目的プログラムを生成する
    ことを特徴とする請求項1記載のプログラム変換装置。
  3. 前記プログラム変換装置は更に、
    前記ソースプログラムを実行形式に変換した実行プログラムをコンピュータに実行させることで、前記区間において実行された頻度が高い順に、当該頻度が第一位の実行経路を当該コンピュータから取得する実行経路取得手段を備え、
    前記実行経路指定手段は、前記取得手段により取得された前記第一位の実行経路を指定する
    ことを特徴とする請求項1記載のプログラム変換装置。
  4. 前記プログラム変換装置は更に、
    前記コンピュータが並列実行可能な命令数mを取得する命令上限取得手段を備え、
    前記実行経路取得手段は更に、
    前記区間における実行頻度が第2位以下の実行経路を取得し、
    前記実行経路指定手段は、
    前記実行経路を前記命令数mに基づき、前記実行経路取得手段によって取得された、第一位から第n(n=m−1)位までの実行経路を指定し、
    前記第二コード列生成手段は、前記実行経路指定手段によって指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、
    前記目的プログラム生成手段は、
    前記第一コード列と前記第二コード列生成手段により生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成する
    ことを特徴とする請求項3記載のプログラム変換装置。
  5. 前記第二コード列生成手段は更に、
    前記第二コード列生成手段により生成された第一位から第n位のn個のコードのうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成する
    ことを特徴とする請求項4記載のプログラム変換装置。
  6. 前記プログラム変換装置は更に、
    前記コンピュータのメモリの形態が、前記コンピュータの全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型であるか、前記コンピュータの全てのプロセッサエレメントが固有のメモリを有するメモリ分散型かであるかのいずれの形態のメモリを使用しているかの情報を取得するメモリ情報取得手段を備え、
    前記目的プログラム生成手段は、前記メモリ情報取得手段により取得したメモリ情報に基づき、メモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成する
    ことを特徴とする請求項1記載のプログラム変換装置。
  7. 前記目的プログラム生成手段は、
    前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成する
    ことを特徴とする請求項5記載のプログラム変換装置。
  8. 前記プログラム変換装置は更に、
    前記目的プログラムを前記コンピュータに適合するように機械語に変換する機械語変換手段を備える
    ことを特徴とする請求項1記載のプログラム変換装置。
  9. 条件分岐を含むソースプログラムを実行形式である実行形式プログラムに変換して、かつ、2以上の命令を並列して実行できるプログラム変換実行装置であって、
    前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定手段と、
    前記区間にある全ての条件分岐を含んだ命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成手段と、
    前記第一コード列を含む第一プログラムを実行する実行手段と、
    前記実行手段が前記第一プログラムを実行することにより得られた前記区間における実行経路のうち実行頻度が高い順に、当該実行頻度が第一位の実行経路を取得する取得手段と、
    前記取得手段によって取得された実行経路を前記実行経路指定手段によって指定し、当該実行経路上の命令群に相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成手段と、
    前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成手段と、
    前記第一コード列と、前記第二コード列とを、並列実行するように、かつ、前記第二コード列において他の実行経路への条件分岐が発生しない場合には前記第二コード列に継続して前記第三コード列を実行し、前記第二コード列において他の実行経路への条件分岐が発生する場合には前記第一コード列に継続して前記第三コード列を実行するように編成した目的プログラムを生成する目的プログラム生成手段とを備え、
    前記実行手段は前記第一プログラムを実行する代わりに前記目的プログラムを実行する
    ことを特徴とするプログラム変換実行装置。
  10. 前記目的プログラム生成手段は、
    前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コードの後に含んで編成されたプログラムを生成する
    ことを特徴とする請求項9記載のプログラム変換実行装置。
  11. 前記プログラム変換実行装置は更に、
    当該プログラム変換実行装置が並列実行可能な命令数mを取得する命令上限取得手段を備え、
    前記実行経路取得手段は更に、
    前記区間における実行頻度が第2位以下の実行経路を取得し、
    前記実行経路指定手段は、
    前記実行経路を前記命令数mに基づき、前記実行経路取得手段によって取得された、第一位から第n(n=m−1)位までの実行経路を指定し、
    前記第二コード生成手段は、前記実行経路指定手段によって指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、
    前記目的プログラム生成手段は、
    前記第一コード列と前記第二コード列生成手段により生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成する
    ことを特徴とする請求項10記載のプログラム変換実行装置。
  12. 前記第二コード列生成手段は更に、
    前記第二コード列生成手段により生成された第一位から第n位のn個のコード列のうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成する
    ことを特徴とする請求項11記載のプログラム変換実行装置。
  13. 前記目的プログラム生成手段は、
    自機のメモリの形態が、全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成する
    ことを特徴とする請求項9記載のプログラム変換実行装置。
  14. 前記目的プログラム生成手段は、
    前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成する
    ことを特徴とする請求項12記載のプログラム変換実行装置。
  15. プログラム変換装置が実行する、条件分岐を含むソースプログラムを変換して2以上の命令を並列して実行できるコンピュータを対象とする目的プログラムを生成するプログラム変換方法であって、
    前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定ステップと、
    前記区間にある全ての命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成ステップと、
    前記実行経路指定ステップにおいて指定される実行経路上の命令群だけに相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成ステップと、
    前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成ステップと、
    前記第一コード列と、前記第二コード列とを、前記コンピュータに並列実行させるように、かつ、前記第二コード列において他の実行経路への分岐条件が成立しない場合には前記第二コード列に継続して前記第三コード列を実行させ、前記第二コード列において他の実行経路への分岐条件が成立する場合には第一コード列に継続して第三コード列を実行させるように編成した目的プログラムを生成する目的プログラム生成ステップとを備える
    ことを特徴とするプログラム変換方法。
  16. 前記目的プログラム生成ステップでは、
    前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コード列の後に含んで編成された目的プログラムを生成する
    ことを特徴とする請求項15記載のプログラム変換方法。
  17. 前記プログラム変換方法は更に、
    前記ソースプログラムを実行形式に変換した実行プログラムをコンピュータに実行させることで、前記区間において実行された頻度が高い順に、当該頻度が第一位の実行経路を当該コンピュータから取得する実行経路取得ステップを備え、
    前記実行経路指定ステップは、前記実行経路取得ステップにおいて取得された前記第一位の実行経路を指定する
    ことを特徴とする請求項15記載のプログラム変換方法。
  18. 前記プログラム変換方法は更に、
    前記コンピュータが並列実行可能な命令数mを取得する命令上限取得ステップを備え、
    前記実行経路取得ステップは更に、
    前記区間における実行頻度が第2位以下の実行経路を取得し、
    前記実行経路指定ステップは、
    前記実行経路を前記命令数mに基づき、前記実行経路取得ステップにおいて取得された、第一位から第n(n=m−1)位までの実行経路を指定し、
    前記第二コード列生成ステップは、前記実行経路指定ステップにおいて指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、
    前記目的プログラム生成ステップは、
    前記第一コード列と前記第二コード列生成ステップにおいて生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成する
    ことを特徴とする請求項17記載のプログラム変換方法。
  19. 前記第二コード列生成ステップは更に、
    前記第二コード列生成ステップにより生成された第一位から第n位のn個のコードのうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成する
    ことを特徴とする請求項18記載のプログラム変換方法。
  20. 前記プログラム変換方法は更に、
    前記コンピュータのメモリの形態が、前記コンピュータの全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型であるか、前記コンピュータの全てのプロセッサエレメントが固有のメモリを有するメモリ分散型かであるかのいずれの形態のメモリを使用しているかの情報を取得するメモリ情報取得ステップを備え、
    前記目的プログラム生成ステップは、前記メモリ情報取得ステップにおいて取得されたメモリ情報に基づき、メモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成する
    ことを特徴とする請求項15記載のプログラム変換方法。
  21. 前記目的プログラム生成ステップは、
    前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成する
    ことを特徴とする請求項19記載のプログラム変換方法。
  22. 前記プログラム変換方法は更に、
    前記目的プログラムを前記コンピュータに適合するように機械語に変換する機械語変換ステップを備える
    ことを特徴とする請求項15記載のプログラム変換方法。
  23. プログラム変換実行装置が実行する、条件分岐を含むソースプログラムを実行形式である実行形式プログラムに変換して、かつ、2以上の命令を並列して実行できるプログラム変換実行方法であって、
    前記ソースプログラムにおいて、条件分岐を跨ぐ一区間についての複数の実行経路のうちの一つの実行経路を指定する実行経路指定ステップと、
    前記区間にある全ての条件分岐を含んだ命令群を基に、その命令群に相当する第一コード列を生成する第一コード列生成ステップと、
    前記第一コード列を含む第一プログラムを実行する実行ステップと、
    前記実行ステップが前記第一プログラムを実行することにより得られた前記区間における実行経路のうち実行頻度が高い順に、当該実行頻度が第一位の実行経路を取得する取得ステップと、
    前記取得ステップによって取得された実行経路を前記実行経路指定ステップによって指定し、当該実行経路上の命令群に相当する第二コード列を生成し、当該生成において条件分岐命令については、他の実行経路への分岐条件が成立しない場合に前記区間における当該条件分岐命令以降の命令を続行し、他の実行経路への分岐条件が成立する場合に前記区間における当該条件分岐以降の命令の実行を中止するコードを当該条件分岐命令に相当するコードとして生成する第二コード列生成ステップと、
    前記ソースプログラムの前記区間に後続する部分の命令群を基に、その命令群に相当する第三コード列を生成する第三コード列生成ステップと、
    前記第一コード列と、前記第二コード列とを、並列実行するように、かつ、前記第二コード列において他の実行経路への条件分岐が発生しない場合には前記第二コード列に継続して前記第三コード列を実行し、前記第二コード列において他の実行経路への条件分岐が発生する場合には前記第一コード列に継続して前記第三コード列を実行するように編成した目的プログラムを生成する目的プログラム生成ステップとを備え、
    前記実行ステップは前記第一プログラムを実行する代わりに前記目的プログラムを実行する
    ことを特徴とするプログラム変換実行方法。
  24. 前記目的プログラム生成ステップは、
    前記コンピュータにおいて前記第一コード列の終了が前記第二コード列の終了よりも早い場合には、前記第二コード列を実行している前記コンピュータのプロセッサエレメントに第二コード列の実行を停止させるコードを前記第一コードの後に含んで編成されたプログラムを生成する
    ことを特徴とする請求項23記載のプログラム変換実行方法。
  25. 前記プログラム変換実行方法は更に、
    当該プログラム変換実行方法が並列実行可能な命令数mを取得する命令上限取得ステップを備え、
    前記実行経路取得ステップは更に、
    前記区間における実行頻度が第2位以下の実行経路を取得し、
    前記実行経路指定ステップは、
    前記実行経路を前記命令数mに基づき、前記実行経路取得ステップにおいて取得された、第一位から第n(n=m−1)位までの実行経路を指定し、
    前記第二コード生成ステップは、前記実行経路指定ステップにおいて指定された第一位から第n位までの実行経路を、実行経路ごとに合計n個のコード列に変換し、
    前記目的プログラム生成ステップは、
    前記第一コード列と前記第二コード列生成ステップにおいて生成された前記n個のコード列を並列実行させるようにコードを編成した目的プログラムを生成する
    ことを特徴とする請求項24記載のプログラム変換実行方法。
  26. 前記第二コード列生成ステップは更に、
    前記第二コード列生成ステップにより生成された第一位から第n位のn個のコード列のうち、他の実行経路への条件分岐が発生しなかったコード列以外のコード列を停止させる停止コードを含んで生成する
    ことを特徴とする請求項25記載のプログラム変換実行方法。
  27. 前記目的プログラム生成ステップは、
    自機のメモリの形態が、全てのプロセッサエレメントが一つのメモリを共有するメモリ共有型である場合に、前記第一コード列と前記第二コード列において利用される前記ソースプログラム中の元となる変数がそれぞれ独立した変数として扱うコードになっている目的プログラムを生成する
    ことを特徴とする請求項23記載のプログラム変換実行方法。
  28. 前記目的プログラム生成ステップは、
    前記停止コードによって停止させられたスレッドをプロセッサエレメントが消去せずに保持しておくコードを含んで目的プログラムを生成する
    ことを特徴とする請求項27記載のプログラム変換実行方法。
JP2004341236A 2004-11-25 2004-11-25 プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。 Expired - Fee Related JP4783005B2 (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2004341236A JP4783005B2 (ja) 2004-11-25 2004-11-25 プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。
US11/269,705 US20060130012A1 (en) 2004-11-25 2005-11-09 Program conversion device, program conversion and execution device, program conversion method, and program conversion and execution method
CNB2005101236116A CN100562849C (zh) 2004-11-25 2005-11-18 程序转换器件及方法、程序转换执行器件及转换执行方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004341236A JP4783005B2 (ja) 2004-11-25 2004-11-25 プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。

Publications (3)

Publication Number Publication Date
JP2006154971A JP2006154971A (ja) 2006-06-15
JP2006154971A5 JP2006154971A5 (ja) 2008-01-17
JP4783005B2 true JP4783005B2 (ja) 2011-09-28

Family

ID=36585567

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004341236A Expired - Fee Related JP4783005B2 (ja) 2004-11-25 2004-11-25 プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。

Country Status (3)

Country Link
US (1) US20060130012A1 (ja)
JP (1) JP4783005B2 (ja)
CN (1) CN100562849C (ja)

Families Citing this family (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4712512B2 (ja) * 2005-10-14 2011-06-29 富士通株式会社 プログラム変換プログラム、プログラム変換装置、プログラム変換方法
JPWO2008072334A1 (ja) * 2006-12-14 2010-03-25 富士通株式会社 コンパイル方法及びコンパイラ
JP2008158806A (ja) * 2006-12-22 2008-07-10 Matsushita Electric Ind Co Ltd 複数プロセッサエレメントを備えるプロセッサ用プログラム及びそのプログラムの生成方法及び生成装置
WO2009118731A2 (en) 2008-03-27 2009-10-01 Rocketick Technologies Ltd Design simulation using parallel processors
US9032377B2 (en) * 2008-07-10 2015-05-12 Rocketick Technologies Ltd. Efficient parallel computation of dependency problems
JP2010039536A (ja) * 2008-07-31 2010-02-18 Panasonic Corp プログラム変換装置、プログラム変換方法およびプログラム変換プログラム
US9489183B2 (en) 2010-10-12 2016-11-08 Microsoft Technology Licensing, Llc Tile communication operator
US9430204B2 (en) 2010-11-19 2016-08-30 Microsoft Technology Licensing, Llc Read-only communication operator
US9507568B2 (en) * 2010-12-09 2016-11-29 Microsoft Technology Licensing, Llc Nested communication operator
US9395957B2 (en) 2010-12-22 2016-07-19 Microsoft Technology Licensing, Llc Agile communication operator
US9128748B2 (en) 2011-04-12 2015-09-08 Rocketick Technologies Ltd. Parallel simulation using multiple co-simulators
US9195443B2 (en) * 2012-01-18 2015-11-24 International Business Machines Corporation Providing performance tuned versions of compiled code to a CPU in a system of heterogeneous cores
EP2950211B1 (en) * 2013-01-23 2021-07-07 Waseda University Parallelism extraction method and method for making program
RU2614583C2 (ru) * 2013-03-15 2017-03-28 Интел Корпорейшн Определение профиля пути, используя комбинацию аппаратных и программных средств
IL232836A0 (en) * 2013-06-02 2014-08-31 Rocketick Technologies Ltd Efficient parallel computation of dependency problems
US9348596B2 (en) 2013-06-28 2016-05-24 International Business Machines Corporation Forming instruction groups based on decode time instruction optimization
US9372695B2 (en) 2013-06-28 2016-06-21 Globalfoundries Inc. Optimization of instruction groups across group boundaries
US9335987B2 (en) * 2013-12-09 2016-05-10 International Business Machines Corporation Data object with common statement series
CA2942359C (en) * 2014-03-11 2020-10-06 Iex Group, Inc. Systems and methods for data synchronization and failover management
US9858058B2 (en) * 2014-03-31 2018-01-02 International Business Machines Corporation Partition mobility for partitions with extended code

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2921190B2 (ja) * 1991-07-25 1999-07-19 日本電気株式会社 並列実行方式
FR2685511B1 (fr) * 1991-12-19 1994-02-04 Bull Sa Procede de classification des architectures d'ordinateur.
JPH0660047A (ja) * 1992-08-05 1994-03-04 Seiko Epson Corp マルチプロセッサ処理装置
JPH0736680A (ja) * 1993-07-23 1995-02-07 Omron Corp 並列化プログラム開発支援装置
JPH1196005A (ja) * 1997-09-19 1999-04-09 Nec Corp 並列処理装置
US6170083B1 (en) * 1997-11-12 2001-01-02 Intel Corporation Method for performing dynamic optimization of computer code
US6308261B1 (en) * 1998-01-30 2001-10-23 Hewlett-Packard Company Computer system having an instruction for probing memory latency
JP2000163266A (ja) * 1998-11-30 2000-06-16 Mitsubishi Electric Corp 命令実行方式
JP3641997B2 (ja) * 2000-03-30 2005-04-27 日本電気株式会社 プログラム変換装置及び方法並びに記録媒体
EP1365328B1 (en) * 2001-02-28 2013-09-04 Fujitsu Limited Method for executing parallel process, and multi-processor computer
JP2003323304A (ja) * 2002-04-30 2003-11-14 Fujitsu Ltd 投機タスク生成方法および装置
JP3896087B2 (ja) * 2003-01-28 2007-03-22 松下電器産業株式会社 コンパイラ装置およびコンパイル方法
JP2004303113A (ja) * 2003-04-01 2004-10-28 Hitachi Ltd 階層メモリ向け最適化処理を備えたコンパイラおよびコード生成方法

Also Published As

Publication number Publication date
JP2006154971A (ja) 2006-06-15
CN1783012A (zh) 2006-06-07
US20060130012A1 (en) 2006-06-15
CN100562849C (zh) 2009-11-25

Similar Documents

Publication Publication Date Title
JP4783005B2 (ja) プログラム変換装置、プログラム変換実行装置およびプログラム変換方法、プログラム変換実行方法。
JP5707011B2 (ja) 統合分岐先・述語予測
JPH1139167A (ja) 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ
JPH0397059A (ja) 並列プロセッサで処理する並列な命令ストリームを同期させる方法
KR20090089382A (ko) 컴파일 방법 및 컴파일러
US6675380B1 (en) Path speculating instruction scheduler
JP2898105B2 (ja) コンパイル中にソフトウェア・スケジューリング技術を用いてハードウェアのパイプライン処理の中断を最小化する方法
US20110125986A1 (en) Reducing inter-task latency in a multiprocessor system
US20020095668A1 (en) Compiler and register allocation method
Feljan et al. Task allocation optimization for multicore embedded systems
US20240036921A1 (en) Cascading of Graph Streaming Processors
Anantharaman et al. A hardware accelerator for speech recognition algorithms
US11436045B2 (en) Reduction of a number of stages of a graph streaming processor
CN113791770B (zh) 代码编译器、代码编译方法、代码编译系统和计算机介质
JP2005332370A (ja) 制御装置
JP2006099579A (ja) 情報処理装置及び情報処理方法
CN113778455A (zh) 一种代码转换方法、装置、电子设备及存储介质
US11734065B2 (en) Configurable scheduler with pre-fetch and invalidate threads in a graph stream processing system
CLEOPHAS Process-Based Aho-Corasick Failure Function Construction
US10606602B2 (en) Electronic apparatus, processor and control method including a compiler scheduling instructions to reduce unused input ports
JP2017224288A (ja) 並列化方法、並列化ツール、車載装置
JP2002318689A (ja) 資源使用サイクルの遅延指定付き命令を実行するvliwプロセッサおよび遅延指定命令の生成方法
JP2017073083A (ja) 並列化方法、並列化ツール、車載装置
JP3921722B2 (ja) コンパイラ処理装置
Ng et al. Fuzzy-Based Scheduling Algorithm

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20071122

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20071122

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100223

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20110105

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20110302

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

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20110621

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110708

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

Free format text: PAYMENT UNTIL: 20140715

Year of fee payment: 3

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313111

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees