JP2021149807A - 情報処理装置及びコンパイラプログラム - Google Patents
情報処理装置及びコンパイラプログラム Download PDFInfo
- Publication number
- JP2021149807A JP2021149807A JP2020051212A JP2020051212A JP2021149807A JP 2021149807 A JP2021149807 A JP 2021149807A JP 2020051212 A JP2020051212 A JP 2020051212A JP 2020051212 A JP2020051212 A JP 2020051212A JP 2021149807 A JP2021149807 A JP 2021149807A
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- execution
- unit
- program
- information processing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Executing Machine-Instructions (AREA)
Abstract
【課題】情報処理装置において、コンパイラの生成するオブジェクトプログラムの実行速度を高速化する。【解決手段】情報処理装置30においてプログラムのコンパイル処理を行うコンパイラであって、プログラムのループ処理に含まれる命令列20aを取得する取得部と、命令列20aのうちの第1の命令と依存関係がない第2の命令を命令列20aから抽出する抽出部と、命令列20aにおいて、第1の命令の次に第2の命令を配置する配置部とを有する。【選択図】図6
Description
本発明は、情報処理装置及びコンパイラプログラムに関する。
プロセッサにおける命令のスループットを高める方式としてソフトウェアパイプラインがある。ソフトウェアパイプラインは、ループ処理を対象とした命令スケジューリングを行い、ループ内の命令レベル並列性を高めるコンパイラの最適化手法である。大規模なプログラムにおける実行性能のボトルネックとなるのは主としてループ処理である。そのため、ループ処理に対してソフトウェアパイプラインを適用することは、プログラムの実行速度を高速化するのに有用である。
但し、ソフトウェアパイプラインでは、命令の待ち合わせをするための待ち合わせ時間が長くなることがあり、その場合にはプログラムの実行速度を十分に高速化できない。
一側面によれば、プログラムの実行速度を高速化することを目的とする。
一側面によれば、ループ処理に含まれる命令列を取得する取得部と、前記命令列のうちの第1の命令と依存関係がない第2の命令を前記命令列から抽出する抽出部と、前記命令列において、前記第1の命令の次に前記第2の命令を配置する配置部とを有する情報処理装置が提供される。
一側面によれば、プログラムの実行速度を高速化することができる。
以下に、図面を参照しながら本実施形態について説明する。
図1は、ターゲットプロセッサのハードウェア構成図である。
このターゲットプロセッサ1は、例えばARMの命令セットに対してパイプライン処理が可能なプロセッサである。また、ターゲットプロセッサ1は、アウトオブオーダ実行により命令列を処理するプロセッサであり、命令の順序を入れ替えてプログラムを実行することができる。
この例では、ターゲットプロセッサ1は、計算コア2とL2キャッシュ3とを有する。このうち、計算コア2は、種々の命令を実行するための回路とレジスタとを備えたハードウェアである。また、L2キャッシュ3は、ターゲットプロセッサ1の外部のDRAM(Dynamic Random Access Memory)等のメインメモリ10のデータを格納するSRAM(Static RAM)等のハードウェアである。
そのL2キャッシュ3には、ターゲットプロセッサ1の外部のDMA(Direct Memory Access)コントローラ4、メモリインターフェース5、バスブリッジ6、及び周辺回路7が接続される。
このうち、DMAコントローラ4は、DMA方式でデータの転送を行うときの制御回路である。また、メモリインターフェース5は、メインメモリ10とターゲットプロセッサ1との間の通信のインターフェースとなる回路である。更に、バスブリッジ6は、例えばPCI(Peripheral Component Interconnect)バスを別のバスに変換する回路である。そして、周辺回路7は各種の入出力回路である。
図2は、計算コア2の構成図である。
図2に示すように、計算コア2は、ロード命令実行回路(LDU)11、ストア命令実行回路(STU)12、整数演算実行回路(ALU)13、浮動小数演算実行回路(FPU)14、及びL1キャッシュ15を有する。これらの各部はバス16により相互に接続される。
図2に示すように、計算コア2は、ロード命令実行回路(LDU)11、ストア命令実行回路(STU)12、整数演算実行回路(ALU)13、浮動小数演算実行回路(FPU)14、及びL1キャッシュ15を有する。これらの各部はバス16により相互に接続される。
このうち、ロード命令実行回路(LDU)11は、メインメモリ10からレジスタにデータを転送するロード命令を実行する回路である。また、ストア命令実行回路(STU)12は、レジスタからメインメモリ10にデータを格納するストア命令を実行する回路である。そして、整数演算実行回路(ALU)13は、整数値のデータに対して算術演算や論理演算を行うための回路である。また、浮動小数演算実行回路(FPU)14は、浮動小数のデータに対して算術演算を行う回路である。
これらの実行回路の個数は特に限定されない。この例では、計算コア2に整数演算実行回路(ALU)13を二つ設ける。
一方、L1キャッシュ15は、L2キャッシュ3のデータを格納するためのSRAM等の回路である。
このような計算コア2においては、複数の命令の依存関係を維持しながら、これらの命令を各実行回路で並列実行することによりプログラムの実行速度が高速化される。その実行速度は、各命令のレイテンシに依存する。ここでは、命令の実行を開始してから実行が終了するまでの時間をレイテンシとして定義する。
計算コア2で実行する命令のレイテンシは、その命令を実行する実行回路ごとに異なる。
例えば、ロード命令実行回路(LDU)11におけるレイテンシは3クロックサイクルであり、ストア命令実行回路(STU)12のレイテンシは1クロックサイクルである。そして、整数演算実行回路(ALU)13のレイテンシは1クロックサイクルであり、浮動小数演算実行回路(FPU)14のレイテンシは3クロックサイクルである。
図3(a)はハードウェアテーブルの模式図であり、図3(b)はレイテンシテーブルの模式図である。
このうち、図3(a)のハードウェアテーブル18は、番号、実行回路、及び命令の各々を対応付けた情報である。このうち、番号は、実行回路を一意に識別する数値である。また、命令は、対応する実行回路が実行する命令である。
一方、図3(b)のレイテンシテーブル19は、命令とレイテンシとを対応付けた情報である。例えば、ldrsw命令、ldr命令、及びstr命令の各々にはレイテンシ「3」が対応付けられる。なお、ldrsw命令は、即値で表されるメモリアドレスのデータをレジスタに転送する命令である。また、ldr命令はロード命令であり、str命令はストア命令である。
更に、fmul命令とfadd命令は、それぞれ浮動小数の乗算命令と加算命令である。そして、add命令とsub命令は、それぞれ整数の加算命令と減算命令である。また、mov命令はレジスタにデータをコピーする命令であり、cmp命令はオペランドの値とレジスタの値とを比較する命令である。
これらのハードウェアテーブル18とレイテンシテーブル19は、いずれも開発用のマシンのメモリに予め格納される。
次に、ターゲットプロセッサ1で実行するプログラムの例について説明する。
図4は、ターゲットプロセッサ1で実行するアセンブリプログラム20の模式図である。
このアセンブリプログラム20は、C言語で記述されたソースプログラムをコンパイラがコンパイルして得られたプログラムである。なお、図4では、ソースプログラムのforループのループ本体に対応した命令列20aのみを示している。また、各命令のオペランドにおけるxn、dnはいずれもレジスタを示す。
図4に示すように、この例では、最初のldrsw命令から最後のb.ne命令に至る命令からなる命令列20aでループ本体が実現される。なお、nop(no operation)命令は、パイプラインをストールさせるためにコンパイラが生成した命令である。そして、命令列20aの先頭のラベル「LBB1_1」は、コンパイラが記述したループの始まりを示す文字列である。また、最後のb.ne命令は、演算結果がゼロであることを示すZフラグに「0」が格納されていない場合にラベル「LBB1_1」のldrsw命令にジャンプする条件分岐命令である。
前述のハードウェアテーブル18、レイテンシテーブル19、及びコンパイラが解析した命令間の依存関係を利用すると、命令とそれを実行する実行回路とを対応付けたスケジューリングテーブルを作成することができる。
図5は、そのスケジューリングテーブルの模式図である。
このスケジューリングテーブルTBは、実行回路の各々が実行する命令を実行サイクルCycの順に並べたテーブルである。この例では、命令列20aの全体の実行サイクル数が11となっている。
このスケジューリングテーブルTBは、実行回路の各々が実行する命令を実行サイクルCycの順に並べたテーブルである。この例では、命令列20aの全体の実行サイクル数が11となっている。
スケジューリングテーブルTBにおける命令「ldr d3,[x1,x9,lsl#3]」と命令str d2,[x2,x8,lsl#3]の各々のオペランドには同じレジスタが指定されておらず、これらの命令間にはデータの依存関係がない。そのため、この例では命令「ldr d3,[x1,x9,lsl#3]」と命令str d2,[x2,x8,lsl#3]とを同時に実行することにより全体の実行サイクル数の低減が図られている。
しかし、命令「ldrsw x9,[x0,x8,lsl#2]」と命令「fmul d2,d3,d0」との間にもデータの依存関係がないにも関わらず、命令「fmul d2,d3,d0」が命令「ldrsw x9,[x0,x8,lsl#2]」の後に実行されており、実行サイクル数を更に削減する余地がある。
(本実施形態)
本実施形態では、以下のようにしてループ処理における実行サイクル数を低減する。
本実施形態では、以下のようにしてループ処理における実行サイクル数を低減する。
図6は、本実施形態におけるコンパイル方法の模式図である。
本実施形態では、図6に示すように、情報処理装置30が、前述のアセンブリプログラム20における命令列20aを取得する(P1)。そして、情報処理装置30が、取得した命令列20aにおける命令の順序を入れ替えた第1の出力アセンブリプログラム21を出力する(P2)。
この例では、情報処理装置30は、命令列20aに含まれる最初の命令「ldrsw x9,[x0,x8,lsl#2]」とデータの依存関係がない命令「fmul d2,d3,d0」を抽出する。そして、情報処理装置30が、第1の出力アセンブリプログラム21において、命令「ldrsw x9,[x0,x8,lsl#2]」の次に命令「fmul d2,d3,d0」を配置する。なお、ここでは命令「ldrsw x9,[x0,x8,lsl#2]」の次の二つのnop命令の次に命令「fmul d2,d3,d0」を配置しているが、命令「ldrsw x9,[x0,x8,lsl#2]」の直後に命令「fmul d2,d3,d0」を配置してもよい。
更に、情報処理装置30が、命令列20aに含まれるいずれの命令ともデータの依存関係がない命令「str wzr,[sp,#12]」を、第1の出力アセンブリプログラム21の命令列20aの前に追加する。この命令のオペランドの「wzr」はゼロレジスタを表し、「sp」はスタックポインタを表す。
このように命令列20aに含まれるいずれの命令ともデータの依存関係がない命令「str wzr,[sp,#12]」のことを以下ではバリア命令と呼ぶ。
次に、情報処理装置30が、第1の出力アセンブリプログラム21をコンパイルした第2の出力アセンブリプログラム22を出力する(P3)。そのコンパイルの際、命令「str wzr,[sp,#12]」は、他の命令が自身を追い越すのを禁止するバリア命令として機能する。バリア命令は、情報処理装置30がソフトウェアパイプラインを実現するための命令列を生成するのを抑止する。そのため、ソフトウェアパイプラインを実現するための多数のnop命令を情報処理装置30が生成するのを抑止できる。また、情報処理装置30は、レジスタのリネーミングもそのコンパイル時に実行する。
図7は、第2の出力アセンブリプログラム22から得られたスケジューリングテーブル23の模式図である。
図7に示すように、前述のようにldrsw命令の次にfmul命令を配置したことにより、これらの命令が同時に実行されるようになる。これにより、レイテンシが「3」の命令「ldrsw x9,[x0,x8,lsl#2]」と、レイテンシが「3」の命令「fmul d0,d0,d1」の各々の実行時間がクロックサイクル1〜3で重なる。そのため、一方の命令の実行時間を他方の命令の実行時間として有効に活用でき、プログラム全体の実行サイクル数を低減できる。この例では全体の実行サイクル数が7となり、図5の例よりも実行サイクル数を低減することができる。
特に、この例では命令「ldrsw x9,[x0,x8,lsl#2]」を実行する回路がロード命令実行回路11であり、「fmul d0,d0,d1」を実行する回路が浮動小数演算実行回路14であって、両命令の実行回路が異なる。そのため、上記のように命令「ldrsw x9,[x0,x8,lsl#2]」と命令「fmul d0,d0,d1」とを同時に実行することができ、実行サイクル数を低減することが可能となる。
更に、バリア命令を追加したことでソフトウェアパイプラインによる最適化が抑止されるため、ソフトウェアパイプラインの実現に要するnop命令が不要となる。そのため、過剰なnop命令でプログラムの実行速度が低下するのを抑制できる。
なお、ターゲットプロセッサ1はアウトオブオーダ実行により命令列を処理するプロセッサであるが、本実施形態はインオーダ実行により命令例を処理するプロセッサにも適用可能である。インオーダ実行のプロセッサの場合は命令の実行順序の変更を伴うソフトウェアパイプラインが実現できないため、バリア命令は不要となる。
次に、本実施形態に係る情報処理装置30の機能構成について説明する。
図8は、本実施形態に係る情報処理装置30の機能構成図である。
図8に示すように、情報処理装置30は、通信部31、記憶部32、及び制御部33を有する。
このうち、通信部31は、開発者の端末からアセンブリプログラム20(図6参照)を受信する処理部である。また、記憶部32は、前述のハードウェアテーブル18とレイテンシテーブル19とを記憶する。
一方、制御部33は、情報処理装置30の各部を制御する処理部である。この例では、制御部33は、取得部34、抽出部35、配置部36、追加部37、プログラム生成部38、コンパイル部39、テーブル生成部40、及び比較部41を有する。
取得部34は、アセンブリプログラム20に含まれる命令列20a(図6参照)を取得する処理部である。
また、抽出部35は、その命令列20aに含まれる第1の命令とデータの依存関係がない第2の命令を抽出する処理部である。図6の例では、第1の命令を命令列20aの先頭の命令「ldrsw x9,[x0,x8,lsl#2]」とする。この場合、第2の命令は、命令「ldrsw x9,[x0,x8,lsl#2]」とデータの依存関係がない命令「fmul d2,d3,d0」となる。なお、第1の命令とデータの依存関係がない命令が複数存在する場合には、抽出部35は、レイテンシテーブル19を参照することにより、複数の命令のうちでレイテンシが最も大きいものを第2の命令として抽出する。
そして、配置部36は、命令列20aにおいて第1の命令の次に第2の命令を配置する処理部である。図6の例では、配置部36は、命令「ldrsw x9,[x0,x8,lsl#2]」の次に命令「fmul d2,d3,d0」を配置する。
また、追加部37は、命令列20aの前にバリア命令を追加する処理部である。図6の例では、追加部37は、命令列20aの前にバリア命令として命令「str wzr,[sp,#12]」を追加する。
プログラム生成部38は、追加部37によって追加されたバリア命令と、配置部36によって命令の配置が変更された命令列20aとを含むプログラムを第1の出力アセンブリプログラム21(図6参照)として生成する処理部である。
また、コンパイル部39は、プログラム生成部38が生成した第1の出力アセンブリプログラム21をコンパイルして第2の出力アセンブリプログラム22(図6参照)を生成する処理部である。
テーブル生成部40は、ハードウェアテーブル18、レイテンシテーブル19、及び第2の出力アセンブリプログラム22を利用することにより、前述のスケジューリングテーブルTB(図7参照)を生成する処理部である。
そして、比較部41は、アセンブリプログラム20と第2の出力アセンブリプログラム22の各々の命令列の実行サイクル数を比較する処理部である。
次に、本実施形態に係るコンパイル方法について説明する。
図9は、本実施形態に係るコンパイル方法のフローチャートである。
図9は、本実施形態に係るコンパイル方法のフローチャートである。
以下では、図6のアセンブリプログラム20に対して情報処理装置30が行う処理を例にして説明する。
まず、取得部34が、アセンブリプログラム20に含まれる命令列20aを取得する(ステップS11)。
次に、追加部37が、命令列20aの前にバリア命令を追加する(ステップS12)。なお、ターゲットプロセッサ1としてインオーダ実行のプロセッサを使用する場合には、前述のようにバリア命令が不要となるため、ステップS12を省略してもよい。
次いで、抽出部35が、命令列20aの先頭の命令「ldrsw x9,[x0,x8,lsl#2]」を第1の命令とし、該第1の命令とその次の命令との間にデータの依存関係があるかを判定する(ステップS13)。
なお、第1の命令とその次の命令が同じ実行回路で実行される命令の場合、抽出部35はステップS13をスキップし、更に次の命令に対してステップS13を実行する。例えば、図6の例では、第1の命令の「ldrsw x9,[x0,x8,lsl#2]」と同じ実行回路で実行される命令「ldr d3,[x1,x9,lsl#3]」に対してはステップS13を行わず、更に次の命令「str d2,[x2,x8,lsl#3]」に対してステップS13を行うことになる。
ここで、依存関係がない(ステップS13:否定)と判定された場合には、抽出部35が、第1の命令との間でデータの依存関係がない命令を第2の命令として抽出する(ステップS14)。図6の例では、抽出部35は、命令「fmul d2,d3,d0」を抽出することになる。
なお、ステップS13〜S16は1命令ごとに繰り返されるが、繰り返していくうちに第1の命令とデータの依存関係がない命令が複数見つかる場合がある。その場合は、抽出部35は、レイテンシテーブル19を参照することにより、複数の命令のうちでレイテンシが最も大きいものを第2の命令として抽出する。これにより、第1の命令と第2の命令の各々の実行サイクル同士が重なったときに、第2の命令の実行時間を第1の命令の実行時間として有効に活用でき、プログラムの実行速度をより高速化することができる。
次に、配置部36が、第1の命令の次に第2の命令を配置する(ステップS15)。図6の例では、配置部36は、命令「ldrsw x9,[x0,x8,lsl#2]」の次に命令「fmul d2,d3,d0」を配置する(ステップS16)。
次いで、配置部36が、第1の命令と依存関係がない第2の命令の個数が、当該第2の命令を実行する実行回路の個数に等しいかを判定する。ここで、第2の命令の個数が実行回路の個数に等しい場合には、第1の命令と依存関係がない新たな第2の命令が見つかっても、全ての第2の命令を各実行回路で並列実行できない。
よって、第2の命令の個数が実行回路の個数に等しいと判定された場合(ステップS16:肯定)は、第2の命令の探索を停止し、ステップS17に移る。
一方、第2の命令の個数が実行回路の個数に等しくないと判定された場合(ステップS16:否定)は、各実行回路で並列実行できる第2の命令が命令列20aに存在する可能性がまだある。よって、この場合には、ステップS14で抽出した第2の命令の次の命令に対してステップS13からやり直す。
また、ステップS13において依存関係があると判定された場合(ステップS13:肯定)は、依存関係の有無が判定された次の命令に対してステップS13を実行する。そして、全ての命令に対してステップS13を実行した場合にはステップS17に移る。
ステップS17においては、プログラム生成部38が第1の出力アセンブリプログラム21を生成する。その第1の出力アセンブリプログラム21は、ステップS12で追加したバリア命令と、ステップS15で命令の配置が変更された命令列20aとを備えたアセンブリのプログラムである。
次いで、コンパイル部39が、第1の出力アセンブリプログラム21をコンパイルして第2の出力アセンブリプログラム22を生成する(ステップS18)。ステップS12でバリア命令「str wzr,[sp,#12]」を追加したことにより、そのコンパイルでは、コンパイル部39がソフトウェアパイプラインに適した命令列を生成するのが抑止され、多数のnop命令が生成されるのを抑えることができる。また、コンパイル部39は、コンパイル時にレジスタのリネーミングも行う。
次に、テーブル生成部40がスケジューリングテーブル生成処理を行う(ステップS19)。そして、比較部41が実行サイクル数比較処理を行い(ステップS20)、本実施形態に係るコンパイル方法の基本ステップを終える。
次に、ステップS19のスケジューリングテーブル生成処理について説明する。
図10は、本実施形態に係るスケジューリングテーブル生成処理のフローチャートである。
以下では、図6の第2の出力アセンブリプログラム22を例にしながら、スケジューリングテーブル生成処理の各ステップについて説明する。
まず、テーブル生成部40が、スケジューリングテーブルTBにおける実行回路の項目を生成する(ステップS31)。
図11は、このようにして生成された実行回路の項目を示す模式図である。図11に示すように、テーブル生成部40は、ロード命令実行回路(LDU)11、ストア命令実行回路(STU)12、整数演算実行回路(ALU)13、浮動小数演算実行回路(FPU)の各々の項目を生成する。更に、テーブル生成部40は、実行サイクル数を示す項目「Cyc」も生成する。
再び図10を参照する。
再び図10を参照する。
次に、テーブル生成部40が、第2の出力アセンブリプログラム22の命令を一行ずつ読み込み、その命令に「LBB1_1」等の文字列のラベルがあるかを検出する(ステップS32)。ラベルは、ループ処理の最後の命令であるジャンプ命令の戻り先の命令に付される。よって、ラベルが付された命令は、ループ処理の最初の命令ということになる。
ここで、ラベルを検出しない場合(ステップS32:否定)は、第2の出力アセンブリプログラム22にはループ処理が存在しないことになる。本実施形態が対象とするのはループ処理における実行サイクル数の低減であるため、この場合には処理を行わずに呼び出し元に戻る。
一方、ラベルを検出した場合(ステップS32:肯定)はステップS33に移る。
ステップS33では、テーブル生成部40が、ループ処理における命令の番号を示す変数nを1に初期化する。n=1の命令は、そのループ処理における最初の命令であり、n=2の命令は最初から2番目の命令ということになる。
次に、テーブル生成部40が、第2の出力アセンブリプログラム22におけるn番目の命令を読み込む(ステップS34)。
次いで、テーブル生成部40が、ハードウェアテーブル18(図3(a))を参照することにより、n番目の命令を実行する実行回路の番号kを特定する(ステップS35)。例えば、1番目の命令である命令「str wzr,[sp,#12]」は、ストア命令実行回路(STU)12で実行される命令であるから、その実行回路の番号は「02」となる。
次に、テーブル生成部40が、ステップS31で生成された実行回路の各項目のうち、番号kの実行回路の欄にn番目の命令を書き込む(ステップS36)。1番目の命令である命令「str wzr,[sp,#12]」は、番号が「02」で表されるストア命令実行回路(STU)12の欄に書き込まれる。
次いで、テーブル生成部40が、レイテンシテーブル19を参照することによりn番目の命令のレイテンシを特定し、そのレイテンシを記憶する(ステップS37)。図3に示されるように、1番目の命令である命令「str wzr,[sp,#12]」のレイテンシは「3」である。
次いで、テーブル生成部40が、n番目の命令がbne命令かどうかを判定する(ステップS38)。bne命令は、ループ処理の最後の命令である。よって、n番目の命令がbne命令である場合(ステップS38:肯定)は、後続のn+1番目の命令はループ処理には含まれないため処理を終える。
一方、n番目の命令がbne命令ではない場合(ステップS38:否定)は、後続のn+1番目の命令はループ処理に含まれる命令である。よって、この場合はステップS39に移り、テーブル生成部40が変数nを1だけインクリメントし、再びステップS34に戻る。
以上により、スケジューリングテーブル生成処理の基本ステップを終了する。
次に、このスケジューリングテーブル生成処理におけるステップS36の処理内容について詳細に説明する。
図12〜図22は、ステップS36の処理内容について説明するための模式図である。
まず、図12に示すように、テーブル生成部40が、1番目の命令である命令「str wzr,[sp,#12]」を、ストア命令実行回路12の1サイクル目に書き込む。
次に、図13に示すように、テーブル生成部40が、2番目の命令である命令「ldrsw x9,[x0,x8,lsl#2]」を、ロード命令実行回路11の1サイクル目に書き込む。
続いて、図14に示すように、テーブル生成部40が、3番目の命令である命令「fmul d0,d0,d1」を、浮動小数演算実行回路14の1サイクル目に書き込む。
次に、図15に示すように、テーブル生成部40が、4番目と5番目の命令である2個のnop命令を浮動小数演算実行回路14の2サイクル目と3サイクル目に書き込む。
次いで、図16に示すように、テーブル生成部40が、6番目の命令である命令「fadd d3,d0,d2」を、浮動小数演算実行回路14の4サイクル目に書き込む。
続いて、図17に示すように、テーブル生成部40が、7番目の命令である命令「ldr d0,[x1,x9,lsl#3]」をロード命令実行回路11の欄に書き込む。
このとき、テーブル生成部40は、命令「ldr d0,[x1,x9,lsl#3]」の先行命令である命令「ldrsw x9,[x0,x8,lsl#2]」のレイテンシ「3」をステップS37で記憶している。レイテンシが「3」の場合、命令「ldrsw x9,[x0,x8,lsl#2]」の実行が終了するのは3サイクル目である。よって、テーブル生成部40は4サイクル目に命令「ldr d0,[x1,x9,lsl#3]」を書き込む。
次いで、図18に示すように、テーブル生成部40が、8番目の命令である命令「add x9,x8,#1」を「#0」の整数演算実行回路13の欄に書き込む。この命令「ldr d0,[x1,x9,lsl#3]」におけるオペランドにはレジスタx9が指定されており、レジスタx9を使用する4サイクル目の先行命令「ldrsw x9,[x0,x8,lsl#2]」との間にデータの依存関係がある。テーブル生成部40は、この依存関係を検出し、4サイクル目以降で空いている欄のうち最もサイクル数が小さい欄に命令「add x9,x8,#1」を書き込む。ここでは、テーブル生成部40は、4サイクル目に命令「add x9,x8,#1」を書き込む。
次いで、図19に示すように、テーブル生成部40が、9番目の命令である命令「cmp x9,#99」を、「#0」の整数演算実行回路13の5サイクル目に書き込む。
次いで、図20に示すように、テーブル生成部40が、10番目と11番目の命令である2個のnop命令を、「#0」の整数演算実行回路13の6サイクル目と7サイクル目に書き込む。
続いて、図21に示すように、テーブル生成部40が、12番目の命令である命令「str d3,[x2,x8,lsl#3]」をストア命令実行回路12に書き込む。この命令「str d3,[x2,x8,lsl#3]」におけるオペランドにはレジスタd3が指定されており、レジスタd3を使用する4サイクル目の先行命令「fadd d3,d0,d2」との間にデータの依存関係がある。また、テーブル生成部40は、先行命令「fadd d3,d0,d2」のレイテンシが「3」であることをステップS37で記憶している。テーブル生成部40は、このような依存関係とレイテンシとに基づいて、先行命令「fadd d3,d0,d2」が終了する7サイクル目以降で空いている欄のうち最もサイクル数が小さい欄に命令「str d3,[x2,x8,lsl#3]」を書き込む。ここでは、テーブル生成部40は、7サイクル目に命令「str d3,[x2,x8,lsl#3]」を書き込む。
次に、図22に示すように、テーブル生成部40が、13番目の命令である命令「b.ne LBB1_1」を「#1」の整数演算実行回路13の欄に書き込む。命令「b.ne LBB1_1」はループ処理の最後の命令であるから、ループ処理内の他の命令と順序が逆転するとループ処理が正しく実行されない。そこで、テーブル生成部40は、全ての命令のうちで最も遅い7サイクル目に命令「b.ne LBB1_1」を書き込む。
以上により、第2の出力アセンブリプログラム22に対応したスケジューリングテーブルTBが完成する。
更に、テーブル生成部40は、アセンブリプログラム20に対してもこのスケジューリングテーブル生成処理を実行することにより、アセンブリプログラム20のスケジューリングテーブルTBを生成する。
次に、図9のステップS20の実行サイクル数比較処理について説明する。
図23は、本実施形態に係る実行サイクル数比較処理のフローチャートである。
まず、比較部41が、元のアセンブリプログラム20の命令列の実行サイクル数を特定する(ステップS51)。図5の例では、その実行サイクル数は11である。
次に、比較部41が、第2の出力アセンブリプログラム22の命令列の実行サイクル数を特定する(ステップS52)。図7の例では、その実行サイクル数は7である。
次いで、比較部41が、第2の出力アセンブリプログラム22の命令列の実行サイクル数が、元のアセンブリプログラム20の命令列の実行サイクル数よりも減ったかを判定する(ステップS53)。一例として、比較部41は、元のアセンブリプログラム20と第2の出力アセンブリプログラム22の各々の命令列の実行サイクル数を比較し、後者の実行サイクル数が前者の実行サイクル数よりも減ったかを判定する。
ここで、実行サイクル数が減ったと判定された場合(ステップS53:肯定)は、比較部41が、第2の出力アセンブリプログラム22の採用を決定する(ステップS54)。
一方、実行サイクル数が減っていないと判定された場合(ステップS53:否定)は、比較部41が、元のアセンブリプログラム20の採用を決定する(ステップS55)。
以上により、実行サイクル数比較処理の基本ステップを終える。
上記した本実施形態によれば、図9のステップS15において、配置部36が、第1の命令の「ldrsw x9,[x0,x8,lsl#2]」と依存関係がない第2の命令の「fmul d2,d3,d0」を、命令「ldrsw x9,[x0,x8,lsl#2]」の次に配置する。そして、これにより得られた第1の出力アセンブリプログラム21をコンパイル部39がコンパイルして第2の出力アセンブリプログラム22を生成する。
その第2の出力アセンブリプログラム22においては、上記のように命令「ldrsw x9,[x0,x8,lsl#2]」の次に命令「fmul d2,d3,d0」を配置したことで、図7のようにこれらの命令の実行時間同士が重なる。これによりプログラム全体の実行サイクル数が低減し、プログラムの実行速度を高速化することができる。
しかも、図23の実行サイクル数比較処理においては、元のアセンブリプログラム20と第2の出力アセンブリプログラム22の各々の命令列の実行サイクル数を比較し、後者の実行サイクル数が前者よりも減ったかを判定する。そして、実行サイクル数が減ったと判定された場合にステップS54で第2の出力アセンブリプログラム22の採用を決定することで、処理前と比較して高速なプログラムを得ることができる。
次に、本実施形態に係る情報処理装置のハードウェア構成について説明する。
図24は、本実施形態に係る情報処理装置のハードウェア構成図である。
図24に示すように、情報処理装置30は、記憶装置30a、メモリ30b、プロセッサ30c、通信インターフェース30d、表示装置30e、及び入力装置30fを有する。これらの各部は、バス30gにより相互に接続される。
このうち、記憶装置30aは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージであって、本実施形態に係るコンパイラプログラム50を記憶する。
なお、コンパイラプログラム50をコンピュータが読み取り可能な記録媒体30hに記録させておき、プロセッサ30cに記録媒体30hのコンパイラプログラム50を読み取らせるようにしてもよい。
そのような記録媒体30hとしては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、及びUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体30hとして使用してもよい。これらの記録媒体30hは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
更に、公衆回線、インターネット、及びLAN(Local Area Network)等に接続された装置にコンパイラプログラム50を記憶させてもよい。その場合は、プロセッサ30cがそのコンパイラプログラム50を読み出して実行すればよい。
一方、メモリ30bは、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上にコンパイラプログラム50が展開される。
プロセッサ30cは、情報処理装置30の各部を制御するCPU(Central Processing Unit)やGPU(Graphical Processing Unit)等のハードウェアである。そのプロセッサ30cがメモリ30bと協働してコンパイラプログラム50を実行することにより図8の制御部33が実現される。
図8に示したように、その制御部33には、取得部34、抽出部35、配置部36、追加部37、プログラム生成部38、コンパイル部39、テーブル生成部40、及び比較部41の各部が含まれる。また、図8の記憶部32は、記憶装置30aとメモリ30bにより実現される。
更に、通信インターフェース30dは、情報処理装置30をLAN等のネットワークに接続するためのNIC(Network Interface Card)等のハードウェアである。その通信インターフェース30dにより図8の通信部31が実現される。
そして、表示装置30eは、開発者に種々の情報を表示するための液晶表示装置等のハードウェアである。また、入力装置30fは、キーボードやマウス等のハードウェアである。例えば、開発者は、入力装置30fを操作することにより、情報処理装置30に対して種々の指示を出すことになる。
1…ターゲットプロセッサ、2…計算コア、3…L2キャッシュ、4…DMAコントローラ、5…メモリインターフェース、6…バスブリッジ、7…周辺回路、10…メインメモリ、11…ロード命令実行回路、12…ストア命令実行回路、13…整数演算実行回路、14…浮動小数演算実行回路、15…L1キャッシュ、16…バス、18…ハードウェアテーブル、19…レイテンシテーブル、20…アセンブリプログラム、20a…命令列、21…第1の出力アセンブリプログラム、22…第2の出力アセンブリプログラム、23…スケジューリングテーブル、30…情報処理装置、30a…記憶装置、30b…メモリ、30c…プロセッサ、30d…通信インターフェース、30e…表示装置、30f…入力装置、30g…バス、30h…記録媒体、31…通信部、32…記憶部、33…制御部、34…取得部、35…抽出部、36…配置部、37…追加部、38…プログラム生成部、39…コンパイル部、40…テーブル生成部、41…比較部、50…コンパイラプログラム。
Claims (5)
- ループ処理に含まれる命令列を取得する取得部と、
前記命令列のうちの第1の命令と依存関係がない第2の命令を前記命令列から抽出する抽出部と、
前記命令列において、前記第1の命令の次に前記第2の命令を配置する配置部と、
を有することを特徴とする情報処理装置。 - 前記命令列の前にバリア命令を追加する追加部を更に有することを特徴とする請求項1に記載の情報処理装置。
- 前記第1の命令を実行する第1の実行回路は、前記第2の命令を実行する第2の実行回路と異なることを特徴とする請求項1に記載の情報処理装置。
- 取得した前記命令列の実行サイクル数と、前記第1の命令の次に前記第2の命令を配置した命令列の実行サイクル数とを比較する比較部を更に有することを特徴とする請求項1に記載の情報処理装置。
- コンピュータに、
ループ処理に含まれる命令列を取得し、
前記命令列のうちの第1の命令と依存関係がない第2の命令を前記命令列から抽出し、
前記命令列において、前記第1の命令の次に前記第2の命令を配置する、
処理を実行させるためのコンパイラプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2020051212A JP2021149807A (ja) | 2020-03-23 | 2020-03-23 | 情報処理装置及びコンパイラプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2020051212A JP2021149807A (ja) | 2020-03-23 | 2020-03-23 | 情報処理装置及びコンパイラプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2021149807A true JP2021149807A (ja) | 2021-09-27 |
Family
ID=77849053
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2020051212A Pending JP2021149807A (ja) | 2020-03-23 | 2020-03-23 | 情報処理装置及びコンパイラプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2021149807A (ja) |
-
2020
- 2020-03-23 JP JP2020051212A patent/JP2021149807A/ja active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7458069B2 (en) | System and method for fusing instructions | |
TWI567751B (zh) | 多暫存器記憶體存取指令、處理器、方法及系統 | |
TWI644208B (zh) | 藉由對硬體資源之限制實現的向後相容性 | |
TW201704991A (zh) | 藉由演算法匹配、停用特徵或限制效能之回溯相容性 | |
JP5748800B2 (ja) | ループバッファのパッキング | |
US20140215187A1 (en) | Solution to divergent branches in a simd core using hardware pointers | |
JP2010532063A (ja) | 条件命令を無条件命令および選択命令へと拡張する方法およびシステム | |
JP2000112758A (ja) | 投機的実行中に発生する例外を遅延させるシステム及び方法 | |
JP6245031B2 (ja) | コンパイルプログラム、コンパイル方法およびコンパイル装置 | |
EP2951682B1 (en) | Hardware and software solutions to divergent branches in a parallel pipeline | |
TW201419141A (zh) | 用於執行推測式述詞指令之機制 | |
US9342334B2 (en) | Simulating vector execution | |
US5119324A (en) | Apparatus and method for performing arithmetic functions in a computer system | |
US5053986A (en) | Circuit for preservation of sign information in operations for comparison of the absolute value of operands | |
JP2620511B2 (ja) | データ・プロセッサ | |
US8549266B2 (en) | System and method of instruction modification | |
JP2007532990A (ja) | ヘルパーサブスレッドを含むスレッドの実行の明示的ソフトウェア制御のための方法及び構造 | |
JP2001142699A (ja) | パイプラインプロセッサにおける命令データの転送メカニズム | |
JP2874351B2 (ja) | 並列パイプライン命令処理装置 | |
US11422821B1 (en) | Age tracking for independent pipelines | |
JP2021149807A (ja) | 情報処理装置及びコンパイラプログラム | |
US6829700B2 (en) | Circuit and method for supporting misaligned accesses in the presence of speculative load instructions | |
TWI238352B (en) | Register move operations | |
US20230195517A1 (en) | Multi-Cycle Scheduler with Speculative Picking of Micro-Operations | |
Ge et al. | A vector coprocessor architecture for embedded systems |