[go: up one dir, main page]

JP2008293378A - プログラム書き換え装置 - Google Patents

プログラム書き換え装置 Download PDF

Info

Publication number
JP2008293378A
JP2008293378A JP2007139671A JP2007139671A JP2008293378A JP 2008293378 A JP2008293378 A JP 2008293378A JP 2007139671 A JP2007139671 A JP 2007139671A JP 2007139671 A JP2007139671 A JP 2007139671A JP 2008293378 A JP2008293378 A JP 2008293378A
Authority
JP
Japan
Prior art keywords
memory
memory access
processing
program
ambiguous
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
JP2007139671A
Other languages
English (en)
Inventor
Teruo Kawabata
輝雄 川端
Takehito Heiji
岳人 瓶子
Hajime Ogawa
一 小川
Masatsugu Daimon
正嗣 大門
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
Original Assignee
Panasonic Corp
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 filed Critical Panasonic Corp
Priority to JP2007139671A priority Critical patent/JP2008293378A/ja
Priority to US12/107,450 priority patent/US8286145B2/en
Priority to CN200810100529.5A priority patent/CN101311901B/zh
Publication of JP2008293378A publication Critical patent/JP2008293378A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; 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

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)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

【課題】特殊なハードウェアを設けなくても曖昧なメモリ依存を緩和することができるプログラムに書き換える。
【解決手段】入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え方法であって、第1のメモリアクセス処理がアクセスするメモリのアドレス情報である第1のアドレス情報と、第2のメモリアクセス処理がアクセスするメモリのアドレス情報である第2のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、入力プログラムに挿入する比較処理挿入ステップ(S33)と、実行可否フラグの値に基づいて実行される処理であり、かつ、入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、入力プログラムに挿入する論理保証処理挿入ステップ(S34)とを含む。
【選択図】図7

Description

