(57)【要約】【課題】キャッシュミスの影響が小さく、かつ、性能が高いオブジェクトプログラムを自動に生成することができるコンパイルシステムを提供する。【解決手段】コンパイルシステム１は、コンパイル、リンク及びシミュレーションを実行して得られたプロファイル１０８に基づいて、性能寄与順序リスト１０９を作成する。また、コンパイルシステム１は、性能寄与順序リスト１０９に基づいて、個別自動最適化を適用する候補ブロックを決定し、候補ブロックに対して個別自動最適化を適用する効果があるか否かを判定し、適用する効果があると判定されると、個別自動最適化を適用した場合の候補ブロックを含む関数のコードサイズがキャッシュサイズを超えるか否かを判定することにより最適化可能か否かを判定し、最適化可能と判定された場合、個別自動最適化を適用した場合の所要サイクル数が要求性能を満足するか否かを判定する。【選択図】図２
2010140344.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムに対して自動最適化を実行し、オブジェクトプログラムを生成するコンパイルシステムであって、
前記ソースプログラムに対してコンパイル、リンク及びシミュレーションを実行して得られた第１のシミュレーション結果に基づいて、性能寄与の大きさの情報を含む性能寄与順序リストを作成するリスト作成部と、
前記リスト作成部からの前記性能寄与順序リストに基づいて、個別自動最適化を適用する候補ブロックを決定し、決定した前記候補ブロックに対して前記個別自動最適化を適用した場合に効果があるか否かを判定し、前記個別自動最適化を適用した場合に効果があると判定されると、前記個別自動最適化を適用した場合の前記候補ブロックを含む関数のコードサイズが、１つのキャッシュメモリのキャッシュサイズ又は２つ以上のキャッシュメモリのいずれかのキャッシュサイズを超えるか否かを判定することにより最適化が可能か否かを判定する最適化判定部と、
前記最適化判定部により前記最適化が可能と判定された場合、前記個別自動最適化を適用した場合の所要サイクル数が要求性能を満足するか否かを判定する要求性能判定部と、
を有することを特徴とするコンパイルシステム。
【請求項２】
前記最適化判定部は、前記最適化が可能と判定された場合、前記個別自動最適化の実行を確定する指示を自動最適化制御ヘッダファイルに追加し、
前記要求性能判定部は、前記ソースプログラムと前記自動最適化制御用ヘッダファイルと読み込み、コンパイル、リンク及びシミュレーションを実行して得られた第２のシミュレーション結果に基づいて、前記要求性能を満足したか否かを判定することを特徴とする請求項１に記載のコンパイラシステム。
【請求項３】
前記最適化判定部は、前記第１のシミュレーション結果と前記第２のシミュレーション結果とを比較して、前記個別自動最適化を適用するか否かを判定し、前記候補ブロックの中で前記性能寄与の大きい前記候補ブロックから順次、前記個別自動最適化を適用するか否かの判定を繰り返すことを特徴とする請求項１又は２に記載のコンパイルシステム。
【請求項４】
前記２つ以上のキャッシュメモリの場合において、前記２つ以上のキャッシュメモリは階層化され、マルチコア向けソースプログラムのスレッドAPIを解析することよりスレッド関数群に分割し、前記スレッド関数群のコードサイズが階層化されたキャッシュメモリにおいて最上位のキャッシュメモリのキャッシュサイズを超えるか否かを判定し、前記最上位のキャッシュメモリのキャッシュサイズを超える場合は、前記スレッド関数群のコードサイズが順次下位のキャッシュメモリのキャッシュサイズを超えるか否かを判定することにより、前記スレッド関数群のコードサイズを格納することができる階層のキャッシュサイズを決定するキャッシュ決定部を有し、
前記最適化判定部は、前記個別自動最適化を適用した場合の前記スレッド関数群のコードサイズが、前記キャッシュ決定部により決定された前記階層のキャッシュサイズを超えるか否か判定することにより前記最適化が可能か否かを判定することを特徴とする請求項１から３の何れか１つに記載のコンパイルシステム。
【請求項５】
ソースプログラムに対して自動最適化を実行し、オブジェクトプログラムを生成するコンパイル方法であって、
前記ソースプログラムに対してコンパイル、リンク及びシミュレーションを実行して得られた第１のシミュレーション結果に基づいて、性能寄与の大きさの情報を含む性能寄与順序リストを作成し、
前記性能寄与順序リストに基づいて、個別自動最適化を適用する候補ブロックを決定し、決定した前記候補ブロックに対して前記個別自動最適化を適用した場合に効果があるか否かを判定し、前記個別自動最適化を適用した場合に効果があると判定されると、前記個別自動最適化を適用した場合の前記候補ブロックを含む関数のコードサイズが、１つのキャッシュメモリのキャッシュサイズ又は２つ以上のキャッシュメモリのいずれかのキャッシュサイズを超えるか否かを判定することにより最適化が可能か否かを判定し、
前記最適化が可能と判定された場合、前記個別自動最適化を適用した場合の所要サイクル数が要求性能を満足するか否かを判定することを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイルシステム及びコンパイル方法に関し、特に、キャッシュミスの影響が小さく、かつ、性能が高いオブジェクトプログラムを自動に生成するコンパイルシステム及びコンパイル方法に関する。
【背景技術】
【０００２】
従来、C言語等により記述されたソースファイルを読み込み、コンピュータ上で実行可能なオブジェクトプログラムを生成するコンパイル装置が提案されている。このコンパイル装置では、プログラムの性能を向上させる、即ち、プログラムの高速化を図るために、最適化が実行されている。
【０００３】
プログラムの性能を向上させるためには、ループ展開、ソフトウエアパイプライニング、自動SIMD化等の補償コードの生成を伴う最適化、及び、自動インライン展開や自動VLIW化等の補償コードの生成を伴わないがコードサイズが増大する最適化が実行されるが、これらの最適化はコードサイズの増大を招いていた。一方、ターゲットプロセッサのキャッシュ容量の制約から、キャッシュミスにより性能低下を制御するために、コードサイズの増加を抑える必要がある。
【０００４】
例えば、キャッシュミスの発生を予測し、キャッシュミスの影響を最小限にするように機械語命令に変換するコンパイル装置が提案されている（例えば、特許文献１参照）。
【０００５】
このコンパイル装置は、機械語命令とキャッシュメモリのキャッシュラインサイズとからキャッシュミスの発生サイクルを予想する。そして、コンパイル装置は、プロセッサの停止時間が減少するように機械語命令の配置を変更している。
【０００６】
しかし、このコンパイル装置では、キャッシュミスの影響を小さくしながら、プログラムの性能を大きく向上させることができない。そこで、キャッシュミスの影響を小さくしながら、プログラムの性能を向上させるために、ユーザがコンパイルオプションの細かい制御の変更及びシミュレーションを手動で繰り返し行い、その効果を確認しながら最適化制御方法を決めていた。このように、従来では、キャッシュミスの影響を小さくしながら、どのような最適化を行うかを自動に決めることはできないという問題があった。
【特許文献１】特開平０３−２８２７３４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
そこで、本発明は、キャッシュミスの影響が小さく、かつ、性能が高いオブジェクトプログラムを自動に生成することができるコンパイルシステムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一態様によれば、ソースプログラムに対して自動最適化を実行し、オブジェクトプログラムを生成するコンパイルシステムであって、前記ソースプログラムに対してコンパイル、リンク及びシミュレーションを実行して得られた第１のシミュレーション結果に基づいて、性能寄与の大きさの情報を含む性能寄与順序リストを作成するリスト作成部と、前記リスト作成部からの前記性能寄与順序リストに基づいて、個別自動最適化を適用する候補ブロックを決定し、決定した前記候補ブロックに対して前記個別自動最適化を適用した場合に効果があるか否かを判定し、前記個別自動最適化を適用した場合に効果があると判定されると、前記個別自動最適化を適用した場合の前記候補ブロックを含む関数のコードサイズが、１つのキャッシュメモリのキャッシュサイズ又は２つ以上のキャッシュメモリのいずれかのキャッシュサイズを超えるか否かを判定することにより最適化が可能か否かを判定する最適化判定部と、前記最適化判定部により前記最適化が可能と判定された場合、前記個別自動最適化を適用した場合の所要サイクル数が要求性能を満足するか否かを判定する要求性能判定部と、を有することを特徴とするコンパイルシステムを提供することができる。
【発明の効果】
【０００９】
本発明のコンパイルシステムによれば、キャッシュミスの影響が小さく、かつ、性能が高いオブジェクトプログラムを自動に生成することができる。
【発明を実施するための最良の形態】
【００１０】
以下、図面を参照して本発明の実施の形態について詳細に説明する。
【００１１】
（第１の実施の形態）
まず、図１に基づき、本発明の第１の実施の形態に係る情報処理システムの構成について説明する。図１は、第１の実施の形態に係る情報処理システムの構成を示す構成図である。
【００１２】
図１に示すように、情報処理システム１００は、本体装置１０１と、各種データを記憶する記憶装置１０２と、各種データを表示する表示装置１０３とを有して構成されている。本体装置１０１は、パーソナルコンピュータ等のコンピュータ装置本体であり、中央処理装置（以下、CPUという）１０１ａ、及び、図示しない主メモリ等を搭載している。また、本体装置１０１には、入力装置として、キーボード１０４及びマウス１０５が接続されている。本体装置１０１は、これらの入力装置からの指示に基づいて、各種プログラムを実行する。
【００１３】
記憶装置１０２には、コンパイル、リンク、シミュレーション等の機能のプログラムを有するコンパイラ１０６と、プログラミング言語により記述されたソースプログラム１０７とが記憶されている。ユーザは、ソースプログラム１０７を入力とし、コンパイラ１０６を本体装置１０１上において実行することにより、オブジェクトプログラムを得ることができる。このように、コンパイラ１０６を実行可能な本体装置１０１が、本実施の形態のコンパイルシステムを構成する。なお、ソースプログラム１０７は、記憶装置１０２に記憶されているが、他の記憶媒体に記憶されていてもよい。
【００１４】
ここで、このように構成される本実施の形態に係るコンパイルシステムの構成について説明する。図２は、第１の実施の形態に係るコンパイルシステムの構成を示す構成図である。
【００１５】
図２に示すように、コンパイルシステム１は、初期コンパイル部１１と、リスト作成部１２と、判定部１３と、再コンパイル部１４と、要求性能判定部１５とを有して構成されている。
【００１６】
初期コンパイル部１１は、ソースプログラム１０７を受け取り、コンパイル、リンク、及びシミュレーションを実行する。初期コンパイル部１１は、シミュレーションを実行し得られたカバレッジ結果を含むプロファイル１０８をリスト作成部１２に出力する。
【００１７】
リスト作成部１２は、このプロファイル１０８を受け取り、性能寄与順序リスト１０９を作成し、作成した性能寄与順序リスト１０９を判定部１３に出力する。
【００１８】
判定部１３には、キャッシュ情報として最上位キャッシュのキャッシュ容量が与えられる。判定部１３は、性能寄与順序リスト１０９に基づいて、候補ブロックを選択し、選択した候補ブロックに対して後述する個別自動最適化適用評価を実行して最適化可能か否かを判定する。さらに、判定部１３は、個別自動最適化適用評価により最適化可能と判定された場合、キャッシュ判定を実行して最適化可能か否かを判定する。このように判定部１３は、最適化可能か否かを判定する最適化判定部を構成する。
【００１９】
上述したキャッシュ判定では、最適化が適用された場合のコードサイズが、与えられたキャッシュ容量よりも大きいか小さいかが判定される。判定部１３は、判定結果に基づいて、自動最適化制御用ヘッダファイル１１０を更新するか否かを決定する。判定部１３は、最適化が適用された場合のコードサイズが、与えられたキャッシュ容量よりも小さい場合、自動最適化制御用ヘッダファイル１１０の更新を行いう。一方、判定部１３は、最適化が適用された場合のコードサイズが、与えられたキャッシュ容量よりも大きい場合、自動最適化制御用ヘッダファイル１１０の更新を行わない。判定部１３は、自動最適化制御用ヘッダファイル１１０を更新すると、更新した自動最適化制御用ヘッダファイル１１０を再コンパイル部１４に出力する。
【００２０】
再コンパイル部１４には、図示を省略しているが、ソースプログラム１０７が供給される。再コンパイル部１４は、このソースプログラム１０７と、判定部１３により更新された自動最適化制御用ヘッダファイル１１０とを読み込み、再度、コンパイル、リンク、及びシミュレーションを実行する。再コンパイル部１４は、図示を省略しているが、初期コンパイル部１１と同様に、カバレッジを含むプロファイルを要求性能判定部１５に出力する。
【００２１】
要求性能判定部１５には、達成すべき性能、ここでは、所要サイクル数が与えられる。要求性能判定部１５は、再コンパイル部１４からのシミュレーション結果、即ち、プロファイルを受け取り、要求性能満足判定を行う。要求性能満足判定は、プロファイルから求められる所要サイクル数が期待されている所要サイクル数未満になったか否かを判定する。所要サイクル数未満になった場合、自動最適化を終了し、オブジェクトプログラム１１１を出力する。
【００２２】
図３は、ソースプログラムの例を説明するための説明図である。図３に示すソースプログラム１０７は、６つの関数、ここでは、val、init、stage1、stage2、stage3及びmainを有している。初期コンパイル部１１は、上述したように、このソースプログラム１０７からカバレッジ結果を含むプロファイル１０８を生成する。
【００２３】
図４は、プロファイルの例を説明するための説明図である。このプロファイル１０８は、どの関数がどのくらい寄与があるかを含むファイルである。各関数には、それぞれself cycleと関数コードサイズとが対応付けられている。例えば、関数stage1は、self cycleが1892Kcycle、関数コードサイズが66byteである。リスト作成部１２は、上述したように、このプロファイル１０８から性能寄与順序リスト１０９を生成する。
【００２４】
図５は、性能寄与順序リストの例を説明するための説明図である。図５に示すように、リスト作成部１２は、プロファイル１０８から性能寄与順序リスト１０９を作成する。各関数及び各基本ブロックのうち、所要サイクル数が大きい関数及び基本ブロックに対して候補ブロック選択ポインタを設定し、後述する個別自動最適化適用評価を順次実行する。
【００２５】
ここで、コンパイルシステム１による自動最適化の処理の流れについて説明する。図６は、コンパイルシステムによる自動最適化の処理の流れの例を説明するためのフローチャートである。
【００２６】
まず、ソースプログラム１０７が読み込まれ、コンパイル、リンク及びシミュレーションが実行される（ステップＳ１）。シミュレーションの結果から得られたカバレッジ結果を含むプロファイル１０８に基づいて、性能寄与順序リスト１０９が作成され、候補ブロック選択ポインタに１が設定される（ステップＳ２）。候補ブロックが選択され、個別自動最適化適用ポインタに１が設定される（ステップＳ３）。選択された候補ブロックでの個別自動最適化適用評価判定が実行され、最適化可能か否かが判定される（ステップＳ４）。
【００２７】
最適化不可能と判定された場合、NOとなり、同じ候補ブロック対して、全ての個別自動最適化評価判定を適用したか否かが判定される（ステップＳ５）。全ての個別自動最適化評価判定が実行されていない場合、NOとなり、個別自動最適化適用ポインタに１が加えられ（ステップＳ６）、ステップＳ４に戻る。ステップＳ５において、全ての個別自動最適化評価判定が実行されている場合、YESとなり、全ての候補ブロックに対して、個別自動最適化評価判定を適用したか否かが判定される（ステップＳ７）。全ての候補ブロックに対して、個別自動最適化評価判定が実行されていない場合、NOとなり、候補ブロック選択ポインタに１が加えられ（ステップＳ８）、ステップＳ３に戻る。全ての候補ブロックに対して、個別自動最適化評価判定が実行されている場合、YESとなり、最適化失敗として自動最適化の処理を終了する。
【００２８】
ここで、最適化失敗とは、全ての候補ブロックに対して、全ての個別自動最適化評価判定を実行しても、要求性能を満たさない場合である。即ち、もとになるアルゴリズムでは要求性能が満たせないため、ソースプログラム１０７の見直しの再検討が必要となる。
【００２９】
一方、ステップＳ４において、最適化可能と判定された場合、YESとなり、関数のコードサイズがキャッシュサイズを超えないか否かが判定される（ステップＳ９）。関数のコードサイズがキャッシュサイズを超える場合、NOとなり、ステップＳ５に進む。関数のコードサイズがキャッシュサイズを超えない場合、YESとなり、自動最適化制御用ヘッダファイル１１０が更新される（ステップＳ１０）。自動最適化制御用ヘッダファイル１１０の更新では、自動最適化可能と判定された関数に対して、自動最適化を行うことを確定する指示であるプロトタイプ宣言または#pragma指令が自動最適化制御用ヘッダファイル１１０に追加される。この#pragma指令は、C言語の拡張機能であり、コンパイラにより定義された動作を行うことを指示する指令である。
【００３０】
このように更新された自動最適化制御用ヘッダファイル１１０とソースプログラム１０７とが読み込まれ、再度、コンパイル、リンク及びシミュレーションが実行される（ステップＳ１１）。シミュレーションの結果、要求性能を満足したか否かが判定される（ステップＳ１２）。要求性能を満足した場合、即ち、所要サイクル数が期待されている所要サイクル数未満となった場合、YESとなり、最適化成功として自動最適化の処理を終了する。要求性能を満足していない場合、NOとなり、ステップＳ５に戻り上述した処理を繰り返す。
【００３１】
ここで、ステップＳ４、Ｓ９及びＳ１０について、図７及び図８を用いて詳細に説明する。図７及び図８は、個別自動最適化適用評価の処理の流れの例を説明するためのフローチャートである。個別自動最適化適用評価は、複数の、ここでは５つの自動最適化の項目により構成されている。５つの自動最適化の項目は、自動VLIW化、自動インライン展開、自動SIMD化、自動ループ展開、及び、自動ソフトウエアパイプライニングである。
【００３２】
まず、自動VLIW化の効果があるか否かが判定される（ステップＳ２１）。自動VLIW化の効果の判定基準は、所要サイクル数が短縮するか否かである。このときに、カバレッジを含むプロファイル１０８の結果を利用し、所要サイクル数が短縮するかどうかを見積もる。所要サイクル数が短縮すれば、自動VLIW化の効果がある、即ち、最適化可能と判定され、所要サイクル数が短縮しなければ、自動VLIW化の効果がない、即ち、最適化不可能と判定される。
【００３３】
自動VLIW化の効果がある場合、YESとなり、関数のコードサイズがL1キャッシュサイズを超えないか否かが判定される（ステップＳ２２）。関数のコードサイズがL1キャッシュサイズを超えない場合、YESとなり、関数をVLIWモード関数に設定するためのプロトタイプ宣言が自動最適化制御用ヘッダファイル１１０に追加され（ステップＳ２３）、図６のステップＳ１１に進む。
【００３４】
一方、ステップＳ２１において、自動VLIW化の効果がない場合、NOとなり、ステップＳ２４に進む。即ち、自動VLIW化の効果がない場合は、最適化不可能と判定され、図５のステップＳ５及びＳ６に示すように、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。また、ステップＳ２２において、関数のコードサイズがL1キャッシュサイズを超える場合、NOとなり、ステップＳ２４に進む。即ち、関数のコードサイズがL1キャッシュサイズを超える場合は、最適化不可能と判定され、図５のステップＳ５及びＳ６に示すように、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。
【００３５】
基本ブロック内に関数呼び出しがあり、自動インライン展開の効果があるか否かが判定される（ステップＳ２４）。自動インライン展開の効果の判定基準は、レジスタ割り当ての結果、スピルアウトが発生しないか否かである。このときに、カバレッジを含むプロファイル１０８の結果を利用し、寄与の大きい、基本ブロックの関数呼び出しのうち、まだ試していない自動インライン展開について、効果判定が実行される。スピルアウトが発生しない場合、自動インライン展開の効果がある、即ち、最適化可能と判定され、スピルアウトが発生する場合、自動インライン展開の効果がない、即ち、最適化不可能と判定される。
【００３６】
自動インライン展開の効果がある場合、YESとなり、関数のコードサイズがL1キャッシュサイズを超えないか否かが判定される（ステップＳ２５）。関数のコードサイズがL1キャッシュサイズを超えない場合、YESとなり、呼び出し先関数をインライン関数に設定する#pragma指令が自動最適化制御用ヘッダファイル１１０に追加され（ステップＳ２６）、図６のステップＳ１１に進む。
【００３７】
一方、ステップＳ２４において、自動インライン展開の効果がない場合、NOとなり、ステップＳ２７に進む。即ち、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。また、ステップＳ２５において、関数のコードサイズがL1キャッシュサイズを超える場合、NOとなり、ステップＳ２７に進む。即ち、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。
【００３８】
ループであり、自動SIMD化の効果があるか否かが判定される（ステップＳ２７）。自動SIMD化の効果の判定基準は、ループの所要サイクル数が短縮するか否かである。このときに、カバレッジを含むプロファイル１０８の結果を利用し、寄与の大きいループのうち、まだ試していないループについて、自動SIMD化の効果判定が実行される。所要サイクル数が短縮すれば、自動SIMD化の効果がある、即ち、最適化可能と判定され、所要サイクル数が短縮しなければ、自動SIMD化の効果がない、即ち、最適化不可能と判定される。
【００３９】
自動SIMD化の効果がある場合、YESとなり、関数のコードサイズがL1キャッシュサイズを超えないか否かが判定される（ステップＳ２８）。関数のコードサイズがL1キャッシュサイズを超えない場合、YESとなり、ループに対する個別自動SIMD化を指示する#pragma指令が自動最適化制御用ヘッダファイル１１０に追加され（ステップＳ２９）、図６のステップＳ１１に進む。
【００４０】
一方、ステップＳ２７において、自動SIMD化の効果がない場合、NOとなり、図８のステップＳ３０に進む。即ち、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。また、ステップＳ２８において、関数のコードサイズがL1キャッシュサイズを超える場合、NOとなり、図８のステップＳ３０に進む。即ち、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。
【００４１】
ループであり、自動ループ展開の効果があるか否かが判定される（ステップＳ３０）。自動ループ展開の効果の判定基準は、ループの所要サイクル数が短縮するか否かである。このときに、カバレッジを含むプロファイル１０８の結果を利用し、寄与の大きいループのうち、まだ試していないループについて、自動ループ展開の効果判定が実行される。所要サイクル数が短縮すれば、自動ループ展開の効果がある、即ち、最適化可能と判定され、所要サイクル数が短縮しなければ、自動ループ展開の効果がない、即ち、最適化不可能と判定される。
【００４２】
自動ループ展開の効果がある場合、YESとなり、関数のコードサイズがL1キャッシュサイズを超えないか否かが判定される（ステップＳ３１）。関数のコードサイズがL1キャッシュサイズを超えない場合、YESとなり、ループに対する個別自動ループ展開を指示する#pragma指令が自動最適化制御用ヘッダファイル１１０に追加され（ステップＳ３２）、図６のステップＳ１１に進む。
【００４３】
一方、ステップＳ３０において、自動ループ展開の効果がない場合、NOとなり、ステップＳ３３に進む。即ち、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。また、ステップＳ３１において、関数のコードサイズがL1キャッシュサイズを超える場合、NOとなり、ステップＳ３３に進む。即ち、個別自動最適化適用評価ポインタに１が加えられ、次の個別自動最適化適用評価に進むことになる。
【００４４】
ループであり、自動ソフトウエアパイプライニングの効果があるか否かが判定される（ステップＳ３３）。自動ソフトウエアパイプライニングの効果の判定基準は、ループの所要サイクル数が短縮するか否かである。このときに、カバレッジを含むプロファイル１０８の結果を利用し、寄与の大きいループのうち、まだ試していないループについて、自動ソフトウエアパイプライニングの効果判定が実行される。所要サイクル数が短縮すれば、自動ソフトウエアパイプライニングの効果がある、即ち、最適化可能と判定され、所要サイクル数が短縮しなければ、自動ソフトウエアパイプライニングの効果がない、即ち、最適化不可能と判定される。
【００４５】
自動ソフトウエアパイプライニングの効果がある場合、YESとなり、関数のコードサイズがL1キャッシュサイズを超えないか否かが判定される（ステップＳ３４）。関数のコードサイズがL1キャッシュサイズを超えない場合、YESとなり、ループに対する個別自動ソフトウエアパイプライニングを指示する#pragma指令が自動最適化制御用ヘッダファイル１１０に追加され（ステップＳ３５）、図６のステップＳ１１に進む。
【００４６】
一方、ステップＳ３３において、自動ソフトウエアパイプライニングの効果がない場合、NOとなり、図６のステップＳ７に進む。ここでは、全ての個別自動最適化適用評価が実行されたので、図６のステップＳ５において、YESと判定され、ステップＳ７に進むことになる。また、ステップＳ３３において、関数のコードサイズがL1キャッシュサイズを超える場合、NOとなり、図６のステップＳ７に進む。ここでは、全ての個別自動最適化適用評価が実行されたので、図６のステップＳ５において、YESと判定され、ステップＳ７に進むことになる。
【００４７】
ここで、コンパイルシステム１による自動最適化の処理について、図３のソースプログラム１０７を用いて実行した例を説明する。また、自動最適化の処理中に再コンパイル部１４から出力されるプロファイルの例を図９に示し、判定部１３から出力される自動最適化制御用ヘッダファイル１１０の例を図１０に示す。図９は、再コンパイル部から出力されるプロファイルの例を説明するための説明図である。図１０は、自動最適化制御用ヘッダファイルの例を説明するための説明図である。
【００４８】
なお、判定部１３には、キャッシュ情報として、キャッシュサイズ１Kbyteが与え、要求性能判定部１５には、達成すべき性能（所要サイクル数）として、3000Kcycleが与えられるものとする。
【００４９】
まず、初期コンパイル部１１によって、ソースプログラム１０７が読み込まれ、最初のコンパイル、リンク、シミュレーションが実行された結果、図４に示すプロファイル１０８が出力される。リスト作成部１２によって、このプロファイル１０８が読み込まれ、図５に示す性能寄与順序リスト１０９が生成される。
【００５０】
寄与の大きい関数は、stage1,stage2,stage3であり、候補ブロック選択ポインタをこれらの関数に設定する。まず、stage1に対して、最初の自動最適化適用判定である自動VLIW化の適用評価の判定を行う。適用評価の判定は、並列度上昇があるため、OKである。また、当該関数のstage1のコードサイズは、この自動VLIW化の最適化の適用により、66byteから168byteとなり、キャッシュサイズ１Kbyteを超えないため、問題ない。そのため、最適化可能と判定され、自動最適化制御用ヘッダファイル１１０が更新される。ここでは、「static void_section(.vtext)stage1(long*,long*);」というプロトタイプ宣言が自動最適化制御用ヘッダファイル１１０に追加される。stage１の所要サイクル数は、1697Kcycleとなり、プログラム全体の所要サイクル数は、7238Kcycleとなる。
【００５１】
この時点で、寄与の大きい関数は、stage2及びstage3となり、stage2及びstage3に対して同様に、自動VLIW化の適用判定を実行する。この結果、「static void_section(.vtｆext)stage2(long*,long*);」、及び「static void_section(.vtext)stage3(long*,long*);」というプロトタイプ宣言が自動最適化制御用ヘッダファイル１１０に追加される。このようにプロトタイプ宣言が追加された自動最適化制御用ヘッダファイル１１０とソースプログラム１０７とを再度、コンパイル、リンク、シミュレーションを実行すると、プロファイル１０８ａに示す結果となる。この結果、プログラム全体の所要サイクル数は、6843Kcycleとなり、要求性能を満たしていないため、自動最適化が続行される。
【００５２】
寄与の大きい関数stage1,stage2,stage3で、まだ適用評価をしていない自動インライン展開について適用判定を行う。ここでは、関数呼び出しがないため、自動インライン展開は実行されない。候補ブロック選択ポインタを進め、次に、stage1のループに対して、カバレッジを含むプロファイル結果から、寄与の大きいループが候補ブロックとなる。この候補ブロックに対して、自動SIMD化の効果判定を行う。所要サイクル数が減少するため、自動SIMD化の効果判定はOKである。また、当該関数のstage1のコードサイズは、この自動SIMD化の最適化の適用により、168byteから312byteとなり、キャッシュサイズ１Kbyteを超えないため、問題ない。そのため、最適化可能と判定され、自動最適化制御用ヘッダファイル１１０が更新される。ここでは、「#pragma profile pack 30  //30行目のループをSIMD化」という#pragma指令が自動最適化制御用ヘッダファイル１１０に追加される。stage1の所要サイクル数は、1093Kcycleとなり、プログラム全体の所要サイクル数は、6634Kcycleとなる。
【００５３】
この時点で、寄与の大きい関数は、stage2及びstage3となり、stage2及びstage3に対して同様に、自動インライン展開の適用評価判定を実行する。この結果、「#pragma profile pack 60  //60行目のループをSIMD化」、及び「#pragma profile pack 90  //90行目のループをSIMD化」という#pragma指令が自動最適化制御用ヘッダファイル１１０に追加される。このように#pragma指令が追加された自動最適化制御用ヘッダファイル１１０とソースプログラム１０７とを再度、コンパイル、リンク、シミュレーションを実行すると、プロファイル１０８ｂに示す結果となる。この結果、プログラム全体の所要サイクル数は、4953Kcycleとなり、要求性能を満たしていないため、自動最適化が続行される。
【００５４】
この時点で、寄与の大きい関数は、initとなり、initに対して試していない自動最適化適用評価を試す。まず。自動VLIW化を試す。並列度が上がらないため、NOと判定される。基本ブロック内の関数読み出しの自動インライン化はレジスタ数が不足しないため、OKと判定される。該当関数のinitのコードサイズは、50byteから16byteであり、問題ない。そのため、最適化可能と判定され、自動最適化制御用ヘッダファイル１１０が更新される。
【００５５】
ここでは、「#pragma profile inline 20  //20行目の関数呼び出しをインライン化」という#pragma指令が自動最適化制御用ヘッダファイル１１０に追加される。このように#pragma指令が追加された自動最適化制御用ヘッダファイル１１０とソースプログラム１０７とを再度、コンパイル、リンク、シミュレーションを実行すると、プロファイル１０８ｃに示す結果となる。この結果、プログラム全体の所要サイクル数は、3577Kcycleとなり、要求性能を満たしていないため、自動最適化が続行される。
【００５６】
次に寄与の大きい関数stage1について、寄与の大きいループのループ展開の効果判定を行う。コンパイラによっては自動SIMD化が動作した場合はループ展開が不可能なケースがあるが、その場合は、次の自動最適化適用評価判定に進む。同じループに対して、ソフトウエアパイプライニングの適用評価判定を行う。所要サイクル数が減少するため、OKと判定される。当該関数のstage1のコードサイズは、312byteから328byteであり問題ない。そのため、最適化可能と判定され、自動最適化制御用ヘッダファイル１１０が更新される。
【００５７】
ここでは、「#pragma profile swp 30  //30行目のループをソフトウエアパイプライニング」という#pragma指令が自動最適化制御用ヘッダファイル１１０に追加される。
【００５８】
この時点で、寄与の大きい関数はstage2及びstage3となり、stage2及びstage3に対して同様に、自動ソフトウエアパイプライニングの適用評価判定を実行する。この結果、「#pragma profile swp 60  //60行目のループをソフトウエアパイプライニング」、及び「#pragma profile swp 90  //90行目のループをソフトウエアパイプライニング」という#pragma指令が自動最適化制御用ヘッダファイル１１０に追加される。
【００５９】
図１０に示すように、自動最適化制御用ヘッダファイル１１０に、上述した自動最適化適用評価によりプロトタイプ宣言及び#pragma指令が追加される。再コンパイル部１４は、この自動最適化制御用ヘッダファイル１１０とソースプログラム１０７と含めて、再度、コンパイル、リンク、シミュレーションを実行し、プロファイル１０８ｄを得る。この結果、プログラム全体の所要サイクル数は、2816Kcycleとなり、要求性能である3000Kcycleを満たしているため、自動最適化の処理が終了する。自動最適化の処理が終了すると、この時点において得られたプログラムがオブジェクトプログラム１１１として、コンパイルシステム１から出力される。
【００６０】
以上のように、コンパイルシステム１は、達成すべき性能（所要サイクル数）とキャッシュ情報と入力し、自動最適化を実行し、最適化可能な場合は自動最適化制御用ヘッダファイル１１０を出力する。この自動最適化制御用ヘッダファイル１１０とソースプログラム１０７とを含めて再コンパイルを実行し、達成すべき性能を満たした場合、最適化成功となり、オブジェクトプログラム１１１を出力するようになっている。この結果、キャッシュミスの影響が小さく、性能が高いオブジェクトプログラム１１１を自動に生成することができる。
【００６１】
よって、本実施の形態のコンパイルシステムによれば、キャッシュミスの影響が小さく、かつ、性能が高いオブジェクトプログラムを自動に生成することができる。
【００６２】
また、キャッシュミスの影響を低減した高性能なオブジェクトプログラム１１１を自動で生成することが可能となるため、TAT（Turn Around Time）を短縮することができるという効果を有する。また、ユーザは可読性の高いソースプログラムを保持しつつ、キャッシュミスの影響を考慮した最適化を行うことができる。また、最適化可否判定の結果を自動最適化制御用ヘッダファイル１１０に出力することにより、ユーザは、ソースファイルを修正する必要がない。
【００６３】
（第２の実施の形態）
次に、第２の実施の形態について説明する。
【００６４】
図１１は、第２の実施の形態に係るコンパイルシステムの構成を示す構成図である。なお、図１１において、図２と同一の構成については同一の符号を付して説明を省略する。
【００６５】
図１１に示すように、コンパイルシステム１ａは、図２のコンパイルシステム１にキャッシュ決定部２１を加えると共に、判定部１３に代えて判定部１３ａを有して構成されている。
【００６６】
キャッシュ決定部２１は、ある一定期間でキャッシュに常駐することが望まれる関数群に対し、各関数群の合計コードサイズが最上位キャッシュのキャッシュ容量を超えないか否かを判定する。マルチコアシステムの場合、各コアで同期を必要としない１つのスレッドとして実行される関数群（スレッド関数群）が最上位キャッシュのキャッシュ容量を超えないか否かで判定可能である。
【００６７】
キャッシュ決定部２１は、個別自動最適化適用評価を実行する前に最上位キャッシュのキャッシュ容量を超えている要素関数について、順次下位のキャッシュのキャッシュ容量を超えるか否かを判定する。即ち、stage1、stage2及びstage3の合計のコードサイズがL1キャッシュサイズを超えている場合、キャッシュ決定部２１は、stage1、stage2及びstage3の合計のコードサイズがL2キャッシュサイズを超えているか否かを判定する。このように、キャッシュ決定部２１は、スレッド関数群のコードサイズが階層化されたキャッシュのキャッシュサイズを超えないか否かを順次判定し、適用する階層のキャッシュサイズを決定する。
【００６８】
関数群の集合への分類は、スレッドAPI呼び出しの解析と関数のコールグラフから自動的に分類することが可能である。
【００６９】
判定部１３ａは、関数群のコードサイズがキャッシュ決定部２１によって判定された階層のキャッシュサイズを超えないか否かを判定する。
【００７０】
図１２は、マルチコア向けソースプログラムの例を説明するための説明図である。図１２に示すマルチコア向けソースプログラム１０７ａは、図３のソースプログラム１０７のmain関数に対して、マルチコア向けの最適化を行ったものである。このプログラムでは、「#pragma omp parallel for」がスレッドAPIとなり、関数stage1,stage2,stage3がスレッド関数群である。
【００７１】
ここで、コンパイルシステム１ａによる自動最適化の処理の流れについて説明する。図１３は、コンパイルシステムによる自動最適化の処理の流れの例を説明するためのフローチャートである。なお、図１３において、図６と同一の処理については、同一の符号を付して説明を省略する。
【００７２】
マルチコア向けプログラムの場合、関数群集合への分割を行う（ステップＳ４１）。関数群集合の要素関数のコードサイズが階層化されたキャッシュのキャッシュサイズを超えないか否かを順次判定し、キャッシュサイズを決定する（ステップＳ４２）。ステップＳ４において、候補フロックでの個別自動最適化適用評価を実行し、最適化可能と判定された場合、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えるか否かが判定される（ステップＳ４３）。各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えた場合、YESとなり、ステップＳ５において、同じ候補ブロックに対して、全ての個別自動最適化評価判定を適用したか否かが判定される。一方、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えない場合、NOとなり、ステップＳ１０において、自動最適化制御用ヘッダファイル１１０を更新する。
【００７３】
ここで、ステップＳ４、Ｓ９及びＳ１０について、図１４及び図１５を用いて詳細に説明する。図１４及び図１５は、個別自動最適化適用評価の処理の流れの例を説明するためのフローチャートである。なお、図１４及び図１５において、それぞれ図７及び図８と同一の処理については、同一の符号を付して説明を省略する。
【００７４】
ステップＳ２１において、自動VLIW化の効果があると判定された場合、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えないか否かが判定される（ステップＳ５１）。キャッシュサイズを超えない場合、YESとなり、ステップＳ２３において、関数をVLIWモード関数にするプロトタイプ宣言を自動最適化制御用ヘッダファイル１１０に追加する。一方、キャッシュサイズを超える場合、NOとなり、次の個別自動最適化適用評価に進む。
【００７５】
次に、ステップＳ２４において、自動インライン展開の効果があると判定された場合、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えないか否かが判定される（ステップＳ５２）。キャッシュサイズを超えない場合、YESとなり、ステップＳ２６において、呼び出し先関数をインライン関数に設定する#pragma指令を自動最適化制御用ヘッダファイル１１０に追加する。一方、キャッシュサイズを超える場合、NOとなり、次の個別自動最適化適用評価に進む。
【００７６】
次に、ステップＳ２７において、自動SIMD化の効果があると判定された場合、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えないか否かが判定される（ステップＳ５３）。キャッシュサイズを超えない場合、YESとなり、ステップＳ２９において、ループに対する個別自動SIMD化を指示する#pragma指令を自動最適化制御用ヘッダファイル１１０に追加する。一方、キャッシュサイズを超える場合、NOとなり、次の個別自動最適化適用評価に進む。
【００７７】
次に、ステップＳ３０において、自動ループ展開の効果があると判定された場合、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えないか否かが判定される（ステップＳ５４）。キャッシュサイズを超えない場合、YESとなり、ステップＳ３２において、ループに対する個別展開指示の#pragma指令を自動最適化制御用ヘッダファイル１１０に追加する。一方、キャッシュサイズを超える場合、NOとなり、次の個別自動最適化適用評価に進む。
【００７８】
最後に、ステップＳ３３において、自動ソフトウエアパイプライニングの効果があると判定された場合、各関数群集合の要素関数のコードサイズが、キャッシュ決定部２１で決定されたキャッシュサイズを超えないか否かが判定される（ステップＳ５５）。キャッシュサイズを超えない場合、YESとなり、ステップＳ３５において、ループに対する個別ソフトウエアパイプライニング指示の#pragma指令を自動最適化制御用ヘッダファイル１１０に追加する。一方、キャッシュサイズを超える場合、NOとなり、ステップＳ７に進み、次の候補ブロックに対して個別自動最適化適用評価を順次実行する。
【００７９】
ここで、コンパイルシステム１ａによる自動最適化の処理について、図１２のソースプログラム１０７ａを用いて実行した例を説明する。なお、ターゲットプロセッサの構成は、４つのプロセッサコアを有し、L1キャッシュサイズが１Kbyte、L2キャッシュサイズが４Kbyteとする。コンパイルシステム１ａには、キャッシュ情報として、L1キャッシュサイズ１Kbyte、L2キャッシュサイズ４Kbyteが与えられる。また、コンパイルシステム１ａには、達成すべき性能（所要サイクル数）として、3000Kcycleが与えられる。
【００８０】
まず、初期コンパイル部１１によって、図３に示すプロファイル１０８を得る。コンパイラの構文解析の結果、コンパイラが内部的に作成したスレッド関数とコールグラフの関係でスレッド関数群を求めることができる。その結果、stage1、stage2及びstage3が関数群集合である。
【００８１】
図３に示すように、関数群集合、即ち、stage1、stage2及びstage3の合計のコードサイズは、928byteである。キャッシュ決定部２１では、L1キャッシュサイズ１Kbyteを超えないため、L1キャッシュサイズが適用される。
【００８２】
関数群のコードサイズは、stage3のソフトウエアパイプライニングの適用判定時に、L1キャッシュサイズ１Kbyteを超過するため、stage1、stage2及びstage3の関数群に対する自動ソフトウエアパイプライニングが適用される前の自動最適化制御用ヘッダファイル１１０が生成される。この時点で、達成すべき性能を満たしていない場合、この関数群に対して実行されていない個別自動最適化適用評価を実行する、あるいは、他の候補ブロックに対して実行されていない個別自動最適化適用評価を実行する。
【００８３】
以上のように、本実施の形態のコンパイルシステム１ａは、マルチコア向けプログラムのスレッドAPIを解析し、スレッド関数群を求める。また、コンパイルシステム１ａは、このスレッド関数群のコードサイズが最上位キャッシュのキャッシュ容量を超えているか否かを判定し、キャッシュ容量を超えている場合、順次下位のキャッシュのキャッシュ容量を超えるか否かを判定する。さらに、コンパイルシステム１ａは、この判定結果に基づいて決定された階層のキャッシュサイズを用いて個別自動最適化適用評価を実行するようにした。この結果、スレッドAPIを解析することにより、スレッド関数群への分割が可能であり、個別自動最適化適用評価判定のコードサイズ判定では、第１の実施の形態のコンパイラシステム１に比べて、より効果的な判定を行うことができる。
【００８４】
よって、本実施の形態のコンパイルシステムによれば、マルチコア向けのプログラムの場合においても、キャッシュミスの影響が小さく、かつ、性能が高いオブジェクトプログラムを自動に生成することができる。
【００８５】
なお、本明細書におけるフローチャート中の各ステップは、その性質に反しない限り、実行順序を変更し、複数同時に実行し、あるいは実行毎に異なった順序で実行してもよい。
【００８６】
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【図面の簡単な説明】
【００８７】
【図１】第１の実施の形態に係る情報処理システムの構成を示す構成図である。
【図２】第１の実施の形態に係るコンパイルシステムの構成を示す構成図である。
【図３】ソースプログラムの例を説明するための説明図である。
【図４】プロファイルの例を説明するための説明図である。
【図５】性能寄与順序リストの例を説明するための説明図である。
【図６】コンパイルシステムによる自動最適化の処理の流れの例を説明するためのフローチャートである。
【図７】個別自動最適化適用評価の処理の流れの例を説明するためのフローチャートである。
【図８】個別自動最適化適用評価の処理の流れの例を説明するためのフローチャートである。
【図９】再コンパイル部から出力されるプロファイルの例を説明するための説明図である。
【図１０】自動最適化制御用ヘッダファイルの例を説明するための説明図である。
【図１１】第２の実施の形態に係るコンパイルシステムの構成を示す構成図である。
【図１２】マルチコア向けソースプログラムの例を説明するための説明図である。
【図１３】コンパイルシステムによる自動最適化の処理の流れの例を説明するためのフローチャートである。
【図１４】個別自動最適化適用評価の処理の流れの例を説明するためのフローチャートである。
【図１５】個別自動最適化適用評価の処理の流れの例を説明するためのフローチャートである。
【符号の説明】
【００８８】
１，１ａ…コンパイルシステム、１１…初期コンパイル部、１２…リスト作成部、１３，１３ａ…判定部、１４…再コンパイル部、１５…要求性能判定部、２１…キャッシュ決定部、１００…情報処理システム、１０１…本体装置、１０１ａ…CPU、１０２…記憶装置、１０３…表示装置、１０４…キーボード、１０５…マウス。
【図１】
2010140344.tif 000003
【図２】
2010140344.tif 000004
【図３】
2010140344.tif 000005
【図４】
2010140344.tif 000006
【図５】
2010140344.tif 000007
【図６】
2010140344.tif 000008
【図７】
2010140344.tif 000009
【図８】
2010140344.tif 000010
【図９】
2010140344.tif 000011
【図１０】
2010140344.tif 000012
【図１１】
2010140344.tif 000013
【図１２】
2010140344.tif 000014
【図１３】
2010140344.tif 000015
【図１４】
2010140344.tif 000016
【図１５】
2010140344.tif 000017