JP6398725B2 - コンパイルプログラム、コンパイル方法およびコンパイラ装置 - Google Patents

コンパイルプログラム、コンパイル方法およびコンパイラ装置 Download PDF

Info

Publication number
JP6398725B2
JP6398725B2 JP2015000280A JP2015000280A JP6398725B2 JP 6398725 B2 JP6398725 B2 JP 6398725B2 JP 2015000280 A JP2015000280 A JP 2015000280A JP 2015000280 A JP2015000280 A JP 2015000280A JP 6398725 B2 JP6398725 B2 JP 6398725B2
Authority
JP
Japan
Prior art keywords
branch
code
instruction
unit
thread
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.)
Active
Application number
JP2015000280A
Other languages
English (en)
Other versions
JP2016081501A (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.)
Fujitsu Ltd
Original Assignee
Fujitsu 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 Fujitsu Ltd filed Critical Fujitsu Ltd
Publication of JP2016081501A publication Critical patent/JP2016081501A/ja
Application granted granted Critical
Publication of JP6398725B2 publication Critical patent/JP6398725B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3844Speculative instruction execution using dynamic branch prediction, e.g. using branch history tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming

Description

本発明はコンパイルプログラム、コンパイル方法およびコンパイラ装置に関する。
コンピュータのプロセッサの処理能力を向上させる技術の1つに、パイプライン処理がある。パイプライン処理では、各命令の処理をフェッチ・デコード・実行・メモリアクセスなどの複数のステージに分割し、異なるステージの処理を並列に実行可能にする。あるステージ(例えば、フェッチステージ)である命令の処理が行われているとき、これと並列に、他のステージ(例えば、デコードステージ)で他の命令の処理が行われる。
理想的には、処理を行っていない空きステージが生じないように、パイプラインに命令を詰め込むことが好ましい。しかし、様々な理由により、空きステージが生じてパイプラインの利用率が下がることがある。その理由の1つとして、プログラムの中に条件分岐を示す分岐命令が含まれていることが挙げられる。分岐命令が実行されると、その実行結果に応じて、ジャンプせずに次のアドレスの命令が選択されるか(not−taken)、ジャンプして離れたアドレスの命令が選択される(taken)。分岐命令の次に実行されるべき命令は、当該分岐命令が実行ステージを通過するまで確定しないことから、実行結果を待って次の命令をパイプラインに投入すると空きステージが生じてしまう。
この問題に対し、プロセッサが分岐予測を行う方法が考えられる。プロセッサに含まれるハードウェアとしての分岐予測回路は、分岐命令が過去に実行されたときの分岐方向を示す履歴情報を保持しておく。例えば、分岐予測回路は、分岐命令毎に、過去数回〜数十回の分岐方向(takenまたはnot−taken)を示すビット列を保持しておく。
そして、分岐予測回路は、分岐命令がパイプラインに投入されると、履歴情報に基づいて今回の分岐方向を予測する。例えば、同じ分岐方向が連続して選択される確率が高い場合、分岐予測回路は、直近数回の分岐方向と同じ分岐方向が選択されると予測し得る。また、例えば、takenとnot−takenが規則性をもって交互に選択されている場合、分岐予測回路は、その規則性に基づいて今回の分岐方向を予測し得る。
分岐方向が予測されると、予測された方向の命令が分岐命令の次にパイプラインに投入される(投機的実行)。分岐方向の予測が実際の分岐方向と合っていた場合、プロセッサは、そのままパイプライン処理を続ければよい。一方、分岐方向の予測が間違っていた場合、プロセッサは、予測に基づいて投入した命令をパイプラインから削除して正しい命令を投入し直すことになる。すなわち、予測ミスのペナルティが発生する。よって、パイプライン処理の効率は、分岐予測の精度に依存すると言うことができる。
また、プロセッサの処理能力を向上させる技術の1つに、ハードウェアマルチスレッディングがある。1つのスレッドの命令列を実行していると、上記の条件分岐の他にも、メモリアクセスなどの様々な要因により断片的な小さな待ち時間が発生し得る。この断片的な小さな待ち時間は、レジスタデータの入れ替えなどのコンテキストスイッチを伴う、OS(Operating System)レベルのマルチスレッディングでは削減することが難しい。よって、1つのプロセッサまたはプロセッサコアで同時に1つのスレッドのみ実行する場合、パイプラインステージなどのリソースの利用率を向上させるには限界がある。
そこで、ハードウェアマルチスレッディングでは、1つのプロセッサまたはプロセッサコア内において、複数のスレッドがプロセッサのリソースを同時に共有する。このプロセッサから見たスレッドを、「ハードウェアスレッド」と呼ぶことがある。プロセッサは、複数のハードウェアスレッド分のデータを、当該プロセッサのレジスタに格納しておく。そして、例えば、プロセッサは、あるハードウェアスレッドで待ち時間が発生すると、その待ち時間の間に他のハードウェアスレッドの命令をパイプラインに投入して、パイプラインのステージを埋める。この場合、パイプライン上では、あるハードウェアスレッドの命令と他のハードウェアスレッドの命令とが混在して並列に実行されることになる。コンテキストスイッチを伴わないため、ハードウェアスレッドの切替は高速に行える。
OSからこのプロセッサまたはプロセッサコアを見ると、複数のスレッドが物理的に並列に実行されていると認識される。このため、OSは論理的には、複数のハードウェアスレッドを実行するプロセッサまたはプロセッサコアを、ハードウェアスレッドの数分のプロセッサまたはプロセッサコアであると認識することがある。
ところで、ハードウェアマルチスレッディングと分岐予測の両方の技術を採用したプロセッサも考えられる。そのようなプロセッサでは、複数のハードウェアスレッドが、プロセッサまたはプロセッサコアが備えるリソースの1つとして、分岐命令の履歴情報を保持する分岐予測回路を共用することになる。履歴情報は、テーブル形式で保存しておくことが考えられる。例えば、分岐予測回路は、複数のハードウェアスレッドの何れかで分岐命令が実行されると、ハッシュ関数など所定の式に従って分岐命令のアドレスをテーブルのインデックスに変換し、インデックスが示すエントリを更新する。
スレッド間での分岐予測回路の共用に関しては、次のような技術が提案されている。プロセッサは、2つのスレッドで同じコードが実行されるとき、テーブルのインデックス範囲全体を共用する「統一モード」で動作する。一方、プロセッサは、2つのスレッドで異なるコードが実行されるとき、1つのテーブルを2分割して半分のインデックス範囲を一方のスレッドに割り当て、他の半分のインデックス範囲を他のスレッドに割り当てる「分割モード」で動作する。分割モードでは、最上位ビットがスレッド識別子に対応するように、分岐命令のアドレスからテーブルのインデックスを算出することで、テーブルを2分割する。このテーブルの使用方法は、プロセッサ内でハードウェア的に実装される。
特開2004−326785号公報
複数のスレッドを実行可能なプロセッサでは、同じプログラムに基づいて複数のスレッドが起動されることもあり得る。その場合、分岐予測に用いられる情報を記憶する記憶領域(例えば、テーブルの記憶領域)の共有方法が問題となる。
1つのスレッドで一の分岐命令が実行されると、その分岐命令のアドレスなどに応じた領域上に、分岐命令の実行結果(例えば、takenまたはnot−takenを示すビット)が書き込まれる。また、他の1つのスレッドで分岐命令が実行されると、その分岐命令のアドレスなどに応じた領域上に、分岐命令の実行結果が書き込まれる。このとき、2つのスレッドは同じプログラムの命令を実行していることから、この2つの分岐命令が同じ命令(命令アドレスが同じ)である可能性がある。すると、2つのスレッドにより同じ情報が更新され、この情報の中に2つのスレッド分の実行結果が混在することになる。
複数のスレッド分の実行結果が混在する情報に基づいて分岐予測を行うと、分岐予測の精度が低下するという問題がある。例えば、1つのスレッドでは一の分岐命令の分岐方向が過去数回takenで連続しているとすると、そのスレッドにおける次の分岐方向はtakenであると予測し得る。また、他の1つのスレッドでは同じ分岐命令の分岐方向が過去数回not−takenで連続しているとすると、そのスレッドにおける次の分岐方向はnot−takenであると予測し得る。しかし、この2つのスレッドのtaken/not−takenの情報が混在していると、このような分岐予測が困難になる。
これに対し、ハードウェア的に分岐予測回路を改良して、同じプログラムに基づいて起動される2つのスレッドに対して、異なる記憶領域を割り当てる方法も考えられる。しかし、この方法では、既存のプロセッサの分岐予測の精度が改善されない。
1つの側面では、本発明は、複数のスレッドを実行可能なプロセッサにおける分岐予測の精度を向上させるコンパイルプログラム、コンパイル方法およびコンパイラ装置を提供することを目的とする。
1つの態様では、コンピュータに以下の処理を実行させるコンパイルプログラムが提供される。第1のコードに含まれる一の分岐命令をコピーして複数の分岐命令に変換する。分岐予測に用いられる情報を記憶する記憶領域を共用する複数のスレッドを実行可能なプロセッサにおいて、使用するスレッドに応じて複数の分岐命令の中から異なる分岐命令が実行されるよう制御する制御命令を生成する。複数の分岐命令と制御命令とを含む第2のコードを生成する。
また、1つの態様では、コンピュータが実行するコンパイル方法が提供される。
また、1つの態様では、記憶部と変換部とを有するコンパイラ装置が提供される。記憶部は、分岐命令を含む第1のコードを記憶する。変換部は、第1のコードに含まれる分岐命令をコピーして複数の分岐命令に変換する。変換部は、分岐予測に用いられる情報を記憶する記憶領域を共用する複数のスレッドを実行可能なプロセッサにおいて、使用するスレッドに応じて複数の分岐命令の中から異なる分岐命令が実行されるよう制御する制御命令を生成する。変換部は、複数の分岐命令と制御命令とを含む第2のコードを生成する。
1つの側面では、複数のスレッドを実行可能なプロセッサにおける分岐予測の精度が向上する。
第1の実施の形態のコンパイラ装置の例を示す図である。 コンパイラ装置のハードウェア例を示すブロック図である。 プロセッサの構造例を示すブロック図である。 履歴テーブルのエントリの競合例を示す図である。 予測精度向上の手順例を示すフローチャートである。 履歴テーブルのエントリの競合解消例を示す図である。 コンパイラ装置の機能例を示すブロック図である。 ソースコードの例を示す図である。 ソースコードの他の例を示す図である。 ソースコードの構造例を示す図である。 コンパイルコマンドの例を示す図である。 収集した実行時情報の例を示す図である。 コンパイルの手順例を示すフローチャートである。 分岐予測最適化の手順例を示すフローチャートである。 分岐予測最適化の手順例を示すフローチャート(続き1)である。 分岐予測最適化の手順例を示すフローチャート(続き2)である。 最適化コードの第1の例を示す図である。 最適化コードの第2の例を示す図である。 最適化コードの第3の例を示す図である。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態のコンパイラ装置の例を示す図である。
第1の実施の形態のコンパイラ装置10は、プロセッサ20またはこれと同等のアーキテクチャをもつプロセッサで実行されることを想定して、コードの最適化を行う。コンパイラ装置10は、コード13をコード14に変換する。コード13,14は、命令の集合を含んでいる。コード13は、例えば、高級言語で記述されたソースコードまたはソースコードから変換された中間コードである。コード14は、例えば、最適化された中間コード、アセンブリコード、機械可読なオブジェクトコードなどである。
コンパイラ装置10は、ユーザが操作する端末装置でもよいし、端末装置からアクセスされるサーバ装置でもよい。また、コンパイラ装置10は、コンピュータまたは情報処理装置を用いて実装してもよい。プロセッサ20は、コンパイラ装置10が備えていてもよいし、コンパイラ装置10と異なるコンピュータなどが備えていてもよい。すなわち、コンパイラ装置10が生成するオブジェクトコードは、コンパイラ装置10で実行されてもよいし、コンパイラ装置10と異なるコンピュータなどで実行されてもよい。
コンパイラ装置10は、記憶部11および変換部12を有する。記憶部11は、コード13を記憶する。記憶部11は、RAM(Random Access Memory)などの揮発性の記憶装置でもよいし、HDD(Hard Disk Drive)などの不揮発性の記憶装置でもよい。変換部12は、記憶部11に記憶されたコード13をコード14に変換する。変換部12は、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサでもよいし、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、例えば、記憶部11または他の記憶装置に記憶されたプログラムを実行する。なお、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
プロセッサ20は、ハードウェアマルチスレッディングおよび分岐予測の技術を採用したプロセッサである。プロセッサ20は、スレッド21(スレッド#0)、スレッド22(スレッド#1)および記憶領域23を有する。プロセッサ20がマルチコアプロセッサの場合、スレッド21,22および記憶領域23は同一のコアに属し得る。
スレッド21,22は、ハードウェアスレッドと呼ばれ得る。スレッド21,22は、プロセッサ20が備えるパイプラインステージや演算器などのリソースを共用する。スレッド21,22は、一方のスレッドのみ実行した場合に生じる空きリソースを活用することで、並列に実行され得る。例えば、プロセッサ20は、スレッド21,22両方にレジスタを割り当てておき、スレッド21に待ち時間が生じると、パイプラインにスレッド22の命令を投入して空きステージを埋める。また、例えば、並列に動作可能な整数演算器と浮動小数点演算器とをプロセッサ20が備えている場合、プロセッサ20は、スレッド21の整数演算が実行されている間、スレッド22の浮動小数点演算を実行し得る。
記憶領域23は、分岐予測に用いられる情報を記憶する。記憶領域23は、分岐予測回路が備える半導体メモリの記憶領域でもよい。例えば、記憶領域23は、分岐命令のアドレスまたは分岐命令のアドレスから算出されるインデックスと対応付けて、過去所定回分の分岐方向(takenまたはnot−taken)を示す履歴情報を記憶する。分岐予測に用いられる情報は、テーブル形式で記憶されてもよい。
ここで、変換部12は、次のようにしてコード13からコード14を生成する。
変換部12は、コード13に含まれる条件分岐を示す分岐命令15について、分岐予測の最適化を行う場合、分岐命令15をコピーする。これにより、分岐命令15に対応する(通常は、分岐命令15と同じ)条件分岐を示す複数の分岐命令が得られる。図1では、分岐命令15,16が得られる。コピー後の分岐命令の数は、プロセッサ20で実行されるスレッドの数と同じでもよいし、異なっていてもよい。
また、変換部12は、コード14またはコード14から変換されたオブジェクトコードをプロセッサ20に実行させた場合に、使用するスレッドに応じて分岐命令15,16の中から異なる分岐命令が実行されるよう制御する制御命令17を生成する。制御命令17は、例えば、スレッドIDを確認し、スレッド#0のときは分岐命令15または分岐命令15を包含する命令群を選択し、スレッド#1のときは分岐命令16または分岐命令16を包含する命令群を選択するものである。この場合、コードがスレッド21で起動されると、分岐命令15が実行されて分岐命令16は実行されない。一方、スレッド22で起動されると、分岐命令16が実行されて分岐命令15は選択されない。
そして、変換部12は、分岐命令15,16と制御命令17とを含むコード14を生成する。コード14が中間コードまたはアセンブリコードである場合、コード14はプロセッサ20で実行可能なオブジェクトコードに変換される。
コード14またはコード14から変換されたオブジェクトコードがスレッド21,22の両方で実行されるとき、スレッド21では、分岐命令15,16のうち分岐命令15のみが実行される。そして、例えば、記憶領域23内の分岐命令15の命令アドレスに応じた領域に、分岐命令15の実行結果が書き込まれる。一方、スレッド22では、分岐命令15,16のうち分岐命令16のみが実行される。そして、例えば、記憶領域23内の分岐命令16の命令アドレスに応じた領域に、分岐命令16の実行結果が書き込まれる。
第1の実施の形態のコンパイラ装置10によれば、分岐予測の最適化において、コード13に含まれる分岐命令15がコピーされ、スレッドに応じて分岐命令15,16の中から異なる分岐命令を実行させるコード14が生成される。これにより、スレッド21,22で同じオブジェクトコードが実行される場合であっても、各スレッドで実行される分岐命令のアドレスがずれることになる。よって、分岐予測回路を変更しなくても、スレッド21の分岐予測に用いられる情報とスレッド22の分岐予測に用いられる情報とが記憶領域23内の異なる領域に書き込まれる可能性が高くなる。その結果、スレッド21,22に対する分岐予測の処理を分離でき、分岐予測の精度を向上させることができる。
[第2の実施の形態]
第2の実施の形態のコンパイラ装置100は、高級言語で記述されたソースコードをコンパイルし、機械可読なオブジェクトコードを生成する。コンパイラ装置100は、ユーザが操作する端末装置でもよいし、端末装置からアクセスされるサーバ装置でもよい。コンパイラ装置100は、例えば、コンピュータを用いて実装される。その場合、コンパイラ装置100は、ソフトウェアとしてのコンパイラを実行する。
図2は、コンパイラ装置のハードウェア例を示すブロック図である。
コンパイラ装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。上記ユニットはバス108に接続される。CPU101は第1の実施の形態の変換部12の一例であり、RAM102は第1の実施の形態の記憶部11の一例である。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、コンパイラ装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、コンパイラ装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OSやミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。HDD103に記憶されるプログラムには、コンパイルプログラムが含まれる。なお、コンパイラ装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、コンパイラ装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイパネル(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部105は、コンパイラ装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、コンパイラ装置100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他のコンピュータと通信を行うインタフェースである。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
なお、コンパイラ装置100は、媒体リーダ106を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部104や入力信号処理部105を備えていなくてもよい。また、ディスプレイ111や入力デバイス112が、コンパイラ装置100の筐体と一体に形成されていてもよい。
図3は、プロセッサの構造例を示すブロック図である。
コンパイラ装置100が生成するオブジェクトコードは、上記のCPU101が実行してもよいし、他のCPUが実行してもよい。他のCPUは、コンパイラ装置100が備えるものでもよいし、他のコンピュータが備えるものでもよい。第2の実施の形態では、オブジェクトコードを実行するターゲットのCPUとして、CPU200を想定する。
CPU200は、コア210,220,230,240を備える。コア210は、キャッシュメモリ211、ハードウェアスレッド212,212aおよび分岐予測部216を有する。コア220,230,240も、コア210と同様のユニットを含む。なお、コアの数や各コアに含まれるハードウェアスレッドの数は、一例である。
キャッシュメモリ211は、コア210外にある二次キャッシュメモリまたはメインメモリに記憶された命令やデータを一時的に記憶する高速な半導体メモリである。キャッシュメモリ211は、一次キャッシュメモリと呼ばれることがある。キャッシュメモリ211は、ハードウェアスレッド212,212aから共通に利用される。すなわち、キャッシュメモリ211には、ハードウェアスレッド212の命令やデータと、ハードウェアスレッド212aの命令やデータとが混在して記憶され得る。
ハードウェアスレッド212,212aは、ハードウェアマルチスレッディングによって実現されるスレッドであり、並列に実行可能な処理単位である。OSからは、コア210は論理的に複数のコアであるように見える。ハードウェアスレッド212,212aにはそれぞれ、スレッドIDが付与されている。例えば、ハードウェアスレッド212はスレッド#0、ハードウェアスレッド212aはスレッド#1である。ハードウェアスレッド212,212aは、レジスタ部213,213aを有する。また、ハードウェアスレッド212,212aは、演算部214および命令制御部215を共有する。
レジスタ部213,213aは、演算部214によって用いられるデータを一次的に記憶するレジスタの集合である。レジスタ部213,213aとキャッシュメモリ211の間でデータが転送される。レジスタ部213はハードウェアスレッド212のデータを記憶し、レジスタ部213aはハードウェアスレッド212aのデータを記憶する。ただし、1つのレジスタの集合の中から、ハードウェアスレッド212に割り当てるレジスタとハードウェアスレッド212aに割り当てるレジスタとが動的に決定されてもよい。
演算部214は、1または2以上のパイプラインを含む。パイプラインには、命令制御部215によって、キャッシュメモリ211に記憶されたハードウェアスレッド212の命令またはハードウェアスレッド212aの命令が投入される。演算部214は、ハードウェアスレッド212の命令の実行にレジスタ部213を使用し、ハードウェアスレッド212aの命令の実行にレジスタ部213aを使用する。演算部214は、パイプライン上で、ハードウェアスレッド212,212aの命令を並列に実行することができる。
また、演算部214は、整数加減算器や浮動小数点加減算器のように、独立に動作可能な複数の種類の演算器を備えていてもよい。その場合、演算部214は、ハードウェアスレッド212,212aで行われる異なる種類の演算を、並列に実行することもできる。ここで、演算部214のリソースは、ハードウェアスレッド212,212aに対して固定的に割り当てられるのではなく、動的に割り当てられる。ハードウェアスレッド212,212aは、リソースの集合を共有していると言うこともできる。これにより、1つのハードウェアスレッドのみ実行した場合に生じる不使用リソースを削減できる。
命令制御部215は、不使用リソースが少なくなるように(例えば、パイプライン上にできる限り命令が隙間なく詰め込まれるように)、演算部214に対するハードウェアスレッド212,212aの命令の投入をスケジューリングする。例えば、命令制御部215は、ハードウェアスレッド212の命令を連続的に投入していき、次の命令をすぐに投入できない待ち状態になると、ハードウェアスレッド212aの命令を投入する。パイプライン上には、ハードウェアスレッド212,212aの命令を混在させることができる。命令制御部215は、投入した命令が何れのハードウェアスレッドのものであるか区別できるように、各命令のスレッドIDを管理する。
分岐予測部216は、条件分岐を示す分岐命令がキャッシュメモリ211から読み込まれたとき、その分岐命令の過去の分岐方向に基づいて、今回の分岐方向を予測する。分岐命令の後は、ジャンプせずに分岐命令の次の命令に進むか(not−taken)、または、ジャンプして分岐命令から離れた命令に進む(taken)。分岐予測部216は、ハードウェアスレッド212,212aによって共有される。命令制御部215は、分岐予測部216が予測した分岐方向に基づいて、分岐命令の実行結果を待たずに、分岐命令の次に演算部214に投入する命令を決定する(投機的実行)。
例えば、分岐予測部216は、過去の分岐方向から、takenやnot−takenのバースト性(連続性)を判定する。バースト性がある場合、takenが数回連続していると、今回の分岐方向もtakenである可能性が高いと判断し得る。not−takenが数回連続していると、今回の分岐方向もnot−takenである可能性が高いと判断し得る。また、例えば、分岐予測部216は、過去の分岐方向から、takenとnot−takenの変化の規則性を判定する。takenとnot−takenが交互に現れる傾向にある場合、今回の分岐方向は前回の逆である可能性が高いと判断し得る。
分岐命令の履歴情報の蓄積にあたって、分岐予測部216は、履歴メモリ217を有する。履歴メモリ217は、後述する履歴テーブルを記憶する揮発性の半導体メモリである。分岐予測部216は、演算部214から、実行された分岐命令の命令アドレスとその実行結果を取得する。すると、分岐予測部216は、命令アドレスのハッシュ値を算出して履歴テーブルのインデックスを算出し、インデックスが指し示すエントリに、実行結果の情報(例えば、takenを示す「1」またはnot−takenを示す「0」)を書き込む。1つのエントリには、直近数回から数十回分の実行結果の情報が列挙される。
ところで、コア210は、ハードウェアスレッド212,212aを用いて、同じプログラムを並列に実行することが可能である。以下、同じプログラムが並列に実行されるときの分岐予測の問題点と、第2の実施の形態におけるその解決例について説明する。
図4は、履歴テーブルのエントリの競合例を示す図である。
ハードウェアスレッド212,212aでは、同一のプログラムAが実行されているとする。また、分岐予測部216の履歴メモリ217には、命令アドレスに対してエントリが対応付けられる履歴テーブル218が記憶されているとする。
ハードウェアスレッド212において、プログラムAに含まれる一の分岐命令が実行される。すると、分岐予測部216は、この分岐命令の命令アドレスを、ハッシュ関数を用いて履歴テーブル218のインデックスに変換し、インデックスが示すエントリに分岐方向の情報を書き込む。また、ハードウェアスレッド212aにおいて、ハードウェアスレッド212と同じ分岐命令が実行される。分岐命令が同じであり命令アドレスが同じであることから、分岐予測部216は、ハードウェアスレッド212のときと同じエントリに、ハードウェアスレッド212aの分岐方向の情報を書き込む。
このように、履歴テーブル218のあるエントリの中には、ハードウェアスレッド212,212aの分岐命令の実行結果が混在することになる。例えば、ハードウェアスレッド212の分岐方向が連続してtaken(「1」)であり、ハードウェアスレッド212aの分岐方向が連続してnot−taken(「0」)であっても、そのエントリの中にはtakenとnot−takenとが混在することになる。
そして、ハードウェアスレッド212で上記の分岐命令が再び読み込まれると、分岐予測部216は、分岐命令の命令アドレスを履歴テーブル218のインデックスに変換し、インデックスが示す上記のエントリを参照する。分岐予測部216は、ハードウェアスレッド212,212aの直近の実行結果が混在した履歴情報に基づいて、ハードウェアスレッド212の今回の分岐方向を予測することになる。同様に、ハードウェアスレッド212aで上記の分岐命令が再び読み込まれると、分岐予測部216は、ハードウェアスレッド212,212aの直近の実行結果が混在した上記の履歴情報に基づいて、ハードウェアスレッド212aの今回の分岐方向を予測することになる。
その結果、分岐予測部216の予測精度が低くなり、分岐予測に失敗する(予測ミスが発生する)確率が高くなるおそれがあるという問題がある。この問題は特に、長期間で平均化すると各分岐方向の選択確率が50%に近い分岐命令について顕著に表れる。分岐方向に長期的な偏りがなくても局所的な偏りや規則性がある場合、本来、分岐予測部216は、そのような偏りや規則性を判定して予測精度を向上させることができる。しかし、ハードウェアスレッド212,212aの実行結果が混在して平均化されてしまうと、局所的な偏りや規則性を利用した分岐予測ができなくなり、予測精度が低下し得る。
一方で、分岐予測部216をハードウェア的に変更することは容易でない。そこで、第2の実施の形態では、コンパイラ装置100がオブジェクトコードを生成するときに行う最適化処理の中に、分岐予測の精度を向上させる最適化を追加する。
図5は、予測精度向上の手順例を示すフローチャートである。
(S1)コンパイラ装置100は、一次コンパイルとして、ソースコードをオブジェクトコードに変換する。このとき、コンパイラ装置100は、オブジェクトコードの中に、このオブジェクトコードをCPU200に実行させたときに実行状況を示す実行時情報が収集されるように命令を挿入しておく。収集する実行時情報には、各命令の実行回数、各命令の実行時間、各分岐命令の予測ミス回数などが含まれる。
(S2)CPU200は、ユーザから入力されたコマンドに応じて、ステップS1で生成された収集用のオブジェクトコードを実行する。このとき、CPU200は、オブジェクトコードに含まれる命令を受けて、各命令の実行回数や実行時間、各分岐命令の予測ミス回数などを監視し、指定されたファイルに実行時情報を継続的に書き出していく。
(S3)コンパイラ装置100は、二次コンパイルとして、ソースコードをオブジェクトコードに変換するコンパイルを開始する。このとき、コンパイラ装置100は、ユーザから入力されたコマンドに応じて、ステップS2で収集された実行時情報を用いて分岐予測の最適化を行う。コンパイラ装置100は、実行時情報を参照して、分岐命令を含んでおり予測ミスの影響の大きい命令群を選択する。予測ミスの影響の大きい命令群は、予測ミスの確率が高く、且つ、相対的な実行時間(実行コスト)が大きい命令群である。
(S4)コンパイラ装置100は、ステップS3で選択した命令群をコピーし、ハードウェアスレッド212,212aに応じて異なる命令群を選択させる命令を付加する(多重化)。そして、コンパイラ装置100は、二次コンパイルの結果として、分岐命令を含む命令群が多重化されたオブジェクトコードを生成する。
(S5)CPU200は、ユーザから入力されるコマンドに応じて、ステップS4で生成された最適化後のオブジェクトコードを実行する。このとき、多重化された範囲について、ハードウェアスレッド212,212aは、命令アドレスの異なる命令群を実行することになる。すなわち、命令アドレスの異なる分岐命令が実行される。
図6は、履歴テーブルのエントリの競合解消例を示す図である。
上記の最適化が行われたプログラムBは、スレッドIDがスレッド#0であるハードウェアスレッドでのみ実行される分岐命令b1と、スレッドIDがスレッド#1であるハードウェアスレッドでのみ実行される分岐命令b2とを含む。この2つの分岐命令は、最適化前の1つの分岐命令をコピーして得られたものであり、同一の処理内容を示している。
ハードウェアスレッド212,212aの両方でプログラムBが起動されると、ハードウェアスレッド212では、スレッド#0用の分岐命令b1が実行される。すると、分岐予測部216は、分岐命令b1の命令アドレスを履歴テーブル218のインデックスに変換し、インデックスが示すエントリに分岐方向の情報を書き込む。一方、ハードウェアスレッド212aでは、スレッド#1用の分岐命令b2が実行される。すると、分岐予測部216は、分岐命令b2の命令アドレスを履歴テーブル218のインデックスに変換し、インデックスが示すエントリに分岐方向の情報を書き込む。
分岐命令b1の命令アドレスと分岐命令b2の命令アドレスは異なるため、ハードウェアスレッド212,212aの分岐方向の情報は、履歴テーブル218の異なるエントリに書き込まれる可能性が高い。よって、予測ミスの影響が大きい分岐命令については、ハードウェアスレッド212,212aの実行結果が同じエントリに混在してしまう確率を低減できる。その結果、分岐予測部216の予測精度を向上させることができる。
次に、コンパイラ装置100が備える機能について説明する。
図7は、コンパイラ装置の機能例を示すブロック図である。
コンパイラ装置100は、ソースコード記憶部121、中間コード記憶部122、オブジェクトコード記憶部123および実行時情報記憶部124を有する。これらのユニットは、例えば、RAM102またはHDD103に確保した記憶領域として実現できる。また、コンパイラ装置100は、ソースコード解析部131、最適化部132およびコード生成部134を有する。これらのユニットは、例えば、CPU101に実行させるコンパイルプログラムのモジュールとして実装することができる。
ソースコード記憶部121は、ユーザにより高級言語を用いて記述されたソースコードを記憶する。高級言語の例としては、後で例示するC言語などが挙げられる。ソースコードは、コンパイラ装置100で作成されてもよいし、他の装置で作成されてもよい。
中間コード記憶部122は、ソースコードから変換された中間コードを記憶する。中間コードは、コンパイル途中で内部的に用いられるコードであり、コンパイラ装置100がその表現形式を任意に決定してもよい。最適化部132による最適化は、中間コードに対して行われる。オブジェクトコードは、中間コードから生成される。
オブジェクトコード記憶部123は、機械語で記述されたオブジェクトコードを記憶する。機械語では、命令やオペランドがビット列(数値)で表現される。CPUアーキテクチャによって使用可能な命令セットが異なるため、生成されるオブジェクトコードはターゲットのCPUに依存する。第2の実施の形態で生成されるオブジェクトコードは、図3に示したCPU200で実行されることを想定している。
実行時情報記憶部124は、オブジェクトコードの実行状況を示す実行時情報を記憶する。実行時情報は、収集機能が付加されたオブジェクトコードをCPU200に実行させることで、CPU200によって生成される。実行時情報には、関数の呼び出し回数などソフトウェアレベルの実行状況を示すソフトウェア情報と、分岐予測部216の予測ミス回数などハードウェアレベルの実行状況を示すハードウェア情報とが含まれ得る。
ソースコード解析部131は、ソースコードが記述されたソースファイルの名称などを含むコンパイルコマンドを受け付ける。すると、ソースコード解析部131は、ソースコード記憶部121から指定されたソースファイルを読み出し、字句解析、構文解析、意味解析などのフロントエンド処理を行う。そして、ソースコード解析部131は、ソースコードに対応する中間コードを生成して中間コード記憶部122に格納する。
また、ソースコード解析部131は、コンパイルコマンドに含まれているコンパイルオプションを解析し、コンパイルオプションの内容を示すオプション情報を中間コード記憶部122に格納する。コンパイルオプションには、実行時情報の収集機能をもつオブジェクトコードを生成することを指示するオプションや、収集された実行時情報を用いて最適化処理を行うことを指示するオプションが含まれる。なお、実行時情報の収集や使用は、ソフトウェア情報とハードウェア情報とに分けて指示することができる。
最適化部132は、実行時間の短い効率的なオブジェクトコードが生成されるように、中間コード記憶部122に記憶された中間コードを書き換えることで、各種の最適化を実現する。最適化処理には、命令数の削減、命令順序の入れ替え、依存関係の命令の並列化、メモリアクセスの局所化などが含まれる。これらの最適化処理の中には、実行時情報の中のソフトウェア情報を参照して行われるものもある。また、最適化処理には、分岐予測の最適化も含まれる。最適化部132は、分岐命令多重化部133を有する。
分岐命令多重化部133は、実行時情報の中のハードウェア情報の使用を示すコンパイルオプションが指定されたとき、ハードウェア情報を用いて分岐予測の最適化を行う。分岐命令多重化部133は、実行時情報記憶部124からハードウェア情報を読み出し、ハードウェア情報に基づいて、分岐命令を含む命令範囲について予測ミスの影響度を算出する。分岐命令の予測ミス率が高いほど影響度が大きいと判断され、命令範囲の実行時間が長い(サイクル数が多い)ほど影響度が大きいと判断される。そして、分岐命令多重化部133は、影響度の大きい範囲の命令群を多重化する。すなわち、分岐命令多重化部133は、分岐命令を含む命令群をコピーし、スレッドIDに応じて異なる命令群が実行されるように、中間コード記憶部122に記憶された中間コードを書き換える。
コード生成部134は、中間コード記憶部122に記憶された最適化後の中間コードをオブジェクトコードに変換し、オブジェクトコード記憶部123に格納する。中間コードからオブジェクトコードへの変換は、アセンブリコードを経由して行われてもよい。コード生成部134は、収集機能付加部135を有する。
収集機能付加部135は、ソフトウェア情報の収集を示すコンパイルオプションが指定された場合、ソフトウェア情報を収集する命令をオブジェクトコードに挿入する。例えば、実行開始時にソフトウェア情報の継続的な出力を示すフラグをONに設定し、実行終了時に当該フラグをOFFに設定する命令を、オブジェクトコードに挿入しておく。また、収集機能付加部135は、ハードウェア情報の収集を示すコンパイルオプションが指定された場合、ハードウェア情報を収集する命令をオブジェクトコードに挿入する。例えば、実行開始時にハードウェア情報の継続的な出力を示すフラグをONに設定し、実行終了時に当該フラグをOFFに設定する命令を、オブジェクトコードに挿入しておく。
図8は、ソースコードの例を示す図である。
ソースコード141は、ソースコード記憶部121に記憶される。ソースコード141には、関数sub_parentと関数sub_childが定義されている。
関数sub_parentには、ループ変数kを用いたループ(以下ではループkと呼ぶことがある)が含まれる。ループkの中で、関数sub_childが繰り返し呼び出される。関数sub_childには、ループ変数iを用いたループ(以下ではループiと呼ぶことがある)が含まれる。ループiには、ループ変数jを用いたループ(以下ではループjと呼ぶことがある)が含まれる。すなわち、ループiは二重ループの外側ループであり、ループjは二重ループの内側ループである。
ループjには、if−else文が含まれる。このif−else文では、変数chの値がAのときは「処理1」が実行され、変数chの値がAでなくBのときは「処理2」が実行され、変数chの値がAでもBでもないときは「処理3」が実行される。このif−else文は、二重ループ(ループiとループj)の中で繰り返し実行される。ただし、if−else文と同様の処理を、switch−case文を用いて表現することもできる。
図9は、ソースコードの他の例を示す図である。
ソースコード142は、ソースコード141と同様の処理を記述したものである。ただし、二重ループの中で、if−else文に代えてswitch−case文が用いられている。このswitch−case文では、変数chの値が判定され、値がAのときは「処理1」が実行され、値がBのときは「処理2」が実行され、それ以外のときは既定の処理として「処理3」が実行される。switch−case文は、内部的には、中間コードに変換されるときにソースコード141のようなif−else文に置き換えられる。よって、if−else文とswitch−case文からは、同じ条件分岐を示す中間コードが生成されることになる。
図10は、ソースコードの構造例を示す図である。
ソースコード141は、ソースコード解析部131による構文解析を通じて、図10に示すような構造をもつプログラムとして認識される。プログラムは、1または2以上の処理単位を含む。1つの処理単位は、1つの関数や1つのループなど、ソースコード上で区切ることができる1つの纏まった命令範囲である。処理単位は、1または2以上の基本ブロックを含む。1つの基本ブロックは、開始点の命令が1つのみであり、終了点の命令以外では他の基本ブロックへ分岐することのない最小の命令列である。
ソースコード141からは、処理単位310,320,330,340,350が抽出される。処理単位310は関数sub_parentに対応し、処理単位320はループkに対応する。処理単位330は関数sub_childに対応し、処理単位340はループiに対応し、処理単位350はループjに対応する。処理単位310は処理単位320を包含する親単位である。処理単位340は処理単位350を包含する親単位であり、処理単位330は処理単位340を包含する親単位である。
処理単位320は、基本ブロック321,322,323,324を含む。基本ブロック321は、ループ変数kの初期化やループ終了の判定を示す。基本ブロック321からは、基本ブロック322と基本ブロック324へと分岐する。基本ブロック322は、処理単位330の呼び出しを示す。基本ブロック323は、ループの繰り返しの判定を示す。基本ブロック323からは、基本ブロック322と基本ブロック324へと分岐する。基本ブロック324は、ループの終了処理を示す。
処理単位340は、基本ブロック341,342,343,344を含む。基本ブロック341,342,343,344によって表されるループ構造は、処理単位320と同様である。ただし、基本ブロック342は、処理単位350の呼び出しを示す。処理単位350は、基本ブロック351,352,353,354を含む。基本ブロック351,352,353,354によって表されるループ構造は、処理単位320,340と同様である。ただし、基本ブロック352は、if−else文による条件分岐を示す。
なお、if文による条件分岐を示す基本ブロックは、IFブロックと呼ぶことがある。if−else文による条件分岐を示す基本ブロックは、IF−ELSEブロックと呼ぶことがある。以下では、両者を合わせてIFブロック群と呼ぶことがある。
ここで、基本ブロックのBack−Dominatorについて説明する。Back−Dominatorは、基本ブロック群のグラフ上で、基本ブロック毎に特定される所定の条件を満たす他の基本ブロックである。具体的には、Back−Dominatorは、ある基本ブロックに到達する全てのパスが共通して通過する他の基本ブロックのうち、当該基本ブロックからの距離が最小のものである。
例えば、処理単位350の中で、基本ブロック352のBack−Dominatorは基本ブロック351であり、基本ブロック353のBack−Dominatorは基本ブロック352である。基本ブロック354については、基本ブロック351から基本ブロック352,353を経由して到達するパスと、基本ブロック351から基本ブロック352,353を迂回して到達するパスとが存在する。よって、基本ブロック354のBack−Dominatorは、基本ブロック351になる。
図11は、コンパイルコマンドの例を示す図である。
コンパイルコマンド143は、一次コンパイル時、すなわち、実行時情報の収集機能をもつオブジェクトコードを生成するときに入力されるコンパイルコマンドの例である。コンパイルコマンド144は、二次コンパイル時、すなわち、実行時情報を用いて最適化されたオブジェクトコードを生成するときに入力されるコンパイルコマンドの例である。
コンパイルコマンド143,144は、ソースファイル名と実行ファイル名を含む。ソースファイル名は、ソースコードが記述されたファイルのパスを示す。実行ファイル名は、生成したオブジェクトコードを格納するファイルのパスを示す。
コンパイルコマンド143は、OPTprofile:collectオプションとOPThw−counter:collectオプションを含む。前者はソフトウェア情報の収集を示し、ソフトウェア情報の出力先のファイルの指定を含む。後者はハードウェア情報の収集を示し、ハードウェア情報の出力先のファイルの指定を含む。ただし、出力先のファイルは省略可能であり、省略された場合は既定のディレクトリ(例えば、実行ファイルと同じディレクトリ)の既定の名前のファイルが指定されたものとみなされる。
コンパイルコマンド144は、OPTprofile:useオプションとOPThw−counter:useオプションを含む。前者はソフトウェア情報を用いた最適化を示し、ソフトウェア情報を記載したファイルの指定を含む。後者はハードウェア情報を用いた最適化を示し、ハードウェア情報を記載したファイルの指定を含む。ただし、入力元のファイルは省略可能であり、省略された場合は既定のディレクトリ(例えば、実行ファイルと同じディレクトリ)の既定の名称のファイルが指定されたものとみなされる。
また、コンパイルコマンド144は、コスト閾値と予測ミス閾値を含む。コスト閾値と予測ミス閾値は、後述するように、分岐予測の最適化において分岐命令を含む命令群をコピーするか否か判定するときに用いる閾値である。コスト閾値は省略可能であり、省略された場合は所定値(例えば、7)が用いられる。また、予測ミス閾値も省略可能であり、省略された場合は所定値(例えば、8)が用いられる。
図12は、収集した実行時情報の例を示す図である。
実行時情報記憶部124には、例えば、ソフトウェア情報145,146とハードウェア情報147,148が格納される。ソフトウェア情報145はハードウェアスレッド212が出力したソフトウェア情報であり、ソフトウェア情報146はハードウェアスレッド212aが出力したソフトウェア情報である。ハードウェア情報147はハードウェアスレッド212が出力したハードウェア情報であり、ハードウェア情報148はハードウェアスレッド212aが出力したハードウェア情報である。
ソフトウェア情報145には、ソースコード141の各行について、ハードウェアスレッド212におけるその行の処理の実行回数が含まれる。また、ソフトウェア情報145には、ソースコード141の各処理単位(関数やループなど)について、ハードウェアスレッド212におけるその処理単位の実行回数が含まれる。同様に、ソフトウェア情報146には、ハードウェアスレッド212aにおけるソースコード141の各行の実行回数と各処理単位の実行回数とが含まれる。なお、収集機能をもつオブジェクトコードには、各命令がソースコード141の何れの行や処理単位に対応するかの情報が含まれる。
ハードウェア情報147には、オブジェクトコードの各命令について、ハードウェアスレッド212におけるその命令の実行回数や、その命令の実行に要したサイクル数が含まれる。また、ハードウェア情報147には、ハードウェアスレッド212で実行された各分岐命令について、分岐予測部216の予測ミス数が含まれる。同様に、ハードウェア情報148には、ハードウェアスレッド212aにおける各命令の実行回数やサイクル数が含まれる。また、ハードウェア情報148には、ハードウェアスレッド212aで実行された各分岐命令について、分岐予測部216の予測ミス数が含まれる。なお、オブジェクトコードに含まれる命令は、命令アドレスによって識別される。
次に、コンパイラ装置100が実行するコンパイルの手順について説明する。
図13は、コンパイルの手順例を示すフローチャートである。
(S10)ソースコード解析部131は、コンパイルコマンドで指定されたソースファイルからソースコードを読み出し、字句解析、構文解析、意味解析などのフロントエンド処理を行う。そして、ソースコード解析部131は、ソースコードを中間コードに変換し、中間コードを中間コード記憶部122に格納する。
(S11)ソースコード解析部131は、コンパイルコマンドに含まれるコンパイルオプションを解析し、コンパイルオプションの内容を中間コード記憶部122に格納する。コンパイルオプションには、ソフトウェア情報の収集、ハードウェア情報の収集、ソフトウェア情報を用いた最適化、ハードウェア情報を用いた最適化などを示すものがある。
(S12)最適化部132は、中間コード記憶部122に記憶された中間コードに対して、CPUアーキテクチャに依存しない汎用的な最適化を実行する。汎用的な最適化には、例えば、最終結果に影響を与えない不要な演算の削除や不要な変数の削除、依存関係のない命令の順序入れ替えや並列処理化などが含まれる。
(S13)最適化部132は、中間コード記憶部122を参照して、ソフトウェア情報を用いた最適化を示すコンパイルオプションが指定されたか判断する。当該コンパイルオプションが指定されている場合はステップS14に処理が進み、当該コンパイルオプションが指定されていない場合はステップS15に処理が進む。
(S14)最適化部132は、実行時情報記憶部124からコンパイルオプションで指定されたソフトウェア情報を読み出し、中間コード記憶部122に記憶された中間コードに対して、ソフトウェア情報を用いた最適化を実行する。ソフトウェア情報を用いた最適化には、例えば、実行頻度の高い命令列がジャンプなしで実行されるようにif−else文の分岐方向を入れ替えることや、アクセス頻度の高いメモリ領域が局所化されるように変数の順序を入れ替えることなどが含まれる。なお、行や処理単位の実行頻度を算出するにあたり、ハードウェアスレッド212,212aそれぞれに対応する実行頻度を算出して大きい方を採用してもよい。また、ハードウェアスレッド212,212aの実行回数を平均化し、平均化した実行回数を用いて実行頻度を算出してもよい。
(S15)最適化部132は、中間コード記憶部122を参照して、ハードウェア情報を用いた最適化を示すコンパイルオプションが指定されたか判断する。当該コンパイルオプションが指定されている場合はステップS16に処理が進み、当該コンパイルオプションが指定されていない場合はステップS17に処理が進む。
(S16)最適化部132は、実行時情報記憶部124からコンパイルオプションで指定されたハードウェア情報を読み出し、中間コード記憶部122に記憶された中間コードに対して、ハードウェア情報を用いて後述する分岐予測の最適化を実行する。
(S17)コード生成部134は、中間コード記憶部122を参照して、ソフトウェア情報を収集するコンパイルオプションが指定されたか判断する。当該コンパイルオプションが指定されている場合はステップS18に処理が進み、当該コンパイルオプションが指定されていない場合はステップS19に処理が進む。
(S18)コード生成部134は、オブジェクトコードの先頭に、オブジェクトコードの実行中にソフトウェア情報を継続的に出力するよう指示する命令を挿入する。このとき、コード生成部134は、ソフトウェア情報の出力先のファイル名をオブジェクトコードに埋め込んでおく。また、コード生成部134は、オブジェクトコードの末尾に、ソフトウェア情報の出力を停止するよう指示する命令を挿入する。
(S19)コード生成部134は、中間コード記憶部122を参照して、ハードウェア情報を収集するコンパイルオプションが指定されたか判断する。当該コンパイルオプションが指定されている場合はステップS20に処理が進み、当該コンパイルオプションが指定されていない場合はステップS21に処理が進む。
(S20)コード生成部134は、オブジェクトコードの先頭に、オブジェクトコードの実行中にハードウェア情報を継続的に出力するよう指示する命令を挿入する。このとき、コード生成部134は、ハードウェア情報の出力先のファイル名をオブジェクトコードに埋め込んでおく。また、コード生成部134は、オブジェクトコードの末尾に、ハードウェア情報の出力を停止するよう指示する命令を挿入する。
(S21)コード生成部134は、中間コード記憶部122に記憶された中間コードをオブジェクトコードに変換し、コンパイルコマンドで指定された実行ファイルに書き込む。このオブジェクトコードには、ステップS18のソフトウェア情報を収集する命令や、ステップS20のハードウェア情報を収集する命令が含まれていることがある。
図14は、分岐予測最適化の手順例を示すフローチャートである。
この分岐予測最適化は、上記のステップS16において実行される。
(S30)最適化部132は、全ての処理単位の中で最後に実行される基本ブロックを選択する。ここで選択した基本ブロックをcurr_blkとおく。
(S31)最適化部132は、curr_blkのBack−Dominatorを検索する。すなわち、最適化部132は、基本ブロック群のグラフ上で、curr_blkに到達する全てのパスが共通して通過する基本ブロックのうち、curr_blkからの距離が最小のものを検索する。ここで検索された基本ブロックをpre_blkとおく。
(S32)最適化部132は、更にpre_blkのBack−Dominatorを検索し、該当する基本ブロックがあるか判断する。該当する基本ブロックがある場合、ステップS33に処理が進む。その場合、ここで検索された基本ブロックをpre2_blkとおく。該当する基本ブロックがない場合、ステップS35に処理が進む。
(S33)最適化部132は、pre2_blkとpre_blkの間のパスを確認し、pre2_blkの次に実行される基本ブロックがpre_blkのみであるか判断する。pre2_blkとpre_blkの間のパスがこの条件を満たす場合はステップS35に処理が進み、条件を満たさない場合はステップS34に処理が進む。
(S34)最適化部132は、現在のpre2_blkをpre_blkと読み替える。そして、ステップS32に処理が進む。
(S35)最適化部132は、pre_blkからcurr_blkの間に、IFブロック群(IFブロックまたはIF−ELSEブロック)に含まれる分岐命令が存在するか判断する。この分岐命令は、条件分岐を示す命令である。該当する分岐命令が存在する場合はステップS36に処理が進み、存在しない場合はステップS39に処理が進む。
(S36)最適化部132は、ハードウェア情報に基づいて、分岐命令を実行したときの各分岐方向(takenおよびnot−taken)の選択率を算出する。各分岐方向の選択率は、例えば、ハードウェア情報が示す分岐命令の実行回数および分岐命令の次に実行される命令それぞれの実行回数から算出できる。なお、選択率を算出するにあたり、ハードウェアスレッド212,212aそれぞれに対応する選択率を算出して大きい方を採用してもよい。また、ハードウェアスレッド212,212aの実行回数を平均化し、平均化した実行回数を用いて選択率を算出してもよい。
そして、最適化部132は、各分岐方向の選択率が50%に近いか判断する。選択率が50%に近い分岐命令は、予測ミスが発生しやすいと推定できる。例えば、最適化部132は、選択率が50%を中心とする所定の範囲(例えば、40%〜60%)に入っているか判断する。算出した選択率がこの条件を満たす場合はステップS37に処理が進み、この条件を満たさない場合はステップS39に処理が進む。
(S37)最適化部132は、現在のpre_blkからcurr_blkの範囲に属する命令群を、多重化範囲の候補として抽出する。
(S38)最適化部132は、ハードウェア情報に基づいて、ステップS37で抽出した多重化範囲の候補の予測ミスポイントと実行コストポイントを算出する。予測ミスポイントは、その範囲に含まれる分岐命令の予測ミスの発生頻度を示す値であり、例えば、予測ミス数÷分岐命令の実行回数×100と算出できる。実行コストポイントは、その範囲に含まれる命令の実行頻度を示す値であり、例えば、その範囲の命令の合計サイクル数÷オブジェクトコード全体の合計サイクル数×100と算出できる。
なお、予測ミスポイントや実行コストポイントを算出するにあたり、ハードウェアスレッド212,212aそれぞれに対応する予測ミスポイントや実行コストポイントを算出して大きい方を採用してもよい。また、ハードウェアスレッド212,212aの実行回数やサイクル数を平均化し、平均化した実行回数とサイクル数を用いて、予測ミスポイントや実行コストポイントを算出してもよい。
(S39)最適化部132は、pre_blkをcurr_blkと読み替える。
(S40)最適化部132は、全ての処理単位の中で残りの基本ブロックが存在するか判断する。残りの基本ブロックがある場合はステップS31に処理が進み、残りの基本ブロックがない場合はステップS41に処理が進む。
図15は、分岐予測最適化の手順例を示すフローチャート(続き1)である。
(S41)最適化部132は、多重化範囲の候補を1つ選択する。ここで選択した多重化範囲の候補をcurr_regionとおく。
(S42)最適化部132は、curr_regionを包含する親階層の処理単位があるか判断する。親階層の処理単位としては、例えば、ループを包含する外側ループや、ループを包含する関数などが挙げられる。親階層の処理単位がある場合、ステップS43に処理が進む。この場合、1つ上の階層の処理単位をpar_regionとおく。親階層の処理単位がない場合、ステップS46に処理が進む。
(S43)最適化部132は、par_regionの実行コストポイントを算出する。例えば、実行コストポイントとして、par_regionに含まれる命令の合計サイクル数÷オブジェクトコード全体の合計サイクル数×100を算出する。par_regionはcurr_regionの命令も含むため、par_regionの実行コストポイントはcurr_regionの実行コストポイント以上である。
そして、最適化部132は、par_regionの実行コストポイントとcurr_regionの実行コストポイントの違いが小さいか判断する。例えば、最適化部132は、curr_regionの実行コストポイントが、par_regionの実行コストポイントの80%以上を占めるか判断する。すなわち、par_regionの実行コストの多くがcurr_regionによって発生しているか判断する。条件を満たす場合はステップS44に処理が進み、満たさない場合はステップS46に処理が進む。
(S44)最適化部132は、ステップS41で選択した多重化範囲の候補(curr_region)を、親階層の処理単位(par_region)まで拡大する。
(S45)最適化部132は、拡大したcurr_region、すなわち、par_regionの予測ミスポイントを算出する。例えば、最適化部132は、par_regionに含まれる分岐命令について、予測ミス数÷分岐命令の実行回数×100を算出する。最適化部132は、拡大したcurr_regionの予測ミスポイントおよび実行コストポイントを、par_regionの予測ミスポイントおよび実行コストポイントに更新する。そして、ステップS42に処理が進む。
(S46)最適化部132は、curr_regionの予測ミスポイントが閾値以上であるか判断する。このとき、最適化部132は、中間コード記憶部122に記憶されたコンパイルオプションの内容を参照し、ユーザから予測ミス閾値が指定されている場合はその予測ミス閾値を使用する。指定されていない場合、最適化部132は、所定の値(例えば、8)を閾値として使用する。予測ミスポイントが閾値以上の場合はステップS48に処理が進み、閾値未満の場合はステップS47に処理が進む。
(S47)最適化部132は、curr_regionの予測ミスポイントを0に更新する。これは、予測ミス率が小さい分岐命令を最適化から除外することを意味する。
(S48)最適化部132は、curr_regionの実行コストポイントが閾値以上であるか判断する。このとき、最適化部132は、中間コード記憶部122に記憶されたコンパイルオプションの内容を参照し、ユーザからコスト閾値が指定されている場合はそのコスト閾値を使用する。指定されていない場合、最適化部132は、所定の値(例えば、7)を閾値として使用する。実行コストポイントが閾値以上の場合はステップS50に処理が進み、閾値未満の場合はステップS49に処理が進む。
(S49)最適化部132は、curr_regionの実行コストポイントを0に更新する。これは、実行頻度が小さい分岐命令を最適化から除外することを意味する。
(S50)最適化部132は、ステップS41で選択されていない残りの多重化範囲の候補があるか判断する。残りの多重化範囲の候補がある場合はステップS41に処理が進み、全ての多重化範囲の候補が選択された場合はステップS51に処理が進む。
図16は、分岐予測最適化の手順例を示すフローチャート(続き2)である。
(S51)最適化部132は、多重化範囲の候補を1つ選択する。ここで選択した多重化範囲の候補をcurr_regionとおく。
(S52)最適化部132は、curr_region実行コストポイント×予測ミスポイントを、curr_regionの影響度として算出する。
(S53)最適化部132は、ステップS52で算出した影響度が閾値以上であるか判断する。影響度の閾値は、コスト閾値×予測ミス閾値である。ユーザからコスト閾値および予測ミス閾値が指定された場合、最適化部132は、この2つの閾値から影響度の閾値を算出する。ユーザからコスト閾値および予測ミス閾値が指定されなかった場合、所定の値を影響度の閾値として使用する。例えば、コスト閾値の既定値が8であり、予測ミス閾値の既定値が7である場合、影響度の閾値の既定値は56になる。影響度が閾値以上の場合はステップS54に処理が進み、閾値未満の場合はステップS56に処理が進む。
(S54)最適化部132は、curr_regionに含まれる命令群(分岐命令を含む)を、命令群のセット数がCPU200の各コアが備えるハードウェアスレッドの数と一致するようにコピーする。ハードウェアスレッド数が2の場合、例えば、curr_regionに含まれる命令群を1回コピーして2セットの命令群を用意する。
(S55)最適化部132は、オブジェクトコードを実行しているハードウェアスレッドのスレッドIDに応じて、ステップS54で得られた複数の命令群の中から1つの命令群を選択する制御構造をもつ制御命令を生成する。例えば、最適化部132は、複数の命令群それぞれの先頭に異なるスレッドIDを含むラベルを付与し、自ハードウェアスレッドのスレッドIDを確認して何れかのラベルにジャンプする制御命令を、複数の命令群の前に挿入する。また、コピーされた処理単位が関数である場合、例えば、最適化部132は、複数の関数それぞれの関数名に異なるスレッドIDを付加し、自ハードウェアスレッドのスレッドIDを確認して何れかの関数を呼び出す制御命令を生成する。
(S56)最適化部132は、ステップS51で選択されていない残りの多重化範囲の候補があるか判断する。残りの多重化範囲の候補がある場合はステップS51に処理が進み、全ての多重化範囲の候補が選択された場合は分岐予測の最適化が終了する。
図17は、最適化コードの第1の例を示す図である。
最適化コード151は、図8に示したソースコード141に対して分岐予測の最適化を行ったものである。分岐予測の最適化は中間コードに対して行われるものであるが、ここでは理解を容易にするためソースコード形式で最適化結果を示している。
最適化コード151には、関数sub_parentと関数sub_childが定義されている。関数sub_parentには、ループkが含まれる。関数sub_childには、ループiが含まれる。ループiには、ループjが含まれる。以上の処理単位の構造は、ソースコード141と同じである。ただし、最適化コード151では、ループjの中のIF−ELSEブロックが多重化範囲として選択されている。ループjは、多重化結果としてコード部分151a,151b,151cを含む。
コード部分151aでは、自ハードウェアスレッドのスレッドIDを確認し、スレッドIDを含むラベル(コード部分151bの先頭またはコード部分151cの先頭)にジャンプする。例えば、最適化コード151がハードウェアスレッド212で実行された場合はコード部分151bの先頭にジャンプし、最適化コード151がハードウェアスレッド212aで実行された場合はコード部分151cの先頭にジャンプする。
コード部分151bは、ソースコード141と同様のif−else文を含む。コード部分151bには、条件分岐を示す分岐命令が含まれている。また、コード部分151cは、ソースコード141と同様のif−else文、すなわち、コード部分151bと同じif−else文を含む。コード部分151cには、条件分岐を示す分岐命令が含まれている。よって、最適化コード151がハードウェアスレッド212,212aで実行された場合、ハードウェアスレッドに応じて異なる命令アドレスの分岐命令が選択的に実行されるものの、何れのハードウェアスレッドでも分岐命令の内容は同じになる。
図18は、最適化コードの第2の例を示す図である。
最適化コード152には、関数sub_parentと関数sub_childが定義されている。関数sub_parentには、ループkが含まれる。関数sub_childには、ループiが含まれる。以上の処理単位の構造は、ソースコード141と同じである。ただし、最適化コード152では、ループjが多重化範囲として選択されている。ループiには、コピーされた複数のループjが含まれる。ループiは、多重化結果としてコード部分152a,152b,152cを含む。
コード部分152aでは、自ハードウェアスレッドのスレッドIDを確認し、スレッドIDを含むラベル(コード部分152bの先頭またはコード部分152cの先頭)にジャンプする。例えば、最適化コード152がハードウェアスレッド212で実行された場合はコード部分152bの先頭にジャンプし、最適化コード152がハードウェアスレッド212aで実行された場合はコード部分152cの先頭にジャンプする。
コード部分152bは、ソースコード141と同様のループjを含む。コード部分152bには、条件分岐を示す分岐命令が含まれている。また、コード部分152cは、ソースコード141と同様のループj、すなわち、コード部分152bと同じループjを含む。コード部分152cには、条件分岐を示す分岐命令が含まれている。よって、最適化コード152がハードウェアスレッド212,212aで実行された場合、ハードウェアスレッドに応じて異なる命令アドレスの分岐命令が選択的に実行されるものの、何れのハードウェアスレッドでも分岐命令の内容は同じになる。
最適化コード151と比較した場合、最適化コード152では、自ハードウェアスレッドのスレッドIDに応じてジャンプ先を判定するコード部分152aが、ループjの外に出ている。このため、スレッドIDに応じてジャンプ先を判定する回数が少なくなる。if−else文の実行コストがループjの実行コストの大部分を占めている場合、このように多重化範囲を拡大することで、多重化のオーバヘッドを抑制でき、オブジェクトコードの実行効率を向上させることができる。
図19は、最適化コードの第3の例を示す図である。
最適化コード153では、ソースコード141の関数sub_childが多重化範囲として選択されている。最適化コード153は、関数sub_child[0](コード部分153b)と関数sub_child[1](コード部分153c)を含む。また、最適化コード153には、関数sub_parentが定義されている。関数sub_parentには、ループkが含まれる。ループkは、コード部分153aを含む。
コード部分153aでは、自ハードウェアスレッドのスレッドIDを確認し、スレッドIDを含む関数名の関数(コード部分153bまたはコード部分153c)を呼び出す。例えば、最適化コード153がハードウェアスレッド212で実行された場合はコード部分153bの関数が呼び出され、最適化コード153がハードウェアスレッド212aで実行された場合はコード部分153cの関数が呼び出される。
コード部分153bは、元の関数sub_childと同等の関数を含む。コード部分153bには、条件分岐を示す分岐命令が含まれている。また、コード部分153cは、元の関数sub_childと同等の関数、すなわち、コード部分153bと同等の関数を含む。コード部分153cには、条件分岐を示す分岐命令が含まれている。よって、最適化コード153がハードウェアスレッド212,212aで実行された場合、ハードウェアスレッドに応じて異なる命令アドレスの分岐命令が選択的に実行されるものの、何れのハードウェアスレッドでも分岐命令の内容は同じになる。
最適化コード151,152と比較した場合、最適化コード153では、自ハードウェアスレッドのスレッドIDに応じて呼び出し先を判定するコード部分153aが、ループiの外に出ている。このため、スレッドIDに応じて呼び出し先を判定する回数が更に少なくなる。if−else文の実行コストが関数sub_childの実行コストの大部分を占めている場合、このように多重化範囲を拡大することで、多重化のオーバヘッドを抑制でき、オブジェクトコードの実行効率を向上させることができる。
第2の実施の形態のコンパイラ装置100によれば、分岐予測の最適化において、分岐命令を含む命令群がコピーされ、スレッドIDに応じて異なる命令群を選択的に実行するオブジェクトコードが生成される。このため、分岐予測部216を共用するハードウェアスレッド212,212aで同じオブジェクトコードが並列に実行されても、各ハードウェアスレッドで実行される分岐命令の命令アドレスがずれる。よって、分岐予測部216を交換しなくても、ハードウェアスレッド212,212aの分岐方向の履歴が履歴テーブル218の同じエントリに書き込まれる確率を低減できる。その結果、ハードウェアスレッド212,212aに対する分岐予測を分離でき、予測精度を向上できる。
また、分岐予測の最適化を行う前のオブジェクトコードを実行したときの実行時情報が収集され、実行時情報に基づいて、最適化対象の分岐命令が絞り込まれる。よって、全ての分岐命令について当該分岐命令を含む命令群をコピーする場合よりも、オブジェクトコードのサイズを削減することができる。また、収集された実行時情報に基づいて、コピーする1セットの命令群の範囲が適宜拡大される。これにより、ハードウェアスレッドに応じて複数の命令群の中から1つの命令群を選択するオーバヘッドを削減でき、生成するオブジェクトコードの実行効率を向上させることができる。
なお、前述のように、第1の実施の形態の情報処理は、コンパイラ装置10にプログラムを実行させることで実現することができる。第2の実施の形態の情報処理は、コンパイラ装置100にプログラムを実行させることで実現することができる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムをコピーして(インストールして)実行してもよい。
10 コンパイラ装置
11 記憶部
12 変換部
13,14 コード
15,16 分岐命令
17 制御命令
20 プロセッサ
21,22 スレッド
23 記憶領域

Claims (6)

  1. コンピュータに、
    第1のコードに含まれる一の分岐命令をコピーして複数の分岐命令に変換し、
    分岐予測に用いられる情報を記憶する記憶領域を共用する複数のスレッドを実行可能なプロセッサにおいて、使用するスレッドに応じて前記複数の分岐命令の中から異なる分岐命令が実行されるよう制御する制御命令を生成し、
    前記複数の分岐命令と前記制御命令とを含む第2のコードを生成する、
    処理を実行させるコンパイルプログラム。
  2. 前記プロセッサに前記第1のコードに応じた処理を実行させたときの前記第1のコードに含まれる各分岐命令の実行状況を示す実行時情報を取得し、
    前記実行時情報に基づいて、前記第1のコードの中から前記一の分岐命令を選択する、
    請求項1記載のコンパイルプログラム。
  3. 前記実行時情報は、前記第1のコードに含まれる各分岐命令について、前記プロセッサによる分岐予測の失敗状況を示す予測ミス情報を含み、
    前記予測ミス情報に基づいて前記一の分岐命令を選択する、
    請求項2記載のコンパイルプログラム。
  4. 前記プロセッサに前記第1のコードに応じた処理を実行させたときの前記第1のコードに含まれる命令の実行状況を示す実行時情報を取得し、
    前記実行時情報に基づいて、前記第1のコードの中から前記一の分岐命令を含む命令群の範囲を選択し、前記選択した範囲の命令群をコピーする、
    請求項1記載のコンパイルプログラム。
  5. コンピュータが実行するコンパイル方法であって、
    第1のコードに含まれる一の分岐命令をコピーして複数の分岐命令に変換し、
    分岐予測に用いられる情報を記憶する記憶領域を共用する複数のスレッドを実行可能なプロセッサにおいて、使用するスレッドに応じて前記複数の分岐命令の中から異なる分岐命令が実行されるよう制御する制御命令を生成し、
    前記複数の分岐命令と前記制御命令とを含む第2のコードを生成する、
    コンパイル方法。
  6. 分岐命令を含む第1のコードを記憶する記憶部と、
    前記第1のコードに含まれる前記分岐命令をコピーして複数の分岐命令に変換し、
    分岐予測に用いられる情報を記憶する記憶領域を共用する複数のスレッドを実行可能なプロセッサにおいて、使用するスレッドに応じて前記複数の分岐命令の中から異なる分岐命令が実行されるよう制御する制御命令を生成し、
    前記複数の分岐命令と前記制御命令とを含む第2のコードを生成する、変換部と、
    を有するコンパイラ装置。
JP2015000280A 2014-10-10 2015-01-05 コンパイルプログラム、コンパイル方法およびコンパイラ装置 Active JP6398725B2 (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US14/511,251 2014-10-10
US14/511,251 US9658855B2 (en) 2014-10-10 2014-10-10 Compile method and compiler apparatus

Publications (2)

Publication Number Publication Date
JP2016081501A JP2016081501A (ja) 2016-05-16
JP6398725B2 true JP6398725B2 (ja) 2018-10-03

Family

ID=55655497

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015000280A Active JP6398725B2 (ja) 2014-10-10 2015-01-05 コンパイルプログラム、コンパイル方法およびコンパイラ装置

Country Status (2)

Country Link
US (1) US9658855B2 (ja)
JP (1) JP6398725B2 (ja)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9886317B2 (en) * 2015-02-02 2018-02-06 Oracle International Corporation Fine-grained scheduling of work in runtime systems
US9916164B2 (en) * 2015-06-11 2018-03-13 Intel Corporation Methods and apparatus to optimize instructions for execution by a processor
US9715377B1 (en) * 2016-01-04 2017-07-25 International Business Machines Corporation Behavior based code recompilation triggering scheme
US10747878B1 (en) * 2016-10-07 2020-08-18 Rightquestion, Llc Rapid verification of executing processes
CN110147250B (zh) * 2018-02-13 2021-11-12 龙芯中科技术股份有限公司 一种转移预测电路及其控制方法
US11095495B2 (en) * 2019-04-05 2021-08-17 Arista Networks, Inc. Multi-result lookups
CN112540764A (zh) * 2019-09-23 2021-03-23 无锡江南计算技术研究所 条件转移预测方向变换的编译优化方法
US11200038B1 (en) * 2020-06-25 2021-12-14 Paypal, Inc. Fast compiling source code without dependencies
US11314496B2 (en) 2020-06-25 2022-04-26 Paypal, Inc. Ultra-fast install and update of an operating system
KR102397340B1 (ko) * 2020-07-30 2022-05-12 경북대학교 산학협력단 마이크로컨트롤러 업데이트 관리방법 및 관리시스템

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3007340B1 (ja) 1998-11-17 2000-02-07 株式会社ディジタル・ビジョン・ラボラトリーズ 機能呼び出し方法、並列分散処理システムおよびコンピュータ
US7013454B2 (en) * 1999-02-22 2006-03-14 Sun Microsystems, Inc. Thread suspension system and method using trapping instructions
US6721875B1 (en) * 2000-02-22 2004-04-13 Hewlett-Packard Development Company, L.P. Method and apparatus for implementing a single-syllable IP-relative branch instruction and a long IP-relative branch instruction in a processor which fetches instructions in bundle form
US20030135719A1 (en) * 2002-01-14 2003-07-17 International Business Machines Corporation Method and system using hardware assistance for tracing instruction disposition information
US20030135718A1 (en) * 2002-01-14 2003-07-17 International Business Machines Corporation Method and system using hardware assistance for instruction tracing by revealing executed opcode or instruction
US7120784B2 (en) 2003-04-28 2006-10-10 International Business Machines Corporation Thread-specific branch prediction by logically splitting branch history tables and predicted target address cache in a simultaneous multithreading processing environment
JP4287799B2 (ja) 2004-07-29 2009-07-01 富士通株式会社 プロセッサシステムおよびスレッド切り替え制御方法
JP4923240B2 (ja) 2006-01-17 2012-04-25 国立大学法人東京工業大学 プログラム処理装置、並列処理プログラム、プログラム処理方法、並列処理コンパイラ、並列処理コンパイラを格納した記録媒体およびマルチプロセッサシステム
JP2008107913A (ja) * 2006-10-23 2008-05-08 Toshiba Corp プログラム、ソフトウェア変換装置及びコンピュータ
JP2010039536A (ja) * 2008-07-31 2010-02-18 Panasonic Corp プログラム変換装置、プログラム変換方法およびプログラム変換プログラム
US7664942B1 (en) * 2008-08-25 2010-02-16 Sun Microsystems, Inc. Recovering a subordinate strand from a branch misprediction using state information from a primary strand
US8667476B1 (en) * 2009-01-20 2014-03-04 Adaptmicrosys LLC Instruction grouping and ungrouping apparatus and method for an adaptive microprocessor system
JP4621786B2 (ja) 2009-04-28 2011-01-26 株式会社東芝 情報処理装置、並列処理最適化方法およびプログラム
US9477481B2 (en) * 2014-06-27 2016-10-25 International Business Machines Corporation Accurate tracking of transactional read and write sets with speculation

Also Published As

Publication number Publication date
US20160103683A1 (en) 2016-04-14
US9658855B2 (en) 2017-05-23
JP2016081501A (ja) 2016-05-16

Similar Documents

Publication Publication Date Title
JP6398725B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイラ装置
US10387157B2 (en) System and method for instruction set conversion based on mapping of both block address and block offset
Lu et al. Design and implementation of a lightweight dynamic optimization system
US20110119660A1 (en) Program conversion apparatus and program conversion method
JP6572610B2 (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
US8799881B2 (en) Program parallelization device and program product
US9395986B2 (en) Compiling method and compiling apparatus
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP2009110299A (ja) プログラムを最適化するコンパイラ
JP6432450B2 (ja) 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
US20100095102A1 (en) Indirect branch processing program and indirect branch processing method
US8510529B2 (en) Method for generating program and method for operating system
US7228528B2 (en) Building inter-block streams from a dynamic execution trace for a program
US9335990B2 (en) Method, a system, and a non-transitory computer-readable medium for supporting application development
JP5278538B2 (ja) コンパイルシステム、コンパイル方法およびコンパイルプログラム
JP6536266B2 (ja) コンパイル装置、コンパイル方法およびコンパイルプログラム
US9417872B2 (en) Recording medium storing address management program, address management method, and apparatus
JP5240200B2 (ja) データ処理装置および方法
JP2004240953A (ja) コンピュータシステム、その同時多重スレッディング方法およびキャッシュコントローラシステム。
JP2022140995A (ja) 情報処理装置、コンパイルプログラムおよびコンパイル方法
JP2019144857A (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
JP2024030940A (ja) ソースコード変換プログラムおよびソースコード変換方法
JP6066031B2 (ja) 情報処理装置、情報処理方法及び情報処理プログラム
CN113094092A (zh) 用于经由编程者注释执行异构数据结构选择的方法、系统和制品

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20171215

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180731

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: 20180807

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20180820

R150 Certificate of patent or registration of utility model

Ref document number: 6398725

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150