本発明は、特にメモリアクセス命令を含む命令列の依存緩和を行なうプログラム書き換え装置に関する。
近年、プロセッサの処理速度は急激に向上しているが、それに比べてメインメモリのアクセス速度向上は小さく、両者の速度差は年々大きくなっている。このため、プロセッサを有する情報処理装置により高速に情報処理を行なう際には、メモリアクセスがボトルネックとなることが従来指摘されている。
この問題を解消するために、メインメモリのメモリ領域に記憶されているデータ取得にペナルティサイクルが必要となるロード命令をできるだけ他命令よりも先行させて実行し、そのペナルティサイクル期間に他の命令を実行させるように命令をスケジューリングする方法が知られている。これにより、メモリアクセスによるペナルティの影響を他命令の実行サイクルで隠蔽することができ、性能劣化を抑えることが可能である。
しかし、静的な命令スケジューリングでは、ほとんどの場合、メモリアクセス命令のメモリアクセスアドレス値が動的に変化する。このため、メモリアクセス命令間に生じるメモリ依存を想定しなければならない。これは、曖昧なメモリ依存として知られている。その結果、静的な命令スケジューリングでは、ロード命令を他のメモリアクセス命令よりも先行させることが不可能となり、メモリアクセス命令によるペナルティサイクルの隠蔽が困難になり、プロセッサの性能を活かすことができない。
したがって、従来、このような曖昧なメモリ依存を有するメモリアクセス命令に対して命令スケジューリングを実施するには、特殊な命令を実行するハードウェアをプロセッサが持たなければ、メモリ領域に対するストア命令より前にロード命令を移動させることができなかった。
この曖昧なメモリ依存を考慮した特殊な命令として、投機的ロード命令が挙げられる(例えば、特許文献1参照。)。投機的ロード命令とは、以下のような処理を実行する命令である。つまり、ロード命令によりアクセスされるメモリ領域のアドレスをハードウェアの特別な記憶装置に記憶しておき、当該アドレスに記憶されているメモリデータをレジスタに設定する。その後、ストア命令が実行されたときに、レジスタに記憶されているデータをメモリ領域に設定し、ストア命令よりアクセスされるメモリ領域のアドレスと上記特別な記憶装置に記憶されていた投機的ロード命令のアドレスとの間で干渉が生じる場合には、投機的ロード命令で設定されたレジスタにストア命令がストアするデータを上書きすることで、論理等価性を保つものである。
図16および図17を用いて、投機的ロード命令について具体的に説明する。
例えば、通常のメモリアクセス命令のみを実行するプロセッサについて考える。図16は、ソースプログラムの一例を示す図である。図17(a)は、図16に示したソースプログラムと等価で、かつ投機的ロード命令がないアセンブラファイルの一例を示す図である。このようなプロセッサで図16に示すようなメモリアクセス処理を実行するためには、曖昧なメモリ依存を考慮して、図17(a)に示すように忠実にメモリアクセス順を守ったアセンブラファイルを作成しなければならない。
一方、図17(b)は、図16に示したソースプログラムと等価で、かつ投機的ロード命令を含むアセンブラファイルの一例を示す図である。このように、投機的ロード命令を活用することで、図16に示すメモリアクセス順を必ずしも守る必要がなくなる。すなわち、ロード命令をストア命令より先行させて実行することができる。これにより、メモリ参照によるペナルティサイクルを他の命令で隠蔽することができ、結果として性能が向上する。
特許第3762597号公報(23頁、図6)
しかしながら、このような投機実行的命令を実行させるためには、特殊なハードウェアをプロセッサに設けなければならないという問題がある。
本発明は、上述の課題を解決するためになされたものであり、特殊なハードウェアを設けなくても曖昧なメモリ依存を緩和することができるプログラム書き換え装置を提供することを目的とする。
上記目的を達成するために、本発明に係るプログラム書き換え装置は、入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え装置であって、前記入力プログラムに含まれる第1のメモリアクセス処理がアクセスするメモリのアドレス情報である第1のアドレス情報と、前記入力プログラムに含まれる第2のメモリアクセス処理がアクセスするメモリのアドレス情報である第2のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入手段と、前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入手段とを備える。
メモリアクセス処理の論理保証をするための論理保証処理を実行可否フラグに基づいて選択的に実行するようにしている。このため、特殊なハードウェアを設けなくても、曖昧なメモリ依存を緩和することができる。よって、プロセッサが備えるメモリアクセス命令を静的に効率良く命令スケジューリングでき、プログラム実行時の処理速度を向上させることができる。また、ハードウェア利用効率も向上する。
好ましくは、前記第1のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、前記第2のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である。
これによって、プロセッサが備えるキャッシュメモリや外部メモリ空間にアクセスするロード命令やストア命令に対して、静的に効率良く命令スケジューリングでき、プログラム実行時の処理速度を向上させることができる。また、ハードウェア利用効率も向上する。
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出手段と、前記クリティカルパス検出手段により検出されたクリティカルパスに前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれるか否かを判断し、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれる場合には、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析手段とを備え、前記比較処理挿入手段は、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された前記第1のメモリアクセス処理および前記第2のメモリアクセス処理を対象として、前記比較処理を挿入する。
これによって、クリティカルパス上の曖昧なメモリ依存関係にある命令間にのみに対して自動的に依存を緩和させることができ、効率よくクリティカルパスを短縮させ、命令スケジューリングでき、プログラム実行時の処理速度を向上させることができる。また、ハードウェア利用効率も向上する。
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された第1のメモリアクセス処理と前記第2のメモリアクセス処理との実行順序を変更する実行順序変更手段を備える。
これによって、レイテンシの長い命令を先行配置させることができ、プログラム実行時の処理速度を向上させることができる。またハードウェア利用効率も向上する。
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズと前記第2のメモリアクセス処理が1回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較手段を備え、前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値を、前記第1のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する。
さらに好ましくは、前記比較処理挿入手段は、実行順序として前記論理保証処理よりも前の一箇所に、前記比較処理を挿入する。
これによって、アドレス比較処理がメモリアクセス処理直前に一度のみの一致判定で実現でき、プログラム実行時の処理速度を向上させることができる。
さらに好ましくは、上述のプログラム書き換え装置は、さらに、前記第1および第2のメモリアクセス処理が繰り返し実行され、かつ各メモリアクセス処理においてアクセスされるメモリのアドレスが規則的に更新されるという条件を満たすか否かを判断する規則性判断手段を備え、前記比較処理挿入手段は、前記規則性判断手段において前記条件を満たすと判断された場合には、実行順序として前記第1および第2のメモリアクセス処理の繰り返しよりも前の位置に、前記比較処理を挿入する。
または、上述のプログラム書き換え装置は、さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズよりも前記第2のメモリアクセス処理が1回にアクセスするデータのサイズが小さいという条件を満たすか否かを判断するデータサイズ比較手段を備え、前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値を、前記第1のメモリアクセス処理がメモリに書き込む値の一部で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する。
これによって、オブジェクトサイズが異なるメモリアクセス処理の曖昧なメモリ依存であっても、メモリ依存を緩和することができ、プログラム実行時の処理速度を向上させることができる。
さらに好ましくは、上述のプログラム書き換え装置は、さらに、最適化に関する最適化指示情報を受け取る最適化指定情報付加手段を備え、前記比較処理挿入手段および前記論理保証処理挿入手段は、前記最適化指定情報付加手段が受け取った前記最適化指示情報に基づいて、選択的に動作する。
これによって、プログラマは、メモリアクセス命令に対するスケジューリングに対するコードサイズと実行性能とのトレードオフを考慮しながらプログラミングをすることができる。
なお、本発明は、このような特徴的な手段を備えるプログラム書き換え装置として実現することができるだけでなく、プログラム書き換え装置に含まれる特徴的な手段をステップとするプログラム書き換え方法として実現したり、プログラム書き換え方法に含まれる特徴的なステップをコンピュータに実行させるプログラムとして実現したりすることもできる。そして、そのようなプログラムは、CD−ROM(Compact Disc-Read Only Memory)等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
本発明によると、特殊なハードウェアを設けなくても曖昧なメモリ依存を緩和することができる。また、曖昧なメモリ依存にある命令に対して静的に効率の良いスケジューリングが可能となり、プログラム実行時の処理速度を向上させることができる。さらに、ハードウェア利用効率も向上する。
[システム構成]
図1は、本発明の実施の形態に係るコンパイラシステムの外観構成を示す図である。コンパイラシステムは、同図に示すようなコンピュータ上で各種プログラムを実行することにより実現される。
図2は、本発明の実施の形態に係るコンパイラシステムの構成を示す図である。
コンパイラシステム100は、C言語等の高級言語で記述されたソースプログラム200を機械語で記述された実行プログラム230に変換するソフトウェアシステムであり、コンパイラ110と、アセンブラ120と、リンカ130とを含む。
コンパイラ110は、命令の実行可否を制御可能とする実行可否フラグレジスタを有するCPU(Central Processing Unit)をターゲットプロセッサとし、ソースプログラム200をアセンブラ言語で記述されたアセンブラファイル210に変換するプログラムである。コンパイラ110は、ソースプログラム200をアセンブラファイル210に変換する際に、ソースプログラム200を解析して得られた処理内でクリティカルパス処理に関して曖昧なメモリ依存を緩和するメモリ依存緩和最適化部と命令スケジューリング最適化部とで最適化処理を行い、アセンブラファイル210を出力する。
アセンブラ120は、アセンブラ言語で記述されたアセンブラファイル210を機械語で記述されたオブジェクトファイル220に変換するプログラムである。リンカ130は、複数のオブジェクトファイル220を結合し、実行プログラム230を生成するプログラムである。
実行プログラム230の開発ツールとして、シミュレータ140およびプロファイラ150が用意されている。シミュレータ140は、実行プログラム230をシミュレートし、実行時の各種実行ログデータ240を出力するプログラムである。プロファイラ150は実行ログデータ240を解析し、プログラムの実行順序等を解析したプロファイルデータ250を出力するプログラムである。
これらの各種プログラムをコンピュータ上で実行することにより、ソースプログラム200から実行プログラム230が作成される。
[コンパイラの構成]
図3は、コンパイラ110の構成を示す図である。
コンパイラ110は、構文解析部111と、最適化情報解析部112と、一般最適化部113と、曖昧なメモリ依存緩和最適化部114と、命令スケジューリング部115と、コード出力部116とを含む。各構成処理部は、コンピュータ上で実行されるプログラムとして実現される。
構文解析部111は、ソースプログラム200を入力として受け、ソースプログラム200の構文解析処理を行った後、中間言語のプログラム(中間コード)を出力する処理部である。
最適化情報解析部112は、キャッシュパラメータ201、プロファイルデータ250、コンパイルオプションおよびプラグマなどの中間コードの最適化処理に必要な情報を読み込み、解析する処理部である。コンパイルオプションおよびプラグマはいずれもコンパイラ110に対する指示である。
一般最適化部113は、中間コードに一般的な最適化処理を施す処理部である。
曖昧なメモリ依存緩和最適化部114は、クリティカルパス上の曖昧なメモリ依存を緩和する処理部である。
命令スケジューリング部115は、命令の並びを最適化し、命令スケジューリングを行う処理部である。
コード出力部116は、最適化された中間コードをアセンブラ言語に変換してアセンブラファイル210を出力する処理部である。
[処理の流れ]
次に、コンパイラ110の実行する処理の流れについて説明する。図4は、コンパイラ110が実行する処理のフローチャートである。
構文解析部111は、ソースプログラム200の構文解析を行い、中間コードを生成する(S1)。最適化情報解析部112は、キャッシュパラメータ201、プロファイルデータ250、コンパイルオプションおよびプラグマなどを解析する(S2)。一般最適化部113は、最適化情報解析部112における解析結果に従い、一般的な中間コードの最適化を行う(S3)。曖昧なメモリ依存緩和最適化部114は、中間コードのクリティカルパス上の曖昧なメモリ依存を有するメモリアクセス処理に着目し、必要であれば、補正処理を挿入し、曖昧なメモリ依存の緩和を行う(S4)。命令スケジューリング部115は、命令のスケジューリングを行う(S5)。コード出力部116は、中間コードをアセンブラコードに変換し、アセンブラファイル210として出力する(S6)。
構文解析処理(S1)、最適化情報解析処理(S2)、一般的な最適化処理(S3)、命令スケジューリング処理(S5)およびアセンブラコード出力処理(S6)は、一般的な処理と同様であるため、その詳細な説明はここでは繰返さない。
以下、曖昧なメモリ依存緩和最適化処理(S4)について詳細に説明する。
図5は、曖昧なメモリ依存緩和最適化処理(図4のS4)の詳細を説明するためのフローチャートである。
曖昧なメモリ依存緩和最適化部114は、コンパイルオプションまたはプラグマ指令などによる最適化指示がある場合に実施する。最適化指示がある場合(S9でYES)、曖昧なメモリ依存緩和最適化部114は、中間コードを入力として、クリティカルパスを検出する(S10)。最適化指示がない場合(S9でNO)、処理を終了する。クリティカルパスの検出処理は、一般的な処理と同様であるため、その詳細はここでは繰返さない。クリティカルパスとは、資源(レジスタ、メモリ、外部ポート等)に対して定義・参照する(可能性がある<これを曖昧な依存と呼ぶ>)ことで生じる依存で結ばれる命令列のうちで、最長の実行時間がかかる命令列をいう。一般的に、これをノードとエッジと呼ばれる要素から構成されるDAG(Directed Acyclic Graph)と呼ばれる依存グラフを用いて求める。このとき、命令をノード、依存をエッジ、依存距離(命令間の実行時間)をエッジ距離として一般的なグラフ理論に基づいてクリティカルパスを求めることができる。
曖昧なメモリ依存緩和最適化部114は、検出したクリティカルパス中において、曖昧なメモリ依存関係にある論理的に連続するメモリアクセス処理を検出する(S11)。曖昧なメモリ依存検出処理(S11)については後に詳述する。
最適化対象となる曖昧なメモリ依存関係にある論理的に連続するメモリアクセス処理が存在しない場合(S12でNO)、処理を終了する。
最適化対象のメモリアクセス処理が存在する場合(S12でYES)、曖昧なメモリ依存緩和最適化部114は、検出したメモリアクセス処理に対して曖昧なメモリ依存を緩和する(S13)。依存緩和処理(S13)については、後に詳述する。
曖昧なメモリ依存緩和最適化部114は、曖昧なメモリ依存緩和が実施できたか否かを判定し(S14)、実施できなければ(S14でNO)、メモリアクセス処理に後続する処理に対して、曖昧なメモリ依存検出処理(S11)以下の処理を繰り返す。
曖昧なメモリ依存緩和が実施できた場合(S14でYES)、曖昧なメモリ依存緩和最適化部114は、曖昧なメモリ依存を緩和した処理に対して、再度クリティカルパスを検出する(S15)。曖昧なメモリ依存緩和最適化部114は、再検出したクリティカルパスと、処理前のクリティカルパスとの全長を比較し、最適化適用後に短縮されるかを判定する(S16)。
クリティカルパス長が短縮されていると判定された場合(S16でYES)、曖昧なメモリ依存緩和最適化部114は、短縮されたクリティカルパスに対して曖昧なメモリ依存を緩和するための処理を再帰的に繰り返す(S11)。
クリティカルパス長が短縮されていないか、またはクリティカルパス長が同じ場合(S16でNO)、曖昧なメモリ依存緩和最適化部114は、直前に実施された依存緩和処理を削除する(S17)。すなわち、直前に実施された依存緩和処理は(S13)実施されなかったものとする。その後、曖昧なメモリ依存緩和最適化部114は、メモリアクセス処理に後続する処理に対して曖昧なメモリ依存検出処理(S11)以下の処理を繰り返す。
以下、曖昧なメモリ依存検出処理(S11)および依存緩和処理(S13)について詳細に説明する。
図6は曖昧なメモリ依存検出処理(図5のS11)の詳細なフローチャートである。
曖昧なメモリ依存緩和最適化部114は、クリティカルパス検出処理(図5のS10)において検出されたクリティカルパスに対して、命令を先頭から順に選択しながら、以下の処理を繰り返す(S20)。
曖昧なメモリ依存緩和最適化部114は、選択した処理がメモリアクセス処理であり、かつ当該メモリアクセス処理の後続処理の中に、当該メモリアクセス処理に対して曖昧なメモリ依存関係のみにある処理が存在するか否かを判断する(S21)。
選択した処理がメモリアクセス処理ではないか、または、選択した処理がメモリアクセス処理であるが、当該メモリアクセス処理の後続処理の中に、当該メモリアクセス処理に対して曖昧なメモリ依存関係のみにある処理が存在しない場合には(S21でNO)、曖昧なメモリ依存緩和最適化部114は、次の処理を選択し(S20)、同様の判断を行なう(S21)。
選択した処理がメモリアクセス処理であり、かつ当該メモリアクセス処理の後続処理の中に、当該メモリアクセス処理に対して曖昧なメモリ依存関係のみにある処理が存在する場合には(S21でYES)、曖昧なメモリ依存緩和最適化部114は、最適化対象のアドレス変数名が、プラグマまたはコンパイルオプションにより指定されているか否かを判定する(S22)。
最適化対象のアドレス変数名が指定されている場合(S22でYES)、曖昧なメモリ依存緩和最適化部114は、最適化対象のメモリアクセス処理のアドレス変数名と指定された変数名とが一致するか否かを判定する(S23)。変数名が一致しない場合(S23でNO)、曖昧なメモリ依存緩和最適化部114は、次の処理を選択し(S20)、S21以降の処理を繰り返す。
変数名が一致する場合(S23でYES)、または最適化対象のアドレス変数名が指定されていない場合(S22でNO)、曖昧なメモリ依存緩和最適化部114は、ターゲットプロセッサの実行可否フラグレジスタ資源を使用可能か否かを判定する(S24)。実行可否フラグレジスタ資源が使用できるか否かの判定は、一般的なレジスタ割り付け最適化で用いる生存区間解析などを用いることで可能であるため、その詳細な説明はここでは繰り返さない。
曖昧なメモリ依存関係にあるメモリアクセス処理間で使用できる実行可否フラグレジスタ資源が存在しない場合には(S24でNO)、次の処理を選択し(S20)、S20以降の処理を繰り返す。
使用できる実行可否フラグレジスタ資源が存在する場合には(S24でYES)、曖昧なメモリ依存緩和最適化部114は、曖昧なメモリ依存関係にあるメモリアクセス処理に含まれるメモリ参照命令をメモリ代入命令の前に移動可能か否かを判定する(S25)。つまり、曖昧なメモリ依存緩和最適化部114は、メモリ代入命令と依存する命令が、メモリ参照命令とメモリ代入命令との間に存在するかを解析し、依存する命令が無ければメモリ参照命令を移動可能であると判断し、依存する命令が存在すればメモリ参照命令を移動不可能と判断する。移動不可能な場合(S25でNO)、曖昧なメモリ依存緩和最適化部114は、次の処理を選択し(S20)、S21以降の処理を繰り返す。
メモリ参照命令を移動可能な場合には(S25でYES)、曖昧なメモリ依存緩和最適化部114は、S21で検出された曖昧なメモリ依存関係にあるメモリアクセス処理を最適化の対象としてリターンする(S26)。すべての処理を探索し終わっても、最適化の対象となるメモリアクセス処理が存在していなければ、探索ループ(S20)を終了し、曖昧なメモリ依存処理検出を終了する。
図7は依存緩和処理(図5のS13)の詳細なフローチャートである。
曖昧なメモリ依存緩和最適化部114は、曖昧なメモリ依存検出処理(図5のS11、図6)で検出されたメモリアクセス処理が、曖昧な真のメモリ依存にあるか否かを判定する(S30)。
曖昧な真のメモリ依存になければ(S30でNO)処理を終了する。曖昧な真のメモリ依存にあれば(S30でYES)、曖昧なメモリ依存緩和最適化部114は、メモリに記憶されているデータのロード処理をストア処理の直前に移動し(S31)、依存関係にあるメモリアクセス処理が対象とするメモリの領域サイズ(オブジェクトサイズ)が互いに等しいか判定する(S32)。
オブジェクトサイズが異なる場合(S32でNO)、曖昧なメモリ依存緩和最適化部114は、それらメモリアクセス処理のアドレスレジスタ値の範囲を比較する比較処理をロード処理の直前に挿入し(S33)、そのアドレス範囲比較処理の結果に応じたアドレス毎の補正処理をロード処理の後ろに挿入し(S34)、処理を終える。
アドレスレジスタ値の範囲を比較する比較処理(S33)は、以下のようにして行われる。互いのメモリアクセス処理をAPbおよびAPsとする。また、APbおよびAPsそれぞれのメモリアクセスアドレスをAAbおよびAAsとする。さらに、APbおよびAPsそれぞれのメモリアクセス領域サイズをASbおよびASsとする。また、ASbおよびASsの最大公約数gcd(ASb、ASs)をGASとし、ASb>ASsとした場合、比較回数nはASb/GASで、この処理では、以下のn個の比較(AAb+GAS*0==AAs、AAb+GAS*1==AAs、AAb+GAS*2==AAs、・・・、AAb+GAS*(n−1)==AAs)を行なう。これにより、依存メモリ領域を検出する。つまり、AAb+GAS*k==AAsの比較結果が真となった場合には、ASb>ASsとした場合、APbによってアクセスされるメモリ領域のうちアクセス先頭アドレスAAbからGAS*kバイトだけずれた位置からGASバイト分の領域と、APsによってアクセスされるメモリ領域とが依存関係にあるといえる。
アドレス毎の補正処理(S34)は、前記アドレスレジスタ値の範囲を比較する比較処理(S33)の結果毎に、ロード処理で代入されるデータに、ストア処理でストアされるデータの内で依存メモリ領域に該当する領域部分のみを上書きするような実行可否フラグ付き代入処理をロード処理の後に挿入する処理である。
オブジェクトサイズが同じ場合(S32でYES)、曖昧なメモリ依存緩和最適化部114は、その曖昧なメモリ依存関係にあるメモリアクセス処理はループ内の処理であるか否かを判定する(S35)。ループ内でない場合(S35でNO)、曖昧なメモリ依存緩和最適化部114は、他の曖昧なメモリ依存を緩和したときに生成したアドレス比較処理が流用可能か判定する(S36)。当該判定において、アドレス変数が互いに一致していて、かつロード処理までに存在するアドレス変数の増減値が互いに同等であることがわかる場合(S36でYES)、アドレス比較処理を流用し、アドレス比較処理の挿入(S40)をスキップする。逆に、S36の判定において、アドレス比較処理が存在しない、またはアドレス変数が一致していない、またはアドレス変数の増減値が互いに同等でない可能性がある場合(S36でNO)、曖昧なメモリ依存緩和最適化部114は、メモリアクセス処理の互いのメモリアドレスの一致を比較するアドレス一致比較処理を、ロード処理の直前に挿入する(S40)。
2つのメモリアクセス処理がともにループ内の処理の場合(S35でYES)、ループ処理におけるメモリアドレスが変化する増分値が互いに固定かつ同等か否かを判定する(S37)。メモリアドレスの増分値が互いに固定でない、または同等でない場合には(S37でNO)、ループ内でない場合(S35でNO)と同様に、アドレス一致比較処理の挿入処理を実施する(S36、S40)。
メモリアドレスの増分値が互いに固定でかつ同等な場合(S37でYES)、曖昧なメモリ依存緩和最適化部114は、アドレス一致比較処理をループ処理の唯一の先行処理であるプリヘッダ処理の最後尾に挿入する(S38)。曖昧なメモリ依存緩和最適化部114は、各比較処理を挿入(S38、S40)した後、補正処理として、ロード処理で代入されるデータを、ストア処理でストアされるデータで上書きするような実行可否フラグ付き代入処理をロード処理の後に挿入し(S39)、処理を終える。
[コンパイルオプション]
コンパイラシステム100では、コンパイラに対するコンパイルオプションとして、オプション「−fno−cut−ambiguous−depend」が用意される。このオプションが、コンパイラ実行時に指定されれば、プラグマの指定に関わらず、曖昧なメモリ依存に対する緩和最適化を行わない。本オプションの指定がなければ、一般の最適化と同様に、「−O」(最適化コマンドラインオプション指定)の有無に従う。
[プラグマ指定]
本指定は、直後のループに対するものである。
プラグマ「#pragma _cut_ambiguous_depend[変数名,変数名]」により変数が指定された場合には、プラグマ指定されたアドレス変数のみに着目して曖昧なメモリ依存緩和最適化を行う。指定する変数は、配列でも、ポインタでもよい。変数の指定が省略された場合には、すべてのメモリアクセスを対象として曖昧なメモリ依存緩和最適化を行う。
以下、いくつかの具体的局面における曖昧なメモリ依存緩和処理について説明する。なお、以降の処理では、説明の簡単化のため擬似アセンブラ言語によるプログラム記述を行っているが、実際には中間言語による最適化処理が行われる。
[非ループ構造・同じオブジェクトサイズアクセス]
図8A〜図8Cは、非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。
図8Aは、非ループ構造で同じオブジェクトサイズアクセスのソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が2回連続するものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、お互いのアドレス変数が同じ型であるため、同じである。
図8B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図8B(a))からは、クリティカルパス検出処理(図5のS10)にて図8C(a)に示すようなクリティカルパスが検出される。このクリティカルパスは、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグは入力された中間コードで使用されていないので自由に使用できる実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pA++によるメモリへの定義と2回目の*pB++によるメモリへの参照であり、真の依存関係であるため、図7のS30でYESとなり、図8B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは同等であるため、図7のS32でYESとなり、さらにループ内の処理ではないため図7のS35でNOとなる。
図7のS35でNOとなれば、先行に既存のアドレス比較処理が存在しないため、図7のS36でNOとなり、アドレス変数pBに割り付けられたレジスタr1の値とアドレス変数pAに割り付けられたレジスタr0の値とが一致するか比較するアドレス比較処理を図7のS31で移動したメモリ参照処理の直前に挿入する(図7のS40)。なお、図8B(b)に示すアドレス比較処理「cmpeq C0,r1,r0」は、r1とr0との値が等しい場合に、条件可否フラグC0に1を代入する処理である。
最後に、曖昧なメモリ依存において実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11を*pAによるメモリ代入処理で代入される値であるr10で上書きするように、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7の39)。図8B(b)に示す実行可否フラグ付き補正命令では、C0==1の場合、すなわち、r1とr0との値が等しい場合に、命令movが実行される。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されたため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図8C(b)に示すように、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は図8C(a)の7cycleから図8C(b)の4cycleとなり、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮することで、命令スケジューリング処理(図4のS5)によって、より高性能な中間コードを実現でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[非ループ構造・異なるオブジェクトサイズアクセス(小→大)]
図9A〜図9Dは、非ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。
図9Aは、非ループ構造で異なるオブジェクトサイズアクセスのソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が2回連続するものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、それぞれ4byteと2byteでストア・オブジェクトサイズはロード・オブジェクトサイズより大きい。
図9B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図9B(a))からは、クリティカルパス検出処理(図5のS10)にて図9C(a)に示すようなクリティカルパスが検出される。このクリティカルパスは、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグは入力された中間コードで使用されていないので自由に使用できる実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pA++によるメモリへの定義と2回目の*pB++によるメモリへの参照であり、メモリによる真の依存関係であるため、図7のS30でYESとなり、図9B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは異なるため、図7のS32でNOとなる。
図7のS32でNOとなれば、曖昧なメモリ依存緩和最適化部114は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。アドレス範囲比較処理は、以下のようにして求められる。つまり、pAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズがそれぞれ4byteと2byteであるので、それらの最大公約数gcdは2と求められ、比較回数nが4byte/gcd(4byte、2byte)で2と求められる。また、アドレス変数pBに割り付けられたレジスタはr1、アドレス変数pAに割り付けられたレジスタはr0であるため、アドレス範囲比較処理として、r0==r1+2*0とr0==r1+2*1の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部114は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。図9B(b)の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が0であるのかまたは2byteだけずれているのかの比較処理を行っている。
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11のうちで依存があるメモリ領域部分に相当するデータ部分のみに*pAによるメモリ代入処理で代入される値であるr10で上書きするように(図9D)、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7のS34)。図9B(b)の中間コードでは、図9Dの補正処理のメモリイメージの様に、下位16bit部分に依存がある場合は、「extr r11,r10,15,0」としてr11にr10の0bit目から15bit目の16bitを符号拡張して上書きし、上位16bit部分に依存がある場合は、「extr r11,r10,31,16」としてr11にr10の16bit目から31bit目の16bitを符号拡張して上書きする。符号拡張の必要の有無は、r11のメモリ参照命令の動作にあわせる必要がある。この場合ではldh処理はメモリの16bitデータを32bitに符号拡張したうえでレジスタに代入することを想定しているため、補正処理にも符号拡張を実施する必要があり、extr処理で符号拡張されることを想定している。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されるため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図9C(b)に示すように、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は図9C(a)の7cycleから図9C(b)の4cycleとなり、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮することで、命令スケジューリング処理(図4のS5)によって、より高性能な中間コードを実現でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[非ループ構造・異なるオブジェクトサイズアクセス(大→小)]
図10A〜図10Dは、非ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。
図10Aは、非ループ構造で異なるオブジェクトサイズアクセスのソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が2回連続するものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、それぞれ2byteと4byteでロード・オブジェクトサイズはストア・オブジェクトサイズより大きい。
図10B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図10B(a))からは、クリティカルパス検出処理(図5のS10)にて図10C(a)に示すようなクリティカルパスが検出される。このクリティカルパスは、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグは入力された中間コードで使用されていないので自由に使用できる実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pA++によるメモリへの定義と2回目の*pB++によるメモリへの参照であり、メモリによる真の依存関係であるため、図7のS30でYESとなり、図10B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは異なるため、図7のS32でNOとなる。
図7のS32でNOとなれば、曖昧なメモリ依存緩和最適化部114は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。アドレス範囲比較処理は、以下のようにして求められる。つまり、pAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズがそれぞれ2byteと4byteであるので、それらの最大公約数gcdは2と求められ、比較回数nが4byte/gcd(2byte、4byte)で2と求められる。また、アドレス変数pBに割り付けられたレジスタはr1、アドレス変数pAに割り付けられたレジスタはr0であるため、アドレス範囲比較処理として、r1==r0+2*0とr1==r0+2*1の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部114は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。図10B(b)の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が0であるのかまたは2byteだけずれているのかの比較処理を行っている。
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11に*pAによるメモリ代入処理で代入される値であるr10のうちで依存があるメモリ領域部分に相当するデータ部分を上書きするように、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7のS34)。図10B(b)の中間コードでは、図10Dの補正処理のメモリイメージの様に、下位16bit部分に依存がある場合は、「valn r11,r10,r11」としてr11下位16bitにr10の下位16bitを上書きし、上位16bit部分に依存がある場合は、「valn r11,r11,r10」としてr11の上位16bitにr10の上位16bitを上書きする。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されたため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図10C(b)に示すように、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は図10C(a)の7cycleから図10C(b)の4cycleとなり、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮することで、命令スケジューリング処理(図4のS5)によって、より高性能な中間コードを実現でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[ループ構造・ループ外で判定]
図11A〜図11Cは、ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。
図11Aは、ループ構造のソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理がループ内に2回連続し、その処理をループにより100回繰り返すものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、お互いのアドレス変数が同じ型であるため、同じである。
図11B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図11B(a))からは、クリティカルパス検出処理(図5のS10)にて図11C(a)に示すようなクリティカルパスが検出される。このクリティカルパスは、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグとして入力された中間コードでC6のみ使用しているためC6以外の実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pA++によるメモリへの定義と2回目の*pB++によるメモリへの参照であり、メモリによる真の依存関係であるため、図7のS30でYESとなり、図11B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは同等であるため、図7のS32でYESとなり、さらにループ内に処理が存在するため図7のS35でYESとなる。
アドレス変数pAとpBの増分値は、ループ内でそれぞれpA++、pB++として互いに1要素ずつ固定的に増加するため、S37でYESとなる。
S37でYESとなれば、ループ内での依存は基準アドレスのみの判定で良いため、アドレス変数pBに割り付けられたレジスタr1の値とアドレス変数pAに割り付けられたレジスタr0の値とが一致するか比較するアドレス比較処理をループのプリヘッダ処理の最後尾に挿入する(図7のS38)。
最後に、曖昧なメモリ依存において実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11を*pAによるメモリ代入処理で代入される値であるr10で上書きされるように、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7の39)。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されたため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図11C(b)に示すように、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は図11C(a)の7cycleから図11C(b)の4cycleとなり、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮し、アドレス比較処理をループ外で実行することで処理を削減でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[ループ構造・ループ内で判定]
図12A〜図12Cは、ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。
図12Aは、ループ構造のソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAのアドレスを引数incで指定された数値を増分値として更新し、pBは次の要素を示すようにアドレスを更新する処理と、更新されたpAとpBのアドレスで、pBが指す領域をpAが指す領域に代入し、両アドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理をループにより100回繰り返すものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、お互いのアドレス変数が同じ型であるため、同じである。
図12B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図12B(a))からは、クリティカルパス検出処理(図5のS10)にて図12C(a)に示すようなクリティカルパスが検出される。このクリティカルパスは、1回目の*pAによるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pAによるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグとして入力された中間コードでC6のみ使用しているためC6以外の実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pAによるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pAによるメモリへの定義と2回目の*pB++によるメモリへの参照であり、メモリによる真の依存関係であるため、図7のS30でYESとなり、図12B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは同等であるため、図7のS32でYESとなり、さらにループ内に処理が存在するため図7のS35でYESとなる。
アドレス変数pAとpBの増分値は、ループ内でpAは+1と+inc、pBは+1と+1として互いに異なる増分値を持つ可能性があるため、S37でNOとなる。
S37でNOとなれば、ループ内での依存判定を毎回実施する必要があり、また先行処理に既存のアドレス比較処理が存在しないため、図7のS36でNOとなり、アドレス変数pBに割り付けられたレジスタr1の値とアドレス変数pAに割り付けられたレジスタr0の値とが一致するか比較するアドレス比較処理を図7のS31で移動したメモリ参照処理の直前に挿入する(図7のS40)。
最後に、曖昧なメモリ依存において実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11を*pAによるメモリ代入処理で代入される値であるr10で上書きされるように、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7の39)。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されたため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図12C(b)に示すように、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は図12C(a)の7cycleから図12C(b)の4cycleとなり、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、それぞれのメモリアクセスのアドレス増分値が異なる場合でも、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮することで、命令スケジューリング処理(図4のS5)によって、より高性能な中間コードを実現でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[ループ構造・異なるオブジェクトサイズアクセス(小→大)]
図13Aおよび図13Bは、ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。
図13Aは、ループ構造で異なるオブジェクトサイズアクセスのソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理がループ内に2回連続し、その処理をループにより100回繰り返すものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、それぞれ4byteと2byteでストア・オブジェクトサイズはロード・オブジェクトサイズより大きい。
図13B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図13B(a))からは、クリティカルパス検出処理(図5のS10)にて図9C(a)と同様なクリティカルパスが検出される。このクリティカルパスは、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグとして入力された中間コードでC6のみ使用しているためC6以外の実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pA++によるメモリへの定義と2回目の*pB++によるメモリへの参照であり、メモリによる真の依存関係であるため、図7のS30でYESとなり、図13B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは異なるため、図7のS32でNOとなる。
図7のS32でNOとなれば、曖昧なメモリ依存緩和最適化部114は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。アドレス範囲比較処理は、以下のようにして求められる。つまり、pAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズがそれぞれ4byteと2byteであるので、それらの最大公約数gcdは2と求められ、比較回数nが4byte/gcd(4byte、2byte)で2と求められる。また、アドレス変数pBに割り付けられたレジスタはr1、アドレス変数pAに割り付けられたレジスタはr0であるため、アドレス範囲比較処理として、r0==r1+2*0とr0==r1+2*1の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部114は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。図13B(b)の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が0であるのかまたは2byteだけずれているのかの比較処理を行っている。
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11のうちで依存があるメモリ領域部分に相当するデータ部分のみに*pAによるメモリ代入処理で代入される値であるr10で上書きするように(図9Dと同様)、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7のS34)。図13B(b)の中間コードでは、図9Dの補正処理のメモリイメージと同様に、下位16bit部分に依存がある場合は、「extr r11,r10,15,0」としてr11にr10の0bit目から15bit目の16bitを符号拡張して上書きし、上位16bit部分に依存がある場合は、「extr r11,r10,31,16」としてr11にr10の16bit目から31bit目の16bitを符号拡張して上書きする。符号拡張の必要の有無は、r11のメモリ参照命令の動作にあわせる必要がある。この場合ではldh処理はメモリの16bitデータを32bitに符号拡張したうえでレジスタに代入することを想定しているため、補正処理にも符号拡張を実施する必要があり、extr処理で符号拡張されることを想定している。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されたため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図9C(b)と同様に、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は7cycleから4cycleと、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮することで、命令スケジューリング処理(図4のS5)によって、より高性能な中間コードを実現でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[ループ構造・異なるオブジェクトサイズアクセス(大→小)]
図14Aおよび図14Bは、ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。
図14Aは、ループ構造で異なるオブジェクトサイズアクセスのソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理がループ内に2回連続し、その処理をループにより100回繰り返すものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、それぞれ2byteと4byteでロード・オブジェクトサイズはストア・オブジェクトサイズより大きい。
図14B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図14B(a))からは、クリティカルパス検出処理(図5のS10)にて図10C(a)と同様なクリティカルパスが検出される。このクリティカルパスは、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存であるため、1回目の*pBによるメモリ参照と*pAによるメモリ代入と2回目の*pBによるメモリ参照と*pAによるメモリ代入の連続した処理の流れとなる。
このクリティカルパスに対して、曖昧なメモリ依存検出処理(図5のS11、図6)が実行される。つまり、クリティカルパス上の処理を先頭から順に探索し(図6のS20)、1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理の曖昧なメモリ依存を検出する(図6のS21)。これにより、図6のS21でYESとなる。
実行可否フラグとして入力された中間コードでC6のみ使用しているためC6以外の実行可否フラグレジスタ資源が存在している。このため、図6のS24でYESとなる。
メモリ参照処理の移動可否判定処理(S25)では、メモリ参照処理の曖昧なメモリ依存の要因となるメモリ以外にもレジスタr1およびr11についても考慮される。レジスタr1とr11のそれぞれが他の処理と依存する場合も考えられるが、この場合では移動先のメモリ代入処理とメモリ参照処理までの間にレジスタr1とr11の定義・参照による依存がない。このため、メモリ参照処理が移動可能で図6のS25でYESとなる。
よって、図6のS26にて1回目の*pA++によるメモリ代入処理と2回目の*pB++によるメモリ参照処理が曖昧なメモリ依存関係と判断され、図5のS12でYESとなり依存緩和処理(図5のS13)にそれらのメモリアクセス処理の情報を渡す。その曖昧なメモリ依存となるメモリアクセス処理に対して、依存が緩和される(図5のS13、図7)。
得られたメモリアクセス処理の曖昧なメモリ依存は、1回目の*pA++によるメモリへの定義と2回目の*pB++によるメモリへの参照であり、メモリによる真の依存関係であるため、図7のS30でYESとなり、図14B(b)の様に2回目の*pBによるメモリ参照処理を1回目の*pAによるメモリ代入処理の前に移動する(図7のS31)。それらのメモリアクセス処理のpAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズは異なるため、図7のS32でNOとなる。
図7のS32でNOとなれば、曖昧なメモリ依存緩和最適化部114は、アドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。アドレス範囲比較処理は、以下のようにして求められる。つまり、pAによるストア・オブジェクトサイズとpBによるロード・オブジェクトサイズがそれぞれ2byteと4byteであるので、それらの最大公約数gcdは2と求められ、比較回数nが4byte/gcd(2byte、4byte)で2と求められる。また、アドレス変数pBに割り付けられたレジスタはr1、アドレス変数pAに割り付けられたレジスタはr0であるため、アドレス範囲比較処理として、r1==r0+2*0とr1==r0+2*1の二つのアドレス一致を比較する処理が求められる。曖昧なメモリ依存緩和最適化部114は、このように求められたアドレス範囲比較処理をメモリ参照処理の直前に挿入する(図7のS33)。図14B(b)の中間コードでは、前記比較処理を効率的に行うために、両アドレスの排他的論理和を取り、その結果が0であるのかまたは2byteだけずれているのかの比較処理を行っている。
最後に、曖昧なメモリ依存で実際に依存が発生するときに論理を正しく保つために、アドレスが一致した場合に実行可否フラグレジスタによって*pBによるメモリ参照処理によって得られた値であるr11に*pAによるメモリ代入処理で代入される値であるr10のうちで依存があるメモリ領域部分に相当するデータ部分を上書きするように、実行可否フラグ付き補正命令を移動した*pBによるメモリ参照処理の後ろに挿入する(図7のS34)。図14B(b)の中間コードでは、図10Dの補正処理のメモリイメージと同様に、下位16bit部分に依存がある場合は、「valn r11,r10,r11」としてr11下位16bitにr10の下位16bitを上書きし、上位16bit部分に依存がある場合は、「valn r11,r11,r10」としてr11の上位16bitにr10の上位16bitを上書きする。
このように、依存緩和処理(図5のS13)にて依存緩和が実施されたため、図5のS14でYESとなり、依存緩和後の中間コードに対してクリティカルパスを再検出すると(図5のS15)、図10C(b)と同様に、クリティカルパスは、1回目の*pBによるメモリ参照と実行可否フラグ付き補正命令と*pAによるメモリ代入処理の真の依存のみからなる。すなわち、メモリ参照処理によるレイテンシを3cycleとすると、クリティカルパス長は7cycleから4cycleとなり、3cycle短縮される。よって図5のS16にてYESとなり、図5のS11を再帰的に実施することになる。この例の場合は、全ての曖昧なメモリ依存が取り除かれたため、2回目の曖昧なメモリ依存検出処理(図7のS11)では依存緩和対象のメモリアクセスが検出されないため、図5のS12でNOとなり処理を終える。
このように、メモリアクセス対象のサイズが異なる場合でも、曖昧なメモリ依存緩和処理(図5、図4のS4)を行ない、クリティカルパスを短縮することで、命令スケジューリング処理(図4のS5)によって、より高性能な中間コードを実現でき、アセンブラコード出力処理(図4のS6)にてオブジェクトコードを生成してコンパイル処理を終える。
[非ループ構造・同じオブジェクトサイズアクセスの連続]
図15A〜図15Cは、非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。
図15Aは、非ループ構造で同じオブジェクトサイズアクセスが連続しているソースプログラム200の一例を示す図である。
このソースプログラム200の処理内容は、関数の引数pA、pBを基準アドレスとしてpBが指す領域をpAが指す領域に代入し、pAとpBのアドレスをそれぞれ次の要素を示すようにアドレス値を加算する処理が2回以上連続しているものである。アドレス変数pAにて代入されるメモリ領域サイズ(ストア・オブジェクトサイズ)とアドレス変数pBにて参照されるメモリ領域サイズ(ロード・オブジェクトサイズ)は、お互いのアドレス変数が同じ型であるため、同じである。
図15B(a)は、このソースプログラム200が図4に示すコンパイラの処理に入力され、図4のS1からS3の処理にて変換されS4の入力となる中間コードである。この入力された中間コード(図15B(a))からは、前記図8A〜図8Cで説明した変換により、図15B(b)のように依存緩和がされた中間コードが生成され、さらに中間コード上の後続の曖昧なメモリ依存に対して同様に依存緩和を実施する。このとき、前方のアドレス比較命令検出判定処理(図7のS36)において、図15C(a)の中間コードの様に、3回目の*pB++によるメモリアクセス処理「ld r12、(r1+)」の直前に「cmpeq C0,r1,r0」を挿入すべきであるが、前方に同様なcmpeq処理が存在し、かつ比較アドレス変数が、pA(r0)とpB(r1)で、かつ直前のcmpeq処理から挿入予定のld処理の直前までにあるアドレス変数pAとpBの増分値は固定であるため、アドレス比較処理を流用可能と判定される。よって、アドレス比較処理は挿入されずに、既存のアドレス比較処理の結果である実行可否フラグレジスタを流用するようにし、補正処理を挿入する(図7のS39)。
このように、連続するメモリアクセスの依存緩和では、アドレス比較処理を削減することで、さらに高性能な中間コード(図15C(b))を実現できる。
[最適化コンパイラオプション]
最適化抑制指示となるコンパイラオプションが指定された場合は、最適化情報解析処理(図4のS2)にて、コンパイラオプションが解析される。その結果、例えば前記図8A〜図8Cの最適化対象となる曖昧なメモリ依存を含むソースプログラム200が入力された場合でも、最適化情報解析処理(図4のS2)の解析結果に応じて、前記と同様に変換された中間コードは図5のS9にてNOとなり、曖昧なメモリ依存緩和最適化を抑制でき、生成機械語コードサイズの増加を防ぐことができる。
[プラグマ指令]
最適化特定指示となるプラグマ指令が曖昧なメモリ依存緩和に関する指定である場合は、最適化情報解析処理(図4のS2)にてシンボル情報を解析する。その結果、例えば前記図8A〜図8Cの最適化対象となる曖昧なメモリ依存を含むソースプログラム200が入力された場合、図6のS22にてYESとなり、シンボル情報にpAとpBが指定されているかの一致を確認し、一致しなれていなければS23でNOとなり次の曖昧なメモリ依存に対して処理を続行し、一致していればS23でYESとなりS24以後の曖昧なメモリ依存緩和処理を続行する。このように、曖昧なメモリ依存の緩和対象を特定することができ、コードサイズの増加と実行性能のバランスを調整することができる。
以上説明したように、本実施の形態に係るコンパイラシステムによると、曖昧なメモリ依存処理にアドレス比較処理とその結果に応じた補正処理を挿入することで曖昧な依存を緩和している。このため、クリティカルパスが短縮され、プログラム実行時の処理速度を向上させることができる。
以上、本発明の実施の形態に係るコンパイルシステムについて、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
上記実施の形態では、C言語向けのコンパイラシステムを想定していたが、本発明はC言語のみに限定されるものではない。他のプログラミング言語を採用した場合でも本発明の有意性は保たれる。
上記実施の形態では、プログラマが依存緩和最適化を抑制するユーザインタフェースとしてコンパイルオプションを採用していたが、本発明はこのインタフェースに限定されるものではない。例えば、プラグマ指定によって伝達してもよい。また伝達方法としても上記実施の形態のようなファイル単位で指定する方法に限らず、処理の範囲を記述する形式にしてもよい。
上記実施の形態では、プログラマが依存緩和対象を指定するユーザインタフェースとしてプラグマ指令を採用していたが、本発明はこのインタフェースに限定されるものではない。例えば、オプション指定によって伝達してもよい。また伝達方法としても上記実施の形態のようなシンボル情報を記述する方法に限らず、処理の範囲を記述する形式にしてもよい。さらに、指定範囲の粒度として、より大まかな粒度として、ファイル単位で用途を指定するようにしてもよい。
上記実施の形態では、メモリアクセス処理としてデータキャッシュや内蔵・外部メモリを想定していたが、本発明はメモリ空間のみに限定されるものではない。他の共有資源に対する処理でも本発明の有意性は保たれる。例えば、動的に資源が共有される可能性があるメモリマップド外部ポートへのアクセス命令等、他の命令であってもよい。
上記実施の形態では、曖昧なメモリ依存に関する依存緩和を想定していたが、本発明は曖昧なメモリ依存のみに限定されるものではない。例えば、曖昧でない真の依存がある場合でも本発明の有意性は保たれる。
上記実施の形態では、ターゲットプロセッサとしてインターロック(データ依存関係が生じている命令間において、先行命令の実行結果が後続命令によって参照されるレジスタにフォワーディグされていない場合に後続命令の実行がプロセッサによって動的に止められる現象)がかかることを想定していたが、本発明はこれに限定されるものではない。インターロックが発生せずに、静的にこのような問題を解決すべきアーキテクチャを採用するプロセッサにも本発明を適用することができる。
例えば、曖昧なメモリ依存緩和最適化部114で依存を緩和するのではなく、不要なレイテンシ待ちを削除することを目的とするのなら、ロード処理・ストア処理は入れ替えずともクリティカルパスの短縮が可能となる。
上記実施の形態では、前記アドレス比較処理の結果に応じた実行可否フラグによる条件付の補正処理を挿入していたが、本発明は実行可否条件を補正処理にのみ限定してつけるものではない。例えば、ロード命令にも実行可否条件をつけることで、不要となる場合のロード処理を削減可能となる。
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
本発明は動的に資源が共有される可能性がある命令の曖昧な依存を緩和するコンパイラ、OS(Operating System)、プロセッサで実行されるプロセス等に適用できる。
本発明の実施の形態に係るコンパイラシステムの外観構成を示す図である。 本発明の実施の形態に係るコンパイラシステムの構成を示す図である。 コンパイラの構成を示す図である。 コンパイラが実行する処理のフローチャートである。 曖昧なメモリ依存緩和最適化処理の詳細なフローチャートである。 曖昧なメモリ依存検出処理の詳細なフローチャートである。 曖昧な依存緩和処理の詳細なフローチャートである。 非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。 非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。 非ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。 非ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。 ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。 ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。 ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ外に出せる場合について説明するための図である。 ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。 ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。 ループ構造で同じオブジェクトサイズアクセスに対する依存緩和処理で、比較処理がループ内に必要な場合について説明するための図である。 ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。 ループ構造で異なるオブジェクトサイズアクセス(小→大)に対する依存緩和処理について説明するための図である。 ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。 ループ構造で異なるオブジェクトサイズアクセス(大→小)に対する依存緩和処理について説明するための図である。 非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。 非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。 非ループ構造で同じオブジェクトサイズアクセスが連続している場合に対する依存緩和処理について説明するための図である。 依存緩和を説明するためのソースプログラムの一例を示す図である。 投機実行による依存緩和を説明するためのアセンブラファイルの一例を示す図である。
符号の説明
100 コンパイラシステム
110 コンパイラ
111 構文解析部
112 最適化情報解析部
113 一般最適化部
114 曖昧なメモリ依存緩和最適化部
115 命令スケジューリング部
116 コード出力部
120 アセンブラ
130 リンカ
140 シミュレータ
150 プロファイラ
200 ソースプログラム
201 キャッシュパラメータ
210 アセンブラファイル
220 オブジェクトファイル
230 実行プログラム
240 実行ログデータ
250 プロファイルデータ

