(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-01-09
(45)【発行日】2024-01-17
(54)【発明の名称】プログラム、情報変換装置及び情報変換方法
(51)【国際特許分類】
G06F 8/41 20180101AFI20240110BHJP
【FI】
G06F8/41 130
(21)【出願番号】P 2021520832
(86)(22)【出願日】2020-05-21
(86)【国際出願番号】 JP2020020033
(87)【国際公開番号】W WO2020235616
(87)【国際公開日】2020-11-26
【審査請求日】2022-12-05
(31)【優先権主張番号】P 2019095442
(32)【優先日】2019-05-21
(33)【優先権主張国・地域又は機関】JP
【新規性喪失の例外の表示】特許法第30条第2項適用 〔開催日〕 平成30年10月21日 〔集会名〕 2018 51st Annual IEEE/ACM International Symposium on Microarchitecture (MICRO) グランドハイアット福岡(福岡県福岡市博多区住吉1丁目2-82) 〔刊行物等〕 〔ウェブサイト公開日〕平成30年6月7日 〔ウェブサイトのアドレス〕 https://ipsj.ixsq.nii.ac.jp/ej/index.php?active_action=repository_view_main_item_detail&page_id=13&block_id=8&item_id=189768&item_no=1
(73)【特許権者】
【識別番号】504137912
【氏名又は名称】国立大学法人 東京大学
(74)【代理人】
【識別番号】110002789
【氏名又は名称】弁理士法人IPX
(72)【発明者】
【氏名】入江 英嗣
(72)【発明者】
【氏名】坂井 修一
(72)【発明者】
【氏名】小泉 透
(72)【発明者】
【氏名】中江 哲史
(72)【発明者】
【氏名】福田 晃史
【審査官】福西 章人
(56)【参考文献】
【文献】特開2000-284968(JP,A)
【文献】松崎秀則 ほか,レジスタリネーミング機構なしで高速にout-of-order実行するためのレジスタ割り当て手法,2000年記念並列処理シンポジウム,日本,社団法人情報処理学会,2000年05月30日,Vol.2000, No.6,pp.301-308
【文献】酒井一憲 ほか,STRAIGHTにおける投機メモリフォワーディングの実装の検討,情報処理学会 研究報告 [online],日本,情報処理学会,2017年01月16日,2017-ARC-224, 34号,pp.1-6
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/00-8/77
(57)【特許請求の範囲】
【請求項1】
プログラムであって、コンピュータを情報変換装置として機能させ、
前記情報変換装置は、(A)~(E)の何れか1つ以上の構成要素;
(A)1つの基本ブロックに存在する複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理部、
(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理部、
(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理部、
(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理部、
(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、当該ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理部、
を具備する
プログラム。
【請求項2】
請求項1記載のプログラムにおいて
前記情報変換装置は、
前記(B)ループ内定数解析処理部、
を具備する
プログラム。
【請求項3】
請求項1または請求項2記載のプログラムにおいて、
前記(A)複製必要性解析処理部では、
複数のphi関数から参照される命令が存在する箇所を特定し、
当該命令をオペランドとするレジスタ間転送命令を、(参照数-1)個、当該命令の後方に追加し、
参照している複数phi関数のオペランドを相互に異なる命令となるように変更する、
プログラム。
【請求項4】
請求項1~請求項3の何れか1つに記載のプログラムにおいて、
前記(B)ループ内定数解析処理部では、
phi関数の参照が循環している閉路を特定し、
phi関数を頂点、phi関数からphi関数への参照を有向辺とした有向グラフを作成し、
この有向グラフに有向閉路が存在した場合に、
辺の始点となるphi関数と辺の終点となるphi関数の間にレジスタ間転送命令を追加する、
プログラム。
【請求項5】
請求項1~請求項4の何れか1つに記載のプログラムにおいて、
前記(C)命令間依存解析処理部では、
複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、
phi関数を頂点、phi関数が参照する命令間のデータ依存を有向辺とした有向グラフを作成し、
前記有向グラフ内における有向閉路の有無を判定し、
有向閉路が存在しない場合は、トポロジカルソートの各経路が等距離となるようNOP命令を追加し、
有向閉路が存在する場合は、レジスタ間転送命令を追加し、有向閉路を除去することでトポロジカルソートを可能とする、
プログラム。
【請求項6】
請求項1~請求項5の何れか1つに記載のプログラムにおいて、
前記(D)同一命令参照解析処理部では、
複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、
当該phi関数をphi関数α、phi関数β、phi関数γに分類し、
ここで、phi関数αとは、2つの実行経路で同じ命令の結果を参照しているphi関数であり、
phi関数βとは、2つの実行経路で異なる命令の結果を参照し、そのうち片方だけが分岐より前の命令を参照しているphi関数であり、
phi関数γとは、2つの実行経路で異なる命令の結果を参照し、その両方が分岐より前の命令を参照しているphi関数であり、
phi関数αとphi関数βが同時に存在する場合は、レジスタ間転送命令を1つ追加し、
phi関数αとphi関数γが同時に存在する場合は、レジスタ間転送命令を2つ追加する、
プログラム。
【請求項7】
請求項1~請求項6の何れか1つに記載のプログラムにおいて、
前記(E)スピルアウト有効性解析処理部では、
ループ処理内に挿入されたレジスタ間転送命令が扱う変数の値に関して、その変数の値を生成する生産者命令と、当該値を参照する消費者命令の位置を確認し、前記全ての消費者命令が当該ループ処理内に存在しない場合に、
前記生産者命令の後かつ当該ループ処理前に前記変数の値を汎用レジスタ以外の記憶素子にストアし、
当該ループ処理後かつ前記全ての消費者命令の前に前記変数の値をロードし、
前記レジスタ間転送命令を削除する、
プログラム。
【請求項8】
請求項1~請求項7の何れか1つに記載のプログラムにおいて、
前記プログラムは、コンパイラであり、
前記情報変換装置は、ソースプログラムからプロセッサに対応するオブジェクトコードを生成するコンパイル装置であり、ここで前記プロセッサは、過去の実行結果を参照する相対位置をオペランドとする命令コードを実行可能な機能を具備する、
プログラム。
【請求項9】
情報変換装置であって、
(A)~(E)の何れか1つ以上の構成要素;
(A)1つの基本ブロックに存在する複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理部、
(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理部、
(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理部、
(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理部、
(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理部、
を具備する
情報変換装置。
【請求項10】
情報変換方法であって、
(A)~(E)の何れか1つ以上の処理ステップ;
(A)1つの基本ブロックにおける複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理ステップ、
(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理ステップ、
(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理ステップ、
(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理ステップ、
(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理ステップ及び
を有する
情報変換方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラム、情報変換装置及び情報変換方法に関する。
【背景技術】
【0002】
プロセッサの処理能力向上が要求される中で、半導体プロセスの微細化に伴い、プロセッサ上に複数のコアが実装されるようになった。一方、デナードスケーリングが破綻し、電力の制限からダイ上のトランジスタ全てを同時に駆動できない、ダークシリコンと呼ばれる問題が生じている。そのため、電力効率を高めたプロセッサが求められている。
【0003】
電力効率を高めるプロセッサとして、命令レベルの並列性(instruction level parallelism:ILP)を活用したプロセッサが提案されており、特許文献1に記述されているように、命令コードの処理順序を入れ替えるアウトオブオーダー(Out of Order)実行機能を有するプロセッサが開発されている。
【先行技術文献】
【特許文献】
【0004】
【発明の概要】
【発明が解決しようとする課題】
【0005】
特許文献1に記載されているような、アウトオブオーダー実行に対応したプロセッサでは、命令コードを入れ替えたときに、元々前の命令で参照するレジスタを後ろの命令が上書きしてしまう問題を回避する必要がある。この問題を回避するために用いられる手法がレジスタリネーミングであり、コードに書かれている論理レジスタ番号を、実際に使われる物理レジスタ番号に対応させ読み替えるものである。
【0006】
しかしながら、この資源管理として論理レジスタ空間と物理レジスタ空間を関連づけるレジスタリネーミング、すなわち本来の計算処理以外の処理に多くの電力が使われてしまい、プロセッサ全体としての電力効率が悪くなるという問題がある。
【0007】
本発明では上記事情を鑑み、レジスタリネーミングを行わずにアウトオブオーダー実行可能なプロセッサに対して、小さいサイズと高い処理性能を実現する情報の変換(ソースコードからバイナリコード又はバイナリコードからバイナリコード)を行う技術を提供することとした。
【課題を解決するための手段】
【0008】
本発明の一態様によれば、プログラムであって、コンピュータを情報変換装置として機能させ、前記情報変換装置は、(A)~(E)の何れか1つ以上の構成要素;(A)1つの基本ブロックに存在する複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理部、(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理部、(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理部、(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理部、(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、当該ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理部、を具備するプログラムが提供される。
【0009】
本発明の一態様によれば、高い電力効率でプロセッサを動作させることが可能となる。
【図面の簡単な説明】
【0010】
【
図1】本発明の実施形態に係るコンパイル装置の構成概要を示す機能ブロック図。
【
図2】本発明の実施形態に係るコンパイラの機能ブロック図。
【
図3】過去の実行結果を参照する相対位置をオペランドとするアセンブリコード例。
【
図4】[
図4A]複数のphi関数から参照される命令が存在する場合のアセンブリコードフロー図。[
図4B]
図4AにRMOV命令を追加して解決したアセンブリコードフロー図。
【
図5】[
図5A]ループ内定数が存在する場合のアセンブリコードフロー図。[
図5B]
図5AにRMOV命令を追加して解決したアセンブリコードフロー図。
【
図6】[
図6A]命令間にデータ依存がある場合のアセンブリコードフロー図。[
図6B]
図6AにRMOV命令を追加して解決したアセンブリコードフロー図。
【
図7】[
図7A]複数の実行経路で同じ命令を参照している場合のアセンブリコードフロー図。[
図7B]
図7AにRMOV命令を追加して解決したアセンブリコードフロー図。
【
図8】
図7Bとは異なる場所にRMOV命令を追加して、
図7Aの問題を解決したアセンブリコードフロー図。
【
図9】[
図9A]ループ構造を持つCソースプログラム。[
図9B]RMOV命令を使用したアセンブリコード。[
図9C]
図9BのRMOV命令1つをスピルアウトしたアセンブリコード。
【
図10】変数の参照する消費者命令コードの前にロード命令を挿入する位置を示すアセンブリコードフロー図。
【
図11】本発明の実施形態に係るコンパイル方法のフローチャート。
【発明を実施するための形態】
【0011】
以下、図面を用いて本発明の実施形態について説明する。以下に示す実施形態中で示した各種特徴事項は、互いに組み合わせ可能である。
【0012】
ところで、本実施形態に登場するソフトウェアを実現するためのプログラムは、コンピュータが読み取り可能な非一時的な記録媒体として提供されてもよいし、外部のサーバからダウンロード可能に提供されてもよいし、外部のコンピュータで当該プログラムを起動させてクライアント端末でその機能を実現(いわゆるクラウドコンピューティング)するように提供されてもよい。
【0013】
また、本実施形態において「部」とは、例えば、広義の回路によって実施されるハードウェア資源と、これらのハードウェア資源によって具体的に実現されうるソフトウェアの情報処理とを合わせたものも含みうる。また、本実施形態においては様々な情報を取り扱うが、これら情報は、例えば電圧・電流を表す信号値の物理的な値、0又は1で構成される2進数のビット集合体としての信号値の高低、又は量子的な重ね合わせ(いわゆる量子ビット)によって表され、広義の回路上で通信・演算が実行されうる。
【0014】
また、広義の回路とは、回路(Circuit)、回路類(Circuitry)、プロセッサ(Processor)、及びメモリ(Memory)等を少なくとも適当に組み合わせることによって実現される回路である。すなわち、特定用途向け集積回路(Application Specific Integrated Circuit:ASIC)、プログラマブル論理デバイス(例えば、単純プログラマブル論理デバイス(Simple Programmable Logic Device:SPLD)、複合プログラマブル論理デバイス(Complex Programmable Logic Device:CPLD)、及びフィールドプログラマブルゲートアレイ(Field Programmable Gate Array:FPGA))等を含むものである。
【0015】
本実施形態では、情報変換装置の一例として、ソースプログラムからプロセッサに対応するオブジェクトコードを生成するコンパイル装置1を説明する。
図1は、本実施形態に係るコンパイル装置1の構成概要を示す機能ブロック図である。
図1に示すとおり、コンパイル装置1は、記憶部2と、通信部3と、制御部4と、作業メモリ部5とを有し、これらの構成要素がコンパイル装置1内部において通信バス10と電気的に接続されている。以下、各構成要素についてさらに説明する。
【0016】
<記憶部2>
記憶部2は、様々な情報を記憶する揮発性または不揮発性の記憶媒体である。これは、例えばソリッドステートドライブ(Solid State Drive:SSD)やハードディスクドライブ(Hard Disk Drive)のストレージデバイスとして、あるいは、プログラムの演算に係る一時的に必要な情報(引数、配列等)を記憶するランダムアクセスメモリ(Random Access Memory:RAM)等のメモリとして実施されうる。また、これらの組合せであってもよい。
【0017】
本実施形態の記憶部2では、
図1に示すとおり、ソースプログラム20と、コンパイラ21と、オブジェクトコード22と、リンカ23と、実行形式ファイル24とが記憶される。
【0018】
ソースプログラム20は、コンパイラ21の入力情報となるもので、プログラム言語で記述されたものである。2章で記述した様に、プログラム言語は、C、C++、C#、Javaなど種類は限定されない。ソースプログラム20は通信部3を介して供給元から与えられる。供給元としては、具体的には外部のネットワークに接続された情報処理装置、USBメモリなどの外付け記憶デバイス、もしくは、キーボードなどの入力デバイスなどであるが、装置やデバイスの種類は限定されない。
【0019】
コンパイラ21は、2章で記述したコンパイラの機能を、コンパイル装置1で実行可能なソフトウェアの形態で記憶される。さらには、最適化レベルなどコンパイル実行時の各種パラメータ類も合わせて記憶される。
【0020】
オブジェクトコード22は、コンパイラ21で処理された後の、リネームレス・アウトオブオーダー実行プロセッサで実行可能な命令セットで記述されたオブジェクトコードである。
【0021】
リンカ23は、複数のソースプログラム20をコンパイルした後の複数のオブジェクトコード22および、予め用意されているライブラリ(不図示)を結合して、ターゲットとする装置で実行可能な形式のファイルすなわち実行形式ファイル24を生成するもので、ソフトウェアの形態で記憶される。
【0022】
実行形式ファイル24は一旦記憶部2に記憶された後、必要に応じ通信部3を介して外部情報処理装置や外部デバイスに供給される。あるいは、このコンパイル装置1そのものが、実行形式ファイル24を実行する情報処理装置を兼ねる構成も可能である。
【0023】
<通信部3>
通信部3は、外部の情報処理装置、USBメモリなどの外付け記憶デバイス、キーボード、マウス、ディスプレイなどの入出力デバイスとの間で情報の授受を行なうものである。USB、IEEE1394、Thunderbolt、有線LANネットワーク通信等といった有線型の通信手段や、WiFiなどの無線LANネットワーク通信、5G/LTE/3G等のモバイル通信、Bluetooth(登録商標)通信等を必要に応じて含めてもよい。これらは一例であり、専用の通信規格を採用してもよい。すなわち、これら複数の通信手段の集合として実施することがより好ましい。
【0024】
<制御部4>
制御部4は、コンパイル装置に関連する全体動作の処理・制御を行う。制御部4は、例えば不図示である中央処理装置(Central Processing Unit:CPU)である。このコンパイル装置1においては、必ずしもCPUがリネームレス・アウトオブオーダー実行プロセッサである必要はなく、記憶部2に記憶されているソフトウェアを実行可能なものであれば、RISC(Reduced Instruction Set Computer)やCISC(Complex Instruction Set Computer)どちらであっても構わないし、CPUとしての処理能力に関わる動作周波数やコアの数さらにはキャッシュサイズなどCPUの構成パラメータも限定されない。
【0025】
<作業メモリ部5>
作業メモリ5部は制御部4がコンパイル処理やリンク処理を行う際の一時的な作業領域として使用するメモリで、ランダムアクセスメモリ(Random Access Memory:RAM)が一般に使われるが、DRAM(Dynamic RAM)、SDRAM(Synchronous Dynamic RAM)、SRAM(Static RAM)など種類は限定されない。
【0026】
3.コンパイラ
第3章では、本発明の実施形態に係るコンパイラ21について、図面を用いて説明する。
図2は本実施形態に係るコンパイラ21の機能ブロック図である。コンパイラはプログラム言語で記述されたソースプログラム20を、対象とするプロセッサが処理可能な命令を用いたオブジェクトコード22に変換するものである。ここで、プログラム言語は、C、C++、C#、Javaなど種類は限定されない。
【0027】
コンパイラに入力されたソースプログラム20は、先ず中間コード生成部処理機能にて、字句解析、構文解析、意味解析が実行されて中間コードが生成される。この際、phi(φ)関数が導入される。ここでphi関数とは、コンパイル作業における中間コードの中で使用されるもので、直前に通過した基本ブロックに応じて参照するオペランドが変化するものである。上述した、レジスタに再書き込みを行わないリネームレス・アウトオブオーダー実行プロセッサは、静的単一代入(static single assignment:SSA)形式と共通した特徴を有しており、phi関数を使用することが可能である。実行経路の違いにより参照する仮想レジスタの可能性が複数ある場合や、同一レジスタであっても距離の調整が必要である場合に追加される。本実施形態においては、中間コード生成処理を行った後、後述する(A)~(E)何れか1つ以上の処理を実行し、オブジェクトコード生成処理機能にてオブジェクトコード22を生成する。
【0028】
上述したリネームレス・アウトオブオーダー実行プロセッサ向けにオブジェクトコード22を生成するコンパイラでは、通常のプロセッサ向けコンパイラとは異なり、ソースオペランドレジスタまでの距離を意識した処理が必要となる。具体的には、プログラムに複数の実行経路が存在する場合、それぞれの実行経路で実行される命令数やその順序が一般に異なるため、ソースオペランドまでの距離を一意に定めるためには工夫が必要である。そのために、生存しているレジスタの値をコピーするレジスタ間転送命令をRMOV命令と定義し活用することとする。なお、この距離を調整するためのレジスタ間転送命令(RMOV)は本実施形態が対象とするリネームレス・アウトオブオーダー実行プロセッサにおいて活用する価値がある命令で、一般のアウトオブオーダーで用いられるレジスタリネーミング処理では不要な命令である。
【0029】
リネームレス・アウトオブオーダー実行プロセッサの処理能力を最大限に発揮し、オブジェクトコード22のサイズを小さくするにはレジスタ間転送命令(RMOV)は少数に留めるのが望ましい。そのため、本発明のコンパイラ21は、コンピュータをソースプログラムからプロセッサに対応するオブジェクトコードを生成するコンパイル装置1として機能させ、このコンパイル装置1は、(A)~(E)の何れか1つ以上の構成要素;
(A)1つの基本ブロックに存在する複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理部、
(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理部、
(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理部
(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理部、
(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理部、
を具備するコンパイラである。
【0030】
上記コンパイル装置1に(A)~(E)の構成要素を具備させるために、コンパイラ21にはそれぞれに対応した、(A)複製必要性解析処理機能、(B)ループ内定数解析処理機能、(C)命令間依存解析処理機能、(D)同一命令参照解析処理機能、(E)スピルアウト有効性解析処理機能、を有している。(A)~(E)については下記に詳しく説明する。なお、デッドコード削除、インライン展開など、一般的なコンパイラで実行されている最適化処理機能に関しては、任意の実装が可能であり、ここでは説明を省略する。
【0031】
3.1 (A)複製必要性解析処理機能
図4A、
図4Bを用いて、(A)複製必要性解析処理機能について説明する。
図4Aでは左側の制御フローにおいて、命令I101にラベル(1)があり、命令I102にて合流地点“.join”にジャンプしている。一方、右側の制御フローでは命令I103にラベル(2)、命令I104にラベル(3)があり、命令I105で合流地点“.join”にジャンプしている。合流後の命令I106ではphi関数でラベル(1)とラベル(2)を参照し、命令I107ではphi関数でラベル(1)とラベル(3)を参照している。すなわち、ラベル(1)を定義する命令I101は、同一基本ブロックに存在する2つのphi関数(I106,I107)から参照されている。このような場合に、ラベル(1)と(2)およびラベル(1)と(3)の距離を同時に合わせることは、ラベル(2)とラベル(3)が同一の基本ブロックに存在する異なる命令であることから不可能である。
【0032】
図4Aの状態を解決するために、レジスタ間転送命令(RMOV)を挿入したアセンブリコードフロー図を
図4Bに示す。命令I101直後にRMOV命令を1つ挿入し、ラベルを(1’)とするとともに、
図4Aの命令I107で参照していたラベル(1)を(1’)に変更したものも命令I109としている。換言すると、1つの基本ブロックに存在する複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する処理である。
【0033】
より具体的に説明すると、複数のphi関数から参照される命令が存在する箇所(I101)を特定し、当該命令をオペランドとするレジスタ間転送命令(RMOV)を、(参照数-1)個、当該命令の後方に追加し(I108)、参照している複数phi関数のオペランドを相互に異なる命令となるように変更する(I109)処理を実施する。この方法により、無駄なレジスタ間転送命令(RMOV)の増加を抑えることが可能である。
3.2 (B)ループ内定数解析処理機能
図5A、
図5Bを用いて、(B)ループ内定数解析処理機能について説明する。
図5Aでは命令I201のphi関数と命令I204のphi関数で、それぞれを参照しあっており、参照が循環した閉路(ループ)となっている。なお、命令I202と命令I205は閉路構成には直接関係しない複数命令、命令I203,I206は相手側のphi関数(それぞれI204とI201)にジャンプする命令である。このようにphi関数の閉路が循環している場合、その閉路上には本来参照すべき命令が存在しない。
図5Aの状態を解決するために、レジスタ間転送命令(RMOV)を挿入したアセンブリコードフロー図を
図5Bに示す。ジャンプ命令I203の直前にRMOV命令I207を挿入し、ラベルを(3)とするとともに、
図5A中命令I204で参照していたラベル(2)をラベル(3)に変更したものを命令I208としている。換言すると、phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令RMOVを挿入する処理である。
【0034】
より具体的に説明すると、phi関数の参照が循環している閉路を特定し、phi関数を頂点、phi関数からphi関数への参照を有向辺とした有向グラフ(I201→I204、I204→I201)を作成し、この有向グラフに有向閉路(I201→I204→I201)が存在した場合に、辺の始点となるphi関数(I201)と辺の終点となるphi関数(I204)の間にレジスタ間転送命令(I207)を追加することで有向閉路を除去する処理を実施する。
【0035】
このphi関数の参照による閉路(ループ)の特別な場合として、phi関数が自分自身を参照する循環が発生する自己閉路の場合がある(不図示)。この自己閉路の場合においても、レジスタ間転送命令RMOVを挿入する処理が有効であることに変わりない。
【0036】
プログラム言語においては、例えばC言語におけるfor文の様なループ処理が多用される。そのため、ループ内に冗長なレジスタ間転送命令を追加せずに、ループ処理内の命令コード数を最小にすることは、プログラムの実行性能を高める観点で効果が大きい。
【0037】
3.3 (C)命令間依存解析処理機能
図6A、
図6Bを用いて、(C)命令間依存解析処理機能について説明する。
図6A左上の基本ブロックでは、命令I301でロードした値を、命令I302および命令I303で使用しており、右上の基本ブロックでは、命令I305および命令I306それぞれでロードした値を命令I307で使用している。一方、命令I304および命令I308でジャンプした後は命令I309で合流するが、命令I309、命令I310および命令I311のphi関数がそれぞれ、“ラベル(3)とラベル(4)”、“ラベル(2)とラベル(5)”および“ラベル(1)とラベル(6)”を参照しており、制約を満たせない。このように複数のphi関数の参照先となる各命令間に依存関係がある場合、全ての経路で同じ順序になるように配置することが出来ないという問題がある。
【0038】
図6Aの状態を解決するために、レジスタ間転送命令(RMOV)を挿入したアセンブリコードフロー図を
図6Bに示す。ジャンプ命令I304の直前にRMOV命令I314を挿入するとともに、命令I302と命令I303を入れ替えて改めて命令I312、命令I313としている。さらに命令I311のphi関数の参照先をラベル(1)からラベル(7)に変更して命令I315としている。換言すると、複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する処理である。
【0039】
より具体的に説明すると、複数のphi関数(I309,I310,I311)の参照先となる各命令間(I301,I302,I303)にデータ依存がある箇所を特定し、phi関数を頂点、phi関数が参照する命令間のデータ依存を有向辺とした有向グラフを作成し、前記有向グラフ内における有向閉路の有無を判定する。有向閉路が存在しない場合は、トポロジカルソートの各経路が等距離となるようNOP命令を追加すれば良い。逆に有向閉路が存在する場合は、レジスタ間転送命令(I314)を追加し、有向閉路を除去、すなわち有向非巡回グラフ(directed acyclic graph:DAG)とすることでトポロジカルソートを可能とする処理を行う。トポロジカルソートが可能となったら、全ての経路で同じ順序になるように配置することが出来て、間にNOP命令を挟むことで同じ距離になるように配置する処理を実施する。
【0040】
3.4 (D)同一命令参照解析処理機能
図7A、
図7Bを用いて、(D)同一命令参照解析処理機能について説明する。
図7Aでは、命令I401~I404の処理後に、分岐があり、その後phi関数I410で合流している。このときphi関数I410,I411では、それぞれ“ラベル(1)とラベル(1)”および“ラベル(2)とラベル(2)”と、同一命令の結果を参照している。この場合、その距離調整が他のphi関数の距離調整と競合する場合がある。通常のphi関数は二つの独立な命令を参照するのに対し、この場合は同じ命令を参照しており命令移動の自由度が低下していることや、二つの異なる命令を同じ位置に配置することはできないことが原因である。
【0041】
図7Aの問題を解決するには、複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令(RMOV)を挿入すれば良い。その様にして問題を解決した例を、
図7Bおよび
図8に示す。
【0042】
図7Aにおけるphi関数I412は分岐前であるラベル(3)と分岐後の右側ブロックにあるラベル(4)を参照している。それに対応するため、分岐後の左側ブロックにRMOV命令(I413)を追加し、ラベル(8)とする。そして、phi関数I412に替えて、ラベル(8)とラベル(4)を参照するphi関数I414を定義している。
【0043】
図8は
図7Bとは別解を示すもので、分岐後の右側ブロックにRMOV命令I415、I416を追加し、それぞれラベル(8)、ラベル(9)とし、長さ調整のためにNOP命令I417を追加する。ラベル変更に合わせて、合流後のphi関数I410、I411の参照先を変更してI418、I419とする。
図7Bおよび
図8ともに、リネームレス・アウトオブオーダー実行プロセッサが正常動作可能なアセンブリコードとなっているが、追加するレジスタ間転送命令(RMOV)は少ない方が好ましく、その観点では
図7Bの対応がより良いと言える。
【0044】
改めて
図7Bに示した解決方法の手順を含め、複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所での解決手順をまとめると下の通りである。
・複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所(I410)を特定し、当該phi関数をphi関数α、phi関数β、phi関数γに分類する。
・phi関数αとは、2つの実行経路で同じ命令の結果を参照しているphi関数であり、
図7AではI410およびI411である。
・phi関数βとは、2つの実行経路で異なる命令の結果を参照し、そのうち片方だけが分岐より前の命令を参照しているphi関数であり、
図7AではI412である。
・phi関数γとは、2つの実行経路で異なる命令の結果を参照し、その両方が分岐より前の命令を参照しているphi関数である。
・phi関数αとphi関数βが同時に存在する場合は、レジスタ間転送命令(RMOV)を1つ追加する。
図7B(I413)がこれに相当する。
・phi関数αとphi関数γが同時に存在する場合は、レジスタ間転送命令(RMOV)を2つ追加する。ここでは具体例を省略する。
【0045】
3.5 (E)スピルアウト有効性解析処理機能
リネームレス・アウトオブオーダー実行プロセッサではループ処理の中で定数の値を保持することを目的としたレジスタ間転送命令(RMOV)を配置するケースが多くある。この処置は、リネームレス・アウトオブオーダー実行プロセッサにおいて必要なものであり、レジスタリネーミング型のプロセッサでは不要である。
【0046】
定数を保持することだけが目的であるレジスタ間転送命令(RMOV)がループ処理内に多数存在すると、オブジェクトコードサイズが大きくなるとともに、プロセッサとしての処理能力を下げる原因ともなる。そのため、ループ処理内に存在するレジスタ間転送命令(RMOV)が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、そのレジスタ間転送命令(RMOV)を削除する処理が有効となる。ここでは、その処理をスピルアウト(spill out)有効性解析処理機能とする
【0047】
先ず、
図9Aに示すプログラム言語Cで記述されたソースプログラムを例に説明する。
図9Aに示すソースプログラムではforループを有している。この
図9Aに対応するリネームレス・アウトオブオーダー実行プロセッサで実行可能なアセンブリコードが
図9Bである。
図9Bに示すとおり、第08行、第09行、第10行の3行にレジスタ間転送命令(RMOV)が存在しているが、これらはループ内で定数を保持するために置かれており、リネームレス・アウトオブオーダー実行プロセッサ全体の処理能力を高めるという観点では、全てのループ内レジスタ間転送命令(RMOV)は必ずしもループ内に存在する必要が無い場合がある。
【0048】
図9Bの第10行に置かれたレジスタ間転送命令(RMOV)をスピルアウトする例を
図9Cに示す。
図9Bの第10行目のレジスタ間転送命令(RMOV)は復帰アドレス(return address)を保持する役割を有しており、ループ内で参照されることが無く、そのためスピルアウトの対象となりうる。
図9Cでは、第08行からのループが始まる前である第07行にて、汎用レジスタ以外の記憶素子であるスタックにストア(ST)し、ループが終了した第16行の後の第18行において、スピルアウトした値をロード(LD)して戻している。それに付随して第02行、第17行にてスタックポインタ(SP)を管理している。この処理により、
図9Bではループ開始である第04行から、ループ終了である第13行の間に命令が8行あったものが、
図9Cではループ開始である第08行から、ループ終了である第16行の間の命令が7行に削減できている。ループ処理は繰り返し実行されるものであり、ループ内の命令数を削減することは全体への処理能力向上に貢献できる。
【0049】
図10には、一連のアセンブリコードの中で、複数の消費者(Consumer)命令がある場合のアセンブリコードフロー図を示す。生産者(Producer)命令I501にて生成された変数を、消費者命令I503、I504、I506で利用している場合を示している。この場合、全ての消費者命令の直前に図中SIで表記するロード命令(Spilling in)を挿入する。なお、消費者命令I503とI504の間にループ処理が入っているが、ロード命令の挿入方法に差が無いことに留意されたい。
【0050】
上記スピルアウト有効性解析処理を換言すると、ループ処理内に挿入されたレジスタ間転送命令が扱う変数の値に関して、その変数の値を生成する生産者命令と、当該値を参照する消費者命令の位置を確認し、前記全ての消費者命令が当該ループ処理内に存在しない場合に、生産者命令の後かつ当該ループ処理前に前記変数の値を汎用レジスタ以外の記憶素子にストアし、当該ループ処理後かつ前記全ての消費者命令の前に前記変数の値をロードし、前記レジスタ間転送命令を削除する処理、と言える。
【0051】
従来のレジスタリネーミング型プロセッサではスピルアウトが使われるのは、関数コールや汎用レジスタが不足した場合のみであるが、本発明が対象とするリネームレス・アウトオブオーダー実行プロセッサでは、汎用レジスタが充分残っており、かつ関数コールで無い場合であってもスピルアウトを行うことで、プロセッサとしての処理能力を高めることが可能である点に留意されたい。
【0052】
4.コンパイル方法
本発明の実施形態に係るコンパイル方法のフローチャートを
図11に示す。
図11に示す例ではコンパイル開始後に以下のステップを実行している。
【0053】
・S101: 中間コード生成処理ステップ。
ソースプログラムに対して字句解析、構文解析、意味解析を実行し、中間コードを生成する。
【0054】
・S102: (A)複製必要性解析処理ステップ。
1つの基本ブロックにおける複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令(RMOV)を挿入する。詳細は3.1節を参照されたい。
【0055】
・S103: (B)ループ内定数解析処理ステップ。
phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令(RMOV)を挿入する。詳細は3.2節を参照されたい。
【0056】
・S104: (C)命令間依存解析処理ステップ。
複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令(RMOV)を挿入する。詳細は3.3節を参照されたい。
【0057】
・S105: (D)同一命令参照解析処理ステップ。
複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令(RMOV)を挿入する。詳細は3.4節を参照されたい。
【0058】
・S106: (E)スピルアウト有効性解析処理ステップ。
ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する。詳細は3.5節を参照されたい。
【0059】
・S107: オブジェクトコード生成処理ステップ。
ここでは説明を省略している一般的な最適化処理も行った後、ターゲットとするリネームレス・アウトオブオーダー実行プロセッサに対応したオブジェクトコードを生成する。
【0060】
図11では、(A)~(E)全ての処理ステップを図示した順に実行しているが、(A)~(E)のうち何れか少なくとも1つ以上の処理ステップを実行すれば、リネームレス・アウトオブオーダー実行プロセッサに有効なオブジェクトコードを生成することが可能である。また、処理順序も図示した順に限定されない。
【0061】
5.結言
前述の実施形態では、情報変換装置の一例として、ソースプログラムからプロセッサに対応するオブジェクトコードを生成するコンパイル装置を説明したが、オブジェクトコードからさらに高効率のオブジェクトコードに変換する情報変換装置が実施されてもよい。また、コンピュータをこのような情報変換装置として機能させるためのプログラムが頒布されてもよいし、このような情報変換方法が実施されてもよい。
【0062】
さらに次に記載の各態様で提供されてもよい。
前記プログラムにおいて前記情報変換装置は、前記(B)ループ内定数解析処理部、を具備するプログラム。
前記プログラムにおいて、前記(A)複製必要性解析処理部では、複数のphi関数から参照される命令が存在する箇所を特定し、当該命令をオペランドとするレジスタ間転送命令を、(参照数-1)個、当該命令の後方に追加し、参照している複数phi関数のオペランドを相互に異なる命令となるように変更する、プログラム。
前記プログラムにおいて、前記(B)ループ内定数解析処理部では、phi関数の参照が循環している閉路を特定し、phi関数を頂点、phi関数からphi関数への参照を有向辺とした有向グラフを作成し、この有向グラフに有向閉路が存在した場合に、辺の始点となるphi関数と辺の終点となるphi関数の間にレジスタ間転送命令を追加する、プログラム。
前記プログラムにおいて、前記(C)命令間依存解析処理部では、複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、phi関数を頂点、phi関数が参照する命令間のデータ依存を有向辺とした有向グラフを作成し、前記有向グラフ内における有向閉路の有無を判定し、有向閉路が存在しない場合は、トポロジカルソートの各経路が等距離となるようNOP命令を追加し、有向閉路が存在する場合は、レジスタ間転送命令を追加し、有向閉路を除去することでトポロジカルソートを可能とする、プログラム。
前記プログラムにおいて、前記(D)同一命令参照解析処理部では、複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該phi関数をphi関数α、phi関数β、phi関数γに分類し、ここで、phi関数αとは、2つの実行経路で同じ命令の結果を参照しているphi関数であり、phi関数βとは、2つの実行経路で異なる命令の結果を参照し、そのうち片方だけが分岐より前の命令を参照しているphi関数であり、phi関数γとは、2つの実行経路で異なる命令の結果を参照し、その両方が分岐より前の命令を参照しているphi関数であり、phi関数αとphi関数βが同時に存在する場合は、レジスタ間転送命令を1つ追加し、phi関数αとphi関数γが同時に存在する場合は、レジスタ間転送命令を2つ追加する、プログラム。
前記プログラムにおいて、前記(E)スピルアウト有効性解析処理部では、ループ処理内に挿入されたレジスタ間転送命令が扱う変数の値に関して、その変数の値を生成する生産者命令と、当該値を参照する消費者命令の位置を確認し、前記全ての消費者命令が当該ループ処理内に存在しない場合に、前記生産者命令の後かつ当該ループ処理前に前記変数の値を汎用レジスタ以外の記憶素子にストアし、当該ループ処理後かつ前記全ての消費者命令の前に前記変数の値をロードし、前記レジスタ間転送命令を削除する、プログラム。
前記プログラムにおいて、前記プログラムは、コンパイラであり、前記情報変換装置は、ソースプログラムからプロセッサに対応するオブジェクトコードを生成するコンパイル装置であり、ここで前記プロセッサは、過去の実行結果を参照する相対位置をオペランドとする命令コードを実行可能な機能を具備する、プログラム。
情報変換装置であって、(A)~(E)の何れか1つ以上の構成要素;(A)1つの基本ブロックに存在する複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理部、(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理部、(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理部、(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理部、(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理部、を具備する情報変換装置。
情報変換方法であって、(A)~(E)の何れか1つ以上の処理ステップ;(A)1つの基本ブロックにおける複数のphi関数から参照される命令が存在する箇所を特定し、当該命令箇所にレジスタ間転送命令を挿入する、複製必要性解析処理ステップ、(B)phi関数の参照が循環している閉路を特定し、当該閉路に対してレジスタ間転送命令を挿入する、ループ内定数解析処理ステップ、(C)複数のphi関数の参照先となる各命令間にデータ依存がある箇所を特定し、当該箇所にレジスタ間転送命令を挿入する、命令間依存解析処理ステップ、(D)複数の実行経路で分岐前の同一命令の結果を参照しているphi関数がある箇所を特定し、当該実行経路にレジスタ間転送命令を挿入する、同一命令参照解析処理ステップ、(E)ループ処理内に存在するレジスタ間転送命令が対象とする変数の値を、ループ処理開始前に汎用レジスタ以外の記憶素子にストアし、当該値をループ処理終了後にロードし、前記レジスタ間転送命令を削除する、スピルアウト有効性解析処理ステップ、を有する情報変換方法。
もちろん、この限りではない。
【0063】
最後に、本発明に係る種々の実施形態を説明したが、これらは、例として提示したものであり、発明の範囲を限定することは意図していない。当該新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。当該実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。
【符号の説明】
【0064】
1 :コンパイル装置
2 :記憶部
20 :ソースプログラム
21 :コンパイラ
22 :オブジェクトコード
23 :リンカ
24 :実行形式ファイル
3 :通信部
4 :制御部
5 :作業メモリ部
10 :通信バス