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

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

Info

Publication number
JP6547466B2
JP6547466B2 JP2015135456A JP2015135456A JP6547466B2 JP 6547466 B2 JP6547466 B2 JP 6547466B2 JP 2015135456 A JP2015135456 A JP 2015135456A JP 2015135456 A JP2015135456 A JP 2015135456A JP 6547466 B2 JP6547466 B2 JP 6547466B2
Authority
JP
Japan
Prior art keywords
instruction
instruction sequence
integer
loop
unit
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
JP2015135456A
Other languages
English (en)
Other versions
JP2017016570A (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
Priority to JP2015135456A priority Critical patent/JP6547466B2/ja
Publication of JP2017016570A publication Critical patent/JP2017016570A/ja
Application granted granted Critical
Publication of JP6547466B2 publication Critical patent/JP6547466B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Description

本発明は、コンパイラ装置、コンパイル方法およびコンパイラプログラムに関する。
近年のプロセッサは、入力された命令を実行する演算器を複数有することで、複数の命令を並列に実行するスーパースカラを実現している。また、近年のプロセッサは、命令間に依存関係および分岐命令が無い場合、命令の順番を入れ替えて実行可能なアウトオブオーダーを実現している。演算器は、整数演算を実行する整数演算器および浮動小数点演算を実行する浮動小数点演算器を含む。すなわち、整数演算を行う整数命令は整数演算器で実行され、浮動小数点演算を行う浮動小数点命令は浮動小数点演算器で実行される。
特開平4−307624号公報 特開平11−110215号公報
そのため、プロセッサによって実行されるオブジェクトに含まれる整数命令および浮動小数点命令の割合に偏りがあると、整数演算器および浮動小数点演算器のうちの一方の演算器に処理が集中する虞がある。その結果、他方の演算器は効率的に使用されない虞がある。そこで、開示の技術の1つの側面は、プロセッサの有する演算器を効率的に使用できるオブジェクトを生成可能なコンパイラ装置を提供することを課題とする。
開示の技術の1つの側面は、次のようなコンパイラ装置によって例示される。本コンパイラ装置は、抽出部、第1の生成部、第2の生成部および第3の生成部を備える。抽出部は、入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、繰り返し命令によって繰り返される命令列を抽出する。第1の生成部は、抽出された命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成する。第2の生成部は、抽出された命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成する。第3の生成部は、ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、整数命令列と浮動小数点命令列とを含む出力命令列を生成する。
本コンパイラ装置は、プロセッサの有する演算器を効率的に使用できるオブジェクトを生成することができる。
図1は、情報処理装置のハードウェア構成を例示する図である。 図2は、情報処理装置が有するプロセッサの構成の一例を示す図である。 図3は、中間コードの一例を示す図である。 図4は、ブロックと命令の関係の一例を示す図である。 図5は、ループの命令列の一例を示す図である。 図6は、ループ展開後の命令列の一例を示す図である。 図7は、プロセッサに入力される命令列に含まれる各命令が複数の演算器で実行される処理の一例を示す図である。 図8は、命令列に含まれる各命令を複数の演算器で分散して実行している状態の一例を示す図である。 図9は、命令列に含まれる各命令の実行がひとつの演算器に集中した状態の一例を示す図である。 図10は、プログラムをコンパイルする処理の流れの一例を示す図である。 図11は、コンパイルおよびコンパイル後のプログラムの実行の一例を示す図である。 図12は、第1実施形態に係るコンパイラ装置の処理ブロックの一例を示す図である。 図13は、コンパイラ装置に入力されるループの命令列の一例を示す図である。 図14は、ループ展開に適さないソースファイルの一例を示す図である。 図15は、第1実施形態に係るコンパイラ装置によるループ展開処理の流れの一例を示す図である。 図16は、ループの構造の一例を示す図である。 図17は、第1実施形態で入力されるループの命令列の一例を示す図である。 図18は、図15のF4およびF5の処理の詳細な流れの一例を示す図である。 図19は、FU変換テーブルの一例を示す図である。 図20は、IU変換テーブルの一例を示す図である。 図21は、入力されたループ演算命令列に含まれる各命令の整数命令への変換前後の対応の一例を示す図である。 図22は、入力されたループ演算命令列に含まれる各命令の浮動小数点演算命令への変換前後の対応の一例を示す図である。 図23は、ループ演算命令列の展開処理の一例を示す図である。 図24は、仮想レジスタマップの一例を示す図である。 図25は、参照リストオペランドにおける仮想レジスタの変換処理の一例を示す図である。 図26は、メモリオペランドのループ展開前後の対応の一例を示す図である。 図27は、各展開番号におけるメモリオペランドの変換を例示する図である。 図28は、定義リストオペランドにおける仮想レジスタオペランドの変換処理の一例を示す図である。 図29は、出力ループ命令列格納部に格納された命令列の一例を示す図である。 図30は、回転数が補正されたループ命令列の一例を示す図である。 図31は、ループ展開後のループの命令列の一例を示す図である。 図32は、命令列が実行された場合の演算器の使用状況の一例を示す図である。 図33は、命令列が実行された場合の演算器の使用状況の一例を示す図である。 図34は、第1比較例に係るコンパイラ装置のループ展開を行う処理ブロックの一例である。 図35は、ループの命令列を疑似的に例示する図である。 図36は、図35に例示されるループが第1比較例に係るコンパイラ装置によってループ展開された命令列の一例を示す図である。 図37は、第2比較例によるループ展開を模式的に例示する図である。 図38は、図37を疑似コードによって例示する図である。 図39は、第1比較例によるループ展開と第1実施形態によるループ展開とを比較する図の一例である。 図40は、コンパイラに入力されるソースファイルに含まれるループの一例を示す図である。 図41は、図40に例示されたループを第1比較例によるループ展開を行った命令列の一例を示す図である。 図42は、図40に例示されたループに対して第1実施形態によるループ展開を行った命令列の一例を示す図である。 図43は、回帰演算の一例を示す図である。 図44は、参照オペランドと定義オペランドを含む命令の一例を示す図である。 図45は、コンパイラ装置に入力されるループの命令列の一例を示す図である。 図46は、図45で例示されたループ展開後の命令列を中間コードで表現した命令列の一例を示す図である。 図47は、第1変形例に係るコンパイラ装置によるループ展開処理の流れの一例を示す図である。 図48は、図47のR1およびR2の処理の詳細な流れの一例を示す図である。 図49は、回帰演算用の初期化処理を示す図の一例である。 図50は、ループ演算命令列の展開処理の一例を示す図である。 図51は、回帰演算命令の一例を示す図である。 図52は、回帰演算命令の書き換え処理の一例を示す図である。 図53は、回帰演算命令の書き換え処理の一例を示す図である。 図54は、回帰演算命令の書き換え処理の一例を示す図である。 図55は、回帰演算命令の書き換え処理の一例を示す図である。 図56は、回帰演算命令の書き換え処理の一例を示す図である。 図57は、ループ展開後のループ演算命令列の一例を示す図である。 図58は、ループ展開後の初期化命令列の一例を示す図である。 図59は、ループ展開後の収束命令列の一例を示す図である。 図60は、ループ展開後のループ命令列の一例を示す図である。 図61は、ループ展開後のループの命令列の一例を示す図である。
以下、図面を参照して、一実施形態に係るコンパイラ装置について説明する。以下に示す実施形態の構成は例示であり、開示の技術は実施形態の構成に限定されない。
<第1実施形態>
図1は、情報処理装置100のハードウェア構成を例示する図である。情報処理装置100は、プロセッサ101、主記憶部102、補助記憶部103、通信部104および接続バスB1を含む。プロセッサ101、主記憶部102、補助記憶部103および通信部104は、接続バスB1によって相互に接続されている。情報処理装置100は、例えば、第1実施形態に係るコンパイラ装置10として使用できる。コンパイラ装置10は、入力されたプログラムのソースファイルをコンパイルすることでプロセッサによって実行可能なオブジェクトを生成する。
情報処理装置100では、プロセッサ101が補助記憶部103に記憶されたプログラ
ムを主記憶部102の作業領域に展開し、プログラムの実行を通じて周辺装置の制御を行う。これにより、情報処理装置100は、所定の目的に合致した処理を実行することができる。主記憶部102および補助記憶部103は、情報処理装置100が読み取り可能な記録媒体である。
主記憶部102は、プロセッサ101から直接アクセスされる記憶部として例示される。主記憶部102は、Random Access Memory(RAM)およびRead Only Memory(ROM)を含む。
補助記憶部103は、各種のプログラムおよび各種のデータを読み書き自在に記録媒体に格納する。補助記憶部103は外部記憶装置とも呼ばれる。補助記憶部103には、オペレーティングシステム(Operating System、OS)、各種プログラム、各種テーブル等が格納される。OSは、通信部104を介して接続される外部装置等とのデータの受け渡しを行う通信インターフェースプログラムを含む。外部装置等には、例えば、コンピュータネットワーク等で接続された、他の情報処理装置および外部記憶装置が含まれる。なお、補助記憶部103は、例えば、ネットワーク上のコンピュータ群であるクラウドシステムの一部であってもよい。
補助記憶部103は、例えば、Erasable Programmable ROM(EPROM)、ソリッド
ステートドライブ(Solid State Drive、SSD)、ハードディスクドライブ(Hard Disk
Drive、HDD)等である。また、補助記憶部103は、例えば、Compact Disc(CD)ドライブ装置、Digital Versatile Disc(DVD)ドライブ装置、Blu-ray(登録商標) Disc(BD)ドライブ装置等である。また、補助記憶部103は、Network Attached Storage(NAS)あるいはStorage Area Network(SAN)によって提供されてもよい。
情報処理装置100が読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、情報処理装置100から読み取ることができる記録媒体をいう。このような記録媒体のうち情報処理装置100から取り外し可能なものとしては、例えばフレキシブルディスク、光磁気ディスク、CD−ROM、CD−R/W、DVD、ブルーレイディスク、DAT、8mmテープ、フラッシュメモリなどのメモリカード等がある。また、情報処理装置100に固定された記録媒体としてハードディスク、SSDあるいはROM等がある。
通信部104は、例えば、コンピュータネットワークとのインターフェースである。通信部104は、コンピュータネットワークを介して外部の装置と通信を行う。
情報処理装置100は、例えば、ユーザ等からの操作指示等を受け付ける入力部をさらに備えてもよい。このような入力部として、キーボード、ポインティングデバイス、タッチパネル、加速度センサーあるいは音声入力装置といった入力デバイスを例示できる。
情報処理装置100は、例えば、プロセッサ101で処理されるデータや主記憶部102に記憶されるデータを出力する出力部を備えるものとしてもよい。このような、出力部として、Cathode Ray Tube(CRT)ディスプレイ、Liquid Crystal Display(LCD)、Plasma Display Panel(PDP)、Electroluminescence(EL)パネル、有機ELパ
ネルあるいはプリンタといった出力デバイスを例示できる。
図2は、情報処理装置100が有するプロセッサ101の構成の一例を示す図である。プロセッサ101は、1つの整数演算器101aおよび2つの浮動小数点演算器101b、101bを有する。整数演算器101aは、整数演算を実行する演算器である。浮動小数点演算器101b、101bは、浮動小数点演算を実行する演算器である。プロセッサ
101は、複数の演算器を有することで、複数の命令を並列に実行可能である。なお、図中では、整数演算器101aは「IU」と記載され、浮動小数点演算器101bは「FU」と記載されている。
ここで、コンパイラ装置10内部での命令の表現である中間コードについて説明する。図3は、中間コードの一例を示す図である。図3を参照して、中間コードについて説明する。
図3に例示される「ld」、「mult」および「st」は、中間コードによって表記された命令コードの一例である。命令コードには整数型の整数命令と浮動小数点型の浮動小数点命令の2種類の型がある。整数命令は、整数演算を行う。浮動小数点命令は、浮動小数点演算を行う。すなわち、整数命令は整数演算器101aで実行され、浮動小数点命令は浮動小数点演算器101bで実行される。図3に例示される「ld」、「mult」および「st」は、いずれも整数命令の例示である。命令に続いて記載されている「[a+$g1], $g2」、「$g2, 5, $g3」および「$g3, [b+$g1]」は、命令に渡される引数でありオペランドと称され
る。オペランドは、例えば、カンマ(,)で区切ることで複数指定できる。オペランドに
は、仮想レジスタ、メモリオペランドおよび定数等が指定される。整数命令には、整数型のオペランドが指定される。浮動小数点命令には、浮動小数点型のオペランドが指定される。
仮想レジスタは、中間コードで用いられる仮想的なレジスタである。図3では、「$g1
」、「$g2」および「$g3」が仮想レジスタの例示である。仮想レジスタは、ソースファイルがコンパイラ装置10によってコンパイルされる際に割り付けられるコンパイラ内部での仮想的なレジスタである。仮想レジスタは、整数を扱う整数型の仮想レジスタと浮動小数点数を扱う浮動小数点型の仮想レジスタとがある。本明細書では、整数型をint型、浮
動小数点型をfloat型とも称する。int型の仮想レジスタは、仮想レジスタ名「$g」と仮想レジスタ番号である数字との組み合わせで特定される。float型の仮想レジスタは、仮想
レジスタ名「$f」と仮想レジスタ番号である数字との組み合わせで特定される。int型お
よびfloat型のいずれの仮想レジスタも、仮想レジスタ番号は1から始まり、新しい仮想
レジスタが作成されるたびに仮想レジスタ番号が1ずつ増加する。
メモリオペランドは、アドレス定数、仮想レジスタおよびオフセットによって特定される。図3では、「[a+$g1]」および「[b+$g1]」がメモリオペランドの例示である。アドレス定数は、アドレスを指し示すラベルとしての文字列によって特定される。図3では、「[a+$g1]」の「a」および「[b+$g1]」の「b」がアドレス定数である。オフセットは、アドレス定数および仮想レジスタによって指定されたアドレスからの距離を示す数値である。図3では、「[a+$g1]」および「[b+$g1]」のいずれもオフセットは「0」となっている。すなわち、図3に例示される「[a+$g1]」は、アドレス定数「a」によって示されるアドレスと仮想レジスタ「$g1」の値が加算されたアドレスのメモリを特定している。また、図
3に例示される「[b+$g1]」は、アドレス定数「b」によって示されるアドレスと仮想レジスタ「$g1」の値が加算されたアドレスのメモリを特定している。
図3の「label」は、ブロックの先頭位置を示すラベルである。ブロックは、複数の命
令を含む。分岐命令またはジャンプ命令では、ラベルが指定されることで、ブロックの先頭に処理が進められる。基本ブロックとは、ブロック内に分岐を含まないブロックである。基本ブロックは分岐を含まないため、基本ブロック内の最初の命令が実行されると途中で分岐することなく最後の命令まで実行される。
図4は、ブロックと命令の関係の一例を示す図である。図4では、図3に例示された命令列に基づいて、ブロックと命令の関係の一例を示している。最初の「ld」命令では、ア
ドレス定数「a」が指し示す値と仮想レジスタ「$g1」に格納された値との和によって示されるアドレスで特定されるメモリの値が、仮想レジスタ「$g2」に読み込まれる。次の「mult」命令では、仮想レジスタ「$g2」に読み込まれた値と数字の「5」との乗算の結果が
、仮想レジスタ「$g3」に格納される。最後の「st」命令では、仮想レジスタ「$g3」に格納された値が、アドレス定数「b」と仮想レジスタ「$g1」との和によって示されるアドレスで特定されるメモリ上に格納される。
図5は、ループの命令列の一例を示す図である。ループの命令列は、初期化命令列、ループ演算命令列およびループ命令列を含む。初期化命令列は、ループの初期化を行う。ループの初期化は、ループに用いられるループカウンタの初期化を含む。図5では、ループカウンタとして指定した仮想レジスタ「$g1」に0を代入することで、ループカウンタの
初期化を行っている。ラベル「Label」は、ループ演算命令列の先頭位置を特定する。ル
ープ演算命令列は、ループによって繰り返し実行される命令を含む。ループ命令列は、加算命令または減算命令と比較分岐命令とを含む。ループ命令列における加算命令または減算命令は、加算または減算によってループカウンタの数値を変更する。図5では、加算命令「add」によって、ループカウンタ「$g1」に「4」を加算している。比較分岐命令は、指定された条件にしたがって、処理を分岐させる。図7では、ループカウンタ「$g1」の
値が「90×4」未満の場合、ラベル「Label」によって特定されるループ演算命令列の
先頭位置に処理が進められる。すなわち、ループは、初期化命令列およびループ命令列によって指定された条件にしたがって、ループ演算命令列の命令を繰り返し実行する。また、ループ演算命令列が基本ブロックである場合、当該ループを最内ループと称する。
図6は、ループ展開後の命令列の一例を示す図である。図6は、図5に例示されたループの命令列をループ展開した命令列の一例である。ループ展開は、ループアンローリングとも称する。ループ展開では、ループ演算命令列の命令を展開することで、ループの回転数を減少させる。図6では、図5に例示されたループ演算命令列の3回転分が1回のループで実行されるようにループ展開されている。展開後の1回のループで実行される、展開前のループ演算命令列の数をループの展開数と称する。図6の場合、展開数は「3」となる。すなわち、ループ展開によって、ループの回転数が減少し、1回のループで実行される命令列の数が増加する。図6に例示されるA、B、Cのそれぞれが、図5に例示されたループ命令列のループ1回転分の命令列に相当する。A、B、Cそれぞれによって例示される命令列には、この並び順に展開番号が割り当てられる。すなわち、Aに例示される命令列の展開番号は1であり、Bに例示される命令列の展開番号は2であり、Cに例示される命令列の展開番号は3である。例えば、変換後のメモリオペランドのオフセット値は、変換前のオフセット値に(展開番号−1)の値を乗算することで算出する事が可能である。例えば、図5に例示される変換前の命令列では、加算命令によって、1回転ごとに仮想レジスタ「$g1」の値が「4」加算されている。したがって、図6に例示されるループ展
開後の命令列では、例えば、Bの命令列(展開番号2)のメモリオペランドでは、「(2−1)×4=4」のオフセット値が加算されている。また、ループ展開に伴い、ループ命令列におけるループカウンタの1回転当たりの増分が補正されている。図6に例示されるループでは展開数が「3」であるため、ループ命令列における加算命令ではループカウンタ「$g1」に「4×3」が加算されている。ループ展開を行う事で、A、B、Cによって
例示される各命令列の間の分岐命令を排除できる。分岐命令が排除された結果、A、B、Cによって例示される各命令列を複数の演算器で並列して実行可能となる。したがって、ループ展開により、命令の並列実行の効率を高めることが可能である。
図7は、プロセッサ101に入力される命令列に含まれる各命令が複数の演算器で実行される処理の一例を示す図である。図7において、FU0は浮動小数点演算器101bの一方に対応し、FU1は浮動小数点演算器101bの他方に対応する。また、IU0は、整数演算器101aに対応する。図7では、第1サイクルから第3サイクルまでの処理が
例示されている。図7の命令列に含まれる命令「fadd」は、浮動小数点命令の一例である。浮動小数点命令である「fadd」は、浮動小数点演算器101bであるFU0またはFU1によって実行される。その結果、第1サイクルでは、命令列の1行目に記載の「fadd $f0,$f1,$f2」がFU0で実行され、命令列の2行目に記載の「fadd $f3,$f4,$f5」はFU1で実行される。第2サイクルでは、命令列の3行目に記載の「fadd $f6,$f7,$f8」がFU0で実行され、命令列の4行目に記載の「fadd $f9,$f10,$f11」はFU1で実行される。第3サイクルでは、命令列の5行目に記載の「fadd $f12,$f13,$f14」がFU0で実行
される。なお、この命令列には、整数命令は含まれていない。そのため、整数命令を実行する整数演算器101bであるIU0は、図7の命令列をプロセッサ101で実行している間、処理を行っていない。
図8は、命令列に含まれる各命令を複数の演算器で分散して実行している状態の一例を示す図である。図8では、第1サイクルから第3サイクルまでの処理が例示されている。図8の命令列に含まれる命令「add」は整数命令の一例である。整数命令である「add」は、整数演算器101bであるIU0によって実行される。その結果、第1サイクルでは、命令列の1行目に記載の「fadd $f0,$f1,$f2」がFU0で実行され、命令列の2行目に記載の「fadd $f3,$f4,$f5」はFU1で実行され、命令列の3行目に記載の「add $g0,$g1,$g2」は、IU0で実行される。第2サイクルでは、命令列の4行目に記載の「fadd $f6,$f7,$f8」がFU0で実行され、命令列の5行目に記載の「fadd $f9,$f10,$f11」はFU
1で実行される。
図9は、命令列に含まれる各命令の実行がひとつの演算器に集中した状態の一例を示す図である。図9では、第1サイクルから第3サイクルまでの処理が例示されている。図9の命令列に含まれる命令は、全て整数命令である。そのため、図9の命令列に含まれる全ての命令は、整数演算器101bであるIU0で実行される。その結果、浮動小数点演算器であるFU0およびFU1は、図9に例示される命令列をプロセッサ101で実行している間、処理を行っていない。
図8および図9を対比するとわかるように、プロセッサ101に入力される命令列に含まれる命令が整数命令および浮動小数点命令の一方に偏っていると、プロセッサ101が有する演算器を有効に使用できない虞がある。
図10は、プログラムをコンパイルする処理の流れの一例を示す図である。プログラムのコンパイルはコンパイラ装置10によって実行される。T1では、コンパイラ装置10は、入力されたプログラムのソースファイルの構文解析を行う。構文解析では、ソースファイルがプログラミング言語の仕様と合致しているか否か解析される。T2では、コンパイラ装置10は、最適化を行う。最適化は、ループに含まれる命令を展開するループ展開を含む。T3では、コンパイラ装置10は、レジスタの割り付けを行う。ここでは、コンパイラ装置10は、仮想レジスタをプロセッサ101の有するレジスタに割り付ける。T4では、コンパイラ装置10は、命令のスケジューリングを行う。命令のスケジューリングでは、プロセッサ101の整数演算器101a、浮動小数点演算器101b、101bを効率的に使用できるように各命令の実行順が並べ替えられる。T5では、コンパイラ装置10は、プロセッサ101によって実行可能なコードを生成する。実行可能なコードは、オブジェクトとも称される。
図11は、コンパイルおよびコンパイル後のプログラムの実行の一例を示す図である。T11は、図10のT2に対応する。T11では、本実施形態において説明する最適化処理が行われる。T12およびT13は、それぞれ図10のT4およびT5に対応する処理である。T14では、コンパイルされたプログラムをプロセッサ101が実行する。プロセッサ101は、T13で生成された実行形式のオブジェクトの中から同時に実行可能な
命令を検出し、アウトオブオーダーおよびスーパースカラによって検出された命令を並列に実行する。
<コンパイラ装置10の処理ブロック>
図12は、第1実施形態に係るコンパイラ装置10の処理ブロックの一例を示す図である。図12では、最適化部200、中間コード部260、マシンモデル201、NFU数格納部202およびNIU数格納部203の各処理ブロックが例示されている。例えば、図1のプロセッサ101が図12の各処理ブロックとして主記憶部102に展開されたコンピュータプログラムを実行する。ただし、図12のいずれかの処理ブロックの少なくとも一部はハードウェア回路、専用のプロセッサまたはデジタルシグナルプロセッサ(Digital Signal Processor、DSP)を含んでもよい。
マシンモデル201には、プロセッサ種別毎の情報があらかじめ記憶される。マシンモデル201は、例えば、プロセッサ種別毎の整数演算器および浮動小数点演算器の数を記憶する。マシンモデル201は、「プロセッサ情報記憶部」の一例である。
最適化部200は、例えば、図10のT2に例示される最適化処理を行う。最適化部200は、演算器数取得部210、命令変換部220、命令展開部230を含む。演算器数取得部210は、プロセッサ101の有する演算器の数を取得する。演算器数取得部210は、整数演算器の数を取得するNIU取得部211および浮動小数点演算器の数を取得するNFU取得部212を有する。プロセッサ101は、NIU取得部211として、マシンモデル201を参照してプロセッサ101の有する整数演算器101aの数を取得する。NIU取得部211は、取得した整数演算器101aの数をNIU数格納部203に格納する。プロセッサ101は、NFU取得部202として、マシンモデル201を参照してプロセッサ101の有する浮動小数点演算器101bの数を取得する。NFU取得部212は、取得した浮動小数点演算器101bの数をNFU数格納部202に格納する。演算器数取得部210は、「演算器数取得部」の一例である。
命令変換部220は、ループ演算命令列に含まれる整数命令および浮動小数点命令の数を算出する。さらに、命令変換部220は、整数命令を浮動小数点命令に、浮動小数点命令を整数命令に変換する。命令変換部220は、IU命令変換部221およびFU命令変換部222を有する。プロセッサ101は、IU命令変換部221として、ループ演算命令列格納部261に格納されたループ演算命令列に含まれる命令を整数命令に変換する。IU命令変換部221は、整数命令に変換した命令をIU変換命令列格納部263に格納する。プロセッサ101は、FU命令変換部222として、ループ演算命令列格納部261に格納されたループ演算命令列に含まれる命令を浮動小数点命令に変換する。FU命令変換部222は、浮動小数点命令に変換した命令をFU変換命令列格納部262に格納する。命令変換部220は、「抽出部」の一例である。
命令展開部230は、ループの命令列に含まれるループ演算命令列を展開する。命令展開部230は、IU命令展開部231およびFU命令展開部232を有する。プロセッサ101は、IU命令展開部231として、IU命令変換部221によって整数命令に変換されたループ演算命令列を展開する。プロセッサ101は、FU命令展開部232として、FU命令変換部222によって浮動小数点命令に変換されたループ演算命令列を展開する。IU命令展開部231は、「第1の生成部」の一例である。FU命令展開部232は、「第2の生成部」の一例である。命令展開部230は、「第3の生成部」の一例である。
ループ命令補正部240は、命令展開部230によるループ展開に伴うループ命令の補正を行う。ループ命令補正部240は、例えば、ループ命令におけるループカウンタに加
算される数値を補正する。ループ命令補正部240は、「決定部」の一例である。
中間コード部260は、コンパイラ装置10に入力された中間コードが格納される。中間コード部260は、ループ演算命令列格納部261、FU変換命令列格納部262、IU変換命令列格納部263、FU出力命令列格納部264、IU出力命令列格納部265および出力命令列格納部266を有する。
ループ演算命令列格納部261には、コンパイラ装置10に入力されたソースファイルに含まれるループ演算命令列が格納される。FU変換命令列格納部262は、FU命令変換部222によって浮動小数点命令に変換された命令が記憶される。IU変換命令列格納部263は、IU命令変換部221によって整数命令に変換された命令が記憶される。FU出力命令列格納部264には、FU変換命令列格納部262に格納された命令が、NFU取得部212によって取得された浮動小数点演算器101bの数だけ追記される。IU出力命令列格納部265には、IU変換命令列格納部263に格納された命令が、NIU取得部211によって取得された整数演算器101aの数だけ、追記される。出力ループ命令列格納部266には、FU出力命令列格納部264およびIU出力命令列格納部265に格納された各命令列が追記される。
以上の構成を有するコンパイラ装置10によるコンパイルにおける最適化処理について、図面を参照して説明する。
図13は、コンパイラ装置10に入力されるループの命令列の一例を示す図である。図13の左側はループ展開される前のソースファイルの一例であり、図13の右側はループ展開後のソースファイルの一例である。コンパイラ装置10では、入力されたソースファイルに含まれるループの命令列が、ループ展開可能であるか否かを判定する。コンパイラ装置10は、ループ展開可能と判定されたループの命令列を展開する。図14は、ループ展開に適さないソースファイルの一例を示す図である。図14の左側はループ展開前のソースファイルの一例であり、図14の左側のソースファイルでは、「a[i+1]」と「a[i]」との間に依存関係がある。ここで、「i」は、ループカウンタである。すなわち、図14
に例示されるソースファイルでは、ループの回転間に依存関係がある。そのため、図14の左側に例示される命令「a[i+1]=b[i]*c[i]+a[i];」と「a[i+2]=[b[i+1]*c[i+1]+a[i+1];」とは、並行して実行する事が出来ない。そのため、ループの回転間に依存関係がある
場合、第1実施形態のコンパイラ装置10は、ループ展開の対象外とすることができる。
図15は、第1実施形態に係るコンパイラ装置10によるループ展開処理の流れの一例を示す図である。図15を参照して、ループ展開処理について説明する。
F1では、コンパイラ装置10は、入力されたソースファイルの中から最内ループを検出する。コンパイラ装置10は、検出された最内ループの命令列の中から、ループ演算命令列を抽出する。最内ループの検出には、公知の様々な方法が適用可能である。
図16は、ループの構造の一例を示す図である。前述のとおり、ループは、初期化命令列によってループカウンタが初期化され、ラベルとループ命令列によってループ演算命令列の各命令が繰り返し実行される。すなわち、コンパイラ装置10は、例えば、ラベルおよびループ命令列によって挟まれたブロックを検出することで、ソースファイルからループを検出する事が可能である。
図17は、第1実施形態で入力されるループの命令列の一例を示す図である。図17に例示される命令列は、中間コードで表現されている。図17に例示される命令列では、ラベル「Label0」とループ命令列とによっと挟まれたループ演算命令列が繰り返し実行され
る。以降の説明では、図17に例示した命令列を対象に処理がなされる。
図15に戻り、F2では、命令変換部220は、抽出されたループ演算命令列に含まれる整数命令の数と浮動小数点命令の数を算出する。F3では、命令変換部220は、ループ演算命令列に含まれる整数命令または浮動小数点命令の数に偏りがあるか否かを判定する。偏りがあるか否かは、例えば、「ループ演算命令列に含まれる浮動小数点命令の数をループ演算命令列で割った値」または「ループ演算命令列に含まれる整数命令の数をループ演算命令列で割った値」のいずれかが、所定値以上であるか否かで判定可能である。所定値は、例えば、プロセッサ101の有する整数演算器101aおよび浮動小数点演算器101bの数に基づいて決定される値である。決定された所定値は、マシンモデル201に記憶される。所定値は、例えば、「0.9」である。整数命令または浮動小数点命令の数に偏りがあると判定された場合(F3でYES)、処理はF4およびF5に進められる。整数命令または浮動小数点命令の数に偏りがないと判定された場合(F3でNO)、処理は終了となる。
F4では、FU命令変換部222は、F1で抽出されたループ演算命令列に含まれる命令を浮動小数点命令に変換し、FU変換命令列格納部262に格納する。F5では、IU命令変換部221は、F1で抽出されたループ演算命令列に含まれる命令を整数命令に変換し、IU変換命令列格納部263に格納する。
図18は、図15のF4およびF5の処理の詳細な流れの一例を示す図である。以下、図18を参照して、図15のF4およびF5の処理について説明する。
G1では、命令変換部220は、結果リストを作成する。結果リストは、変換処理中の命令列を一時的に格納するリストであり、例えば、主記憶部102に用意される。G2では、命令変換部220は、ループ演算命令列の先頭から順番に命令を取り出す。G3では、命令変換部220は、取り出した命令を複製する。取り出された命令は、例えば、主記憶部102に複製される。複製された命令を、ここでは、命令Aと称する。G3の処理は、入力された命令列がコンパイラ装置10の誤動作等で破壊されることを抑制するために実施される。G4では、命令変換部220は、命令Aを結果リストに追加する。G5では、命令変換部220は、命令Aの命令コードを取り出す。G6では、命令変換部220は、整数命令への変換または浮動小数点命令への変換のいずれを実行するか判定する。図15のF4の処理の場合、浮動小数点命令への変換処理のため、処理はG7に進められる。図15のF5の処理の場合、整数命令への変換のため、処理はG8に進められる。
G7では、FU命令変換部222は、FU変換テーブルを参照して、変換後の命令コードと命令の型を取り出す。図19は、FU変換テーブル301の一例を示す図である。FU変換テーブル301は、浮動小数点命令を整数命令に変換する場合の、変換前後の命令の対応を示すテーブルである。FU変換テーブル301は、例えば、図1の主記憶部102または補助記憶部103に記憶される。図19では、変換前の命令コードおよび命令の型と変換後の命令コードと命令の型とが例示されている。図19を参照すると、変換前にint型である命令は、float型の命令に変換されていることがわかる。また、変換前からfloat型である命令は、変換後もfloat型のままであることがわかる。図18のG7では、FU命令変換部222は、図19に例示されるFU変換テーブル301を参照して、命令Aを浮動小数点命令に変換した後の命令コードと命令の型とを取り出す。例えば、変換前の命令Aの命令コードが「mult」である場合、変換後の命令コードとして「fumult」、変換後の命令の型として「float」が取り出される。なお、「fuadd」および「fumult」は、浮動小数点演算器101bによって演算される整数命令であり、オペランドには、例えば、float型の仮想レジスタが指定される。すなわち、「fuadd」および「fumult」は、float
型の仮想レジスタに格納されたビット列を整数として扱って演算する。
G8では、IU命令変換部221は、IU変換テーブルを参照して、変換後の命令コードと命令の型を取り出す。図20は、IU変換テーブル302の一例を示す図である。IU変換テーブル302は、整数命令を浮動小数点命令に変換した場合の、変換前後の命令の対応を示すテーブルである。IU変換テーブル302は、例えば、図1の主記憶部102または補助記憶部103に記憶される。図20では、変換前の命令コードおよび命令の型と変換後の命令コードと命令の型とが例示されている。図20を参照すると、変換前にfloat型である命令は、int型の命令に変換されていることがわかる。また、変換前からint型である命令は、変換後もint型のままであることがわかる。図18のG8では、IU命令変換部221は、図20に例示されるIU変換テーブルを参照して、命令Aを整数命令に変換した後の命令コードと命令の型とを取り出す。例えば、変換前の命令Aの命令コードが「fmult」である場合、変換後の命令コードとして「iufmult」、変換後の命令の型として「int」が取り出させれる。なお、「iufadd」および「iufmult」は、整数演算器101aによって演算される浮動小数点命令であり、オペランドには、例えば、int型の仮想
レジスタが指定される。すなわち、「iufadd」および「iufmult」は、int型の仮想レジスタに格納されたビット列を浮動小数点数として扱って演算する。
図21は、入力されたループ演算命令列に含まれる各命令の整数命令への変換前後の対応の一例を示す図である。入力されたループ演算命令列では、全ての命令が整数命令である。そのため、整数命令への変換が実行されても命令コードおよび命令の型に変更はない。図22は、入力されたループ演算命令列に含まれる各命令の浮動小数点演算命令への変換前後の対応の一例を示す図である。変換前は全ての命令が整数命令であったが、変換後は全ての命令が浮動小数点命令になっていることがわかる。
図18に戻り、G9では、G7またはG8で変換された命令コードと命令の型が命令Aに設定される。すなわち、結果リストにおいて、G4で結果リストに追加された命令AがG7またはG8によって変換された命令コードと命令の型に書き換えられる。G10では、命令変換部220は、まだ変換していない命令がループ演算命令列に残っているか否かを判定する。ループ演算命令列に含まれる全ての命令の変換が完了した場合(G10でNO)、処理は終了する。まだ変換していない命令がループ演算命令列に残っている場合(G10でYES)、処理は、G2に進められる。
図15に戻り、F6では、NIU取得部211は、マシンモデル201を参照してプロセッサ101の有する整数演算器101aの数であるNIU数を取得する。また、NFU取得部212は、マシンモデル201を参照してプロセッサ101の有する浮動小数点演算器101bの数であるNFU数を取得する。ここでは、NIU数として「1」、NFU数として「2」が取得される。
F7では、FU命令展開部232は、FU変換命令列格納部262に格納された命令列を展開し、展開した命令列をFU出力命令列格納部264に格納する。F8では、IU命令展開部231は、IU変換命令列格納部263に格納された命令列を展開し、展開した命令列をIU出力命令列格納部265に格納する。F9では、F7の処理が、NFU回繰り返したか否か判定される。NFU回繰り返した場合(F9でYES)、処理は、F11に進められる。NFU回繰り返していない場合(F9でNO)、処理はF7に戻る。F10では、F8の処理が、NIU回繰り返したか否か判定される。NIU回繰り返した場合(F10でYES)、処理は、F11に進められる。NIU回繰り返していない場合(F10でNO)、処理はF8に戻る。
図23は、ループ演算命令列の展開処理の一例を示す図である。図23の処理は、図15のF7からF10の処理の詳細を示す図の一例である。図23を参照して、ループ演算
命令列の展開処理について説明する。
H1では、命令展開部230は、ループ展開の対象となるループ演算命令列の入力を受け付ける。命令展開部230は、入力されたループ演算命令列の参照リストオペランドに含まれる仮想レジスタを取り出し、仮想レジスタマップを作成する。
図24は、仮想レジスタマップの一例を示す図である。仮想レジスタマップは、ループ展開前の仮想レジスタとループ展開後の仮想レジスタとを対応付けるマップである。仮想レジスタマップでは、ループ展開前の仮想レジスタからループ展開後の仮想レジスタが1対1で対応付けられる。ループ展開後の仮想レジスタは、命令展開部230によって、新たに作成される。ループ展開前の仮想レジスタとループ展開後の仮想レジスタの対応は、例えば、ハッシュ関数によって対応付けられる。すなわち、仮想レジスタマップは、ハッシュテーブルとすることが可能である。
図23に戻り、H2では、命令展開部230は、入力されたループ演算命令列の先頭から順番に命令を取り出す。H3では、命令展開部230は、H2で取り出した命令の参照リストオペランドを順番に取り出す。H4では、命令展開部230は、H3で取り出したオペランドが仮想レジスタであるか否かを判定する。オペランドが仮想レジスタである場合(H4でYES)、処理はH5に進められる。オペランドが仮想レジスタでない場合(H4でNO)、処理はH6に進められる。H5では、命令展開部230は、H1で作成した仮想アドレスマップを基に、仮想レジスタの変換を行う。
図25は、参照リストオペランドにおける仮想レジスタの変換処理の一例を示す図である。J1では、命令展開部230は、図23のH1で作成した仮想レジスタマップを参照し、変換前の仮想レジスタに対応する変換後の仮想レジスタを取り出す。J2では、J1で取り出した変換後の仮想レジスタで変換前の仮想レジスタを書き換える。例えば、図24を参照すると、ループ展開前の仮想レジスタ「$g1」は、ループ展開後に「$f2」に変換される。この際、仮想レジスタ「$g1」に格納されていた値は、そのビット列を変更せず
に仮想レジスタ「$f2」に格納される。すなわち、J2の処理では、書き換え前の仮想レ
ジスタに格納されていた値の符号、仮数、基数および指数等の区別がされない。J2の処理では、書き換え前の仮想レジスタに格納されていたビット列をそのまま書き換え後の仮想レジスタに格納する。
図23に戻り、H6では、命令展開部230は、H3で取り出したオペランドがメモリのアドレスであるか否かを判定する。オペランドがメモリオペランドである場合(H6でYES)、処理はH7に進められる。オペランドがメモリオペランドでない場合(H6でNO)、処理はH8に進められる。H7では、命令展開部230は、オペランドとして指定されているメモリオペランドを変換する。
図26は、メモリオペランドのループ展開前後の対応の一例を示す図である。図26では、メモリオペランド「a+$g1」が「a+$g1+(展開番号―1)×($g1の増分値)」によって算出されることが例示されている。ここで、「$g1の増分値」は、展開前のループにお
ける1回転当たりの増分値のことである。すなわち、ループ命令列の加算命令によってループカウンタ「$g1」に加算される値であるともいえる。図27は、各展開番号における
メモリオペランドの変換を例示する図である。展開番号1では、メモリオペランド「a+$g1」が変換されると、「a+$g1+(1−1)×4」より、「a+$g1」となる。展開番号2では
、メモリオペランド「a+$g1」が変換されると、「a+$g1+(2−1)×4」より、「a+$g1+4」となる。展開番号3では、メモリオペランド「a+$g1」が変換されると、「a+$g1+(3−1)×4」より、「a+$g1+8」となる。この際、メモリオペランド「a+$g1」によって指
定される領域に格納されていた値は、そのビット列を変更せずにメモリオペランド「a+$g
1+8」によって指定される領域に格納される。すなわち、図26および図27の処理では
、書き換え前のメモリオペランドによって指定される領域に格納されていた値の符号、仮数、基数および指数等の区別がされない。図26および図27の処理では、書き換え前のメモリオペランドによって指定される領域に格納されていたビット列をそのまま書き換え後のメモリオペランドによって指定される領域に格納する。
図23に戻り、H8では、命令展開部230は、未処理の参照リストオペランドがあるか否かを判定する。未処理の参照リストオペランドがある場合(H8でYES)、処理はH3に進められる。未処理の参照リストオペランドが無い場合(H8でNO)、処理はH9に進められる。
H9では、命令展開部230は、定義リストオペランドを順番に取り出す。H10では、命令展開部230は、H9で取り出したオペランドが仮想レジスタであるか否かを判定する。オペランドが仮想レジスタである場合(H10でYES)、処理はH11に進められる。オペランドが仮想レジスタでない場合(H10でNO)、処理はH12に進められる。
図28は、定義リストオペランドにおける仮想レジスタオペランドの変換処理の一例を示す図である。図28は、図23のH11の処理の詳細を例示する図である。K1では、命令展開部230は、オペランドの変換対象となる命令の型がint型であるか否かを判定
する。int型である場合(K1でYES)、処理はK2に進められる。int型でない場合(K1でNO)、処理はK3に進められる。K2では、命令展開部230は、int型の仮想
レジスタを新規に作成する。K3では、命令展開部230は、float型の仮想レジスタを
新規に作成する。K4では、命令変換部230は、変換前のオペランドと、K3またはK4で作成した仮想レジスタとの対応を仮想レジスタマップに追加する。K5では、命令展開部230は、オペランドをK3またはK4によって作成した仮想レジスタに変換する。この際、変換前の仮想レジスタに格納されていた値は、そのビット列を変更せずに変換後の仮想レジスタに格納される。すなわち、K5の処理では、書き換え前の仮想レジスタに格納されていた値の符号、仮数、基数および指数等の区別がされない。K5の処理では、書き換え前の仮想レジスタに格納されていたビット列をそのまま書き換え後の仮想レジスタに格納する。
図23に戻り、H12では、命令展開部230は、H9で取り出したオペランドがメモリオペランドであるか否かを判定する。メモリオペランドである場合(H12でYES)、処理はH13に進められる。メモリオペランドでない場合(H12でNO)、処理は、H14に進められる。H13の処理の内容は、H7と同様である。すなわち、H13では、図26および図27に例示される処理が実行される。H14では、命令展開部230は、未処理の定義リストオペランドがあるか否かを判定する。未処理の定義リストオペランドがある場合(H14でYES)、処理はH9に進められる。未処理の定義リストオペランドが無い場合(H14でNO)、処理は終了する。
図15に戻り、F11では、命令展開部230は、FU出力命令列格納部264およびIU出力命令列格納部265に格納された命令を、出力ループ命令列格納部266に格納する。
図29は、出力ループ命令列格納部266に格納された命令列の一例を示す図である。図29では、図17に例示されたループの命令列に含まれるループ演算命令列をループ展開した命令列の一例が示されている。図29に例示される命令列では、展開番号1および2の命令列が、浮動小数点命令による命令列となっている。また、展開番号3の命令列が、整数命令による命令列となっている。その結果、出力ループ命令列格納部266には、
浮動小数点命令による命令列が2つ、整数命令による命令列が1つ格納されている。すなわち、出力ループ命令列格納部266に格納される浮動小数点命令による命令列の数および整数命令による命令列の数は、それぞれ、プロセッサ101の有する浮動小数点演算器101bおよび整数演算器101aの数と一致している。
図15に戻り、F12では、命令展開部230は、ループの回転数を補正する。ループの回転数の補正は、ループ1回転当たりのループカウンタの増分を補正することで行われる。ループカウンタの増分の補正は、例えば、「(ループ展開の展開数)×(ループ展開前のループカウンタの増分値)」によって算出される。ここで、ループ展開の展開数は、「(整数演算器101aの数)+(浮動小数点演算器101bの数)」となっている。したがって、ループカウンタの増分を補正することで、ループ展開後のループの回転数は、「(ループ展開前のループの回転数)÷(整数演算器101aの数+浮動小数点演算器101bの数)」となる。図29に例示されるループ演算命令列の展開数は「3」である。すなわち、ループ展開後の1回転のループによって実行される処理は、ループ展開前のループ3回転分の処理に相当する。また、図17を参照すると、ループ展開前におけるループカウンタ「$g1」は、ループ1回転当たり「4」加算されている。したがって、ループ
展開後では、ループカウンタ「$g1」の値は「(展開数)3×(ループ展開前のループカ
ウンタの増分値)4」によって「12」と算出される。図30は、回転数が補正されたループ命令列の一例を示す図である。図30を参照すると、ループ命令列の加算命令において、ループカウンタ「$g1」の増分が「12」になっていることがわかる。
図31は、ループ展開後のループの命令列の一例を示す図である。図31では、初期化命令列に、展開されたループ演算命令列および補正されたループ命令列が続いている。このように展開された命令列は、例えば、図10のT4に例示される命令スケジューリングによって、複数の演算器によって並列して実行しやすいように実行順が入れ替えられながら、プロセッサ101の演算器によって実行される。
図32および図33は、命令列が実行された場合の演算器の使用状況の一例を示す図である。図32は、全ての命令が浮動小数点命令に変換された命令列を実行した場合の演算器の使用状況の一例を示す図である。図33は、プロセッサ101の有する整数演算器101aおよび浮動小数点演算器101bそれぞれの数に応じて、整数命令および浮動小数点命令を混在させた命令列を実行した場合の演算器の使用状況の一例を示す図である。すなわち、図33は、第1実施形態によるループ展開が行われた命令列が演算器で実行される状態の例示である。図32と図33を比較すると、図33に例示される場合の方が、プロセッサ101の有する各演算器を効率的に使用している事がわかる。
(第1比較例)
第1比較例では、入力されたループの命令列を所定の展開数だけループ展開し、命令の型の変換を行わないコンパイラ装置について説明する。図34は、第1比較例に係るコンパイラ装置500のループ展開を行う処理ブロックの一例である。情報処理装置100は、コンパイラ装置500としても利用可能である。図34では、展開数決定部501、命令展開部502、ループ命令補正部503、入力ループ命令列格納部504、展開命令列格納部505および出力ループ命令列格納部506の各処理ブロックが例示されている。例えば、図1のプロセッサ101が図34の各処理ブロックとして主記憶部102に展開されたコンピュータプログラムを実行する。ただし、図34のいずれかの処理ブロックの少なくとも一部はハードウェア回路、専用のプロセッサまたはデジタルシグナルプロセッサ(Digital Signal Processor、DSP)を含んでもよい。
入力ループ命令列格納部504には、ループ展開の対象となるループの命令列が格納される。コンパイラ装置500のプロセッサ101は、展開数決定部501として、ループ
展開の展開数を決定する。展開数は、プロセッサ101の有するレジスタ数、入力ループ命令列格納部504に格納されたループ演算命令列に含まれる命令数等に基づいて決定される。コンパイラ装置500のプロセッサ101は、命令展開部502として、ループ演算命令列に含まれる命令列を展開する。展開された命令列は、展開命令列格納部505に記憶される。コンパイラ装置500のプロセッサ101は、ループ命令補正部503として、展開後のループ命令におけるループカウンタの増加量、ループの終了条件の補正を行う。以上の処理によって展開されたループの命令列は、出力ループ命令列格納部506に格納される。
図35は、ループの命令列を疑似的に例示する図である。図35に例示されるループでは、ループ演算命令列に含まれる命令がすべて整数命令となっている。図36は、図35に例示されるループが第1比較例に係るコンパイラ装置500によってループ展開された命令列の一例を示す図である。図36に例示される展開後の命令列も、全て整数命令となっている。プロセッサ101は、図2に例示されるように、整数演算器101aを複数有していない。そのため、プロセッサ101が図36に例示される命令列を実行すると、ひとつの整数演算器101aに処理が集中し、浮動小数点演算器101b、101bは使用されない。そのため、プロセッサ101が有する複数の演算器が効率的に使用されているとは言い難い。
(第2比較例)
第2比較例では、ループ展開において、整数命令を浮動小数点命令に、浮動小数点命令を整数命令に変換する処理が追加される。図37は、第2比較例によるループ展開を模式的に例示する図である。図38は、図37を疑似コードによって例示する図である。第2比較例では、ループ展開によって、整数命令によるIU命令列と浮動小数点命令によるFU命令列とが生成される。すなわち、第2比較例では、ループ展開前の元の命令列を、整数命令に変換したIU命令列と、浮動小数点命令に変換したFU命令列とを生成する。生成された命令列は、第2比較例に係るコンパイラ装置によって生成されたオブジェクトに含まれる。オブジェクトが実行されると、プロセッサ101の演算器の使用状況に応じて、IU命令列またはFU命令列が実行される。すなわち、プロセッサ101の有する演算器の使用状況に応じて、IU命令列またはFU命令列が実行される。それぞれの演算器で実行される命令列は、互いに異なるスレッドである。すなわち、第2比較例では、マルチスレッドによって、IU命令列とFU命令列とを実行する。プロセッサ101の有する演算器の使用状況は、OSのシステムコールによって取得可能である。このシステムコールは、オブジェクトが実行されている時点における、整数演算および浮動小数点演算のどちらが頻繁に実行されており、整数演算器101aと浮動小数点演算器101b、101bのいずれが空いているかを返す。
第2比較例では、システムコールによって空いている演算器の情報を取得することで、演算器を効率的に使用した。しかしながら、第2比較例では、他のスレッドによる演算器の使用状況を取得するため、オブジェクトの実行中に演算器の使用状況を動的に取得する。そのため、第2比較例では、システムコール等の関数呼び出しに係るオーバーヘッドが生ずる。
(比較例と第1実施形態との比較)
図39は、第1比較例によるループ展開と第1実施形態によるループ展開とを比較する図の一例である。図39では、展開前の命令列を「元の命令列」と記載している。第1比較例に係るループ展開では、「元の命令列」を2回転分展開している。第1実施形態に係るループ展開では、プロセッサ101aの有する演算器の数に合わせて、浮動小数点命令による命令列(図中では、FU命令化した命令列と記載)が2回転分、整数命令による命令列(図中では、IU命令化した命令列と記載)が1回転分展開されている。例えば、「
元の命令列」が浮動小数点命令による命令列であった場合、第1比較例によるループ展開でも2つの浮動小数点演算器101b、101bによって並列して命令の実行が可能である。しかしながら、整数演算器101aは、この間処理を行っていない。第1実施形態によるループ展開では、前述のとおり、プロセッサ101aの有する演算器の数に合わせてループ展開が行われている。そのため、第1実施形態によるループ展開後の命令列では、浮動小数点による命令列を2つの浮動小数点演算器101b、101bによって実行し、整数命令による命令列を整数演算器101aによって実行する。すなわち、第1比較例よりも第1実施形態によるループ展開を行った方が、プロセッサ101の有する演算器を効率的に使用できることがわかる。
図40は、コンパイラに入力されるソースファイルに含まれるループの一例を示す図である。図40に例示されるループは、3つの整数命令を含む。図41は、図40に例示されたループを第1比較例によるループ展開を行った命令列の一例を示す図である。図41では、整数命令による命令列が2回転分例示されている。ループ展開後の命令列に含まれる命令には、浮動小数点命令は含まれていない。そのため、第1比較例によってループ展開された命令列は、整数演算器101aによって実行される。この間、浮動小数点演算器101b、101bは処理を行っていない。
図42は、図40に例示されたループに対して第1実施形態によるループ展開を行った命令列の一例を示す図である。第1実施形態では、プロセッサ101の有する整数演算器101aおよび浮動小数点演算器101bの数に応じて、展開後の命令列に含まれる整数命令列と浮動小数点命令列の数を決定する。すなわち、図42に例示するように、整数命令を浮動小数点命令に変換した浮動小数点命令列(図中では、FU整数命令と記載)が2つ生成され、整数命令による整数命令列は1つ生成される。その結果、1つの整数命令列は整数演算器101aによって実行され、2つの浮動小数点命令列は、それぞれ浮動小数点演算器101b、101bによって実行される。その結果、第1実施形態によれば、プロセッサ101の有する演算器をより効率的に使用する事ができる。
また、第1実施形態では、コンパイル時にプロセッサ101の有する整数演算器101aおよび浮動小数点演算器101bの数に応じて、ループ展開後のループ演算命令列に含まれる整数命令列および浮動小数点命令列の数を決定した。ループ展開された整数命令列および浮動小数点命令列は、プロセッサ101の命令スケジューラによって整数演算器101aおよび浮動小数点演算器101bに割り当てられる。そのため、第1実施形態によれば、オブジェクトの実行中にシステムコールによる演算器の使用状況を取得しなくともよい。その結果、第2比較例と比較して、オブジェクト実行中のシステムコール呼出し等によるオーバーヘッドが抑制される。
(第1実施形態の効果)
第1実施形態では、コンパイラ装置10は、ループ展開の対象としてループ演算命令列が分岐命令を含まない最内ループを選択した。その結果、コンパイラ装置10は、ループ展開において、分岐先の命令等を含めて展開しなくともよい。
第1実施形態では、コンパイラ装置10は、ループ演算命令列に含まれる整数命令または浮動小数点命令の数に偏りが無い場合には、図15のF4およびF5以降の処理を省略した。そのため、コンパイラ装置10は、コンパイル時間の長時間化を抑制できる。
第1実施形態では、コンパイラ装置10は、FU変換テーブル301およびIU変換テーブル302に基づいてループ演算命令列に含まれる各命令の型を変換した。その結果、コンパイラ装置10は、変換前のループ演算命令列に整数命令および浮動小数点命令の双方が含まれていても、変換後の命令列では、整数命令のみの命令列および浮動小数点命令
のみの命令列を生成できる。
第1実施形態では、コンパイラ装置10は、命令の型を変換した後、プロセッサ101の有する整数演算器101aおよび浮動小数点演算器101bの数に応じて、整数命令による命令列と浮動小数点命令による命令列とを出力した。その結果、コンパイラ装置10は、プロセッサ101の有する演算器をより効率的に使用できるオブジェクトを生成できる。
第1実施形態では、コンパイラ装置10は、マシンモデル201からプロセッサ101の有する整数演算器101aおよび浮動小数点演算器101bの数を取得した。その結果、コンパイル装置10は、マシンモデル201にプロセッサ種別毎の整数演算器および浮動小数点演算器の数を登録しておくことで、様々なプロセッサ向けのオブジェクトを生成できる。
第1実施形態では、コンパイラ装置10は、例えば、図15のF4による浮動小数点命令への変換および図15のF5による整数命令への変換を並行して行う。しかしながら、コンパイラ装置10は、浮動小数点命令への変換および整数命令への変換を並行して実施する構成に限定されない。コンパイラ装置10は、浮動小数点命令への変換および整数命令への変換のいずれか一方を先に実行し、他方をその後に実行してもよい。
第1実施形態では、コンパイラ装置10は、コンパイラ装置10が有するプロセッサ101を対象としてコンパイルが実行した。しかしながら、コンパイラ装置10は、プロセッサ種別の指定を受け付け、指定されたプロセッサを対象としたコンパイルを実行するクロスコンパイラ装置であってもよい。この場合、コンパイル装置10は、指定されたプロセッサの有する整数演算器および浮動小数点演算器の数をマシンモデル201から取得すればよい。
<第1変形例>
第1実施形態では、ループの各回転間の依存関係のないループがループ展開の対象とされた。第1変形例では、ループの各回転間に回帰演算の依存関係があるループもループ展開の対象とされる。第1実施形態と共通の構成要素については同一の符号を付し、その説明は省略される。以下、図面を参照して、第1変形例について説明する。
図43は、回帰演算の一例を示す図である。ひとつの式において、定義と参照に同一の変数を含むものを回帰演算と称する。図43では、式の定義および参照の双方に変数「A」が含まれている。すなわち、図43に例示する式は、変数「A」の回帰演算となっている。
図44は、参照オペランドと定義オペランドを含む命令の一例を示す図である。図44では、「add」命令が例示されている。この「add」命令は、参照オペランドとして「op1
」および「op2」を有し、定義オペランドとして「op3」を有する。第1変形例のコンパイラ装置10は、参照オペランドである「op1」または「op2」と定義オペランドである「op3」とが等しく、「op1」と「op2」とが異なる命令をループ展開の対象となる回帰演算と
判定する。
図45は、コンパイラ装置10に入力されるループの命令列の一例を示す図である。図45の左側はループ展開される前のループの命令列の一例であり、図45の右側はループ展開後のループの命令列の一例である。図45の左側に例示されるループのループ演算命令列では、式「a=a+b[i]*c[i]」において、定義と参照の双方に変数「a」が含まれている。そのため、この式は回帰演算となっている。回帰演算では、ループの回転間において依
存があるため、そのままループ展開する事は難しい。
そこで、ループ演算命令列に回帰演算が含まれる場合、ループの回転間に依存が生じないようにループ演算命令を変形する。すなわち、図45に例示される展開番号1、2、3の各命令列において互いに独立した定義オペランドを作成することで、各展開番号の命令列が他の展開番号の命令列から独立して演算可能とする。ループ終了後、各展開番号の命令列によって算出された値を加算することで、ループ展開前の命令列と同じ値を出力可能となる。ループ終了後に各展開番号の命令列によって算出された値を加算する命令を収束命令と称する。図46は、図45で例示されたループ展開後の命令列を中間コードで表現した命令列の一例を示す図である。図46では、「add $g5, $g2, $g2」の部分が回帰演
算となっている。以下、図46に例示される中間コードをループ展開する処理について説明する。
図47は、第1変形例に係るコンパイラ装置10によるループ展開処理の流れの一例を示す図である。以下、図47を参照して、第1変形例のループ展開処理について説明する。
図47のF1からF3までの処理は、図15のF1からF3までの処理と同様である。そのため、その説明を省略する。R1では、コンパイラ装置10のFU命令変換部222は、F1で抽出されたループ演算命令列に含まれる命令を浮動小数点命令に変換し、FU変換命令列格納部262に格納する。R2では、コンパイラ装置10のIU命令変換部221は、F1で抽出されたループ演算命令列に含まれる命令を整数命令に変換し、IU変換命令列格納部263に格納する。
図48は、図47のR1およびR2の処理の詳細な流れの一例を示す図である。図48を参照して、図47のR1およびR2の処理の流れについて説明する。U1では、命令変換部220は、ループ展開後の初期化命令列を格納する初期化命令列結果リストを作成する。U2では、命令変換部220は、ループ展開後のループ演算命令列を格納する演算命令列結果リストを作成する。U3では、命令変換部220は、ループ展開後の収束命令を格納する収束命令列結果リストを作成する。U1からU3で作成されたそれぞれのリストは、例えば、コンパイラ装置10の主記憶部102または補助記憶部103上に設けられる。図48のG2からG10までの処理は、図18のG2からG10までの処理と同様である。そのため、その説明を省略する。
図47に戻り、F6の処理は、図15のF6の処理と同様である。そのため、その説明を省略する。R3では、命令変換部220は、回帰演算用の初期化処理を実行する。
図49は、回帰演算用の初期化処理を示す図の一例である。図49は、図47のR3の処理の詳細な流れの一例を示す図である。図49を参照して、回帰演算用の初期化処理の流れについて説明する。
C1では、命令変換部220は、仮想レジスタマップを作成する。仮想レジスタマップは、図24で説明したように、ループ変換前の仮想レジスタとループ変換後の仮想レジスタとの対応を示すマップである。作成された仮想マップは、例えば、主記憶部102または補助記憶部103上に記憶される。
C2では、命令変換部220は、ループ展開の前後における回帰演算の定義の対応をC1で作成した仮想レジスタマップに追加する。命令変換部220は、例えば、図46に例示される中間コードを例にすれば、回帰演算「add $g1, $g2, $g2」の定義「$g2」について、C2の処理を実行する。
C3では、命令変換部220は、ループ演算命令列に次の回帰演算命令があるか否かを判定する。次の回帰演算命令がある場合(C3でYES)、処理はC2に進められる。次の回帰演算命令が無い場合(C3でNO)、処理は終了される。すなわち、図49に例示される回帰演算用の初期化処理は、ループ演算命令列に含まれる全ての回帰演算命令に対して実行される。
図47に戻り、R4では、FU命令展開部232は、FU変換命令列格納部262に格納された命令列を展開し、展開した命令列をFU出力命令列格納部264に格納する。R5では、IU命令展開部231は、IU変換命令列格納部263に格納された命令列を展開し、展開した命令列をIU出力命令列格納部265に格納する。
図50は、ループ演算命令列の展開処理の一例を示す図である。図50は、図47のR4およびR5の処理の詳細な流れの一例を示す図である。図50を参照して、ループ演算命令列の展開処理について説明する。
H2の処理は、図15のH2の処理と同様である。そのため、その説明を省略する。D1では、命令展開部230は、H2で取り出した命令が回帰演算であるか否かを判定する。回帰演算である場合(D1でYES)、処理はD2に進められる。回帰演算でない場合(D1でNO)、処理は、H3に進められる。
図51は、回帰演算命令の一例を示す図である。図51は、図44で一例を示した命令について、説明の便宜上参照リストおよび定義リストの範囲を示したものである。すなわち、図44で一例を示した加算命令「add」では、参照オペランドとして「op1」、「op2
」を有し、定義オペランドとして「op3」を有する。図51に例示される加算命令「add」は、参照オペランド「op1」と定義オペランド「op3」とが同一の変数であり、「op1」と
「op2」とは異なる変数であるものとする。
図52は、回帰演算命令の書き換え処理の一例を示す図である。図52は、図50のD2の処理の詳細な流れの一例を示す図である。以下、図52を参照して、回帰演算命令の書き換え処理について説明する。E1では、命令展開部230は、参照オペランド「op1
」が整数型(int型)であるか否かを判定する。「op1」が整数型である場合、処理はE2に進められる。「op1」が整数型でない場合、処理はE5に進められる。
E2では、命令展開部230は、書き換え対象となる命令が整数命令であるか否かを判定する。書き換え対象となる命令が整数命令である場合、処理はE3に進められる。書き換え対象となる命令が整数命令でない場合、処理はE4に進められる。
E3では、命令変換部230は、回帰演算命令の書き換えを行う。図53は、回帰演算命令の書き換え処理の一例を示す図である。図53は、図52のE3の処理の詳細な流れの一例を示す図である。以下、図53を参照して、図52のE3の処理について説明する。
E31では、命令展開部230は、整数型(int型)の仮想レジスタを新規に作成する
。図53では、作成された仮想レジスタは、「new」と記載されている。E32では、命
令展開部230は、図48のU1で作成された初期化命令列結果リストに、E31で作成した仮想レジスタを初期化する命令を追加する。ここでは、命令「mov 0, new」が追加される。すなわち、E32で初期化命令列結果リストに追加された命令は、E31で作成した仮想レジスタ「new」を「0」で初期化している。
E33では、命令展開部230は、E31で作成した仮想レジスタを用いて回帰演算命令を書き換える。書き換えられた命令は「add new, op2, new」となる。E34では、命
令展開部230は、収束命令列結果リストにループ終了後に実行する加算命令を追加する。ここでは、「add new, op3, op3」が収束命令列結果リストに追加される。
E35では、命令展開部230は、図49のC1で作成された仮想レジスタマップを参照し、仮想レジスタ「op2」に対応するループ展開後の仮想レジスタ(図53では、newOP2と記載)を取り出す。E36では、命令展開部230は、回帰演算を「add new, newOP2, new」と書き換える。
図52に戻り、E4では、命令変換部230は、回帰演算命令の書き換えを行う。図54は、回帰演算命令の書き換え処理の一例を示す図である。図54は、図52のE4の処理の詳細な流れの一例を示す図である。以下、図54を参照して、図52のE4の処理について説明する。
E51では、命令展開部230は、浮動小数点型(float型)の仮想レジスタを新規に
作成する。図54のE51では、作成された仮想レジスタは、「new1」と記載されている。E52では、命令展開部230は、図48のU1で作成された初期化命令列結果リストに、E51で作成した仮想レジスタを初期化する命令を追加する。ここでは、命令「mov 0, new1」が追加される。すなわち、E52で初期化命令列結果リストに追加された命令
は、E51で作成した仮想レジスタ「new1」を「0」で初期化している。
E53では、命令展開部230は、E51で作成した仮想レジスタを用いて回帰演算命令を書き換える。書き換えられた命令は「fadd new1, op2, new1」となる。E54では、命令展開部230は、整数型(int型)の仮想レジスタを新規に作成する。図54のE5
4では、作成された仮想レジスタは、「new2」と記載されている。E55では、命令展開部230は、変数の型変換を行う命令を収束命令列結果リストに追加する。ここでは、「movftoi new1, new2」が追加される。この命令は、浮動小数点型の仮想レジスタ「new1」の値を整数型に型変換せずに、ビット列はそのままで、整数型の仮想レジスタである「new2」に代入する。
E56では、命令展開部230は、ループ終了後に実行される加算命令を収束命令列結果リストに追加する。ここでは、「add new2, op3, op3」が追加される。E57では、命令展開部230は、図49のC1で作成された仮想レジスタマップを参照し、仮想レジスタ「op2」に対応するループ展開後の仮想レジスタ(図53では、newOP2と記載)を取り
出す。E58では、命令展開部230は、回帰演算を「fadd new2, newOP2, new2」と書
き換える。
図52に戻り、E5では、命令展開部230は、書き換え対象となる命令が整数命令であるか否かを判定する。書き換え対象となる命令が整数命令である場合、処理はE6に進められる。書き換え対象となる命令が整数命令でない場合、処理はE7に進められる。
図55は、回帰演算命令の書き換え処理の一例を示す図である。図55は、図52のE6の処理の詳細な流れの一例を示す図である。以下、図55を参照して、図52のE6の処理について説明する。
E31からE33の処理は、図53のE31からE33の処理と同様である。そのため、その説明を省略する。E61では、命令展開部230は、浮動小数点型(float型)の
仮想レジスタを新規に作成する。図55のE61では、作成された仮想レジスタは、「new2」と記載されている。E62では、命令展開部230は、変数の型変換を行う命令を収
束命令列結果リストに追加する。ここでは、「movftoi new2, new」が追加される。この
命令は、浮動小数点型の仮想レジスタ「new2」の値を整数型に型変換せずに、ビット列はそのままで、整数型の仮想レジスタである「new」に代入する。
E63では、命令展開部230は、ループ終了後に実行される加算命令を収束命令列結果リストに追加する。ここでは、「fadd new, op3, op3」が追加される。E35からE36の処理は、図53のE35からE36の処理と同様である。そのため、その説明を省略する。
図56は、回帰演算命令の書き換え処理の一例を示す図である。図56は、図52のE7の処理の詳細な流れの一例を示す図である。以下、図56を参照して、図52のE7の処理について説明する。
E51からE53の処理は、図54のE51からE53の処理と同様である。そのため、その説明を省略する。E71では、命令展開部230は、ループ終了後に実行される加算命令を収束命令列結果リストに追加する。ここでは、「fadd new1, op3, op3」が追加
される。E35からE36の処理は、図53のE35からE36の処理と同様である。そのため、その説明を省略する。
図50に戻り、H3からH15の処理は、図23のH3からH15の処理と同様である。そのため、その説明を省略する。
図47に戻り、F9からF12の処理は、図15のF9からF12の処理と同様である。そのため、その説明を省略する。
図57は、ループ展開後のループ演算命令列の一例を示す図である。展開番号1および3の命令列は、図54に例示されるループ展開方法によって展開される。展開番号2の命令列は、図53に例示されるループ展開方法によって展開される。
図58は、ループ展開後の初期化命令列の一例を示す図である。展開番号1および2の初期化命令列は、図54のE52の処理によって追加された命令である。展開番号3の初期化命令列は、図53のE32の処理によって追加された命令である。
図59は、ループ展開後の収束命令列の一例を示す図である。展開番号1および2の収束命令列は、図54のE55およびE56の処理によって追加された命令である。展開番号3の収束命令列は、図53のE34の処理によって追加された命令である。
図60は、ループ展開後のループ命令列の一例を示す図である。ループ命令列は、第1実施形態と同様にループカウンタの補正がなされる。図61は、ループ展開後のループの命令列の一例を示す図である。図61は、図47の処理によって展開されたループの命令列の一例である。図61に例示される命令列は、図58に例示される初期化命令列、図57に例示されるループ演算命令列、図60に例示されるループ命令列、図59に例示される収束命令列を組み合わせたものである。すなわち、図58によって例示される初期化命令列によって仮想レジスタの初期化がなされる。図57に例示されるループ演算命令列は、図60によって例示されるループ命令列によって繰り返し実行される。ループ終了後、図59によって例示される収束命令列が実行される。
第1変形例では、回帰演算を含む命令を命令およびオペランドの型で分類し、各分類ごとに、ループ間に依存関係が生じないようにループ展開を行った。その結果、第1変形例によれば、回帰演算を含むループの命令列に対しても第1実施形態に係るループ展開を適
用可能である。
以上で開示した実施形態や変形例はそれぞれ組み合わせる事ができる。
<その他>
以上の第1変形例を含む実施形態に関し、更に以下の付記を開示する。
(付記1)
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出する抽出部(220)と、
抽出された前記命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成する第1の生成部と、
抽出された前記命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成する第2の生成部と、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する第3の生成部と、を備える、
コンパイラ装置。
(付記2)
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定する決定部をさらに備える、
付記1に記載のコンパイラ装置。
(付記3)
前記決定部は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする、
付記2に記載のコンパイラ装置。
(付記4)
整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部と、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する演算器数取得部と、をさらに備える、
付記1から3のいずれか一項に記載のコンパイラ装置。
(付記5)
前記抽出部によって抽出される前記命令列は分岐を含まない命令列である、
付記1から4のいずれか一項に記載のコンパイラ装置。
(付記6)
コンピュータが、
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出し、
抽出された前記命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成し、
抽出された前記命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成し、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する、
コンパイル方法。
(付記7)
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定する処理をさらに実行する、
付記6に記載のコンパイル方法。
(付記8)
前記決定する処理は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする処理を含む、
付記7に記載のコンパイル方法。
(付記9)
前記コンピュータは、整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部を備え、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する処理をさらに実行する、
付記6から8のいずれか一項に記載のコンパイル方法。
(付記10)
前記抽出される前記命令列は分岐を含まない命令列である、
付記6から9のいずれか一項に記載のコンパイル方法。
(付記11)
コンピュータに、
入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出させ、
抽出された前記命令列に含まれる命令を整数演算を行う整数命令に変換して整数命令列を生成させ、
抽出された前記命令列に含まれる命令を浮動小数点演算を行う浮動小数点命令に変換して浮動小数点命令列を生成させ、
前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成させる、
コンパイラプログラム。
(付記12)
前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定させる処理をさらに実行させる、
付記11に記載のコンパイラプログラム。
(付記13)
前記決定させる処理は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする処理を含む、
付記12に記載のコンパイラプログラム。
(付記14)
前記コンピュータは、整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部を備え、
前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する処理ををさらに実行させる、
付記11から13のいずれか一項に記載のコンパイラプログラム。
(付記15)
前記抽出される前記命令列は分岐を含まない命令列である、
付記11から14のいずれか一項に記載のコンパイラプログラム。
100・・・情報処理装置
101・・・プロセッサ
101a・・・整数演算器
101b・・・浮動小数点演算器
102・・・主記憶部
103・・・補助記憶部
104・・・通信部
10、500・・・コンパイラ装置
201・・・マシンモデル
202・・・NFU数格納部
203・・・NIU数格納部
211・・・NIU取得部
212・・・NFU取得部
220・・・命令変換部
221・・・IU命令変換部
222・・・FU命令変換部
230・・・命令展開部
231・・・IU命令展開部
232・・・FU命令展開部
240・・・ループ命令補正部
261・・・ループ演算命令列格納部
262・・・FU変換命令列格納部
263・・・IU変換命令列格納部
264・・・FU出力命令列格納部
265・・・IU出力命令列格納部
266・・・出力ループ命令列格納部
301・・・FU変換テーブル
302・・・IU変換テーブル

Claims (7)

  1. 入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出する抽出部と、
    抽出された前記命令列に含まれる整数命令を浮動小数点型の仮想レジスタに格納されたビット列を整数として扱うことで浮動小数点演算器に整数演算を実行させる命令に変換して整数命令列を生成する第1の生成部と、
    抽出された前記命令列に含まれる浮動小数点命令を整数型の仮想レジスタに格納されたビット列を浮動小数点数として扱うことで整数演算器に浮動小数点演算を実行させる命令に変換して浮動小数点命令列を生成する第2の生成部と、
    前記ソースファイルをコンパイルしたオブジェクトの実行環境となるプロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する第3の生成部と、を備える、
    コンパイラ装置。
  2. 前記繰り返し命令による前記命令列の繰り返し回数、前記整数演算器の数および前記浮動小数点演算器の数に基づいて、前記繰り返し命令による前記出力命令列の繰り返し回数を決定する決定部をさらに備える、
    請求項1に記載のコンパイラ装置。
  3. 前記決定部は、前記繰り返し命令による前記命令列の繰り返し回数を前記整数演算器の数および前記浮動小数点演算器の数の和で除算した値を前記繰り返し命令による前記出力命令列の繰り返し回数とする、
    請求項2に記載のコンパイラ装置。
  4. 整数演算器と浮動小数点演算器の数をプロセッサ種別毎に記憶するプロセッサ情報記憶部と、
    前記オブジェクトの実行環境となるプロセッサの有する整数演算器と浮動小数点演算器の数を前記プロセッサ情報記憶部から取得する演算器数取得部と、をさらに備える、
    請求項1から3のいずれか一項に記載のコンパイラ装置。
  5. 前記抽出部によって抽出される前記命令列は分岐を含まない命令列である、
    請求項1から4のいずれか一項に記載のコンパイラ装置。
  6. プロセッサを備えるコンピュータが、
    入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出し、
    抽出された前記命令列に含まれる整数命令を浮動小数点型の仮想レジスタに格納されたビット列を整数として扱うことで浮動小数点演算器に整数演算を実行させる命令に変換して整数命令列を生成し、
    抽出された前記命令列に含まれる浮動小数点命令を整数型の仮想レジスタに格納されたビット列を浮動小数点数として扱うことで整数演算器に浮動小数点演算を実行させる命令に変換して浮動小数点命令列を生成し、
    前記プロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成する、
    コンパイル方法。
  7. プロセッサを備えるコンピュータに、
    入力されたソースファイルにおいて命令列の繰り返しを指示する繰り返し命令を検出すると、前記繰り返し命令によって繰り返される前記命令列を抽出させ、
    抽出された前記命令列に含まれる整数命令を浮動小数点型の仮想レジスタに格納されたビット列を整数として扱うことで浮動小数点演算器に整数演算を実行させる命令に変換して整数命令列を生成させ、
    抽出された前記命令列に含まれる浮動小数点命令を整数型の仮想レジスタに格納されたビット列を浮動小数点数として扱うことで整数演算器に浮動小数点演算を実行させる命令に変換して浮動小数点命令列を生成させ、
    前記プロセッサの有する整数演算器の数および浮動小数点演算器の数に基づいて、前記整数命令列と前記浮動小数点命令列とを含む出力命令列を生成させる、
    コンパイラプログラム。
JP2015135456A 2015-07-06 2015-07-06 コンパイラ装置、コンパイル方法およびコンパイラプログラム Active JP6547466B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2015135456A JP6547466B2 (ja) 2015-07-06 2015-07-06 コンパイラ装置、コンパイル方法およびコンパイラプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015135456A JP6547466B2 (ja) 2015-07-06 2015-07-06 コンパイラ装置、コンパイル方法およびコンパイラプログラム

Publications (2)

Publication Number Publication Date
JP2017016570A JP2017016570A (ja) 2017-01-19
JP6547466B2 true JP6547466B2 (ja) 2019-07-24

Family

ID=57830798

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015135456A Active JP6547466B2 (ja) 2015-07-06 2015-07-06 コンパイラ装置、コンパイル方法およびコンパイラプログラム

Country Status (1)

Country Link
JP (1) JP6547466B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021137669A1 (ko) * 2019-12-30 2021-07-08 매니코어소프트주식회사 딥러닝을 위한 가속기용 프로그램 생성 방법

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11307835B2 (en) 2017-07-07 2022-04-19 nChain Holdings Limited Method for controlling the flow execution of a generated script of a blockchain transaction

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3032031B2 (ja) * 1991-04-05 2000-04-10 株式会社東芝 ループ最適化方法及び装置
JP3627905B2 (ja) * 1999-03-08 2005-03-09 株式会社日立製作所 プログラムコンパイル方法および該方法を記録した記録媒体

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021137669A1 (ko) * 2019-12-30 2021-07-08 매니코어소프트주식회사 딥러닝을 위한 가속기용 프로그램 생성 방법
US12106076B2 (en) 2019-12-30 2024-10-01 Moreh Corp. Method for generating program for use in accelerator for deep learning

Also Published As

Publication number Publication date
JP2017016570A (ja) 2017-01-19

Similar Documents

Publication Publication Date Title
US10503634B1 (en) Semantic comparison of computer compiler traces
US9250875B1 (en) Table of contents pointer value save and restore placeholder positioning
US10678540B2 (en) Arithmetic operation with shift
US9218170B1 (en) Managing table of contents pointer value saves
US9495136B2 (en) Using aliasing information for dynamic binary optimization
Yadavalli et al. Raising binaries to llvm ir with mctoll (wip paper)
JP2014510971A (ja) データ処理装置内におけるアドレス生成
JP2015201119A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP6547466B2 (ja) コンパイラ装置、コンパイル方法およびコンパイラプログラム
JP2011253253A (ja) コンピュータ試験方法、コンピュータ試験装置およびコンピュータ試験プログラム
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
CN104239055A (zh) 检测软件代码复杂度的方法
You et al. Translating AArch64 floating-point instruction set to the x86-64 platform
JP6481515B2 (ja) 情報処理装置、コンパイル方法、及びコンパイラプログラム
US8176361B2 (en) Data processing with protection against soft errors
US20140013312A1 (en) Source level debugging apparatus and method for a reconfigurable processor
JP2007080049A (ja) 組み込み用プログラム生成方法、組み込み用プログラム開発システム、及び情報テーブル部
JP7006097B2 (ja) コード生成装置、コード生成方法及びコード生成プログラム
Mohr et al. Hardware acceleration for programs in SSA form
US10922061B2 (en) Information processing apparatus, information processing method and storage medium storing program related to instruction selection of a compiler
See et al. Development of LLVM compilation toolchain for IoT processor targeting wireless measurement applications
JP2018163381A (ja) コード生成装置、コード生成方法及びコード生成プログラム
US9639357B2 (en) Processor, apparatus and method for generating instructions
US20190146797A1 (en) Supplying constant values
EP4165500A1 (en) A method of programming a software module associated with a firmware unit of a device

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180413

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20190130

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190312

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190510

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190610

R150 Certificate of patent or registration of utility model

Ref document number: 6547466

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150