(57)【要約】【課題】処理速度の高速化を図ることが可能なコンパイラ、コンパイル方法、及びコンピュータシステムを提供する。【解決手段】コンパイラ１０は、コンピュータシステムに、分割処理と、変更処理とを実行させる。分割処理では、プログラムに含まれるループ処理の本体を、少なくとも第１部分と第２部分とを含む所定個数の部分に分割する。変更処理では、ループ処理において少なくとも第１部分と第２部分との順番が逆になるように、プログラムを変更する。【選択図】図１
2020071746.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータシステムに、
プログラムに含まれるループ処理の本体を、少なくとも第１部分と第２部分とを含む所定個数の部分に分割する分割処理と、
前記ループ処理において少なくとも前記第１部分と前記第２部分との順番が逆になるように、前記プログラムを変更する変更処理と、を実行させるための、
コンパイラ。
【請求項２】
前記所定個数は２つである、
請求項１に記載のコンパイラ。
【請求項３】
前記第１部分は、前記ループ処理の前記本体の始めの部分を含み、
前記第２部分は、前記ループ処理の前記本体の終わりの部分を含む、
請求項１又は２に記載のコンパイラ。
【請求項４】
前記コンピュータシステムに、
前記変更処理で変更された後の前記プログラムに含まれる複数の変数に対してそれぞれレジスタを割り付ける割付処理を、更に実行させる、
請求項１〜３のいずれか１項に記載のコンパイラ。
【請求項５】
前記コンピュータシステムに、
前記変更処理で変更された後の前記プログラムに対してリストスケジューリングを行うリストスケジューリング処理を、更に実行させる、
請求項１〜４のいずれか１項に記載のコンパイラ。
【請求項６】
前記コンピュータシステムに、
前記割付処理の後に、前記割付処理によって前記複数の変数にレジスタが割り付けられた後の前記プログラムに対してリストスケジューリングを行うリストスケジューリング処理を、更に実行させる、
請求項４に記載のコンパイラ。
【請求項７】
前記分割処理では、前記所定個数の部分の境界を指定する境界情報に基づいて、前記ループ処理の前記本体を前記所定個数の部分に分割する、
請求項１〜６のいずれか１項に記載のコンパイラ。
【請求項８】
前記分割処理では、所定の分割条件に基づいて決定した境界で、前記ループ処理の前記本体を前記所定個数の部分に分割する、
請求項１〜６のいずれか１項に記載のコンパイラ。
【請求項９】
前記所定の分割条件は、前記ループ処理を実行する場合のサイクル数が最も少なくなるような条件である、
請求項８に記載のコンパイラ。
【請求項１０】
コンピュータシステムに、
プログラムに含まれるループ処理の本体を、少なくとも第１部分と第２部分とを含む所定の個数の部分に分割する分割処理と、
前記ループ処理において少なくとも前記第１部分と前記第２部分との順番が逆になるように、前記プログラムを変更する変更処理と、を実行させるための、
コンパイル方法。
【請求項１１】
請求項１〜９のいずれか１項に記載のコンパイラを備えた、
コンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、コンパイラ、コンパイル方法、及びコンピュータシステムに関する。より詳細には、本開示は、ソースコードをオブジェクトコードに変換するコンパイラ、コンパイル方法、及びコンピュータシステムに関する。
【背景技術】
【０００２】
特許文献１には、ソースプログラムをコンパイルするコンパイラが開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１１−２６５２９４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ソースプログラムがループ処理を含む場合に、ループ処理の処理速度を高速化できるようにオブジェクトコードを生成可能なコンパイラが要望されている。
【０００５】
本開示の目的は、処理速度の高速化を図ることが可能なコンパイラ、コンパイル方法、及びコンピュータシステムを提供することにある。
【課題を解決するための手段】
【０００６】
本開示の一態様のコンパイラは、コンピュータシステムに、分割処理と、変更処理と、を実行させるためのコンパイラである。前記分割処理では、プログラムに含まれるループ処理の本体を、少なくとも第１部分と第２部分とを含む所定個数の部分に分割する。前記変更処理では、前記ループ処理において少なくとも前記第１部分と前記第２部分との順番が逆になるように、前記プログラムを変更する。
【０００７】
本開示の一態様のコンパイル方法は、コンピュータシステムに、分割処理と、変更処理と、を実行させる。前記分割処理では、プログラムに含まれるループ処理の本体を、少なくとも第１部分と第２部分とを含む所定個数の部分に分割する。前記変更処理では、前記ループ処理において少なくとも前記第１部分と前記第２部分との順番が逆になるように、前記プログラムを変更する。
【０００８】
本開示の一態様のコンピュータシステムは、前記コンパイラを備えたコンピュータシステムである。
【発明の効果】
【０００９】
本開示によれば、処理速度の高速化を図ることが可能なコンパイラ、コンパイル方法、及びコンピュータシステムを提供することができる。
【図面の簡単な説明】
【００１０】
【図１】図１は、本開示の一実施形態に係るコンパイラの機能を説明するブロック図である。
【図２】図２は、同上のコンパイラを備えたコンピュータシステムの構成図である。
【図３】図３は、同上のコンパイラによる分割処理の説明図である。
【図４】図４は、同上のコンパイラによる変更処理の説明図である。
【図５】図５は、同上のコンパイラの動作を説明するフローチャートである。
【図６】図６は、本開示の一実施形態の変形例１に係るコンパイラによる分割処理の説明図である。
【図７】図７は、同上のコンパイラによる分割処理の別の例の説明図である。
【図８】図８は、本開示の一実施形態の変形例２に係るコンパイラによる分割処理の説明図である。
【図９】図９は、同上のコンパイラによる分割処理の説明図である。
【発明を実施するための形態】
【００１１】
以下に説明する実施形態は、本開示の種々の実施形態の一つに過ぎない。本開示の実施形態は、下記実施形態に限定されることはなく、この実施形態以外も含み得る。また、下記の実施形態は、本開示に係る技術的思想を逸脱しない範囲であれば、設計等に応じて種々の変更が可能である。
【００１２】
（実施形態）
（１）概要
本実施形態のコンパイラは、例えば、自動車等に搭載されるＤＳＰ（Digital Signal Processor）に組み込むためのオブジェクトコードを作成するために使用される。本実施形態のコンパイラは、例えばＣ言語又はＣ++言語等のコンピュータ言語で作成されたソースコードを、ソースコードよりも低い水準のコンピュータ言語（例えば機械語又は中間言語）で記述されるオブジェクトコードに変換する。
【００１３】
本実施形態のコンパイラ１０（図１参照）は、コンピュータシステム１（図２参照）に、分割処理と、変更処理と、を実行させる。換言すれば、コンパイラ１０は、分割処理を行う分割処理部１１と、変更処理を行う変更処理部１２の各機能を含む。
【００１４】
分割処理（分割処理部１１）では、プログラムに含まれるループ処理ＬＰ１の本体１００（図３参照）を、少なくとも第１部分１０１と第２部分１０２とを含む所定個数の部分（１０１，１０２）に分割する。
【００１５】
変更処理（変更処理部１２）では、ループ処理ＬＰ２において少なくとも第１部分１０１と第２部分１０２との順番が逆になるように、プログラムを変更する（図４参照）。なお、図４では、変更後のループ処理をＬＰ２と記載している。
【００１６】
ここにおいて、プログラムは、コンパイラ１０が変換する対象のソースコードＣＤ１である。ソースコードＣＤ１は、例えばＣ言語又はＣ++言語等の高水準のコンピュータ言語で記述されたコードでもよいし、高水準のコンピュータ言語と機械語との間の中間言語で記述されたコードでもよい。
【００１７】
本実施形態のコンパイラ１０は、コンピュータシステム１に、ループ処理ＬＰ１の本体１００を、少なくとも第１部分１０１と第２部分１０２とを含む所定個数の部分に分割する分割処理を実行させる。そして、コンパイラ１０は、コンピュータシステム１に、ループ処理ＬＰ１において少なくとも第１部分１０１と第２部分１０２との順番が逆になるように、プログラムを変更する変更処理を実行させる。コンパイラ１０が変更処理を実行した後のプログラムでは、ループ処理ＬＰ２において第１部分１０１と第２部分１０２との順番が逆になっている。
【００１８】
例えば、変更処理の実行前は、ループ処理ＬＰ１の各ループで第１部分１０１を実行した後に第２部分１０２を実行する場合、変更処理の実行後のプログラムでは、ループ処理ＬＰ２の各ループで第２部分１０２を実行した後に第１部分１０１が実行される。ここで、先に実行される第１部分１０１の処理（命令）のうち、後から実行される第２部分１０２の処理に依存している処理の数は、後から実行される第２部分１０２の処理のうち、先に実行される第１部分１０１の処理に依存している処理の数に比べて少なくなる。なお、ある処理が別の処理に依存しているとは、例えば、ある処理の結果を利用して（換言すると、ある処理で定義された変数を参照して）別の処理が行われる関係にあることをいう。このため、ある処理が実行されなければ、別の処理を実行することはできず、ある処理と別の処理との間に依存関係がある。例えば、先に実行される第１部分１０１の処理が、後から実行される第２部分１０２の処理に依存するとは、第１部分１０１の処理が、第２部分１０２の処理で定義された変数を参照するような依存関係にあることをいう。また、後から実行される第２部分１０２の処理が、先に実行される第１部分１０１の処理に依存するとは、第２部分１０２の処理が、第１部分１０１の処理で定義された変数を参照するような依存関係にあることをいう。
【００１９】
したがって、変更処理を実行して第１部分１０１と第２部分１０２との順番を逆にすれば、第１部分１０１に含まれる処理と第２部分１０２に含まれる処理とで互いに依存関係がない処理を増やすことができる。したがって、コンパイラ１０が変更処理の実行後にリストスケジューリングを実施することで、並列実行が可能な処理を増やすことができる。よって、プロセッサがループ処理を実行する場合の処理速度の高速化を図ることが可能なコンパイラ１０を実現できる。
【００２０】
ところで、ループ処理を高速化する手法としてモジュロースケジューリングがある。モジュロースケジューリングは周知の手法であるので、その説明は省略する。ここで、ループ処理中の変数にレジスタを割り付ける前に、モジュロースケジューリングを実施する場合、レジスタ数に制限がない、つまり無限大個のレジスタが割り付け可能であるという前提でモジュロースケジューリングを実施する。したがって、モジュロースケジューリングの実施後にレジスタの割り付けを行う場合に、レジスタが足りなくなると、レジスタの退避／復帰命令（いわゆるスピル命令）を挿入することになるが、このスピル処理はモジュロースケジューリングでは考慮されていない。そのため、プロセッサがオブジェクトコードを実行する場合に、スピル命令の実行により処理速度が低下する可能性がある。
【００２１】
一方、ループ処理中の変数にレジスタを割り付けた後で、モジュロースケジューリングを実施する場合、スピル命令も含めてモジュロースケジューリングが実施されるため、スピル命令による処理速度の低下は回避できる。しかしながら、モジュロースケジューリングの実施前にレジスタの割り付けを行う場合、レジスタの割り付けによって新たな依存関係が発生する可能性があり、依存関係がある処理は並列実行できないため、処理速度の高速化が妨げられるという問題がある。
【００２２】
それに対して、本実施形態のコンパイラ１０では、ループ処理の本体１００に分割処理と変更処理とを実行することで、第１部分１０１に含まれる処理と第２部分１０２に含まれる処理とで互いに依存関係がない処理を増やすことができる。よって、変更処理を実行して第１部分１０１と第２部分１０２との順番を逆にした後では、リストスケジューリングを実施することで、互いに依存関係がない処理を並列実行できるようになる。したがって、モジュロースケジューリングに比べて、処理が簡単で、処理速度の高速化を図ることが可能なコンパイラ１０を実現できる。
【００２３】
（２）詳細
以下、本実施形態に係るコンパイラ１０、及びコンパイラ１０を備えたコンピュータシステム１（コンパイラ装置）について図面を参照して詳しく説明する。
【００２４】
（２．１）構成
本実施形態のコンピュータシステム１は、図２に示すように、演算部２と、入力部３と、記憶部４と、出力部５とを備える。
【００２５】
演算部２は、例えば、ハードウェアとしてのプロセッサ及びメモリを主構成とする。演算部２は、記憶部４に記録されたプログラム（例えば、コンパイラ１０のプログラム）をプロセッサが実行することによって、演算部２としての機能（コンパイラ１０の機能）が実現される。プログラムは、記憶部４に予め記録されてもよく、電気通信回線を通じて提供されてもよく、演算部２で読み取り可能なメモリカード、光学ディスク、ハードディスクドライブ等の非一時的記録媒体に記録されて提供されてもよい。
【００２６】
入力部３は、例えばキーボード、マウス、ポインティングデバイス等の入力機器を含む。コンピュータシステム１のユーザ（例えば、コンパイラ１０を使ってオブジェクトコードを作成するユーザ）が入力部３を用いて入力作業を行うと、入力部３を用いて入力された入力データが演算部２に入力される。
【００２７】
記憶部４は、例えば、ＲＡＭ（Random Access Memory）等の半導体メモリを含む主記憶装置と、ハードディスク装置等のストレージと、を含む。記憶部４は、コンパイラ１０のプログラム、ソースコードＣＤ１、コンパイラ１０が変換したオブジェクトコード等のデータを記憶する。
【００２８】
出力部５は、例えば、コンパイラ１０に入力されるソースコードＣＤ１、及びコンパイラ１０によって作成されるオブジェクトコード等を表示する機能を有する。出力部５は、例えば、液晶ディスプレイ又は有機ＥＬ（Electro Luminescence）ディスプレイ等の薄型ディスプレイを含む。なお、出力部５は、コンパイラ１０から出力される情報を音声等で出力するスピーカ等を含んでもよい。
【００２９】
図１は、演算部２がコンパイラ１０のプログラム（ソフトウェア）を実行することによって実現されるコンパイラ１０の機能を説明するブロック図である。
【００３０】
コンパイラ１０は、分割処理部１１と、変更処理部１２とを少なくとも含む。本実施形態のコンパイラ１０は、割付処理部１３と、リストスケジューリング処理部１４の機能を更に含んでいる。
【００３１】
コンパイラ１０は、例えばＣ言語で記述されたソースコードＣＤ１を、機械語で記述されるオブジェクトコードに変換する。
【００３２】
分割処理部１１は、プログラム（ソースコードＣＤ１）に含まれるループ処理ＬＰ１の本体１００を、少なくとも第１部分１０１と、第２部分１０２とを含む所定個数の部分に分割する。本実施形態では所定個数は２つである。また、本実施形態では、第１部分１０１は、ループ処理ＬＰ１の本体１００の始めの部分を含み、第２部分１０２は、ループ処理ＬＰ１の本体１００の終わりの部分を含む。ここで、分割処理部１１は、コンパイラ１０のユーザがプラグマ命令Ｐ１（図３参照）を用いてコンパイラ１０に入力した境界情報に基づいて、ループ処理ＬＰ１の本体１００を第１部分１０１と第２部分１０２とに分割する。図３の例では、プラグマ命令Ｐ１（例えば、「#pragma devide_point」）は、ソースコードＣＤ１において第１部分１０１と第２部分１０２との間に配置され、第１部分１０１と第２部分１０２との境界を示している。分割処理部１１は、ループ処理ＬＰ１の本体１００を、プラグマ命令Ｐ１よりも前の部分を第１部分１０１とし、プラグマ命令Ｐ１よりも後の部分を第２部分１０２とするように分割する。このように、分割処理部１１による分割処理では、所定個数の部分の境界を指定する境界情報に基づいて、ループ処理ＬＰ１の本体１００を所定個数の部分に分割する。
【００３３】
変更処理部１２は、ループ処理において、分割処理部１１で分割された所定個数の部分（本実施形態では第１部分１０１及び第２部分１０２の２つの部分）を、少なくとも第１部分１０１と第２部分１０２との順番が逆になるように、プログラムを変更する。
【００３４】
割付処理部１３は、変更処理部１２によって第１部分１０１と第２部分１０２との順番が変更された後のプログラムに含まれる複数の変数に対してそれぞれレジスタを割り付ける割付処理を実行する。複数の変数に対して互いに異なるレジスタを割り付けることで、プログラムに含まれる処理（命令）の並列実行が最大限可能になり、処理の並列性が最大化されるように、複数の変数にレジスタが割り付けられる。すなわち、本実施形態のコンパイラ１０は、コンピュータシステム１に、変更処理で変更された後のプログラムに含まれる複数の変数に対してそれぞれレジスタを割り付ける割付処理を、更に実行させる。なお、割付処理部１３は、レジスタが不足する場合は、複数の変数の一部がレジスタを共有するように、複数の変数に対してレジスタを割り付ければよい。ここで、割付処理部１３は、複数の変数のうち依存関係がある２以上の変数でレジスタを共有するように、複数の変数に対してレジスタを割り付けてもよく、並列性の低下を抑制しながら、レジスタの割り付けを行うことができる。
【００３５】
リストスケジューリング処理部１４は、割付処理部１３による割付処理の後に、割付処理によって複数の変数にレジスタが割り付けられた後のプログラムに対して、リストスケジューリングを実行する。ここにおいて、リストスケジューリングとは、プログラムの実行結果に影響を与えない範囲で、プログラム中の処理が効率的に実行されるように、プログラム中の処理の順番を入れ替えることをいう。リストスケジューリング処理部１４では、第１部分１０１と第２部分１０２との順番が変更された後のプログラムにおいて、プログラム中の処理の依存関係を検査し、依存関係のグラフを作成する。そして、リストスケジューリング処理部１４は、第１部分１０１及び第２部分１０２に含まれる複数の処理（命令）を、依存関係を満たすような並べ方であって、並列実行が可能な処理の数ができるだけ多くなるような並べ方に並べ変える。すなわち、本実施形態のコンパイラ１０は、コンピュータシステム１に、割付処理の後に、割付処理によって複数の変数にレジスタが割り付けられた後のプログラムに対してリストスケジューリングを行うリストスケジューリング処理を、更に実行させる。
【００３６】
（２．２）動作
本実施形態のコンパイラ１０の動作を図５に基づいて説明する。
【００３７】
ユーザは、コンピュータシステム１の入力部３を用いてコンパイラ１０を起動させ、ソースコードＣＤ１のコンパイルを指示すると、コンパイラ１０がソースコードＣＤ１のコンパイルを開始する。
【００３８】
ここで、コンパイラ１０の分割処理部１１は、ソースコードＣＤ１に含まれるループ処理ＬＰ１の本体１００を図３に示すように第１部分１０１と第２部分１０２とに２分割する分割処理を行う（Ｓ１）。コンパイラ１０のユーザは、ソースコードＣＤ１に挿入したプラグマ指令Ｐ１により第１部分１０１と第２部分１０２との境界を示す境界情報を設定している。例えば、ユーザは、ソースコードＣＤ１上で、第１部分１０１及び第２部分１０２にそれぞれ含まれる処理（命令）の数が同数になるように本体１００を分割するための設定情報を入力する。このとき、分割処理部１１は、プラグマ命令Ｐ１により入力された設定情報に従って、本体１００を第１部分１０１と第２部分１０２とに分割する。
【００３９】
分割処理部１１によって本体１００が第１部分１０１と第２部分１０２とに分割されると、変更処理部１２は、ループ処理ＬＰ１において、第１部分１０１と第２部分１０２との順番が逆になるようにソースコードＣＤ１を変更する（図４参照）。すなわち、変更処理部１１は、第１部分１０１の処理を１回実行し、第２部分１０２及び第１部分１０１の順番に並ぶ本体２００を含むループ処理ＬＰ２を（Ｎ−１）回繰り返した後、第２部分１０２の処理を１回実行するように、ソースコードＣＤ１を変更する。
【００４０】
次に、割付処理部１３は、変更処理部１２によって変更されたプログラムに含まれる複数の変数に対してそれぞれレジスタを割り付ける割付処理を実行する（Ｓ３）。
【００４１】
そして、リストスケジューリング処理部１４が、レジスタの割付処理が行われた後のプログラムに対してリストスケジューリング処理を実行する（Ｓ４）。すなわち、リストスケジューリング処理部１４は、ループ処理ＬＰ２の本体２００に含まれる複数の処理（命令）を、依存関係を満たすような並べ方であって、並列実行が可能な処理の数ができるだけ多くなるような並べ方に並べ変える。
【００４２】
このように、リストスケジューリング処理部１４が、第２部分１０２及び第１部分１０１に含まれる複数の処理にリストスケジューリング処理を行うことで、ループ処理ＬＰ２に含まれる処理のうち並列実行が可能な処理の数をできるだけ増やすことができる。したがって、コンパイラ１０がコンパイルしたオブジェクトコードを組み込んだプロセッサでは、ループ処理ＬＰ２の処理速度の高速化が可能になり、ループ処理ＬＰ２の処理速度の高速化を図ることが可能なコンパイラ１０を提供できる。
【００４３】
コンパイラ１０は、リストスケジューリング処理部１４がリストスケジューリング処理を行った後のソースコードＣＤ１を変換（コンパイル）したオブジェクトコードを作成する。コンパイラ１０によって変換されたオブジェクトコードは、例えばＤＳＰのようなプロセッサのメモリに組み込まれて使用される。
【００４４】
なお、図３の例ではループ処理ＬＰ１が１つしか図示されていないが、ソースコードＣＤ１中に複数のループ処理が含まれる場合、コンパイラ１０は複数のループ処理の各々について分割処理と変更処理とを行えばよい。また、ソースコードＣＤ１中に多階層のループ処理が含まれる場合、コンパイラ１０は、最も階層が深いループ処理に対して分割処理と変更処理とを行えばよい。
【００４５】
（３）変形例
上記実施形態は、本開示の様々な実施形態の一つに過ぎない。上記実施形態は、本開示の目的を達成できれば、設計等に応じて種々の変更が可能である。また、コンパイラ１０（プログラム）と同様の機能は、コンパイル方法、コンパイラ１０（プログラム）を備えたコンピュータシステム１、又はコンパイラ１０（プログラム）を記録した非一時的な記録媒体等で具現化されてもよい。一態様に係るコンパイル方法は、コンピュータシステム１に、分割処理と、変更処理と、を実行させるための方法である。分割処理では、プログラムに含まれるループ処理の本体１００を、少なくとも第１部分１０１と第２部分１０２とを含む所定の個数の部分に分割する。変更処理では、ループ処理において少なくとも第１部分１０１と第２部分１０２との順番が逆になるように、プログラムを変更する。一態様に係るコンピュータシステム１は、コンパイラ１０を備えたコンピュータシステムである。コンピュータシステム１は、分割処理を行う分割処理部１１と、変更処理を行う変更処理部１２との各機能を含む。分割処理部１１は、プログラムに含まれるループ処理の本体１００を、少なくとも第１部分１０１と第２部分１０２とを含む所定の個数の部分に分割する。変更処理部１２は、ループ処理において少なくとも第１部分１０１と第２部分１０２との順番が逆になるように、プログラムを変更する。
【００４６】
以下、上記の実施形態の変形例を列挙する。以下に説明する変形例は、適宜組み合わせて適用可能である。なお、以下では、上記実施形態を「基本例」と呼ぶこともある。
【００４７】
本開示におけるコンパイラ１０を備えたコンピュータシステム１は、ハードウェアとしてのプロセッサ（演算部２）及びメモリ（記憶部４）を主構成とする。コンピュータシステム１のメモリに記録されたコンパイラ１０のプログラムをプロセッサが実行することによって、本開示におけるコンピュータシステム１としての機能が実現される。コンパイラ１０のプログラムは、コンピュータシステム１のメモリに予め記録されてもよく、電気通信回線を通じて提供されてもよく、コンピュータシステム１で読み取り可能なメモリカード、光学ディスク、ハードディスクドライブ等の非一時的記録媒体に記録されて提供されてもよい。コンピュータシステム１のプロセッサは、半導体集積回路（ＩＣ）又は大規模集積回路（ＬＳＩ）を含む１ないし複数の電子回路で構成される。ここでいうＩＣ又はＬＳＩ等の集積回路は、集積の度合いによって呼び方が異なっており、システムＬＳＩ、ＶＬＳＩ（Very Large Scale Integration）、又はＵＬＳＩ（Ultra Large Scale Integration）と呼ばれる集積回路を含む。さらに、ＬＳＩの製造後にプログラムされる、ＦＰＧＡ（Field-Programmable Gate Array）、又はＬＳＩ内部の接合関係の再構成若しくはＬＳＩ内部の回路区画の再構成が可能な論理デバイスについても、プロセッサとして採用することができる。複数の電子回路は、１つのチップに集約されていてもよいし、複数のチップに分散して設けられていてもよい。複数のチップは、１つの装置に集約されていてもよいし、複数の装置に分散して設けられていてもよい。ここでいうコンピュータシステム１は、１以上のプロセッサ及び１以上のメモリを有するマイクロコントローラを含む。したがって、マイクロコントローラについても、半導体集積回路又は大規模集積回路を含む１ないし複数の電子回路で構成される。また、コンパイラ１０の複数の機能がクラウド（クラウドコンピューティング）等によって実現されてもよい。
【００４８】
上記の実施形態において、使用メモリサイズ等の２値の比較において、「超える」としているところは「以上」であってもよい。つまり、２値の比較において、２値が等しい場合を含むか否かは、目標値等の設定次第で任意に変更できるので、「超える」か「以上」かに技術上の差異はない。同様に、「以下」としているところは「未満」であってもよい。
【００４９】
（３．１）変形例１
変形例１のコンパイラ１０を図６及び図７に基づいて説明する。変形例１のコンパイラ１０は、分割処理部１１による分割処理が基本例と相違する。なお、分割処理部１１による分割処理以外は基本例と同様であるので、上記の基本例と共通の構成要素には同一の符号を付して、その説明は省略する。
【００５０】
変形例１のコンパイラ１０の分割処理部１１は、図６に示すように、コンパイラ１０のユーザがプラグマ命令Ｐ２を用いてコンパイラ１０に入力した境界情報に基づいて、ループ処理ＬＰ１の本体１００を第１部分１０１と第２部分１０２とに分割する。図６の例では、プラグマ命令Ｐ２（例えば、「#pragma devide_rate = 0.5」）は、ループ処理ＬＰ１の直前に挿入されている。プラグマ命令Ｐ２は、プラグマ命令Ｐ２の直後のループ処理ＬＰ１の本体１００を第１部分１０１と第２部分１０２とに分割する割合を指定している。
【００５１】
図６の例では、本体１００を第１部分１０１と第２部分１０２とに分割する割合を、０より大きく、かつ、１より小さい小数で指定している。
【００５２】
基本例では、ソースコードの途中にプラグマ命令Ｐ１を挿入して第１部分１０１と第２部分１０２との間の分割点を指定しているが、変形例１では、プラグマ命令Ｐ２で第１部分１０１と第２部分１０２との分割割合を指定している。コンパイラ１０の分割処理部１１は、例えば、プラグマ命令Ｐ２で入力された分割割合に基づいて、ソースコードＣＤ１から作成した中間コード上で本体１００を第１部分１０１と第２部分１０２とに分割する。ここで、ソースコードＣＤ１での１行の命令は、中間コードであれば複数行の命令に相当する。したがって、分割処理部１１は、ソースコードＣＤ１上で本体１００を２つに分割する場合に比べて、中間コード上で本体１００を入力された分割割合に基づいて２つに分割する場合の方が、より細かい単位で本体１００を分割することができる。したがって、変形例１のコンパイラ１０では、ループ処理の実行速度を更に高速化することが可能になる。
【００５３】
なお、図６の例では、ユーザは、プラグマ命令Ｐ２を用いて本体１００の分割割合を小数で入力しているが、図７に示すように、ユーザは、プラグマ命令Ｐ３を用いて本体１００の分割割合を百分率で入力してもよい。図７の例では、プラグマ命令Ｐ３（例えば、「#pragma devide_rate = 50」）は、ループ処理ＬＰ１の直前に挿入されている。プラグマ命令Ｐ３は、プラグマ命令Ｐ３の直後のループ処理ＬＰ１の本体１００を第１部分１０１と第２部分１０２とに分割する割合を百分率で指定している。
【００５４】
この場合、コンパイラ１０の分割処理部１１は、プラグマ命令Ｐ３で入力された分割割合（百分率）に基づいて、ソースコードＣＤ１から作成した中間コード上で本体１００を第１部分１０１と第２部分１０２とに分割する。図７の例では、小数に比べてプロセッサが扱いやすい整数（百分率）で分割割合を指定しているので、分割処理部１１がループ処理ＬＰ１の本体１００を分割する処理がしやすくなる。
【００５５】
（３．２）変形例２
変形例２のコンパイラ１０を図８及び図９に基づいて説明する。変形例２のコンパイラ１０では、分割処理において、所定の分割条件に基づいて決定した境界で、ループ処理の本体１００を所定個数の部分に分割している点で基本例及び変形例１と相違する。ここで、所定の分割条件は、ループ処理を実行する場合のサイクル数が最も少なくなるような境界であるという条件である。ここにおいて、オブジェクトコードが組み込まれたプロセッサは、１サイクルでオブジェクトコードの１行分の処理を実行するものとする。なお、分割処理部１１による分割処理以外は基本例と同様であるので、上記の基本例と共通の構成要素には同一の符号を付して、その説明は省略する。
【００５６】
変形例２のコンパイラ１０は、ループ処理を実行する場合のサイクル数が最小になるような、第１部分１０１と第２部分１０２との境界を以下の方法で探索する。
【００５７】
コンパイラ１０は、図８に示すように、ループ処理の本体１００の１／２の部分を第１境界候補Ｂ１とする。また、コンパイラ１０は、第１境界候補Ｂ１を間にして本体１００の１／４（＝１／２−１／４）の部分を第２境界候補Ｂ２、本体１００の３／４（＝１／２＋１／４）の部分を第３境界候補Ｂ３とする。分割処理部１１は、ループ処理の本体１００を第１〜第３境界候補Ｂ１〜Ｂ３でそれぞれ第１部分１０１と第２部分１０２とに分割する。変更処理部１２は、ループ処理の本体１００が第１〜第３境界候補Ｂ１〜Ｂ３で分割された場合の各々について変更処理を行い、割付処理部１３が割付処理を行って、リストスケジューリング処理部１４がリストスケジューリング処理を行う。そして、コンパイラ１０は、ループ処理の本体１００が第１〜第３境界候補Ｂ１〜Ｂ３で分割された場合の各々について、ループ処理を実行する場合のサイクル数を求める。
【００５８】
ここで、中央の第１境界候補Ｂ１でのサイクル数が最小となった場合、コンパイラ１０は、境界の探索処理を終了し、第１境界候補Ｂ１を第１部分１０１と第２部分１０２との境界に決定する。分割処理部１１は、ループ処理の本体１００を第１境界候補Ｂ１で第１部分１０１と第２部分１０２とに分割する。そして、変更処理部１２が、第１部分１０１と第２部分１０２との順番を逆にするようにプログラムを変更し、割付処理部１３が割付処理を行って、リストスケジューリング処理部１４がリストスケジューリング処理を行い、オブジェクトコードを作成する。
【００５９】
一方、両側の第２境界候補Ｂ２又は第３境界候補Ｂ３でのサイクル数が最小となった場合、コンパイラ１０は、サイクル数が最小の境界候補Ｂ２又はＢ３を第１境界候補Ｂ１に設定する。例えば、本体１００の４分の１の第２境界候補Ｂ２でのサイクル数が最小となった場合、コンパイラ１０は、図９に示すように、ループ処理の本体１００の１／４の部分を第１境界候補Ｂ１とする。また、コンパイラ１０は、第１境界候補Ｂ１を間にして本体１００の１／８（＝１／４−１／８）の部分を第２境界候補Ｂ２、本体１００の３／８（＝１／４＋１／８）の部分を第３境界候補Ｂ３とする。分割処理部１１は、ループ処理の本体１００を第１〜第３境界候補Ｂ１〜Ｂ３でそれぞれ第１部分１０１と第２部分１０２とに分割する。変更処理部１２は、ループ処理の本体１００が第１〜第３境界候補Ｂ１〜Ｂ３で分割された場合の各々について変更処理を行い、割付処理部１３が割付処理を行って、リストスケジューリング処理部１４がリストスケジューリング処理を行う。そして、コンパイラ１０は、ループ処理の本体１００が第１〜第３境界候補Ｂ１〜Ｂ３で分割された場合の各々について、ループ処理を実行する場合のサイクル数を求める。
【００６０】
そして、中央の第１境界候補Ｂ１でのサイクル数が最小となった場合、コンパイラ１０は、境界の探索処理を終了し、第１境界候補Ｂ１を第１部分１０１と第２部分１０２との境界に決定する。分割処理部１１は、ループ処理の本体１００を第１境界候補Ｂ１で第１部分１０１と第２部分１０２とに分割する。そして、変更処理部１２が、第１部分１０１と第２部分１０２との順番を逆にするようにプログラムを変更し、割付処理部１３が割付処理を行って、リストスケジューリング処理部１４がリストスケジューリング処理を行い、オブジェクトコードを作成する。
【００６１】
一方、両側の第２境界候補Ｂ２又は第３境界候補Ｂ３でのサイクル数が最小となった場合、コンパイラ１０は、サイクル数が最小の境界候補Ｂ２又はＢ３を第１境界候補Ｂ１に設定して、境界の探索処理を実行する。以下、コンパイラ１０は、複数の境界候補Ｂ１〜Ｂ３のうち、中央の第１境界候補Ｂ１でのサイクル数が最小となるまで、境界の探索処理を続行する。
【００６２】
以上のように、コンパイラ１０は、ループ処理を実行する場合のサイクル数が最も少なくなるような境界であるという分割条件に基づいて、第１部分１０１と第２部分１０２との境界を決定している。したがって、コンパイラ１０は、ループ処理を実行する場合のサイクル数が最小になるように、第１部分１０１と第２部分１０２との境界を適宜設定できる。
【００６３】
（３．３）その他の変形例
基本例では、コンパイラ１０は、ループ処理の本体を２つの部分に分割しているが、ループ処理の本体を３つ以上の部分に分割してもよい。なお、ループ処理の本体を３つ以上の所定個数の部分に分割する場合は、２つに分割する場合に比べて、分割された所定個数の部分を並べ変えた場合に、所定個数の部分に含まれる処理のうち依存関係を有する処理が増加すると考えられる。この場合、所定個数の部分に含まれる処理のうち互いに依存関係を有する処理では、変数に割り当てられるレジスタの置き換えを行えばよい。
【００６４】
分割処理においてループ処理の本体を３つ以上の部分に分割する場合でも、分割された３つ以上の部分のうち、第１部分と第２部分との順番が逆になるようにプログラムを変更することで、変更後のプログラムにおいて並列実行が可能な処理を増やすことができる。したがって、変更処理の実行後にリストスケジューリング処理を実行し、変更後のプログラムにおいて並列実行が可能な処理は並列実行を行うことで、オブジェクトコードが組み込まれたプロセッサの処理速度の高速化が可能になる。
【００６５】
基本例では、リストスケジューリング処理部１４は、割付処理部１３が割付処理を行った後にリストスケジューリングを実施しているが、割付処理部１３が割付処理を行う前にリストスケジューリング処理を実施してもよい。すなわち、コンパイラ１０は、コンピュータシステム１に、変更処理で変更された後のプログラムに対してリストスケジューリングを行うリストスケジューリング処理を、更に実行させてもよい。
【００６６】
この場合でも、コンパイラ１０は、変更処理を行うことによって依存関係がある処理を少なくした状態でリストスケジューリングを行っているので、互いに依存関係がない処理を並列実行できるようになり、処理速度の高速化を図ることができる。
【００６７】
（まとめ）
以上説明したように、第１の態様に係るコンパイラ（１０）は、コンピュータシステム（１）に、分割処理と、変更処理と、を実行させる。分割処理では、プログラムに含まれるループ処理（ＬＰ１）の本体（１００）を、少なくとも第１部分（１０１）と第２部分（１０２）とを含む所定個数の部分（１０１，１０２）に分割する。変更処理では、ループ処理（ＬＰ１）において少なくとも第１部分（１０１）と第２部分（１０２）との順番が逆になるように、プログラムを変更する。
【００６８】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００６９】
第２の態様に係るコンパイラ（１０）では、第１の態様において、所定個数は２つである。
【００７０】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００７１】
第３の態様に係るコンパイラ（１０）では、第１又は第２の態様において、第１部分（１０１）は、ループ処理（ＬＰ１）の本体（１００）の始めの部分を含み、第２部分（１０２）は、ループ処理（ＬＰ１）の本体（１００）の終わりの部分を含む。
【００７２】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００７３】
第４の態様に係るコンパイラ（１０）では、第１〜第３のいずれかの態様において、コンピュータシステム（１）に、割付処理を、更に実行させる。割付処理では、変更処理で変更された後のプログラムに含まれる複数の変数に対してそれぞれレジスタを割り付ける。
【００７４】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００７５】
第５の態様に係るコンパイラ（１０）では、第１〜第４のいずれかの態様において、コンピュータシステム（１）に、リストスケジューリング処理を、更に実行させる。リストスケジューリング処理では、変更処理で変更された後のプログラムに対してリストスケジューリングを行う。
【００７６】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００７７】
第６の態様に係るコンパイラ（１０）では、第４の態様において、コンピュータシステム（１）に、割付処理の後に、リストスケジューリング処理を、更に実行させる。リストスケジューリング処理では、割付処理によって複数の変数にレジスタが割り付けられた後のプログラムに対してリストスケジューリングを行う。
【００７８】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００７９】
第７の態様に係るコンパイラ（１０）では、第１〜第６のいずれかの態様において、分割処理では、所定個数の部分の境界を指定する境界情報に基づいて、ループ処理（ＬＰ１）の本体（１００）を所定個数の部分に分割する。
【００８０】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００８１】
第８の態様に係るコンパイラ（１０）では、第１〜第６のいずれかの態様において、分割処理では、所定の分割条件に基づいて決定した境界で、ループ処理（ＬＰ１）の本体（１００）を所定個数の部分に分割する。
【００８２】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００８３】
第９の態様に係るコンパイラ（１０）では、第８の態様において、所定の分割条件は、ループ処理（ＬＰ１）を実行する場合のサイクル数が最も少なくなるような境界であるという条件である。
【００８４】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００８５】
第１０の態様に係るコンパイル方法では、コンピュータシステム（１）に、分割処理と、変更処理と、を実行させる。分割処理では、プログラムに含まれるループ処理（ＬＰ１）の本体（１００）を、少なくとも第１部分（１０１）と第２部分（１０２）とを含む所定個数の部分（１０１，１０２）に分割する。変更処理では、ループ処理（ＬＰ１）において少なくとも第１部分（１０１）と第２部分（１０２）との順番が逆になるように、プログラムを変更する。
【００８６】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００８７】
第１１の態様に係るコンピュータシステム（１）は、第１〜第９のいずれかの態様のコンパイラ（１０）を備えたコンピュータシステムである。
【００８８】
この態様によれば、処理速度の高速化を図ることが可能なコンパイラを実現できる。
【００８９】
第１２の態様に係るコンパイラ（１０）は、第７の態様において、境界情報はプログラムに組み込まれている。
【００９０】
第１３の態様に係るコンパイラ（１０）は、第１２の態様において、境界情報は、ループ処理の本体を所定個数の部分に分割する割合を指定する情報である。
【００９１】
第１４の態様に係るコンパイラ（１０）は、第８又は第９の態様において、ループ処理の本体を複数の境界候補で分割した場合の各々でサイクル数を求める。コンパイラ（１０）は、複数の境界候補のうちサイクル数が最も少なくなる境界候補を、ループ処理の本体を所定個数の部分に分割する境界とする。
【００９２】
上記態様に限らず、実施形態に係るコンパイラ（１０）の種々の構成（変形例を含む）は、コンパイル方法、又はコンパイラ（１０）を記録した非一時的記録媒体等で具現化可能である。
【００９３】
第２〜第８及び第１２〜第１４の態様に係る構成については、コンパイラ（１０）に必須の構成ではなく、適宜省略可能である。
【符号の説明】
【００９４】
１  コンピュータシステム
１０  コンパイラ
１００  本体
１０１  第１部分
１０２  第２部分
【図１】
2020071746.tif 000003
【図２】
2020071746.tif 000004
【図３】
2020071746.tif 000005
【図４】
2020071746.tif 000006
【図５】
2020071746.tif 000007
【図６】
2020071746.tif 000008
【図７】
2020071746.tif 000009
【図８】
2020071746.tif 000010
【図９】
2020071746.tif 000011