Claims (26)

  1. 入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え装置であって、
    前記入力プログラムに含まれる第1のメモリアクセス処理がアクセスするメモリのアドレス情報である第1のアドレス情報と、前記入力プログラムに含まれる第2のメモリアクセス処理がアクセスするメモリのアドレス情報である第2のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入手段と、
    前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入手段と
    を備えるプログラム書き換え装置。
  2. 前記第1のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、
    前記第2のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である
    請求項1に記載のプログラム書き換え装置。
  3. さらに、
    前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出手段と、
    前記クリティカルパス検出手段により検出されたクリティカルパスに前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれるか否かを判断し、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれる場合には、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析手段とを備え、
    前記比較処理挿入手段は、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された前記第1のメモリアクセス処理および前記第2のメモリアクセス処理を対象として、前記比較処理を挿入する
    請求項2に記載のプログラム書き換え装置。
  4. さらに、前記曖昧なメモリ依存解析手段において曖昧な真のメモリ依存関係にあると判断された第1のメモリアクセス処理と前記第2のメモリアクセス処理との実行順序を変更する実行順序変更手段を備える
    請求項3に記載のプログラム書き換え装置。
  5. さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズと前記第2のメモリアクセス処理が1回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較手段を備え、
    前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値を、前記第1のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
    請求項4に記載のプログラム書き換え装置。
  6. 前記比較処理挿入手段は、実行順序として前記論理保証処理よりも前の一箇所に、前記比較処理を挿入する
    請求項5に記載のプログラム書き換え装置。
  7. さらに、前記第1および第2のメモリアクセス処理が連続し、かつ各メモリアクセス処理においてアクセスされるメモリのアドレスが規則的に更新されるという条件を満たすか否かを判断する規則性判断手段を備え、
    前記比較処理挿入手段は、前記規則性判断手段において前記条件を満たすと判断された場合には、実行順序として前記第1および第2のメモリアクセス処理に対する先頭の前記論理保証処理よりも前の位置に、前記比較処理を挿入する
    請求項5に記載のプログラム書き換え装置。
  8. さらに、前記第1および第2のメモリアクセス処理が繰り返し実行され、かつ各メモリアクセス処理においてアクセスされるメモリのアドレスが規則的に更新されるという条件を満たすか否かを判断する規則性判断手段を備え、
    前記比較処理挿入手段は、前記規則性判断手段において前記条件を満たすと判断された場合には、実行順序として前記第1および第2のメモリアクセス処理の繰り返しよりも前の位置に、前記比較処理を挿入する
    請求項5に記載のプログラム書き換え装置。
  9. さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズよりも前記第2のメモリアクセス処理が1回にアクセスするデータのサイズが小さいという条件を満たすか否かを判断するデータサイズ比較手段を備え、
    前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値を、前記第1のメモリアクセス処理がメモリに書き込む値の一部で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
    請求項4に記載のプログラム書き換え装置。
  10. さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズよりも前記第2のメモリアクセス処理が1回にアクセスするデータのサイズが大きいという条件を満たすか否かを判断するデータサイズ比較手段を備え、
    前記論理保証処理挿入手段は、前記データサイズ比較手段において前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値の一部を、前記第1のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
    請求項4に記載のプログラム書き換え装置。
  11. さらに、最適化に関する最適化指示情報を受け取る最適化指定情報付加手段を備え、
    前記比較処理挿入手段および前記論理保証処理挿入手段は、前記最適化指定情報付加手段が受け取った前記最適化指示情報に基づいて、選択的に動作する
    請求項1〜10のいずれか1項に記載のプログラム書き換え装置。
  12. 前記最適化指定情報付加手段は、曖昧なメモリ依存緩和の実施抑制に関する最適化指示情報を受け取り、
    前記比較処理挿入手段が前記曖昧なメモリ依存緩和の実施抑制に関する最適化指示情報を受け取った場合には、前記比較処理挿入手段および前記論理保証処理挿入手段は動作しない
    請求項11に記載のプログラム書き換え装置。
  13. 前記最適化指定情報付加手段は、曖昧なメモリ依存緩和対象のメモリアクセス処理を特定するシンボル情報を受け取り、
    前記比較処理挿入手段は、前記最適化指定情報付加手段が受け取ったシンボル情報で特定されるメモリアクセス処理を対象として、前記比較処理を挿入する
    請求項11に記載のプログラム書き換え装置。
  14. 入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラム書き換え方法であって、
    前記入力プログラムに含まれる第1のメモリアクセス処理がアクセスするメモリのアドレス情報である第1のアドレス情報と、前記入力プログラムに含まれる第2のメモリアクセス処理がアクセスするメモリのアドレス情報である第2のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入ステップと、
    前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入ステップと
    を含むプログラム書き換え方法。
  15. 前記第1のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、
    前記第2のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である
    請求項14に記載のプログラム書き換え方法。
  16. さらに、
    前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出ステップと、
    前記クリティカルパス検出ステップにおいて検出されたクリティカルパスに前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれるか否かを判断し、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれる場合には、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析ステップとを含み、
    前記比較処理挿入ステップでは、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された前記第1のメモリアクセス処理および前記第2のメモリアクセス処理を対象として、前記比較処理を挿入する
    請求項15に記載のプログラム書き換え方法。
  17. さらに、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された第1のメモリアクセス処理と前記第2のメモリアクセス処理との実行順序を変更する実行順序変更ステップを含む
    請求項16に記載のプログラム書き換え方法。
  18. さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズと前記第2のメモリアクセス処理が1回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較ステップを含み、
    前記論理保証処理挿入ステップでは、前記データサイズ比較ステップにおいて前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値を、前記第1のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
    請求項17に記載のプログラム書き換え方法。
  19. 前記比較処理挿入ステップでは、実行順序として前記論理保証処理よりも前の位置に、前記比較処理を挿入する
    請求項18に記載のプログラム書き換え方法。
  20. 入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラムであって、
    前記入力プログラムに含まれる第1のメモリアクセス処理がアクセスするメモリのアドレス情報である第1のアドレス情報と、前記入力プログラムに含まれる第2のメモリアクセス処理がアクセスするメモリのアドレス情報である第2のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入ステップと、
    前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入ステップと
    をコンピュータに実行させるためのプログラム。
  21. 前記第1のメモリアクセス処理は、メモリにデータの書き込みを行なうストア処理であり、
    前記第2のメモリアクセス処理は、メモリからデータの読み込みを行なうロード処理である
    請求項20に記載のプログラム。
  22. さらに、
    前記入力プログラムの中からクリティカルパスとなる処理を検出するクリティカルパス検出ステップと、
    前記クリティカルパス検出ステップにおいて検出されたクリティカルパスに前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれるか否かを判断し、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理とが含まれる場合には、前記第1のメモリアクセス処理と前記第2のメモリアクセス処理との間に曖昧な真のメモリ依存関係があるか否かを解析する曖昧なメモリ依存解析ステップとをコンピュータに実行させ、
    前記比較処理挿入ステップでは、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された前記第1のメモリアクセス処理および前記第2のメモリアクセス処理を対象として、前記比較処理を挿入する
    請求項21に記載のプログラム。
  23. さらに、前記曖昧なメモリ依存解析ステップにおいて曖昧な真のメモリ依存関係にあると判断された第1のメモリアクセス処理と前記第2のメモリアクセス処理との実行順序を変更する実行順序変更ステップをコンピュータに実行させる
    請求項22に記載のプログラム。
  24. さらに、前記第1のメモリアクセス処理が1回にアクセスするデータのサイズと前記第2のメモリアクセス処理が1回にアクセスするデータのサイズとが等しいという条件を満たすか否かを判断するデータサイズ比較ステップをコンピュータに実行させ、
    前記論理保証処理挿入ステップでは、前記データサイズ比較ステップにおいて前記条件を満たすと判断された場合には、前記第2のメモリアクセス処理がメモリより読み込んだ値を、前記第1のメモリアクセス処理がメモリに書き込む値で上書きする処理を、前記論理保証処理として、前記入力プログラムに挿入する
    請求項23に記載のプログラム。
  25. 前記比較処理挿入ステップでは、実行順序として前記論理保証処理よりも前の位置に、前記比較処理を挿入する
    請求項24に記載のプログラム。
  26. 入力プログラムを、実行可否フラグに基づいて処理の実行可否を制御可能なプロセッサ向けのプログラムに書き換えるプログラムを記録したコンピュータ読取可能な記録媒体であって、
    前記入力プログラムに含まれる第1のメモリアクセス処理がアクセスするメモリのアドレス情報である第1のアドレス情報と、前記入力プログラムに含まれる第2のメモリアクセス処理がアクセスするメモリのアドレス情報である第2のアドレス情報とを比較し、比較結果を実行可否フラグに書き込む比較処理を、前記入力プログラムに挿入する比較処理挿入ステップと、
    前記実行可否フラグの値に基づいて実行される処理であり、かつ、前記入力プログラムの実行時と同じ処理結果を保証するための処理である実行可否フラグ付きの論理保証処理を、前記入力プログラムに挿入する論理保証処理挿入ステップと
    をコンピュータに実行させるためのプログラムを記録したコンピュータ読取可能な記録媒体。
