IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

2024-174762コンパイラ、コンパイル方法、およびコンパイル装置
<>
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図1
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図2
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図3
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図4
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図5
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図6
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図7
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図8
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図9
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図10
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図11
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図12
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図13
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図14
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図15
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図16
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図17
  • -コンパイラ、コンパイル方法、およびコンパイル装置 図18
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024174762
(43)【公開日】2024-12-17
(54)【発明の名称】コンパイラ、コンパイル方法、およびコンパイル装置
(51)【国際特許分類】
   G06F 8/41 20180101AFI20241210BHJP
【FI】
G06F8/41 130
【審査請求】未請求
【請求項の数】9
【出願形態】OL
(21)【出願番号】P 2023092776
(22)【出願日】2023-06-05
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100104190
【弁理士】
【氏名又は名称】酒井 昭徳
(72)【発明者】
【氏名】新井 正樹
【テーマコード(参考)】
5B081
【Fターム(参考)】
5B081CC16
5B081CC32
(57)【要約】
【課題】ソフトウェアパイプライニングの最適化による性能向上を図ること。
【解決手段】コンパイル装置101は、プログラム110内のループ処理111について、レイテンシ情報120に基づきループ処理111内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際のパフォーマンスカウンタ情報130を取得する。レイテンシ情報120は、コンパイル装置101のCPUに対応する命令のレイテンシであり、実行時に命令の実行に障害がない場合の理想的な値を示す。コンパイル装置101は、取得したパフォーマンスカウンタ情報130に基づいて、待ち時間が発生した命令の種類を特定する。コンパイル装置101は、ループ処理111内の命令のうち、特定した種類のいずれかの命令のレイテンシ情報120の値を増加させてソフトウェアパイプライニングを適用することにより実行可能プログラム150を作成する。
【選択図】図1
【特許請求の範囲】
【請求項1】
プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、
取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、
前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理をコンピュータに実行させることを特徴とするコンパイラ。
【請求項2】
前記CPUで実行される命令と対応付けて、当該命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能の改善を試行した場合の改善率を表す情報を記憶する記憶部を参照して、前記ループ処理内の命令のうち、特定した前記種類の命令であって、かつ、前記改善率が高い命令を選択する、
処理を前記コンピュータに実行させ、
前記作成する処理は、
選択した前記命令のレイテンシ情報の値を増加させて、前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、ことを特徴とする請求項1に記載のコンパイラ。
【請求項3】
前記プログラムに基づいて、クリティカルパスとなる命令列を検出し、
検出した前記命令列のうち、特定した前記種類のいずれかの命令を選択する、
処理を前記コンピュータに実行させ、
前記作成する処理は、
選択した前記命令のレイテンシ情報の値を増加させて、前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、ことを特徴とする請求項1に記載のコンパイラ。
【請求項4】
作成した前記実行可能プログラムを出力する、処理を前記コンピュータに実行させることを特徴とする請求項1に記載のコンパイラ。
【請求項5】
作成した前記実行可能プログラムを実行した結果、当該実行可能プログラムの実行時間に基づいて、前記プログラムの性能が改善したか否かを判定し、
判定した判定結果に基づいて、前記記憶部に記憶された前記いずれかの命令に対応する改善率を表す情報を更新する、
処理を前記コンピュータに実行させることを特徴とする請求項2に記載のコンパイラ。
【請求項6】
作成した前記実行可能プログラムを実行した結果、当該実行可能プログラムの実行時間に基づいて、前記プログラムの性能が改善したか否かを判定し、
前記性能が改善した場合、前記いずれかの命令のレイテンシ情報の値を増加させた状態を維持して、前記実行可能プログラムを実行した際の前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理を前記コンピュータにさらに実行させることを特徴とする請求項1に記載のコンパイラ。
【請求項7】
前記性能が改善しなかった場合、前記いずれかの命令のレイテンシ情報の値を増加させない状態に戻して、前記実行可能プログラムを実行した際の前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理を前記コンピュータにさらに実行させることを特徴とする請求項6に記載のコンパイラ。
【請求項8】
プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、
取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、
前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理をコンピュータが実行することを特徴とするコンパイル方法。
【請求項9】
プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、
取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、
前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
制御部を有することを特徴とするコンパイル装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンパイラ、コンパイル方法、およびコンパイル装置に関する。
【背景技術】
【0002】
従来、HPC(High Performance Computing)アプリケーションでは、実行時間の大部分を単一の最内ループに消費する場合が多い。このようなアプリケーションでは、単一の最内ループにコンパイラによる最適化手法を適用することによって、実行時間の短縮が期待できる。最適化手法の一つとして、例えば、ソフトウェアパイプライニングが存在する。
【0003】
先行技術としては、プログラムをコンピュータに実行させてプロファイル情報を収集し、プロファイル情報に基づいて演算待ち時間を算出し、演算待ち時間が第1の閾値より長い場合、プログラムのループ内のSIMD命令率が第2の閾値より低い場合に、ループ内のIF文の命令をSIMD化するSIMD化制御行をプログラムのループに挿入するものがある。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2016-40691号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、従来技術では、ソフトウェアパイプライニングによる最適化の効果が毀損する場合があるという問題がある。
【0006】
一つの側面では、本発明は、ソフトウェアパイプライニングの最適化による性能向上を図ることを目的とする。
【課題を解決するための手段】
【0007】
1つの実施態様では、プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、コンパイラが提供される。
【発明の効果】
【0008】
本発明の一側面によれば、ソフトウェアパイプライニングの最適化による性能向上を図ることができるという効果を奏する。
【図面の簡単な説明】
【0009】
図1図1は、実施の形態1にかかるコンパイル方法の一実施例を示す説明図である。
図2図2は、実施の形態2にかかる情報処理装置200のハードウェア構成例を示すブロック図である。
図3図3は、入力プログラムの具体例を示す説明図である。
図4図4は、中間言語表現の具体例を示す説明図である。
図5図5は、データ依存グラフの具体例を示す説明図である。
図6図6は、チューニングデータベース情報の記憶内容の一例を示す説明図である。
図7図7は、実施の形態2にかかる情報処理装置200の機能的構成例を示すブロック図である。
図8図8は、情報処理装置200の動作例を示す説明図である。
図9図9は、パフォーマンスカウンタ情報の具体例を示す説明図(その1)である。
図10図10は、チューニング作業情報の記憶内容の一例を示す説明図(その1)である。
図11図11は、チューニング作業情報の記憶内容の一例を示す説明図(その2)である。
図12図12は、パフォーマンスカウンタ情報の具体例を示す説明図(その2)である。
図13図13は、チューニング作業情報の記憶内容の一例を示す説明図(その3)である。
図14図14は、チューニング作業情報の記憶内容の一例を示す説明図(その4)である。
図15図15は、チューニング作業情報の記憶内容の一例を示す説明図(その5)である。
図16図16は、チューニングデータベース情報の更新例を示す説明図である。
図17図17は、実施の形態2にかかる情報処理装置200のコンパイル処理手順の一例を示すフローチャート(その1)である。
図18図18は、実施の形態2にかかる情報処理装置200のコンパイル処理手順の一例を示すフローチャート(その2)である。
【発明を実施するための形態】
【0010】
以下に図面を参照して、本発明にかかるコンパイラ、コンパイル方法、およびコンパイル装置の実施の形態を詳細に説明する。
【0011】
(実施の形態1)
図1は、実施の形態1にかかるコンパイル方法の一実施例を示す説明図である。図1において、コンパイル装置101は、プログラムのコンパイル時に、プログラム内のループ処理に対してソフトウェアパイプライニング(Software Pipelining)を適用する機能を有するコンピュータである。
【0012】
プログラムは、ループ処理を含む。ループ処理は、繰り返し実行される処理(命令群)である。プログラムは、例えば、実行時間の大部分を単一の最内ループで消費するようなHPCアプリケーションである。プログラムは、例えば、与えるデータや条件などを変化させながら、複数回繰り返し実行される。
【0013】
ソフトウェアパイプライニングは、コンパイラによる最適化手法の一つであり、例えば、ループ処理内の命令をCPU(Central Processing Unit)の演算器が効率的に処理できるように並び替えることで、性能向上を図る技術である。
【0014】
ここで、CPUの内部には、多数のパフォーマンスカウンタが実装されていることが多い。パフォーマンスカウンタを利用することで、プログラムのある範囲を実行した場合のCPU内部の各種の状態に関する情報を取得することができる。パフォーマンスカウンタを利用することで取得可能な情報としては、例えば、以下が存在する。
【0015】
・整数データload命令のデータ待ちが発生した時間
・浮動小数点データload命令のデータ待ちが発生した時間
・整数演算命令の結果待ちが発生した時間
・浮動小数点演算命令の結果待ちが発生した時間
【0016】
あるCPUに対して、ソフトウェアパイプライニングを適用する場合、CPUベンダが提供するCPUのデータシートの各種情報を参考にすることがある。例えば、ソフトウェアパイプライニングでは、CPUの各命令が何サイクルで結果を生成することができるかという命令のレイテンシ情報が利用される。
【0017】
命令のレイテンシ情報は、実行時に命令の実行に障害がない場合の理想的な値であることが多い。一方、実際のプログラムの実行時は、各種の要因により、命令のレイテンシが想定よりも長くなることがある。このレイテンシの差によって、コンパイラが最適化を適用する際に想定した定常状態が崩れ、ソフトウェアパイプライニングの最適化結果の性能が劣化する場合がある。
【0018】
また、現代のCPUは非常に複雑な構成をもつため、CPUベンダが提供するCPUのデータシートにハードウェアのすべての詳細な振舞いを記載することはできない。さらに、プログラムのコンパイル時に、プログラムの実行時に発生する可能性がある、命令のレイテンシを長くするような状況をすべて想定することは困難である。
【0019】
このため、CPUの利用者にとって発生の原因の検証が困難であるような、命令のレイテンシの増加がプログラムの実行時に発生する可能性がある。このようなことから、従来技術では、あるアプリケーションにソフトウェアパイプライニングを適用した場合に、コンパイル時に想定した命令のレイテンシが実行時に増加することで、最適化の効果が毀損するという問題があった。
【0020】
そこで、本実施の形態では、CPUのパフォーマンスカウンタの情報を利用して、プログラム実行時の命令のレイテンシの増加による性能低下を防ぐことにより、ソフトウェアパイプライニングの最適化による性能向上を図るコンパイル方法について説明する。ここで、コンパイル装置101の処理例について説明する。
【0021】
(1)コンパイル装置101は、プログラム110内のループ処理111について、レイテンシ情報120に基づきループ処理111内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際のパフォーマンスカウンタ情報130を取得する。ここで、プログラム110は、コンパイル対象のプログラムである。
【0022】
レイテンシ情報120は、コンパイル装置101のCPUに対応する命令のレイテンシを示す。レイテンシは、命令の実行にかかる時間である。レイテンシ情報120は、実行時に命令の実行に障害がない場合の理想的な値を示す。レイテンシ情報120は、例えば、CPUベンダから提供されるCPUのデータシートの情報に相当する。
【0023】
パフォーマンスカウンタ情報130は、CPUのパフォーマンスカウンタの情報(プロファイル情報)である。パフォーマンスカウンタの情報は、CPU内部に存在するハードウェアレジスタを利用して取得される情報であり、プログラム全体やプログラム内のある範囲に関する情報である。
【0024】
パフォーマンスカウンタ情報130は、プログラム110内のループ処理111を実行した場合のCPUの内部の状態に関する情報である。パフォーマンスカウンタ情報130は、例えば、整数データload命令のデータ待ちが発生した時間を含む。なお、待ちが発生した時間は、例えば、実行時に待ちが発生した時間を累積したものである。
【0025】
また、パフォーマンスカウンタ情報130は、浮動小数点データload命令のデータ待ちが発生した時間を含む。また、パフォーマンスカウンタ情報130は、整数演算命令の結果待ちが発生した時間を含む。演算は、例えば、加算、減算、乗算、除算などである。また、パフォーマンスカウンタ情報130は、浮動小数点演算命令の結果待ちが発生した時間を含む。
【0026】
ただし、パフォーマンスカウンタ情報130からは、データ待ちや結果待ちが発生した命令の種類は特定できても、どの命令であったかは一意に識別できない。
【0027】
具体的には、例えば、コンパイル装置101は、プログラム110内のループ処理111について、レイテンシ情報120に基づいてソフトウェアパイプライニングを適用することにより、実行可能プログラム140を作成する。実行可能プログラム140は、コンピュータが処理を実行するための解釈可能な命令を含むファイル(実行形式)である。そして、コンパイル装置101は、作成した実行可能プログラム140を実行することにより、パフォーマンスカウンタ情報130を取得する。
【0028】
(2)コンパイル装置101は、取得したパフォーマンスカウンタ情報130に基づいて、待ち時間が発生した命令の種類を特定する。命令の種類としては、例えば、整数データload命令、浮動小数点データload命令、整数演算命令および浮動小数点演算命令がある。
【0029】
具体的には、例えば、コンパイル装置101は、パフォーマンスカウンタ情報130が示す待ち時間が、0より大きい命令の種類を特定してもよい。また、コンパイル装置101は、パフォーマンスカウンタ情報130が示す待ち時間が、あらかじめ設定された閾値以上の命令の種類を特定してもよい。
【0030】
(3)コンパイル装置101は、ループ処理111内の命令のうち、特定した種類のいずれかの命令のレイテンシ情報120の値を増加させてソフトウェアパイプライニングを適用することにより実行可能プログラム150を作成する。ここで、待ち時間が発生した命令は、レイテンシ情報120で想定した値よりも、実行時にレイテンシが増加した命令であるといえる。
【0031】
このため、特定した種類の命令は、他の命令に比べて、レイテンシを増やすことで、プログラム全体として性能が向上する可能性が高いといえる。そこで、コンパイル装置101は、特定した種類のいずれかの命令のレイテンシ情報120の値を、あらかじめ決められた増加分(例えば、1サイクル)だけ増やして実行時の値に近づけることで、ソフトウェアパイプライニングの最適化結果をチューニングする。
【0032】
例えば、待ち時間が発生した命令の種類として、「整数データload命令」が特定されたとする。種類「整数データload命令」の命令には、想定通りの動作をしていない命令が含まれているといえる。この場合、コンパイル装置101は、ループ処理111内の命令のうち、整数データload命令のいずれかの命令のレイテンシ情報120の値を増加させて、レイテンシ情報120を調整する。そして、コンパイル装置101は、調整後のレイテンシ情報120に基づいて、再度ソフトウェアパイプライニングを適用することにより実行可能プログラム150を作成する。
【0033】
このように、実施の形態1にかかるコンパイル装置101によれば、ループ処理111を含むプログラム110について、実行時の命令のレイテンシの増加による性能低下を防いで、ソフトウェアパイプライニングの最適化による性能向上を図ることができる。例えば、コンパイル装置101は、パフォーマンスカウンタ情報130を利用して、想定通りの動作をしていない可能性がある命令を絞り込み、その命令のレイテンシを増加させて性能改善を試みることができる。具体的には、例えば、コンパイル装置101は、ループ処理111内の命令のうち、整数データload命令のいずれかの命令のレイテンシ情報120の値を増加させて、再度ソフトウェアパイプライニングを適用することで性能改善を試みることができる。
【0034】
(実施の形態2)
つぎに、実施の形態2にかかるコンパイル装置101について説明する。以下の説明では、コンパイル装置101を情報処理装置200に適用した場合を例に挙げて説明する。情報処理装置200は、例えば、サーバである。また、情報処理装置200は、PC(Personal Computer)、タブレット端末などであってもよい。
【0035】
まず、実施の形態2にかかる情報処理装置200のハードウェア構成例について説明する。
【0036】
図2は、実施の形態2にかかる情報処理装置200のハードウェア構成例を示すブロック図である。図2において、情報処理装置200は、CPU201と、メモリ202と、ディスクドライブ203と、ディスク204と、通信I/F(Interface)205と、可搬型記録媒体I/F206と、可搬型記録媒体207と、を有する。また、各構成部は、バス208によってそれぞれ接続される。
【0037】
ここで、CPU201は、情報処理装置200の全体の制御を司る。CPU201は、複数のコアを有していてもよい。メモリ202は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMがOSのプログラムを記憶し、ROMがアプリケーションプログラムを記憶し、RAMがCPU201のワークエリアとして使用される。メモリ202に記憶されるプログラムは、CPU201にロードされることで、コーディングされている処理をCPU201に実行させる。
【0038】
ディスクドライブ203は、CPU201の制御に従ってディスク204に対するデータのリード/ライトを制御する。ディスク204は、ディスクドライブ203の制御で書き込まれたデータを記憶する。ディスク204は、例えば、磁気ディスク、光ディスクなどである。
【0039】
通信I/F205は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して外部のコンピュータに接続される。そして、通信I/F205は、ネットワーク210と装置内部とのインターフェースを司り、外部のコンピュータからのデータの入出力を制御する。通信I/F205は、例えば、モデムやLANアダプタなどである。ネットワーク210は、例えば、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)などである。
【0040】
可搬型記録媒体I/F206は、CPU201の制御に従って可搬型記録媒体207に対するデータのリード/ライトを制御する。可搬型記録媒体207は、可搬型記録媒体I/F206の制御で書き込まれたデータを記憶する。可搬型記録媒体207は、例えば、CD(Compact Disc)-ROM、DVD(Digital Versatile Disk)、USB(Universal Serial Bus)メモリなどである。
【0041】
なお、情報処理装置200は、上述した構成部のほかに、例えば、入力装置、ディスプレイなどを有してもよい。また、情報処理装置200は、上述した構成部のうち、例えば、可搬型記録媒体I/F206、可搬型記録媒体207を有さなくてもよい。
【0042】
(入力プログラムの具体例)
つぎに、情報処理装置200が用いる入力プログラムの具体例について説明する。
【0043】
図3は、入力プログラムの具体例を示す説明図である。図3において、入力プログラム300は、コンパイル対象のプログラムであり、ループ処理を含む。例えば、入力プログラム300は、HPCアプリケーションの一部を抜粋したものである。図1に示したプログラム110は、例えば、入力プログラム300に対応する。
【0044】
(中間言語表現の具体例)
つぎに、入力プログラムを変換して得られる中間言語表現の具体例について説明する。
【0045】
図4は、中間言語表現の具体例を示す説明図である。図4において、中間言語表現400は、図3に示した入力プログラム300を変換して得られる中間言語表現である。入力プログラム300から中間言語表現400への変換は、コンパイラの一機能により行われる。
【0046】
中間言語表現400において、i1~i6は、入力プログラム300に含まれるループ処理内の命令を示す。i1は、整数加算命令を示す。i2は、浮動小数点データload命令を示す。i3は、浮動小数点乗算命令を示す。i4は、浮動小数点減算命令を示す。i5は、浮動小数点加算命令を示す。i6は、浮動小数点データstore命令を示す。
【0047】
(データ依存グラフの具体例)
つぎに、中間言語表現から作成されるデータ依存グラフの具体例について説明する。
【0048】
図5は、データ依存グラフの具体例を示す説明図である。図5において、データ依存グラフ500は、図4に示した中間言語表現400から作成されるデータ依存グラフである。データ依存グラフ500は、命令i1~i6をノード501~506とし、命令i1~i6のデータ依存関係や制御依存関係をエッジ511~516として表す有向グラフである。
【0049】
(チューニングデータベース情報の記憶内容)
つぎに、情報処理装置200が用いるチューニングデータベース情報の記憶内容について説明する。チューニングデータベース情報は、CPU(例えば、図2に示したCPU201)に対応する情報である。
【0050】
図6は、チューニングデータベース情報の記憶内容の一例を示す説明図である。図6において、チューニングデータベース情報600は、命令、試行回数および改善数のフィールドを有し、各フィールドに情報を設定することで、チューニング情報600-1~600-8をレコードとして記憶する。
【0051】
ここで、命令は、CPU201で実行される命令を示す。iaddは、整数加算命令である。isubは、整数減算命令である。imultは、整数乗算命令である。iloadは、整数load命令である。faddは、浮動小数点加算命令である。fsubは、浮動小数点減算命令である。fmultは、浮動小数点乗算命令である。floadは、浮動小数点load命令である。
【0052】
試行回数は、命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能の改善を試行した回数を示す。改善数は、命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能が改善した回数を示す。
【0053】
例えば、チューニング情報600-1は、命令「iadd」のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能の改善を試行した場合の試行回数「2000」および改善数「40」を示す。この場合、改善率は、0.02(=40/2000)となる。
【0054】
(情報処理装置200の機能的構成例)
つぎに、実施の形態2にかかる情報処理装置200の機能的構成例について説明する。
【0055】
図7は、実施の形態2にかかる情報処理装置200の機能的構成例を示すブロック図である。図7において、情報処理装置200は、受付部701と、最適化部702と、実行部703と、調整部704と、出力部705と、記憶部710と、を含む。受付部701~出力部705は制御部700となる機能であり、具体的には、例えば、図2に示したメモリ202、ディスク204、可搬型記録媒体207などの記憶装置に記憶されたプログラム(ソフトウェアパイプライニングをチューニングするコンパイラ)をCPU201に実行させることにより、または、通信I/F205により、その機能を実現する。各機能部の処理結果は、例えば、メモリ202、ディスク204などの記憶装置に記憶される。また、記憶部710は、メモリ202、ディスク204などの記憶装置により実現される。具体的には、例えば、記憶部710は、図6に示したようなチューニングデータベース情報600を記憶する。
【0056】
受付部701は、入力プログラムを受け付ける。ここで、入力プログラムは、ループ処理を含むプログラム(ソースプログラム)である。入力プログラムは、例えば、図3に示した入力プログラム300である。
【0057】
具体的には、例えば、受付部701は、他のコンピュータから入力プログラムを受信することにより、受信した入力プログラムを受け付ける。他のコンピュータは、例えば、ユーザが使用するPC、タブレット端末などである。また、受付部701は、不図示の入力装置を用いたユーザの操作入力により、入力プログラムを受け付けてもよい。
【0058】
最適化部702は、受け付けた入力プログラム内のループ処理について、CPU201に対応する命令のレイテンシ情報に基づいて、ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する。
【0059】
ここで、レイテンシ情報は、CPU201に対応する命令のレイテンシを示す。レイテンシは、命令の実行にかかる時間であり、例えば、サイクル数によって表される。レイテンシ情報は、例えば、あらかじめ入力されて、メモリ202、ディスク204などの記憶装置に記憶されている。実行可能プログラムは、コンピュータが処理を実行するための解釈可能な命令を含むファイルである。
【0060】
具体的には、例えば、最適化部702は、受け付けた入力プログラム300を、最適化を適用するための図4に示したような中間言語表現400に変換する。つぎに、最適化部702は、変換した中間言語表現400から、図5に示したようなデータ依存グラフ500を作成する。
【0061】
そして、最適化部702は、中間言語表現400およびデータ依存グラフ500に基づいて、中間言語表現400に対してソフトウェアパイプライニングを適用して実行可能プログラムを作成する。ソフトウェアパイプライニングでは、CPU201に対応する命令のレイテンシ情報をもとに、ループ処理内の命令がCPU201の演算器によって効率的に処理できるように並び替えられる。
【0062】
なお、ソフトウェアパイプライニングの具体的な処理内容については、既存技術のため説明を省略する。ソフトウェアパイプライニングについては、例えば、非特許文献「中田育男,コンパイラの構成と最適化(第2版),朝倉書店,2009,p383~386」を参照することができる。
【0063】
実行部703は、作成された実行可能プログラムを実行する。この際、実行部703は、例えば、実行可能プログラムの実行時間を計測する。実行時間は、実行可能プログラムの実行を開始してから終了するまでの時間である。実行可能プログラムの実行時間は、例えば、ソフトウェアパイプライニングにおける命令の並べ方によって異なるものとなる。
【0064】
調整部704は、実行可能プログラムが実行された結果、パフォーマンスカウンタ情報を取得する。そして、調整部704は、取得したパフォーマンスカウンタ情報に基づいて、CPU201に対応する命令のレイテンシ情報の値を調整する。ここで、パフォーマンスカウンタ情報は、CPU201のパフォーマンスカウンタの情報である。
【0065】
パフォーマンスカウンタ情報は、実行時に待ち時間が発生した命令の種類を特定可能な情報を含む。パフォーマンスカウンタ情報は、例えば、整数データload命令のデータ待ちが発生した時間を含む。また、パフォーマンスカウンタ情報は、浮動小数点データload命令のデータ待ちが発生した時間を含む。
【0066】
また、パフォーマンスカウンタ情報は、整数演算命令の結果待ちが発生した時間を含む。また、パフォーマンスカウンタ情報は、浮動小数点演算命令の結果待ちが発生した時間を含む。パフォーマンスカウンタ情報の具体例については、図9および図14を用いて後述する。
【0067】
具体的には、例えば、調整部704は、取得したパフォーマンスカウンタ情報に基づいて、待ち時間が発生した命令の種類を特定する。そして、調整部704は、入力プログラムに含まれるループ処理内の命令のうち、特定した種類のいずれかの命令のレイテンシ情報の値を増加させる。
【0068】
命令の種類としては、例えば、整数データload命令、浮動小数点データload命令、整数演算命令および浮動小数点演算命令がある。待ち時間が発生した命令は、レイテンシの見積もりが正しくない可能性がある。ただし、パフォーマンスカウンタ情報からは、待ち時間が発生した命令を一意に識別できない。
【0069】
このため、調整部704は、待ち時間が発生した命令の種類を特定することにより、レイテンシ(レイテンシ情報が示す値)の調整を行う命令を絞り込む。
【0070】
より詳細に説明すると、例えば、調整部704は、パフォーマンスカウンタ情報が示す待ち時間が、0秒より大きい命令の種類を特定してもよい。また、調整部704は、パフォーマンスカウンタ情報が示す待ち時間が、閾値以上の命令の種類を特定してもよい。閾値は、任意に設定可能であり、例えば、1秒などに設定されてもよい。また、待ち時間が発生した命令の種類が複数存在する場合がある。この場合、調整部704は、例えば、待ち時間が最も長い命令の種類を特定してもよい。
【0071】
つぎに、調整部704は、特定した種類のいずれかの命令を選択する。命令の選択は、例えば、ランダムに行われてもよい。また、レイテンシの調整を行ってソフトウェアパイプライニングの最適化結果をチューニングすることにより、性能が改善される確率をより高めるために、以下のように命令を選択してもよい。
【0072】
例えば、調整部704は、記憶部710を参照して、ループ処理内の命令のうち、特定した種類の命令であって、かつ、改善率が高い命令を選択してもよい。記憶部710は、CPU201で実行される命令と対応付けて、当該命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能の改善を試行した場合の改善率を表す情報を記憶する。
【0073】
より詳細に説明すると、例えば、調整部704は、チューニングデータベース情報600を参照して、ループ処理内の命令のうち、特定した種類の命令それぞれの改善率を算出する。改善率は、例えば、改善数を試行回数で割ることにより求めることができる。そして、調整部704は、算出した改善率が最も高い命令を選択する。
【0074】
また、調整部704は、入力プログラムに基づいて、クリティカルパスとなる命令列を検出してもよい。ここで、クリティカルパスとは、性能に与える影響が大きい命令列である。例えば、調整部704は、入力プログラムをもとに作成されたデータ依存グラフを参照して、ホップ数が最も多くなる命令列を、クリティカルパスとなる命令列として検出してもよい。そして、調整部704は、検出した命令列のうち、特定した種類のいずれかの命令を選択してもよい。
【0075】
さらに、調整部704は、記憶部710を参照して、検出した命令列のうち、特定した種類の命令であって、かつ、改善率が高い命令を選択してもよい。より詳細に説明すると、例えば、調整部704は、チューニングデータベース情報600を参照して、検出した命令列のうち、特定した種類の命令それぞれの改善率を算出する。そして、調整部704は、算出した改善率が最も高い命令を選択する。
【0076】
そして、調整部704は、選択した命令のレイテンシ情報の値を増加させる。より詳細に説明すると、例えば、調整部704は、選択した命令のレイテンシ情報の値を、所定の増加分だけ増加させる。所定の増加分は、任意に設定可能であり、例えば、1サイクルなどの時間に設定される。
【0077】
また、最適化部702は、特定された種類の命令のレイテンシ情報の値が調整された結果、入力プログラム内のループ処理について、調整後のCPU201に対応する命令のレイテンシ情報に基づいて、再度ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する。
【0078】
また、実行部703は、作成された実行可能プログラムを実行する。そして、調整部704は、実行可能プログラムが実行された結果、性能が改善したか否かを判定する。性能は、入力プログラムの実行性能である。性能は、例えば、実行可能プログラムの実行時間によって判定される。
【0079】
具体的には、例えば、調整部704は、今回作成された実行可能プログラムの実行時間が、前回作成された実行可能プログラムの実行時間よりも短くなった場合に、性能が改善したと判定する。また、調整部704は、性能が改善したと判定した場合、今回作成された実行可能プログラムを最新の実行可能プログラムとしてもよい。
【0080】
一方、調整部704は、今回作成された実行可能プログラムの実行時間が、前回作成された実行可能プログラムの実行時間以上の場合には、性能が改善していないと判定する。また、調整部704は、性能が改善していないと判定した場合、今回作成された実行可能プログラムを削除し、前回作成された実行可能プログラムを最新の実行可能プログラムとしてもよい。
【0081】
また、調整部704は、判定した判定結果に基づいて、記憶部710に記憶された、レイテンシ情報の値が調整された命令に対応する改善率を表す情報を更新してもよい。例えば、ある命令のレイテンシ情報の値が調整された結果、性能が改善したとする。この場合、調整部704は、その命令に対応するチューニングデータベース情報600内の試行回数および改善数それぞれをインクリメントする。
【0082】
一方、ある命令のレイテンシ情報の値が調整された結果、性能が改善しなかったとする。この場合、調整部704は、その命令に対応するチューニングデータベース情報600内の試行回数のみをインクリメントする。これにより、調整部704は、レイテンシ情報の値が調整された命令について、改善率を表す情報を更新する。
【0083】
ここで、作成された実行可能プログラムが実行された結果、性能が改善したとする。この場合、情報処理装置200は、命令のレイテンシ情報の値を増加させた状態を維持して、命令のレイテンシを増加させてソフトウェアパイプライニングを適用する一連の処理を繰り返し実行してもよい。
【0084】
また、作成された実行可能プログラムが実行された結果、性能が改善しなかったとする。この場合、情報処理装置200は、命令のレイテンシ情報の値を増加させない状態に戻して、命令のレイテンシを増加させてソフトウェアパイプライニングを適用する一連の処理を繰り返し実行してもよい。
【0085】
具体的には、例えば、調整部704は、作成された実行可能プログラムが実行された結果、性能が改善した場合、命令のレイテンシ情報の値を増加させた状態を維持する。つぎに、調整部704は、パフォーマンスカウンタ情報を取得し、取得したパフォーマンスカウンタ情報に基づいて、待ち時間が発生した命令の種類を特定する。
【0086】
そして、調整部704は、ループ処理内の命令のうち、特定した種類のいずれかの命令のレイテンシ情報の値を増加させる。最適化部702は、特定された種類の命令のレイテンシ情報の値が調整された結果、入力プログラム内のループ処理について、調整後のCPU201に対応する命令のレイテンシ情報に基づいて、再度ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する。
【0087】
つぎに、実行部703は、作成された実行可能プログラムを実行する。そして、調整部704は、実行可能プログラムが実行された結果、性能が改善したか否かを判定する。これにより、情報処理装置200は、命令のレイテンシを増加させてソフトウェアパイプライニングを適用する一連の処理を繰り返し実行する。一連の処理は、例えば、待ち時間が発生した命令の種類が特定されなくなるまで繰り返し実行される。
【0088】
出力部705は、作成された実行可能プログラムを出力する。出力部705の出力形式としては、例えば、メモリ202、ディスク204などの記憶装置への記憶、通信I/F205による他のコンピュータへの送信などがある。具体的には、例えば、出力部は、入力プログラムについての性能改善が繰り返し実施された結果、性能が改善した最新の実行可能プログラムのみを出力してもよい。
【0089】
より詳細に説明すると、例えば、情報処理装置200は、待ち時間が発生している命令の種類が特定されなくなるまで、入力プログラムについての性能改善を試行する。そして、出力部705は、待ち時間が発生している命令の種類が特定されなかった場合に、性能が改善した最新の実行可能プログラムを出力してもよい。
【0090】
(情報処理装置200の動作例)
つぎに、実施の形態2にかかる情報処理装置200の動作例について説明する。ここでは、図3に示した入力プログラム300に対して、ソフトウェアパイプライニングの最適化結果をチューニングすることにより、入力プログラム300を高速化する場合を例に挙げて説明する。
【0091】
図8は、情報処理装置200の動作例を示す説明図である。図8において、情報処理装置200は、入力プログラム300を中間言語表現400(図4参照)に変換し、変換した中間言語表現400からデータ依存グラフ500(図5参照)を作成する。
【0092】
情報処理装置200は、データ依存グラフ500からクリティカルパスとなる命令列を検出する。クリティカルパスは、例えば、データ依存グラフ500で最も長い経路に相当する。ここでは、クリティカルパスとなる命令列「i1→i2→i3→i5→i6」が検出される。
【0093】
つぎに、情報処理装置200は、中間言語表現400、データ依存グラフ500を参照して、CPU201に対応する命令のレイテンシ情報に基づいて、中間言語表現400に対してソフトウェアパイプライニングを適用することにより、実行可能プログラムOP(OUTPUT)を作成する。レイテンシ情報は、例えば、CPUベンダなどから提供されるCPU201のデータシートに含まれる。
【0094】
そして、情報処理装置200は、作成した実行可能プログラムOPを実行し、実行可能プログラムOPの実行時間を計測する。情報処理装置200は、ここで計測した実行時間を「実行時間TBEST」とする。また、情報処理装置200は、実行可能プログラムOPの実行時のパフォーマンスカウンタ情報Pを取得する。ここで、図9を用いて、初回実行時のパフォーマンスカウンタ情報Pの具体例について説明する。
【0095】
図9は、パフォーマンスカウンタ情報の具体例を示す説明図(その1)である。図9において、パフォーマンスカウンタ情報Pは、CPU201のパフォーマンスカウンタの情報であり、実行可能プログラムOPの実行時に待ち時間が発生したイベント(命令)の種類を特定可能な情報である。
【0096】
パフォーマンスカウンタ情報Pにおいて、Integer operation waitは、整数演算命令の結果待ちが発生した時間を表す。また、Floating-point operation waitは、浮動小数点演算命令の結果待ちが発生した時間を表す。
【0097】
また、Integer load memory access waitは、整数データload命令のデータ待ちが発生した時間を表す。また、Floating-point load memory access waitは、浮動小数点データload命令のデータ待ちが発生した時間を表す。
【0098】
図8の説明に戻り、情報処理装置200は、検出したクリティカルパスとなる命令列「i1→i2→i3→i5→i6」から、初期状態のチューニング作業情報Wを作成する。ここで、図10を用いて、チューニング作業情報Wの記憶内容について説明する。
【0099】
図10は、チューニング作業情報の記憶内容の一例を示す説明図(その1)である。図10において、チューニング作業情報Wは、クリティカルパス上の命令i1,i2,i3,i5ごとのレイテンシ増分および実施状態を有する。レイテンシ増分は、命令のレイテンシを増加させる値を示す。
【0100】
なお、命令i6は、クリティカルパス上には存在するものの、データストア命令であり、図9に示した例のパフォーマンスカウンタ情報Pでは、待ち時間の発生を特定できない。このため、情報処理装置200は、チューニング作業情報Wに命令i6を登録しない。
【0101】
ここで、実施状態は、命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能改善を試行する処理の実施状態を示す。実施状態には、例えば、N(ニュートラル)、C(完了)および数値(現在のレイテンシ増分)のいずれかが設定される。
【0102】
初期状態では、各命令i1,i2,i3,i5のレイテンシ増分は「0」である。また、初期状態では、各命令i1,i2,i3,i5の実施状態は「N」である。
【0103】
図8の説明に戻り、情報処理装置200は、パフォーマンスカウンタ情報Pとチューニング作業情報Wとを参照して、チューニングするべき命令の集合Iを作成する。ここでは、チューニングするべき命令の集合Iは、クリティカルパス(チューニング作業情報W)上の命令であって、かつ、パフォーマンスカウンタ情報Pで最も待ち時間が発生しているイベントの種類に関連する命令とする。
【0104】
図9に示したパフォーマンスカウンタ情報Pでは、最も待ち時間が発生しているイベントの種類は、Floating-point operation wait(浮動小数点演算命令の結果待ち)である。このため、チューニングするべき命令の集合Iは、以下のようになる。
【0105】
I={i3,i5}
【0106】
つぎに、情報処理装置200は、チューニングデータベース情報600(図6参照)を参照して、チューニングするべき命令の集合Iから、チューニングするべき命令Jを選択する。ここでは、チューニングするべき命令の集合Iのうち、改善率が最も高い命令(性能改善に寄与する確率が最も高い命令)を選択するとする。
【0107】
ここで、命令i3は、fmult(浮動小数点乗算命令)である。したがって、命令i3の改善率は、チューニング情報600-7から、「0.1(=100/1000」である。また、命令i5は、fadd(浮動小数点加算命令)である。したがって、命令i5の改善率は、チューニング情報600-5から、「0.03(≒100/3000」である。
【0108】
これにより、チューニングするべき命令の集合Iのうち、改善率が最も高い命令は、命令i3である。また、図10に示したチューニング作業情報Wでは、命令i3の実施状態がC(完了)ではない。このため、チューニングするべき命令Jとして、命令i3が選択される。
【0109】
なお、チューニングするべき命令の集合Iに命令が1つのみ含まれる場合には、例えば、改善率を考慮することなく、その命令が選択される。
【0110】
つぎに、情報処理装置200は、命令i3のレイテンシを1増加させた場合に性能が改善するかどうかを検証するために、図10に示したチューニング作業情報Wから、図11に示すようなチューニング作業情報WTを作成する。
【0111】
図11は、チューニング作業情報の記憶内容の一例を示す説明図(その2)である。図11において、チューニング作業情報WTでは、命令i3の実施状態に、レイテンシの増分を示す「1」が設定されている。実施状態に設定される数字は、レイテンシ増分として確定した値ではなく、仮の値である。
【0112】
つぎに、情報処理装置200は、中間言語表現400、データ依存グラフ500およびチューニング作業情報WTを参照して、中間言語表現400に対してソフトウェアパイプライニングを適用することにより、実行可能プログラムWOP(WOUTPUT)を作成する。
【0113】
この際、情報処理装置200は、ソフトウェアパイプライニングを適用する場合に、各命令i1,i2,i3,i5のレイテンシに、チューニング作業情報WTの各命令i1,i2,i3,i5のレイテンシ増分の列と実施状態の列の値をそれぞれ追加して最適化を適用する。各命令i1,i2,i3,i5のレイテンシ(元の値)は、CPUベンダなどから提供されるレイテンシ情報が示す値である。
【0114】
そして、情報処理装置200は、作成した実行可能プログラムWOPを実行し、実行時間Tを計測する。また、情報処理装置200は、実行可能プログラムWOPの実行時のパフォーマンスカウンタ情報PTを取得する。
【0115】
つぎに、情報処理装置200は、実行時間TBESTと実行時間Tとを比較する。ここでは、実行時間TBESTよりも実行時間Tが小さい場合を想定する。これは、実行可能プログラムWOPのほうが実行可能プログラムOPよりも性能がよく、命令i3のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能が改善したことを意味する。
【0116】
この場合、情報処理装置200は、実行可能プログラムWOPを実行可能プログラムOPとし、実行時間Tを実行時間TBESTとし、さらに、パフォーマンスカウンタ情報PTをパフォーマンスカウンタ情報Pとする。ここで、図12を用いて、2回目実行時のパフォーマンスカウンタ情報Pの具体例について説明する。
【0117】
図12は、パフォーマンスカウンタ情報の具体例を示す説明図(その2)である。図12の例では、Integer operation wait、Floating-point operation wait、および、Integer load memory access waitの待ち時間が、0になっている。
【0118】
さらに、情報処理装置200は、図11に示したチューニング作業情報WTから、図13に示すような新たなチューニング作業情報Wを作成する。
【0119】
図13は、チューニング作業情報の記憶内容の一例を示す説明図(その3)である。図13において、チューニング作業情報Wでは、命令i3について、図11に示したチューニング作業情報WTの命令i3の実施状態の値「1」がレイテンシ増分に加算され、実施状態が「N」に変更されている。
【0120】
そして、情報処理装置200は、さらなる性能改善を実施する。まず、情報処理装置200は、パフォーマンスカウンタ情報Pとチューニング作業情報Wとを参照して、チューニングするべき命令の集合Iを作成する。
【0121】
図12に示したパフォーマンスカウンタ情報Pでは、待ち時間が発生しているイベントの種類は、Floating-point load memory access wait(浮動小数点データload命令のデータ待ち)のみである。このため、チューニングするべき命令の集合Iは、以下のようになる。
【0122】
I={i2}
【0123】
また、図13に示したチューニング作業情報Wでは、命令i2の実施状態がC(完了)ではない。このため、情報処理装置200は、チューニングするべき命令Jとして、命令i2を選択する。
【0124】
つぎに、情報処理装置200は、命令i2のレイテンシを1増加させた場合に性能が改善するかどうかを検証するために、図13に示したチューニング作業情報Wから、図14に示すようなチューニング作業情報WTを作成する。
【0125】
図14は、チューニング作業情報の記憶内容の一例を示す説明図(その4)である。図14において、チューニング作業情報WTでは、命令i2の実施状態に、レイテンシの増分を示す「1」が設定されている。
【0126】
つぎに、情報処理装置200は、中間言語表現400、データ依存グラフ500およびチューニング作業情報WTを参照して、中間言語表現400に対してソフトウェアパイプライニングを適用することにより、実行可能プログラムWOP(WOUTPUT)を作成する。
【0127】
この際、情報処理装置200は、ソフトウェアパイプライニングを適用する場合に、各命令i1,i2,i3,i5のレイテンシに、チューニング作業情報WTの各命令i1,i2,i3,i5のレイテンシ増分の列と実施状態の列の値をそれぞれ追加して最適化を適用する。
【0128】
そして、情報処理装置200は、作成した実行可能プログラムWOPを実行し、実行時間Tを計測する。また、情報処理装置200は、実行可能プログラムWOPの実行時のパフォーマンスカウンタ情報PTを取得する。
【0129】
つぎに、情報処理装置200は、実行時間TBESTと実行時間Tとを比較する。ここでは、実行時間TBESTよりも実行時間Tが大きい場合を想定する。これは、実行可能プログラムOPのほうが実行可能プログラムWOPよりも性能がよく、命令i2のレイテンシを増加させてソフトウェアパイプライニングを適用しても性能が改善しなかったことを意味する。
【0130】
この場合、情報処理装置200は、図14に示したチューニング作業情報WTから、図15に示すような新たなチューニング作業情報Wを作成する。
【0131】
図15は、チューニング作業情報の記憶内容の一例を示す説明図(その5)である。図15において、チューニング作業情報Wでは、命令i2について、実施状態が「C」に変更されている。ここでは、性能改善に失敗したため、図14に示したチューニング作業情報WTの命令i2の実施状態の値「1」は、レイテンシ増分に加算されない。
【0132】
そして、情報処理装置200は、さらなる性能改善を実施する。まず、情報処理装置200は、パフォーマンスカウンタ情報Pとチューニング作業情報Wとを参照して、チューニングするべき命令の集合Iを作成する。ここでは、パフォーマンスカウンタ情報Pは、図12に示したままのため、チューニングするべき命令の集合Iは、以下のように前回と同じになる。
【0133】
I={i2}
【0134】
また、図15に示したチューニング作業情報Wでは、命令i2の実施状態がC(完了)である。このため、情報処理装置200は、チューニングするべき命令Jとして、命令i2を選択しない。また、既に性能改善を実施済みの命令i2以外に、待ち時間が発生した命令は存在しない。
【0135】
したがって、情報処理装置200は、さらなる性能改善は実施しない。この場合、情報処理装置200は、図15に示したチューニング作業情報Wを参照して、チューニングデータベース情報600を更新する。
【0136】
図15に示したチューニング作業情報Wでは、レイテンシを1回に増やす値が「1」のため、命令i3について、試行回数が1回で改善数が1回であることがわかる。このため、情報処理装置200は、チューニングデータベース情報600内の命令「fmult」の試行回数および改善数それぞれの値をインクリメント(+1)する。
【0137】
さらに、図15に示したチューニング作業情報Wでは、命令i2について、レイテンシ増分が「0」のため、試行回数が1回で改善数が0回であることがわかる。このため、情報処理装置200は、チューニングデータベース情報600内の命令「fload」の試行回数の値をインクリメント(+1)する。
【0138】
図16は、チューニングデータベース情報の更新例を示す説明図である。図16において、チューニングデータベース情報600内のチューニング情報600-7の試行回数および改善数が、図6に示した場合に比べて、それぞれ1ずつ増えている。また、チューニングデータベース情報600内のチューニング情報600-8の試行回数が、図6に示した場合に比べて、1増えている。
【0139】
最後に、情報処理装置200は、ソフトウェアパイプライニングの最適化結果として、最も性能がよかった実行可能プログラムOPを出力して、一連の処理を終了する。これにより、情報処理装置200は、ソフトウェアパイプライニングの最適化結果をチューニングすることにより、入力プログラム300の性能向上を達成することができる。
【0140】
ユーザは、例えば、与えるデータや条件などを変化させながら、入力プログラム300を複数回繰り返し実行するにあたり、出力された実行可能プログラムOPを使用することで、入力プログラム300の実行時間を大幅に削減することができる。
【0141】
なお、ここでは、最終的なアウトプットとして、実行可能プログラムOPを出力することにしたが、これに限らない。例えば、情報処理装置200は、最終的なアウトプットとして、入力プログラム300(ソースプログラム)と対応付けて、図15に示したようなチューニング作業情報Wを出力してもよい。これにより、情報処理装置200は、自装置や、CPU構成が自装置と同一の他のコンピュータにおいて、入力プログラム300を実行する際に、どの命令のレイテンシを増加させてソフトウェアパイプライニングを適用すればよいかを特定可能にすることができる。
【0142】
(情報処理装置200のコンパイル処理手順)
つぎに、情報処理装置200のコンパイル処理手順について説明する。
【0143】
図17および図18は、実施の形態2にかかる情報処理装置200のコンパイル処理手順の一例を示すフローチャートである。図17のフローチャートにおいて、まず、情報処理装置200は、コンパイル対象となる入力プログラムを受け付けたか否かを判断する(ステップS1701)。ここで、情報処理装置200は、入力プログラムを受け付けるのを待つ(ステップS1701:No)。
【0144】
そして、情報処理装置200は、入力プログラムを受け付けた場合(ステップS1701:Yes)、入力プログラムを中間言語表現に変換する(ステップS1702)。つぎに、情報処理装置200は、変換した中間言語表現からデータ依存グラフを作成する(ステップS1703)。
【0145】
そして、情報処理装置200は、作成したデータ依存グラフからクリティカルパスとなる命令列を検出する(ステップS1704)。検出される命令列は、入力プログラムに含まれるループ処理内の命令である。つぎに、情報処理装置200は、中間言語表現、データ依存グラフを参照して、CPU201に対応する命令のレイテンシ情報に基づいて、中間言語表現に対してソフトウェアパイプライニングを適用することにより、実行可能プログラムOP(OUTPUT)を作成する(ステップS1705)。
【0146】
そして、情報処理装置200は、作成した実行可能プログラムOPを実行する(ステップS1706)。つぎに、情報処理装置200は、実行した実行可能プログラムOPの実行時間(以下、「実行時間TBEST」とする)と、実行時のパフォーマンスカウンタ情報Pとを取得する(ステップS1707)。
【0147】
そして、情報処理装置200は、検出したクリティカルパスとなる命令列から、初期状態のチューニング作業情報Wを作成して(ステップS1708)、図18に示すステップS1801に移行する。
【0148】
図18のフローチャートにおいて、まず、情報処理装置200は、パフォーマンスカウンタ情報Pとチューニング作業情報Wとを参照して、チューニングするべき命令の集合Iを作成する(ステップS1801)。具体的には、例えば、情報処理装置200は、クリティカルパス(チューニング作業情報W)上の命令であって、かつ、パフォーマンスカウンタ情報Pで最も待ち時間が発生しているイベントの種類に関連する命令の集合を、チューニングするべき命令の集合Iとして作成する。
【0149】
つぎに、情報処理装置200は、作成した命令の集合Iおよびチューニング作業情報Wを参照して、チューニングするべき命令があるか否かを判断する(ステップS1802)。具体的には、例えば、情報処理装置200は、命令の集合Iに含まれ、かつ、チューニング作業情報Wの実施状態がNの命令が存在する場合に、チューニングするべき命令があると判断する。
【0150】
ここで、チューニングするべき命令がある場合(ステップS1802:Yes)、情報処理装置200は、命令の集合Iから、チューニングするべき命令Jを選択する(ステップS1803)。具体的には、例えば、情報処理装置200は、チューニングデータベース情報600を参照して、命令の集合Iのうち、改善率が最も高い命令を選択する。
【0151】
つぎに、情報処理装置200は、選択した命令Jのレイテンシを増加させた場合に性能が改善するかどうかを検証するために、チューニング作業情報Wからチューニング作業情報WTを作成する(ステップS1804)。チューニング作業情報WTでは、例えば、命令Jの実施状態に、レイテンシの増分を示す「1」が設定される。
【0152】
そして、情報処理装置200は、中間言語表現、データ依存グラフおよびチューニング作業情報WTを参照して、中間言語表現に対してソフトウェアパイプライニングを適用することにより、実行可能プログラムWOP(WOUTPUT)を作成する(ステップS1805)。この際、情報処理装置200は、ソフトウェアパイプライニングを適用する場合に、各命令のレイテンシに、チューニング作業情報WTの各命令のレイテンシ増分の列と実施状態の列の値をそれぞれ追加して最適化を適用する。
【0153】
つぎに、情報処理装置200は、作成した実行可能プログラムWOPを実行する(ステップS1806)。そして、情報処理装置200は、実行した実行可能プログラムWOPの実行時間Tと、実行時のパフォーマンスカウンタ情報PTとを取得する(ステップS1807)。
【0154】
つぎに、情報処理装置200は、実行時間TBESTが実行時間Tよりも大きいか否かを判断する(ステップS1808)。ここで、実行時間TBESTが実行時間Tよりも大きい場合には(ステップS1808:Yes)、情報処理装置200は、実行可能プログラムWOPを実行可能プログラムOPとし、実行時間Tを実行時間TBESTとし、パフォーマンスカウンタ情報PTをパフォーマンスカウンタ情報Pとする(ステップS1809)。
【0155】
そして、情報処理装置200は、チューニング作業情報WTの命令Jの実施状態の値をレイテンシ増分に加算し、命令Jの実施状態を「N」に変更して、新たなチューニング作業情報Wを作成し(ステップS1810)、ステップS1801に戻る。
【0156】
また、ステップS1808において、実行時間TBESTが実行時間T以下の場合には(ステップS1808:No)、情報処理装置200は、チューニング作業情報WTの命令Jの実施状態を「C」に変更して、新たなチューニング作業情報Wを作成し(ステップS1811)、ステップS1801に戻る。
【0157】
また、ステップS1802において、チューニングするべき命令がない場合(ステップS1802:No)、情報処理装置200は、チューニング作業情報Wを参照して、チューニングデータベース情報600を更新する((ステップS1812)。そして、情報処理装置200は、実行可能プログラムOPを出力して(ステップS1813)、本フローチャートによる一連の処理を終了する。
【0158】
これにより、情報処理装置200は、入力プログラムについて、命令のレイテンシを増加させて性能の改善を試行することで、ソフトウェアパイプライニングの最適化による性能向上を図ることができる。
【0159】
以上説明したように、実施の形態2にかかる情報処理装置200によれば、入力プログラム内のループ処理について、ソフトウェアパイプライニングを適用して実行された際のCPU201のパフォーマンスカウンタ情報を取得することができる。ソフトウェアパイプライニングは、CPU201に対応する命令のレイテンシ情報に基づいて、ループ処理内の命令を並び替えることである。また、情報処理装置200によれば、取得したパフォーマンスカウンタ情報に基づいて、待ち時間が発生した命令の種類を特定することができる。命令の種類は、例えば、整数データload命令、浮動小数点データload命令、整数演算命令および浮動小数点演算命令のいずれかである。そして、情報処理装置200によれば、ループ処理内の命令のうち、特定した種類のいずれかの命令のレイテンシ情報の値を増加させてソフトウェアパイプライニングを適用することにより実行可能プログラムを作成することができる。
【0160】
これにより、情報処理装置200は、ループ処理を含む入力プログラムについて、ソフトウェアパイプライニングの最適化による性能向上を図ることができる。例えば、情報処理装置200は、CPU201のパフォーマンスカウンタの情報を利用して、想定通りの動作をしていない可能性がある命令を絞り込み、その命令のレイテンシを増加させて性能改善を試みることができる。
【0161】
また、情報処理装置200によれば、記憶部710を参照して、ループ処理内の命令のうち、特定した種類の命令であって、かつ、改善率が高い命令を選択することができる。記憶部710は、CPU201で実行される命令と対応付けて、当該命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能の改善を試行した場合の改善率を表す情報を記憶する。そして、情報処理装置200によれば、選択した命令のレイテンシ情報の値を増加させて、ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成することができる。
【0162】
これにより、情報処理装置200は、過去に性能改善を試行した際に成功した割合が高い命令を選択して、その命令のレイテンシを増加させて性能改善を試みることができる。このため、情報処理装置200は、レイテンシのずれの要因がCPU201(内部構成)に依存する傾向があることを利用して、効率的に性能向上を図ることができる。
【0163】
また、情報処理装置200によれば、入力プログラムに基づいて、クリティカルパスとなる命令列を検出し、検出した命令列のうち、特定した種類のいずれかの命令を選択することができる。そして、情報処理装置200によれば、選択した命令のレイテンシ情報の値を増加させて、ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成することができる。
【0164】
これにより、情報処理装置200は、プログラムの実行性能に与える影響が大きい命令を選択して、その命令のレイテンシを増加させて性能改善を試みることができ、効率的に性能向上を図ることができる。
【0165】
また、情報処理装置200によれば、記憶部710を参照して、検出した命令列のうち、特定した種類の命令であって、かつ、改善率が高い命令を選択することができる。
【0166】
これにより、情報処理装置200は、プログラムの実行性能に与える影響が大きい命令であって、過去に性能改善を試行した際に成功した割合が高い命令を選択して、その命令のレイテンシを増加させて性能改善を試みることができ、より効率的に性能向上を図ることができる。
【0167】
また、情報処理装置200によれば、作成した実行可能プログラムを実行した結果、当該実行可能プログラムの実行時間に基づいて、入力プログラムの性能(実効性能)が改善したか否かを判定することができる。そして、情報処理装置200によれば、判定した判定結果に基づいて、記憶部710に記憶された命令(レイテンシ情報の値を増加させた命令)に対応する改善率を表す情報を更新することができる。
【0168】
これにより、情報処理装置200は、CPU201について、命令のレイテンシを増加させて性能改善を試行した際の結果(改善成功/改善失敗)を蓄積して、今後の性能改善に活用することができる。レイテンシのずれの要因は、CPU201(内部構成)に依存する傾向がある。このため、命令のレイテンシを増加させて性能改善を試行した際の結果(改善成功/改善失敗)は、CPU201においてソフトウェアパイプライニングを行うにあたり有用な情報であるといえる。
【0169】
また、情報処理装置200によれば、入力プログラムの性能が改善した場合、命令のレイテンシ情報の値を増加させた状態を維持して、さらなる性能改善を実施することができる。また、情報処理装置200によれば、入力プログラムの性能が改善しなかった場合、命令のレイテンシ情報の値を増加させない状態に戻して、さらなる性能改善を実施することができる。
【0170】
これにより、情報処理装置200は、性能改善の成否に応じて命令のレイテンシを調整しながら、想定通りの動作をしていない可能性がある命令について、レイテンシを増加させて、さらなる性能改善を試みることができる。
【0171】
また、情報処理装置200によれば、作成した実行可能プログラムを出力することができる。具体的には、例えば、情報処理装置200は、入力プログラムについての性能改善を繰り返し実施した結果、性能が改善した最新の実行可能プログラム(例えば、実行可能プログラムOP)のみを出力してもよい。
【0172】
これにより、情報処理装置200は、ソフトウェアパイプライニングによる最適化の効果を高めて性能が改善された実行可能プログラム(例えば、実行可能プログラムOP)を提供することができる。
【0173】
これらのことから、実施の形態2にかかる情報処理装置200によれば、ソフトウェアパイプライニングの最適化を適用した結果について、CPU201のデータシートに記載されていないような要因による性能低下や、プログラム実行時の複雑な状況による性能低下を防ぐことが可能となる。これにより、情報処理装置200は、HPCアプリケーションなどの実行時間の大部分を単一の最内ループで消費するようなプログラムの実行時間を短縮することができる。
【0174】
なお、本実施の形態で説明したコンパイル方法は、あらかじめ用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイラは、ハードディスク、フレキシブルディスク、CD-ROM、DVD、USBメモリ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本コンパイラは、インターネット等のネットワークを介して配布してもよい。
【0175】
上述した実施の形態に関し、さらに以下の付記を開示する。
【0176】
(付記1)プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、
取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、
前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理をコンピュータに実行させることを特徴とするコンパイラ。
【0177】
(付記2)前記CPUで実行される命令と対応付けて、当該命令のレイテンシを増加させてソフトウェアパイプライニングを適用することにより性能の改善を試行した場合の改善率を表す情報を記憶する記憶部を参照して、前記ループ処理内の命令のうち、特定した前記種類の命令であって、かつ、前記改善率が高い命令を選択する、
処理を前記コンピュータに実行させ、
前記作成する処理は、
選択した前記命令のレイテンシ情報の値を増加させて、前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、ことを特徴とする付記1に記載のコンパイラ。
【0178】
(付記3)前記プログラムに基づいて、クリティカルパスとなる命令列を検出し、
検出した前記命令列のうち、特定した前記種類のいずれかの命令を選択する、
処理を前記コンピュータに実行させ、
前記作成する処理は、
選択した前記命令のレイテンシ情報の値を増加させて、前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、ことを特徴とする付記1または2に記載のコンパイラ。
【0179】
(付記4)前記プログラムに基づいて、クリティカルパスとなる命令列を検出する、
処理を前記コンピュータに実行させ、
前記選択する処理は、
前記記憶部を参照して、検出した前記命令列のうち、特定した前記種類の命令であって、かつ、前記改善率が高い命令を選択する、ことを特徴とする付記2に記載のコンパイラ。
【0180】
(付記5)作成した前記実行可能プログラムを出力する、処理を前記コンピュータに実行させることを特徴とする付記1~4のいずれか一つに記載のコンパイラ。
【0181】
(付記6)作成した前記実行可能プログラムを実行した結果、当該実行可能プログラムの実行時間に基づいて、前記プログラムの性能が改善したか否かを判定し、
判定した判定結果に基づいて、前記記憶部に記憶された前記いずれかの命令に対応する改善率を表す情報を更新する、
処理を前記コンピュータに実行させることを特徴とする付記2に記載のコンパイラ。
【0182】
(付記7)作成した前記実行可能プログラムを実行した結果、当該実行可能プログラムの実行時間に基づいて、前記プログラムの性能が改善したか否かを判定し、
前記性能が改善した場合、前記いずれかの命令のレイテンシ情報の値を増加させた状態を維持して、前記実行可能プログラムを実行した際の前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理を前記コンピュータにさらに実行させる、ことを特徴とする付記1~6のいずれか一つに記載のコンパイラ。
【0183】
(付記8)前記性能が改善しなかった場合、前記いずれかの命令のレイテンシ情報の値を増加させない状態に戻して、前記実行可能プログラムを実行した際の前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理を前記コンピュータにさらに実行させることを特徴とする付記7に記載のコンパイラ。
【0184】
(付記9)前記命令の種類は、整数データload命令、浮動小数点データload命令、整数演算命令および浮動小数点演算命令のいずれかである、ことを特徴とする付記1~8のいずれか一つに記載のコンパイラ。
【0185】
(付記10)プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、
取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、
前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
処理をコンピュータが実行することを特徴とするコンパイル方法。
【0186】
(付記11)プログラム内のループ処理について、CPUに対応する命令のレイテンシ情報に基づき前記ループ処理内の命令を並び替えるソフトウェアパイプライニングを適用して実行された際の前記CPUのパフォーマンスカウンタの情報を取得し、
取得した前記パフォーマンスカウンタの情報に基づいて、待ち時間が発生した命令の種類を特定し、
前記ループ処理内の命令のうち、特定した前記種類のいずれかの命令のレイテンシ情報の値を増加させて前記ソフトウェアパイプライニングを適用することにより実行可能プログラムを作成する、
制御部を有することを特徴とするコンパイル装置。
【符号の説明】
【0187】
101 コンパイル装置
110 プログラム
111 ループ処理
120 レイテンシ情報
130 パフォーマンスカウンタ情報
140,150 実行可能プログラム
200 情報処理装置
201 CPU
202 メモリ
203 ディスクドライブ
204 ディスク
205 通信I/F
206 可搬型記録媒体I/F
207 可搬型記録媒体
208 バス
210 ネットワーク
300 入力プログラム
400 中間言語表現
500 データ依存グラフ
501,502,503,504,505,506 ノード
511,512,513,514,515,516 エッジ
600 チューニングデータベース情報
700 制御部
701 受付部
702 最適化部
703 実行部
704 調整部
705 出力部
710 記憶部
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18