JP2007139671A 2007-05-25 2007-05-25 プログラム書き換え装置 Pending JP2008293378A (ja)

Priority Applications (3)

Application Number Priority Date Filing Date Title
JP2007139671A JP2008293378A (ja) 2007-05-25 2007-05-25 プログラム書き換え装置
US12/107,450 US8286145B2 (en) 2007-05-25 2008-04-22 Program re-writing apparatus
CN200810100529.5A CN101311901B (zh) 2007-05-25 2008-05-20 程序重写装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2007139671A JP2008293378A (ja) 2007-05-25 2007-05-25 プログラム書き換え装置

Publications (1)

Publication Number Publication Date
JP2008293378A true JP2008293378A (ja) 2008-12-04

Family

ID=40073596

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2007139671A Pending JP2008293378A (ja) 2007-05-25 2007-05-25 プログラム書き換え装置

Country Status (3)

Country Link
US (1) US8286145B2 (ja)
JP (1) JP2008293378A (ja)
CN (1) CN101311901B (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2011010435A1 (ja) * 2009-07-24 2011-01-27 パナソニック株式会社 プログラム変換装置およびプログラム変換システム

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5059174B2 (ja) * 2010-08-10 2012-10-24 株式会社東芝 プログラム変換装置、およびそのプログラム
KR20120036208A (ko) * 2010-10-07 2012-04-17 삼성전자주식회사 재구성 기반 컴퓨팅 장치 및 이의 메모리 의존성 보정방법
US10789056B2 (en) * 2016-07-06 2020-09-29 Intel Corporation Technologies for scalable translation caching for binary translation systems
CN107885503B (zh) * 2017-11-11 2021-01-08 湖南大学 一种基于程序特征分析的迭代编译优化方法
CN109726213B (zh) * 2018-12-10 2021-11-19 阿里巴巴(中国)有限公司 一种程序代码转换方法、装置、介质和计算设备
WO2020255267A1 (ja) * 2019-06-18 2020-12-24 三菱電機株式会社 解析装置、方法、及びプログラム
CN112363710B (zh) * 2021-01-14 2021-03-30 之江实验室 一种基于多异构执行体控制器的多变体用户程序编译方法

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0540629A (ja) * 1991-06-18 1993-02-19 Matsushita Electric Ind Co Ltd 情報処理装置
JPH08314721A (ja) * 1995-05-10 1996-11-29 Internatl Business Mach Corp <Ibm> スーパースカラまたはvliwプロセッサにおけるメモリ操作の順序替えのための方法及び装置
JPH10269080A (ja) * 1997-03-25 1998-10-09 Internatl Business Mach Corp <Ibm> 順不同ロード命令とストア命令との干渉を検出回復するための方法及び装置
JP2001175475A (ja) * 1999-12-17 2001-06-29 Fujitsu Ltd 計算機とその制御方法
JP2001520415A (ja) * 1997-10-13 2001-10-30 インスティチュート・フォー・ザ・ディベロップメント・オブ・エマージング・アーキテクチャーズ・エルエルシー 命令実行を最適化する方法および装置
JP2002024010A (ja) * 2000-07-12 2002-01-25 Nec Kofu Ltd メモリロード制御システム及びそのメモリロード制御方式
JP2003323415A (ja) * 2002-04-26 2003-11-14 Internatl Business Mach Corp <Ibm> メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体
JP2004038597A (ja) * 2002-07-03 2004-02-05 Matsushita Electric Ind Co Ltd コンパイラ装置

Family Cites Families (19)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5897666A (en) * 1996-12-09 1999-04-27 International Business Machines Corporation Generation of unique address alias for memory disambiguation buffer to avoid false collisions
JPH10333971A (ja) * 1997-05-28 1998-12-18 Sony Corp データ演算装置
US6505296B2 (en) * 1997-10-13 2003-01-07 Hewlett-Packard Company Emulated branch effected by trampoline mechanism
US6718541B2 (en) * 1999-02-17 2004-04-06 Elbrus International Limited Register economy heuristic for a cycle driven multiple issue instruction scheduler
EP1840735A3 (en) * 1999-12-17 2014-04-23 Fujitsu Ltd. Processor and method of controlling the same
US7062638B2 (en) * 2000-12-29 2006-06-13 Intel Corporation Prediction of issued silent store operations for allowing subsequently issued loads to bypass unexecuted silent stores and confirming the bypass upon execution of the stores
US6748501B2 (en) * 2000-12-30 2004-06-08 International Business Machines Corporation Microprocessor reservation mechanism for a hashed address system
DE10158393A1 (de) * 2001-11-28 2003-06-12 Infineon Technologies Ag Speicher für die Zentraleinheit einer Rechenanlage, Rechenanlage und Verfahren zum Synchronisieren eines Speichers mit dem Hauptspeicher einer Rechenanlage
KR100929078B1 (ko) * 2001-11-29 2009-11-30 파나소닉 주식회사 코딩 왜곡 제거 방법
US7035995B2 (en) * 2002-12-11 2006-04-25 Lsi Logic Corporation Method and apparatus for performing a high speed binary search in time critical environments
US7093099B2 (en) * 2002-12-12 2006-08-15 Alacritech, Inc. Native lookup instruction for file-access processor searching a three-level lookup cache for variable-length keys
JP4374221B2 (ja) * 2003-08-29 2009-12-02 パナソニック株式会社 コンピュータシステムおよび記録媒体
EP1708130A1 (en) * 2004-02-20 2006-10-04 Matsushita Electric Industrial Co., Ltd. Inter-device linkage method, device linkage control system, device linkage control program, and terminal device
CN100580611C (zh) * 2004-06-30 2010-01-13 松下电器产业株式会社 程序执行设备及该程序执行方法
JP2006107338A (ja) * 2004-10-08 2006-04-20 Matsushita Electric Ind Co Ltd プログラム処理装置
WO2007016808A1 (en) * 2005-08-05 2007-02-15 Intel Corporation A compiling and translating method and apparatus
JPWO2007023683A1 (ja) 2005-08-24 2009-03-26 パナソニック株式会社 メディア処理方法、メディア処理プログラム
US20070234014A1 (en) * 2006-03-28 2007-10-04 Ryotaro Kobayashi Processor apparatus for executing instructions with local slack prediction of instructions and processing method therefor
JP5040629B2 (ja) 2007-12-10 2012-10-03 富士通株式会社 データ移行プログラム、データ移行方法およびデータ移行装置

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0540629A (ja) * 1991-06-18 1993-02-19 Matsushita Electric Ind Co Ltd 情報処理装置
JPH08314721A (ja) * 1995-05-10 1996-11-29 Internatl Business Mach Corp <Ibm> スーパースカラまたはvliwプロセッサにおけるメモリ操作の順序替えのための方法及び装置
JPH10269080A (ja) * 1997-03-25 1998-10-09 Internatl Business Mach Corp <Ibm> 順不同ロード命令とストア命令との干渉を検出回復するための方法及び装置
JP2001520415A (ja) * 1997-10-13 2001-10-30 インスティチュート・フォー・ザ・ディベロップメント・オブ・エマージング・アーキテクチャーズ・エルエルシー 命令実行を最適化する方法および装置
JP2001175475A (ja) * 1999-12-17 2001-06-29 Fujitsu Ltd 計算機とその制御方法
JP2002024010A (ja) * 2000-07-12 2002-01-25 Nec Kofu Ltd メモリロード制御システム及びそのメモリロード制御方式
JP2003323415A (ja) * 2002-04-26 2003-11-14 Internatl Business Mach Corp <Ibm> メモリ・アクセス順序付け及びロック管理の方法、装置、プログラム及び記録媒体
JP2004038597A (ja) * 2002-07-03 2004-02-05 Matsushita Electric Ind Co Ltd コンパイラ装置

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2011010435A1 (ja) * 2009-07-24 2011-01-27 パナソニック株式会社 プログラム変換装置およびプログラム変換システム

Also Published As

Publication number Publication date
CN101311901A (zh) 2008-11-26
CN101311901B (zh) 2013-04-24
US20080295082A1 (en) 2008-11-27
US8286145B2 (en) 2012-10-09

Similar Documents

Publication Publication Date Title
JP4844971B2 (ja) インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置
JP3602857B2 (ja) 多機種対応型情報処理システム、および、方法
US7543284B2 (en) Partial dead code elimination optimizations for program code conversion
US6023583A (en) Optimized variable allocation method, optimized variable allocation system and computer-readable memory containing an optimized variable allocation program
JP4640684B2 (ja) プログラムコード変換方法
US7536682B2 (en) Method and apparatus for performing interpreter optimizations during program code conversion
CN103348323B (zh) 用于在计算机系统中执行目标程序的方法和系统
JP2008293378A (ja) プログラム書き換え装置
JPH10320214A (ja) コンパイルシステム及びコンピュータプログラム製品
JP2012038231A (ja) バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム
US7200841B2 (en) Method and apparatus for performing lazy byteswapping optimizations during program code conversion
JPH11194948A (ja) コンパイラ最適化アルゴリズム
JPWO2005078579A1 (ja) プログラム変換装置およびプログラム変換方法
US10459702B2 (en) Flow control for language-embedded programming in general purpose computing on graphics processing units
JP3840149B2 (ja) コンパイラ、演算処理システム及び演算処理方法
Besnard et al. A framework for automatic and parameterizable memoization
Rohde et al. Improving HLS generated accelerators through relaxed memory access scheduling
Schwarz et al. Engineering an optimized instruction set architecture for AMIDAR processors
US7676799B1 (en) Address simplification by binary transformation
JPH10254712A (ja) 多機種対応型情報処理システム、および、方法
JP2003131888A (ja) 手続き間命令スケジューリング方法
JP2007114934A (ja) コンパイラシステム
Åkesson An LLVM Back-end for REPLICA: Code Generation for a Multi-core VLIWProcessor with Chaining
Baudon Staging for general purpose languages
JPH0944362A (ja) コンパイラ

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20100107

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20110926

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20111025

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20120228