JP6331865B2 - プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置 - Google Patents

プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置 Download PDF

Info

Publication number
JP6331865B2
JP6331865B2 JP2014164671A JP2014164671A JP6331865B2 JP 6331865 B2 JP6331865 B2 JP 6331865B2 JP 2014164671 A JP2014164671 A JP 2014164671A JP 2014164671 A JP2014164671 A JP 2014164671A JP 6331865 B2 JP6331865 B2 JP 6331865B2
Authority
JP
Japan
Prior art keywords
loop
program
simd
instruction
optimization
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2014164671A
Other languages
English (en)
Other versions
JP2016040691A (ja
Inventor
周作 中島
周作 中島
内藤 俊也
俊也 内藤
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2014164671A priority Critical patent/JP6331865B2/ja
Priority to US14/799,625 priority patent/US9760352B2/en
Publication of JP2016040691A publication Critical patent/JP2016040691A/ja
Application granted granted Critical
Publication of JP6331865B2 publication Critical patent/JP6331865B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • G06F11/3419Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment by assessing time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3466Performance evaluation by tracing or monitoring
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/81Threshold
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2201/00Indexing scheme relating to error detection, to error correction, and to monitoring
    • G06F2201/865Monitoring of software

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は,プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置に関する。
コンパイラは,オリジナルのプログラムを解析して,予め決められた最適化を行い,コンピュータが実行可能なオブジェクトコードに変換する。しかし,コンパイラはあらかじめ決められた条件の下でそれぞれの最適化処理を行うだけであり,様々なソースプログラムに対して個別に最も理想的な最適化を行うことは容易ではない。
プログラムの最適化については,例えば,以下の特許文献1〜4に記載されている。
特開2000−35894号公報 特開昭63−632号公報 特開2010−218367号公報 特開平08−263298号公報
プログラムの最適化は,プログラムのアルゴリズムを改良することによる最適化だけでなく,プログラムを実行するコンピュータのハードウエアを考慮した最適化も必要である。しかしながら,プログラムの最適化は,対象のプログラムの構造にかかわらず一律に行われるのが一般的である。そのため,プログラムの構造によっては,またはプログラムを実行するコンピュータのハードウエアの構成によっては,一律に適用される最適化が必ずしも最適な結果をもたらすとはかぎらず,かえって効率を低下させる場合もある。
そこで,実施の形態の第1の側面の目的は,有効な最適化を行うプログラムの最適化方法。プログラム最適化プログラム及びプログラム最適化装置を提供することにある。
実施の形態の第1の側面は,演算処理装置が,最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し,
前記プロファイル情報に基づいて演算待ち時間を算出し,
前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理を有するプログラム最適化方法である。
第1の側面によれば,プログラムに対して有効な最適化を行うことができる。
コンパイラの処理を示すフローチャート図である。 本実施の形態におけるプログラム最適化装置の構成を示す図である。 最適化処理のフローチャート図である。 ソースコードで記述した実行可能バイナリコードの一例を示す図である。 図3のボトルネック解析S12のフローチャート図である。 ボトルネックの計算例を示す図である。 ボトルネックの計算例を示す図である。 図3の最適化の解析工程S13のフローチャート図である。 SIMD命令率の算出処理例を示す図である。 ループ内にIF文があるプログラム例とIF文がないプログラム例とを示す図である 工程S36,S37で挿入されるマスク方式SIMD化とリスト方式SIMD化の最適化制御行を示す図である。 CPUコア(演算処理部)の構成例を示す図である。 マスク方式SIMD化による最適化の説明をする図である。 マスク方式SIMD化されたオブジェクトコードを実行した場合にSIMD演算器の動作例を示す図である。 リスト方式SIMD化で最適化されるオブジェクトコードの例を示す図である。 図15のオブジェクトコード32_OCをCPUコアが実行した場合のSIMD演算器の動作例を示す図である。 アンローリング展開を説明する図である。 ソフトウエアパイプライン展開を説明する図である。 本実施の形態におけるDOループのオリジナルプログラムの最適化制御行の例を示す図である。 DOループの繰り返し回数が大の場合にDOループを最適化したオブジェクトコードのフローチャート図である。 DOループの繰り返し回数が中(nが144回未満,16回以上)の場合にDOループを最適化したオブジェクトコードのフローチャート図である。 DOループの繰り返し回数が少(nが15回未満,2回以上)の場合にDOループを最適化したオブジェクトコードのフローチャート図である。 DOループの繰り返し回数が少(nが15回未満,2回以上)の場合にDOループを最適化したオブジェクトコードのフローチャート図である。 最適化制御行データの一例を示す図である。
図1は,コンパイラの処理を示すフローチャート図である。コンパイラは,オリジナルのソースコードのプログラムを入力し(S10),オリジナルプログラムの構文を解析し(S11),解析結果に基づいて最適化したオブジェクトコードのプログラムに変換する(S12)。そして,コンパイラは,変換したオブジェクトコードのプログラムを出力する(S13)。
コンパイラによる最適化には,変換後のプログラムを実行するコンピュータのハードウエアに基づくものがある。たとえば,コンピュータ等の情報処理装置が有するCPU(Central Processing Unit,演算処理装置)のCPUコアは,それぞれ,内部に演算器を複数有し,1つの命令を用いて複数のデータに対する同じ処理を並列して実行するSIMD(Single Instruction Multiple Data)演算を行う。また,CPUコアは,パイプライン構成を有し,連続する命令をパイプラインに展開して複数の命令を並列に処理する。このようなSIMD演算器を有効に利用したり,ソフトウエアをパイプライン展開する機能を利用したりすることで,プログラム実行時の効率を高めることができる。
また,コンパイラは,オリジナルプログラムのループ内の命令をループ内で複数(n個)に展開して,ループの回数をn分の1に減らすアンローリング展開を行う。オリジナルプログラムをアンローリング展開することで,ループの回数に応じて増大する処理のオーバーヘッドを減らし,SIMD化を容易にして,プログラムの実行効率を高めることができる。
本実施の形態では,上記のSIMD演算器の利用や,ソフトウエアのパイプライン展開やアンローリング展開を利用して,オリジナルプログラムを最適化しようとするものである。
最初に,本明細書内のいくつかのキーワードについて簡単に説明する。オリジナルプログラムは,最適化対象のプログラムである。チューニングプログラムは,オリジナルプログラムに最適化制御行を挿入したプログラムである。コンパイラはチューニングプログラムの最適化制御行に基づいてそのプログラムに最も適した最適化処理を行ってオブジェクトコードのプログラムに変換する。
プロファイル情報とは,オリジナルプログラムを実行することで得られる様々な情報であり,ハードウエアモニタ情報と実行時情報とを有する。ハードウエアモニタ情報は,プログラムの実行時に実行される浮動小数点命令情報,整数命令情報,SIMD命令情報などであり,プログラムを実行するCPU内に設けられたモニタ回路がそれらの情報を収集し,出力する。実行時情報は,プログラム内のループの繰り返し回数や代入式の実行回数などであり,例えばオリジナルプログラムを実行する時にそれらの回数をカウントする命令をオリジナルプログラムに挿入することで収集可能である。
ボトルネックとは,プログラムの性能を阻害しているまたは決定している要因を示す情報であり,プログラムを実行した時に取得するハードウエアモニタ情報から所定の計算式により算出される。
最適化制御行とは,コンパイラがプログラムを最適化する際にコンパイラによる最適化の指針になる制御コマンドであり,本実施の形態の最適化装置がボトルネックとプロファイル情報とに基づいて自動的に決定し,オリジナルプログラム内に挿入する。オリジナルプログラムに最適化制御行を挿入することで,チューニングプログラムが生成される。コンパイラは,このチューニングプログラムをコンパイルする際に,最適化制御行の指示に応じて最適化したオブジェクトコードに変換する。
図2は,本実施の形態におけるプログラム最適化装置の構成を示す図である。プログラム最適化装置は,プロセッサであるCPU10と,メインメモリ13と,入出力装置14と,ハードディスク等の大容量メモリ15と,それらを接続するバス16とを有する。CPU10は,デコーダ,演算器,レジスタなどを有するCPUコア11と,1次キャッシュメモリL1と,2次キャッシュメモリL2と,プログラムを実行した時にハードウエアモニタ情報を取得するモニタ回路12とを有する。
モニタ回路12は,例えば,コンパイラによりオリジナルプログラムから変換された実行可能バイナリコード(オブジェクトコード)をコンピュータが実行した際に,例えば,実行した総命令数,浮動小数点ロードメモリアクセス待ち回数,整数ロードメモリアクセス待ち回数,入出力アクセス待ち回数,整数ロードキャッシュアクセス待ち回数,全体の待ち回数,有効総命令数,演算待ち回数,ストア待ち回数,浮動小数点演算待ち回数,L2デマンドミス回数,L2プリフェッチミス回数,L2デマンドライトバック回数,L2プリフェッチライトバック回数,SIMDロード・ストア命令数,SIMD浮動小数点命令数,SIMDfma命令数などのハードウエアモニタ情報を収集し,外部に出力することができる。なお,fma命令は積と和の演算を1回で行う命令である。
これらのハードウエアモニタ情報に基づいて,後述するとおり,SIMD命令率,キャッシュヒット・ミス率,メモリスループットなどを算出することができる。
モニタ回路12は,上記の実行可能バイナリコードを実行するコンピュータのプロセッサに備えられているハードウエア回路であり,取得可能なハードウエアモニタ情報は,プロセッサに依存する。
図2のプログラム最適化装置のハードディスク15内には,オリジナルプログラム20またはチューニングプログラム23を最適化して実行可能バイナリコード(オブジェクトコード)21に変換するコンパイラが記憶されている。また,ハードディスク15内には,コンパイラが生成した実行可能バイナリコード(オブジェクトコード)を実行することで得られるプロファイル情報を収集し,プログラムの特性を解析し,最適化制御行及び挿入位置情報(中間データ,最適化制御行データ)を生成するライブラリプログラムと,オリジナルプログラムに最適化制御行を挿入してチューニングプログラムを生成するツールプログラムとが記憶されている。コンパイラとライブラリプログラムとツールプログラムは,オリジナルプログラムを最適化する最適化プログラム16に対応する。また,ハードディスク15内には,オリジナルプログラム20と,実行可能バイナリコード(オブジェクトコード)21と,最適化制御行に関する最適化制御行データ(中間データ)22と,チューニングプログラム23も記憶される。
図3は,最適化処理のフローチャート図である。図2のプログラム最適化装置が,最適化プログラム16を構成するコンパイラと,ライブラリプログラムと,ツールプログラムを実行することで,図3の最適化処理を実行する。最適化処理は次の通りである。
S10:コンパイラがオリジナルプログラムをコンパイルして実行可能バイナリコード21を生成する。この実行可能バイナリコード21には,コンピュータが実行することでオリジナルプログラムの実行時情報を抽出する仕組みが組み込まれている。実行時情報には,オリジナルプログラムの行単位の実行回数,ループの繰り返し回数,代入式の実行回数などが含まれ,それらの情報は,プログラム名と関数名と行番号と関連付けられて抽出される。
図4は,ソースコードで記述した実行可能バイナリコードの一例を示す図である。この例によれば,サブルーチン「sub」内に,実行時情報とハードウエアモニタ情報を収集するための命令文「call STAR_COLLECTION」と,収集を終了させる命令文「call STOP_COLLECTION」とが挿入されている。
S11:コンピュータに実行可能バイナリコード21を実行させることで,上記の実行時情報とハードウエアモニタ情報とを有するオリジナルプログラムのプロファイル情報を収集する。ハードウエアモニタ情報は,前述のとおりコンピュータのプロセッサが有するモニタ回路が収集し,出力する。
S12:次に,コンピュータがライブラリプログラムを実行することで,収集したプロファイル情報に基づいてオリジナルプログラムのボトルネック候補の計算を行う。オリジナルプログラムのボトルネックには,演算待ち時間が長い,メインメモリのロード待ち時間が長い,メインメモリのストア待ち時間が長い,キャッシュメモリのアクセス待ち時間が長い,メインメモリのスループットが大きいなどがある。工程S12では,これらのボトルネック候補の計算を行い,最適化により改善すべきボトルネックを解析する。
S13:改善すべきボトルネックが検出されると,コンピュータがライブラリプログラムを実行することで,そのボトルネックを改善する最適化を解析し,どの最適化をすべきかを決定する。ボトルネック毎に性能向上を阻害している要因が異なるので,改善すべきボトルネックに応じた最適化解析を行う必要がある。
S14:次に,コンピュータがライブラリプログラムを実行することで,最適化の解析結果に対応した最適化制御行を生成し,最適化制御行を挿入すべきプログラム名,関数名またはサブルーチン名,行番号などの諸情報を取得する。
S15:さらに,コンピュータがライブラリプログラムを実行することで,最適化制御行とそれを挿入すべきプログラム情報や位置情報を有する最適化制御行データ22を生成し,出力する。この最適化制御行データ22は,最適化制御行とそれを挿入すべきプログラム名や行番号などの挿入位置情報が所定のフォーマットで配列されている。
S16:最後に,コンピュータがツールプログラムを実行することで,最適化制御行データ22に基づいて,オリジナルプログラムに最適化制御行を挿入し,最適化済みプログラムであるチューニングプログラム23を出力する。その後,コンピュータがコンパイラを実行することで,このチューニングプログラム23を最適化制御行にしたがって最適化したオブジェクトコードを生成する。つまり,最適化制御行は,コンパイラに,コンパイラが有している種々の最適化処理のうちどの最適化処理を行うかを指示する一種のコマンドである。
上記のとおり,本実施の形態によれば,図2のプログラム最適化装置が図3の最適化処理を行うことで,従来,ユーザが膨大な時間をかけて行っていた最適化制御行を挿入する作業時間を短縮することができる。また,オリジナルプログラムを実行した際に得られる実行時情報が可変であり,オリジナルプログラム内の複数のループの特性が異なる場合でも,ループ毎に適切な最適化制御行を挿入することができる。
図5は,図3のボトルネック解析S12のフローチャート図である。図2のプログラム最適化装置のコンピュータがライブラリプログラムを実行することで,オリジナルプログラムのボトルネック候補の算出を行う。コンピュータは,S20-S28の間の処理をオリジナルプログラムの解析範囲が終了するまで繰り返す。
S21:コンピュータがライブラリプログラムを実行することで,プロファイル情報から実行時情報を取得しながら,オリジナルプログラム内のループ構造に達したか否かを判断する(S23,S22)。そして,コンピュータはライブラリプログラムを実行することで,オリジナルプログラム内のループ構造に達する毎に(S23のYES),ループ内のハードウエアモニタ情報を取得し(S24),候補となる例えば図5に示される5つのボトルネックを算出する(S25,S26)。一般に,ボトルネックが発生するのはループ構造であるので,本実施の形態のプログラム最適化装置は,オリジナルプログラム内のループを解析範囲とし,ループ毎にボトルネックを解析し,ループ内に挿入すべき最適化制御行を生成する。
ボトルネックの候補には,演算待ち時間,メインメモリのロード(ロードメモリアクセス)待ち時間,キャッシュメモリのアクセス待ち時間,メインメモリのストア(ストアメモリアクセス)待ち時間,メモリスループットなどが含まれる。
演算待ち時間は,プロセッサ内で命令がデコードされて演算すべきことが決定した後,演算器の予約部にエントリされてから実際に演算が開始されるまでの待ち時間である。演算待ち時間には浮動小数点演算待ち時間と,整数演算待ち時間とが含まれる。
ロードメモリアクセス待ち時間は,メモリに対するロード命令の実行が待たされる時間であり,浮動小数点ロードメモリアクセス待ち時間と,整数ロードメモリアクセス待ち時間とが含まれる。
キャッシュアクセス待ち時間は,キャッシュメモリへのロードアクセス命令の実行が待たされる時間であり,浮動小数点と整数のロードキャッシュアクセス待ち時間が含まれる。
ストアメモリアクセス待ち時間は,メモリに対するストア命令の実行が待たされる時間であり,浮動小数点と整数のストアメモリアクセス待ち時間が含まれる。
メモリスループットは,メモリアクセスされたデータ容量の合計容量を総命令数の実行に要した時間で除算した値であり,メインメモリの利用効率を示す指標である。一般に,メモリスループットが閾値を超えるほど高い場合は,他のボトルネックを改善してもプログラムの効率の改善にはつながらない場合が多く,メモリスループットが閾値以下の低い場合は,他のボトルネックを改善することでプログラムの効率を改善する場合が多い。メモリスループットが閾値を超えている場合の改善策は,例えば,コンピュータのメモリ容量を増大するなどのハードウエアの改善などである。
コンピュータは,上記のボトルネックの算出値を,解析範囲であるループ毎に求めてメモリやハードディスク内に記憶する。
そして,コンピュータはライブラリプログラムを実行することで,計算した各ボトルネックの値に基づいて,解析範囲であるループ毎に改善すべきボトルネックについて最適化解析を行い,各ボトルネックに対応する性能向上を阻害する要因を検出する(S27)。
図6,図7は,ボトルネックの計算例を示す図である。図6には,メモリまたはハードディスクに記憶されているプロファイル情報テーブル24と,ボトルネック計算処理例S25と,ボトルネック計算により求められた値を格納するボトルネック情報テーブル25が示されている。図6には,ボトルネック計算処理S25の例として,浮動小数点演算待ち時間とメモリスループットとが示されている。
また,図7には,ロードメモリアクセス待ち(浮動小数点ロードメモリアクセス待ち,整数ロードメモリアクセス待ち)(S25-1),キャッシュアクセス待ち(浮動小数点ロードキャッシュアクセス待ち,整数ロードキャッシュアクセス)(S25-2),ストアメモリアクセス待ち,I/Oアクセス待ち(S25-3),メモリスループット(S25-4)の計算式が示されている。
図6のS25に示されるとおり,浮動小数点演算待ち(時間)は,ハードウエアモニタ回路が収集した浮動小数点待ち回数の合計時間である。10はCPU周波数のギガヘルツに対応する。また,メモリスループットは,L2キャッシュメモリへのアクセス要求(demand:dm)に対するキャッシュミス数,L2キャッシュメモリへのプリフェッチ要求(prefetch:pf)に対するキャッシュミス数,L2キャッシュメモリへのアクセス要求時のライトバック(write back:wb)の回数,L2キャッシュメモリへのプリフェッチ要求時のライトバックの回数の合計に,キャッシュメモリの1つのキャッシュラインの容量(128バイト)を乗算したメモリアクセスの総容量を,総命令数で除算して求められる。
図7に示した各種待ちの演算式は図に示されるとおりである。また,メモリスループットを求める式は図6と同じである。
[演算待ち時間が閾値を越える場合の最適化の解析]
図8は,図3の最適化の解析工程S13のフローチャート図である。図8に示した最適化の解析は,図5においてボトルネックの一つである演算待ち時間が閾値を越えていたため,演算待ちのボトルネックを改善すべきと判断された場合の最適化の解析処理を示している。すなわち,図8の最適化の解析は,演算待ちを改善するためにどの最適化制御行をどこに挿入すべきかを解析する処理である。また,図8の最適化の解析工程は,解析範囲であるループ毎に行われる。
S30,S31:コンピュータはライブラリプログラムを実行することで,既に収集して記憶していたハードウエアモニタ情報を取得する。そして,コンピュータは,SIMD演算器で複数のデータに対する演算命令を並列に処理したか否かを示すSIMD命令率を算出する。このSIMD命令率は,解析単位であるループ内のSIMD命令率である。
図9は,SIMD命令率の算出処理例を示す図である。コンピュータは,ハードウエアモニタ情報を含むプロファイル情報テーブルのデータから,図示される演算式によりSIMD命令率を算出し,最適化情報のデータテーブル27に格納する。この演算式によれば,SIMD命令率は,SIMDロード・ストア命令数と,SIMD浮動小数点命令数と,SIMDfma命令数との和を,有効総命令数で除算して求められる。fma(Fused Multiply and Add)命令とは,積と和の演算を1回で行う命令である。SIMD命令率は,SIMDロード・ストア命令数と,SIMD浮動小数点命令数と,SIMDfma命令数と,有効総命令数は,ハードウエアモニタ情報としてモニタ回路から収集される。
図9の演算式は,図2のCPUのCPUコアのSIMD演算器が,ロード・ストア命令を並列に処理する演算器と,浮動小数点演算命令を並列に処理する演算器と,fma命令とを並列に処理する演算器を有することを前提にしている。したがって,プログラムを実行するコンピュータのCPUコアのSIMD演算器の構成に対応して,SIMD命令率の演算式が異なる。
S32:SIMD命令率が所定の閾値を越えていない場合(S32のNO),コンピュータは,IF文の命令をSIMD化する最適化制御文を追加できるか否かを検討する(S33−S37)。ここでは,図3の工程S10,S11で,コンピュータがコンパイラを実行して,オリジナルプログラム20をコンパイルし,生成した実行可能バイナリコード21を実行してプロファイル情報を収集したときは,IF文の命令をSIMD化していないことを前提とする。一般に,IF文の命令はIF文の条件が満たされる場合に実行されるので,SIMD化して並列演算すると逆に効率が低下する場合がある。したがって,コンパイラはIF文の命令をSIMD化しないように最適化することが行われる場合がある。
コンピュータは,SIMD命令率が閾値を越えている場合(S32のYES),IF文の命令をSIMD化できるかの検討は行わない。
また,SIMD命令率が閾値を越えているかいないかにかかわらず,コンピュータは,ループ構造の繰り返し回数に適合した最適化処理を解析して挿入すべき最適化制御文を検討する(S38−S41)。
S33,S33_1:コンピュータは,ライブラリプログラムを実行することで,オリジナルプログラムの解析範囲であるループ内の文種別情報を取得し,ループ内にIF文が存在するか否かをチェックする。もしループ内にIF文が存在する場合は,工程S34−S37によりIF文に適したSIMD化を指示する最適化制御文を決定する。
図10は,ループ内にIF文があるプログラム例とIF文がないプログラム例とを示す図である。図10(A)は,DOループ内にIF文が存在し,ループ制御変数iが1からnまでIF文の条件を満たす場合に図示された演算命令の実行を繰り返すプログラム30である。図10(B)は,DOループ内にIF分が存在せずループ制御変数iが1からnまで図示された演算命令を繰り返すプログラム31である。
S34,S35:コンピュータは,ライブラリプログラムを実行することで,IF文の実行時情報を取得し,IF文の真率を算出する。そして,コンピュータは,IF文の真率が所定の閾値,例えば50%,を越えるか否かをチェックする。
S36,S37:コンピュータは,ライブラリプログラムを実行することで,IF文の真率が大きい場合と小さい場合とでSIMD化方式の選択を行う。すなわち,コンピュータは,IF文の真率が所定の閾値を越えている場合は,最適化制御行としてマスク方式SIMD化を指示する制御行に決定し(S36),IF文の真率が所定の閾値以下の場合は,最適化制御行としてリスト方式SIMD化を指示する制御行に決定する(S37)。
図11は,工程S36,S37で挿入されるマスク方式SIMD化とリスト方式SIMD化の最適化制御行を示す図である。オリジナルプログラム20は,図10(A)に示したプログラム30と同じである。そして,コンピュータは,IF文の条件,P(i)>q,が真になる率が閾値の50%を越える場合は,マスク方式SIMD化を制御する下線の最適化制御行,「!ocl simd」,をDO文の前に挿入したプログラム32を生成することを決定する(S36)。また,コンピュータは,真率が50%以下の場合は,リスト方式SIMD化を制御する下線の最適化制御行,「!ocl simd_listv」,をDO文の前に挿入したプログラム33を生成することを決定する(S37)。
図8に戻り,SIMD命令率が所定の閾値を越えている場合(S32でYES)と,SIMD命令率が所定の閾値以下の場合(S32のNO)のいずれの場合でも,コンピュータはライブラリプログラムを実行することで,ループの実行時情報を取得し(S38),ループの繰り返し回数が所定の閾値を越えている場合(S39のYES),通常のループ構造に対する最適化を行う最適化制御行を選択し,ループの繰り返し回数が所定の閾値以下の場合(S39のNO),少回転向けループ構造に対する最適化を行う最適化制御行を選択する。
十分な繰り返し回数実行される通常のループ構造に対する最適化(S40)では,コンパイラは,DOループをアンローリング展開してSIMD化しやすいオブジェクトコードに変換し,オブジェクトコードを実行するCPUコアはソフトウエアパイプライン化により命令の実行効率を上げて命令の実行サイクル数を少なくする。一方,繰り返し回数が少ない少回転のループ構造に対する最適化(S41)では,コンパイラは,繰り返し回数が少なすぎて利用されないソフトウエアパイプライン化の処理ループや,アンローリング展開する処理ループを,オブジェクトコード内に生成せずに,複数のループを選択するためのオーバーヘッドを削減できるようにする。
以下,マスク方式SIMD化とリスト方式SIMD化について説明し,さらに,通常のループ構造の最適化の例と少回転数ループ向け最適化の例について説明する。
[マスク方式SIMD化とリスト方式SIMD化]
以下,マスク方式SIMD化とリスト方式SIMD化について簡単に説明する。まず,前提として,チューニングプログラムを実行するコンピュータのCPUコアの構成例について説明する。
図12は,CPUコア(演算処理部)の構成例を示す図である。図12のCPUコア300は,浮動小数点演算,浮動小数点ロード,または浮動小数点ストアを複数のデータに対して実行するSIMD命令に応じたSIMD処理を行うことができる。また,1つのデータに対して実行する非SIMD命令に応じた処理も行うことができる。
図12のCPUコア300は,プログラムカウンタPCまたは分岐予測機構が予測する分岐先アドレスのいずれかを選択する命令フェッチアドレス生成器301と,分岐命令の分岐予測を行う分岐予測部302と,命令が記憶されている一次命令キャッシュ303と,一次命令キャッシュから読み出した命令を一時的に格納する命令バッファ304と,命令をデコードする命令デコーダ305を有する。命令デコーダ305は,後述するとおり,命令に対応する制御信号を生成すると共に,命令で指定されている格納先レジスタにリネーミングレジスタを割り当てる。
更に,CPUコア300は,格納先レジスタに割り当てられたリネーミングレジスタとの対応関係を記憶するレジスタリネーミング部REG_RENと,主記憶オペランド生成用リザベーションステーション(Reservation Station for Address generate : RSA)と,固定小数点演算用リザベーションステーション(Reservation Station for Execute: RSE)と,浮動小数点演算用リザベーションステーション(Reservation Station for Floating : RSF)と,分岐用Reservation Station(Reservation Station for Branch : RSBR)と,コミットスタックエントリ(Commit Stack Entry : CSE)とを有する。
各リザベーションステーションRSは,命令デコーダ305から発行された命令のキューであり,命令を実行する実行ユニットに対応して設けられる。特に,固定小数点演算用リザベーションステーションRSEと浮動小数点演算用リザベーションステーションRSFは,アウトオブオーダで,つまり入力データや演算器の準備が整った命令から対応する演算器に命令を発行する。一方,コミットスタックエントリCSEは,全ての命令のエントリについて命令の完了を判定し,アウトオブオーダで開始された命令をインオーダで完了させる。
そして,CPUコア300は,オペランドデータ選択部310と,オペランドアドレス生成器311と,一次データキャッシュ部312と,ストアバッファ部313とを有する。また,CPUコア30は,固定小数点演算を行う演算器320と,浮動小数点演算を行うSIMD演算器330と,固定小数点リネーミングレジスタ321と,浮動小数点リネーミングレジスタFR_REGと,固定小数点レジスタ322と,浮動小数点SIMDレジスタFS_REGと,プログラムカウンタPCとを有する。
命令フェッチアドレス生成器301は,プログラムカウンタPCのカウント値または分岐予測部302からの情報を基に命令アドレスを選択し,一次命令キャッシュ303に対して命令フェッチリクエストを発行する。分岐予測部302は,分岐リザベーションステーションRSBRのエントリに基づいて分岐予測を行う。一次命令キャッシュ303は,命令フェッチリクエストに応じて読み出した命令を命令バッファ304に格納する。そして,命令バッファ304から命令デコーダに対し,プログラムにより指定された命令の順番通りに,すなわちインオーダで命令が供給され,命令デコーダ305は命令バッファ304から供給された命令をインオーダでデコードする。
命令デコーダ305は,デコードした命令の種類に応じて4つのリザベーションステーションRSA,RSE,RSF,またはRSBRに対して,必要なエントリを作成する。これとともに命令デコーダ305は,コミットスタックエントリCSEに対して,デコードしたすべての命令に対応するエントリを作成する。また,命令デコーダ305は,命令が指定するアーキテクチャレジスタ内のレジスタに,リネーミングレジスタ内のレジスタを割り当てる。
レジスタリネーミング部REG_RENは,リザベーションステーションRSA,RSEまたはRSFのいずれかにエントリが作成された時に,命令が指定するアーキテクチャレジスタに割り当てられたリネーミングレジスタのアドレスを記憶する。指定されたアーキテクチャレジスタと割当リネーミングレジスタとの対応関係はレジスタリネーミング部内のリネーミングマップに登録される。CPUコアは,アーキテクチャレジスタとして,固定小数点レジスタ322および浮動小数点SIMDレジスタFS_REGを有する。これらのレジスタは,演算処理結果を格納する格納レジスタとして,命令により指定される。またリネーミングレジスタとして,固定小数点リネーミングレジスタ321および浮動小数点リネーミングレジスタFR_REGを有する。
命令デコーダ305は,固定小数点レジスタ322が格納先のレジスタとして使用される場合には,リネーミングレジスタとして固定小数点リネーミングレジスタ321のアドレスを割り当てる。また,命令デコーダ305は,浮動小数点SIMDレジスタが格納先のレジスタとして使用される場合には,リネーミングレジスタとして浮動小数点リネーミングレジスタFR_REGを割り当てる。前述の格納先レジスタのアドレスに対して割り当てられたリネーミングレジスタのアドレスは,対応関係として,その命令に対応するリザベーションステーションRSA,RSE,RSFと,コミットスタックエントリCSEに出力される。
リザベーションステーションRSA,RSE,RSFは,保持されたエントリのうち,処理に必要な資源,例えばデータや演算器の準備ができたものから順次出力し,後段の演算器などのブロックに対してエントリに対応する処理を実行させる。これにより,命令がアウトオブオーダで実行開始され,命令の処理結果は,固定小数点リネーミングレジスタ321または浮動小数点リネーミングレジスタFR_REGに一時的に格納される。
浮動小数点リザベーションステーションRSFには,例えば浮動小数点演算命令に対応するエントリが格納される。演算器330は,リザベーションステーションRSFからのエントリに基づいて,演算の対象となる入力データを選択し,浮動小数点演算を実行する。浮動小数点命令の実行時には,SIMD演算器330の演算結果は浮動小数点リネーミングレジスタFR_REGに一時的に格納される。
また,浮動小数点ストア命令の実行時には,SIMD演算器330は演算対象として選択したデータをストアバッファ部313に出力する。そして,ストアバッファ部313は,オペランドアドレス生成器311から出力されたオペランドアドレスを指定して,SIMD演算器330から出力されたデータを一次データキャッシュ部312に書き込む。
コミットスタックエントリCSEは,命令デコーダ305によりデコードされたすべての命令に対応するエントリを保持し,各エントリに対応する処理の実行状況を管理し,これらの命令をインオーダで完了させる。例えば,コミットスタックエントリCSEは,次に完了させるべきエントリに対応する処理の結果が,固定小数点リネーミングレジスタ321または浮動小数点リネーミングレジスタFR_REGに格納されると共に,前の順番の命令が完了したと判定すると,リネーミングレジスタに格納されたデータを固定小数点レジスタ322または浮動小数点SIMDレジスタFS_REGに出力させる。これにより,各リザベーションステーションでアウトオブオーダで実行された命令がインオーダで完了する。
そして,SIMD演算器330は,複数の演算器を有する。それに対応して浮動小数点リネーミングレジスタFR_REGと浮動小数点SIMDレジスタFS_REGも複数有する。例えば,1つの命令で4つの組のデータを並列処理できる4-SIMD処理に対応する場合は,SIMD演算器330は4つの演算器を有する。
そして,浮動小数点SIMDレジスタFS_REGは,SIMD演算器と同数のレジスタを有する。同様に,浮動小数点リネーミングレジスタFR_REGも,同数のレジスタを有する。
図12において,整数演算を行う演算器320と固定小数点レジスタ322と固定小数点リネーミングレジスタ321を有する固定小数点演算ユニットを,SIMD処理に対応できるように,複数個有しても良い。但し,図12では,浮動小数点処理に対してのみSIMD処理ができるように構成されている。
図12の浮動小数点演算ユニットを構成する浮動小数点リザベーションステーションRSFと,SIMD演算器330と,浮動小数点SIMDレジスタFS_REGと,浮動小数点リネーミングレジスタFR_REGは,SIMD命令と非SIMD命令を次のように処理する。SIMD命令の場合は,SIMD演算器330内の複数の演算器が並行して処理を行い,それぞれに対して割り当てられている浮動小数点リネーミングレジスタFR_REGに処理結果を一時的に格納する。そして,コミットスタックエントリCSEが順番が前の命令の完了と現在の命令の完了を検出すると,浮動小数点リネーミングレジスタFR_REG内のレジスタに一時的に格納された処理結果が,浮動小数点SIMDレジスタFS_REG内の複数のレジスタに格納される。
一方,非SIMD命令に対しても,同様に演算器の処理結果が浮動小数点リネーミングレジスタFR_ERGに一時的に格納され,コミットスタックエントリCSEが前述の命令完了を検出すると,浮動小数点リネーミングレジスタFR_ERG内のレジスタに一時的に格納された処理結果が,浮動小数点SIMDレジスタFS_REG内のレジスタに格納される。
[マスク方式SIMD化]
次に,マスク方式のSIMD化する最適化について説明する。図11のオリジナルプログラム30は,DOループ内にIF文を含み,IF文の条件式が真の場合に演算命令を実行する。演算命令は,例えば加算演算の場合,第1,第2の数値をメモリからレジスタにロードし,両レジスタ内の第1,第2の数値を加算してレジスタに格納し,レジスタ内の加算結果をメモリにストアするという3つの命令文で構成される。したがって,ソースコードの加算命令は,ロード命令と加算命令とストア命令とに分解されたオブジェクトコードに変換されて,CPUにより実行される。その分解された命令を実行することで,コンピュータは,上記の加算対象の数値のロード命令を先行して実行し,ロード命令の完了を待って複数のSIMD演算器で加算演算を実行し,最後に加算結果をメモリに格納するストア命令を実行する。
そのため,一般に,コンパイラがIF文の演算命令をSIMD化する場合,IF文の条件が真か偽かにかかわらず,DOループにより連続して実行されるIF文内の演算命令を,全てSIMD演算器で演算し,最後のストア命令をIF文の条件が真の場合のみ実行し,偽の場合は実行しないように,コンパイラがプログラムを最適化する。このようなSIMD化をマスク方式SIMD化と称する。つまり,IF文の条件が偽の場合に最後のストア命令をマスクして実行させないようにする。このようなマスク方式SIMD化を行うことで,DOループの連続する演算命令を複数のSIMD演算器を利用して並列に処理し,演算速度を向上させることができる。
ただし,マスク方式SIMD化を行うと,IF文の演算命令を実行する条件が真になる真率が低い場合,演算した結果を破棄する確率が高くなり逆に効率を下げる結果になる。つまり,SIMD化による効率アップよりも無駄な演算を行う効率ダウンのほうが大きくなり,効率を低下させることがある。
図13は,マスク方式SIMD化による最適化の説明をする図である。コンピュータがライブラリプログラムを実行することで,オリジナルプログラム30内のDOループ内のIF文についてIF文の真率が50%を越えることを検出すると,最適化制御行としてマスク方式SIMD化を指示する「!ocl simd」をDOループの前に挿入することを決定する。その結果,マスク方式SIMD化の最適化制御行「!ocl simd」をDOループの前に挿入されたチューニングプログラム32が生成される。このチューニングプログラムの生成は,後述するとおり,コンピュータがツールプログラムを実行することにより行われる。
そして,コンピュータはコンパイラを実行することで,チューニングプログラム32を最適化制御行にしたがって最適化し,マスク方式SIMD化を可能にするオブジェクトコード32_OCを生成する。図13に示したオブジェクトコード32_OCは,理解を容易にするために擬似的なアセンブラ言語で記述されている。このオブジェクトコード32_OCに示されるとおり,IF文内の演算命令は,複数のロード命令loadと乗算命令MPXと加算命令addとストア命令store*に変換される。そして,ストア命令store*は,IF文の条件が真の場合にのみ実行され,偽の場合には実行されないという命令であり,通常のストア命令storeとは異なるストア命令である。通常のストア命令storeの場合は,IF文の条件が真か偽かにかかわらず指定された値をメモリに記憶する処理を行う。このように,コンパイラがソースプログラムの演算命令をオブジェクトコードに変換する際に,オブジェクトコードの演算命令群の最後のストア命令に特殊なストア命令store*を採用することで,上記のマスク方式SIMD化を可能にすることができる。
チューニングプログラム32から変換されたオブジェクトコード32_OCをプロセッサのCPUコアが実行すると,CPUコアは,DOループで繰り返されるIF文の演算命令を,IF文の条件が真か偽かにかかわらず,複数のSIMD演算器で並行して実行する。但し,IF文の条件が偽の演算命令については,CPUコアは,命令群の最後に記述されている演算結果をメモリに格納するストア命令を実行せずに演算結果を破棄する。DOループ内で繰り返されるIF文の演算命令を全てSIMD化することでSIMD化に要するオーバーヘッドを抑制することができる。一方で,IF文の条件が偽の場合に演算処理が無駄になる。しかし,IF文の条件の真率が高い場合は,演算処理が無駄になることによる効率ダウンよりも,繰り返されるIF文の演算命令を全てSIMD化して並列に演算することによる効率アップのほうが勝る。したがって,本実施の形態では,IF文の条件の真率が所定の閾値を越えていれば,マスク方式SIMD化で効率化するのが望ましい。
図14は,マスク方式SIMD化されたオブジェクトコードを実行した場合にSIMD演算器の動作例を示す図である。この例では,CPUコアが2つのSIMD演算器を有するものとする。図13のオリジナルプログラム30の変数n1がn1=10と仮定すると,DOループ内のIF文が10回繰り返される。その10回の演算命令を2つのSIMD演算器で並行に実行すると,図14に示されるとおり5回のサイクルで10回の演算命令を実行することができる。但し,各演算命令は,ロード命令と乗算命令と加算命令とストア命令の命令群からなり,最後のストア命令はIF文の条件が真の場合のみ実行され,偽の場合は実行されず演算結果は破棄される。マスク方式SIMD化でIF文の条件が真の場合のみ実行される命令の他の例として,データ転送命令などがある。データ転送命令は演算結果をメモリのあるアドレスに転送する命令である。
[リスト方式SIMD化]
次に,リスト方式SIMD化する最適化について説明する。DOループ内のIF文の演算命令をSIMD化する場合,前述のマスク方式SIMD化するのが一般的である。しかし,IF文の条件の真率が所定の閾値以下になると,マスク方式SIMD化では演算結果を廃棄する確率が高くなり,SIMD化による効率アップよりも無駄な演算を実行したことによる効率ダウンのほうが強くなる。
そこで,コンピュータはライブラリプログラムを実行することで,DOループ内のIF文の条件の真率が所定の閾値より低い場合,リスト方式SIMD化の最適化制御行を生成することを決定する。リスト方式SIMD化では,コンピュータがコンパイラを実行することで,オリジナルプログラムのDOループを,IF文の条件を満たすループ制御変数の値を配列に登録する第1のループと,その登録した配列のサイズ分だけ回転してIF文内の演算命令を実行する第2のループとを有するプログラム(オブジェクトコード)に変換する。その結果,CPUコアは,そのオブジェクトコードを実行して,第2のループ内の回転回数の演算命令をSIMD演算器で並列に実行する。第1のループでIF文の条件が真になるループ制御変数の値を事前に登録しているので,第2のループで実行する演算命令は全てIF文の条件が真の場合の演算命令である。したがって,リスト方式SIMD化によれば,IF文の条件の真率が低くても,マスク方式SIMD化の場合のように無駄になる演算はなくなり,SIMD化による効率アップが,2つのループを実行することによる効率ダウンを上回ることになる。
図15は,リスト方式SIMD化で最適化されるオブジェクトコードの例を示す図である。図15には,リスト方式SIMD化を指示する最適化制御行「!ocl simd listv」が挿入されたチューニングプログラム32と,最適化制御行「!ocl simd listv」に基づいてコンパイラにより最適化されたオブジェクトコード32_OCの例が示されている。図15のオブジェクトコード32_OCは,理解を容易にするためにバイナリコードではなく,チューニングプログラムと同じソースコードで記述されている。
リスト方式SIMD化を指示する最適化制御行が挿入されると,コンピュータはコンパイラを実行することで,チューニングプログラム32のDOループを,IF文の条件を満たすループ制御変数iの値を配列idx(j)に登録する第1のループ32_OC_1と,その登録した配列idx(j)のサイズ分だけ回転してIF文内の演算命令を実行する第2のループ32_OC_2とを有するプログラム(オブジェクトコード)32_OCに変換する。今仮に,第1のループ32_OC_1でIF文の条件p(i)>qが真になるのが,ループ制御変数iがi=1,3,5,7の場合とすると,第2のループ32_OC_2の配列idx(j)は,
idx(1)=1, idx(2)=3, idx(3)=5, idx(4)=7となるので,第2のループでの演算命令は4回繰り返されるだけになり,その演算命令の演算結果は全てストアされ,演算の無駄が発生しない。
図16は,図15のオブジェクトコード32_OCをCPUコアが実行した場合のSIMD演算器の動作例を示す図である。オブジェクトコード32_OCでは演算命令が4回繰り返されるので,2つのSIMD演算器により2サイクルで実行を完了できる。しかも,演算結果が無駄に破棄されることはない。
上記のように,IF文の演算命令を実行する条件の真率が低い場合は,リスト方式SIMD化によりオリジナルプログラムを最適化することで,条件が真の場合の演算命令だけがSIMD化されて並列演算されるので,SIMD化による効率アップが2つのDOループに分割したことによる効率ダウンを上回り,全体の効率アップにつながる。
[通常のループ構造の最適化と少回転数ループ向け最適化]
ループ構造の最適化は,上記の複数の命令を複数のSIMD演算器で並列に実行するSIMD化に加えて,ループ構造のオリジナルプログラムをアンローリング展開して繰り返し回数を減らす最適化方法と,連続する命令群をCPUコア内のパイプライン構造により並列に実行して処理サイクルを短縮するソフトウエアパイプライン化の最適化方法とが有効である。
しかし,上記のアンローリング展開やソフトウエアパイプライン化による最適化は,ループ構造の繰り返し回数が一定の回数以上でないと効率アップにならない。コンパイラが,繰り返し回数が少ないループ構造に対して,アンローリング展開を行うループや,ソフトウエアパイプライン化を行うループを有するオブジェクトコードに変換しても,大きな効率アップの効果は期待できないばかりか,逆に無駄なループを有することによるループ選択の判断工程が効率ダウンの要因になる。
そこで,本実施の形態では,図8に示したとおり,コンピュータはライブラリプログラムを実行することで,DOループ内のIF文の演算命令をSIMD化すること(S36,S37)に加えて,ループの繰り返し回数が十分に多い場合は通常の最適化を行うような最適化制御行を生成し,ループの繰り返し回数が少ない場合は少回転数のループ向けの最適化を行うような最適化制御行を生成する。
通常の最適化を行う最適化制御行が挿入されたチューニングプログラムの場合,コンパイラは,オリジナルプログラムのDOループをアンローリング展開するループと,CPUコアにおいてソフトウエアパイプライン展開するループとを有するオブジェクトコードを生成する。
一方,少回転数のループ向けの最適化を行う最適化制御行が挿入されたチューニングプログラムの場合,コンパイラは,オブジェクトコード内に,上記のアンローリング展開するループを生成せず,ソフトウエアパイプライン展開するループを生成しない。
図17は,アンローリング展開を説明する図である。図17にはチューニングプログラム32の一例が示されている。このチューニングプログラム32は,繰り返し回数がnのDOループを有する。この繰り返し回数nが十分に多い場合,コンピュータはコンパイラを実行して,チューニングプログラム32のDOループ内の1個の演算命令を8個に展開して,DOループがループ制御変数iが1からnまで8飛びで繰り返し実行されるように変更したオブジェクトコード32_OCを生成する。これにより,オブジェクトコード32_OCでは,DOループの繰り返し回転数を1/8に減じることができ,演算命令を繰り返し実行するために必要なオーバーヘッドの工数を減じることができる。また,DOループ内の演算命令を8個に増やしたことで,繰り返し回数毎に8個の演算命令を複数のSIMD演算器によりSIMD化して実行できるようになり,プログラムの実行効率を高めることができる。
但し,DOループの繰り返し回数が,少なくともアンローリング展開数(図17の例では8回)以上残っていることがアンローリング展開により効率化できる条件である。
図18は,ソフトウエアパイプライン展開を説明する図である。図18のチューニングプログラム30の例は,変数bと変数cとを加算して変数aに代入する演算命令をn回繰り返すDOループである。コンパイラは,このような演算命令を,変数bをメモリからロードする命令と,変数cをメモリからロードする命令と,ロードした変数b,cを加算する命令と,加算結果aをメモリにストアする命令とに分解し,オブジェクトコードに変換する。
そこで,オブジェクトコードを実行するプロセッサマシンモデルとして,ロード命令loadのレイテンシが3サイクル,加算命令addのレイテンシが3サイクル,ストア命令storeのレイテンシが1サイクル,ロード命令とストア命令用の演算器の数が3個,演算器に予約可能な命令の数であるコミット数が4,但しロード命令とストア命令は3命令までしか予約できないと仮定する。
図18中のパイプライン展開例40,41は,縦方向が時間軸,横方向が命令を実行する演算器の数に対応する。
チューニングプログラム30の演算命令を1つずつ順番に実行すると,CPUコア内のパイプラインが実行する命令は,最適化前のパイプライン展開例40に示すとおりであり,一つの演算命令を実行するのに7サイクルを要する。すなわち,CPUコアは,一対のロード命令を並列に実行し,ロード命令のレイテンシ3サイクル後に加算命令を実行し,加算命令のレイテンシ3サイクル後にストア命令を実行する。
それに対して,最適化によりソフトウエアパイプライン展開する例41の場合は,CPUコア内のパイプラインが,最初にCPUコアの2つの演算器が一対のロード命令loadを連続して実行し,最初から3サイクル後に最初の一対のロード命令により取得したデータb,cを加算する加算命令addを実行し,その後加算命令addを連続して実行する。さらに,最初から6サイクル後に最初の加算命令により求めたデータをストアするストア命令storeを実行し,その後ストア命令storeを連続して実行する。その結果,パイプラインは9回の演算命令を15サイクルで完了する。例41には,実線の3つの命令群と,破線の3つの命令群と,一点鎖線の3つの命令群とが区別して示されている。
特に,ロード命令とストア命令を実行する演算器の個数が3個であり,ロード命令と加算命令のレイテンシが3サイクルであるので,DOループの繰り返し回数が9回転以上になると,図18中に太枠で示したように全演算器が演算待ちをすることなく命令を実行する最も効率化された状況を生み出すことができる。したがって,DOループの繰り返し回数が9回転以上の場合に,ソフトウエアパイプライン展開を行うことで効率化を最大限にアップすることができる。
図19は,本実施の形態におけるDOループのオリジナルプログラムの最適化制御行の例を示す図である。前提として,CPUコアはSIMD演算器が2つある2SIMD構成であり,アンローリング展開の展開数が8であり,ソフトウエアパイプライン展開の効果は最低でも9回の命令を展開した場合に最大の効率化を図ることができるものとする。このような前提の場合,2SIMD化と展開数8のアンローリング展開と最低数9のソフトウエアパイプライン展開を行うことで効率化アップの効果が期待できる条件は,DOループの繰り返し回数が2×8×9=144回以上であることである。また,2SIMD化と展開数8のアンローリング展開とを行うことで効率化アップの効果が期待できる条件は,DOループの繰り返し回数が2×8=16回以上であることである。さらに,2SIMD化のみを行うことで効率化アップの効果が期待できる条件は,DOループの繰り返し回数が2回以上であることである。
[ループ繰り返し回数が大の場合]
そこで,図19の最適化制御行の例では,オリジナルプログラム31は,図10(B)に示したものと同じであり,DOループ内にIF文が存在せず繰り返し回数がn回のループを有するプログラムである。コンピュータがライブラリプログラムを実行することで,DOループの実行時情報を取得し,実行時情報に含まれるDOループの繰り返し回数が大(例えばnが144回以上)の場合は,最適化制御行として何も挿入しないチューニングプログラム34_1を生成することを決定する。このチューニングプログラム34_1は,オリジナルプログラム31に何も最適化制御行が挿入されていない。この場合は,コンピュータがコンパイラを実行して,チューニングプログラム34_1を次のような複数のループを有するオブジェクトコードに変換する。
図20は,DOループの繰り返し回数が大の場合にDOループを最適化したオブジェクトコードのフローチャート図である。図20の最適化されたオブジェクトコードは,コンピュータがコンパイラを実行して,図19のチューニングプログラム34_1のループを最適化して生成したオブジェクトコードである。
この最適化されたオブジェクトコードによるプログラムは,ループ内プログラムを実行開始し(S61),ループの残り繰り返し回数が大(例えばnが144回以上),中(例えばnが16以上,144未満),少(nが2以上,16未満),微少(nが2未満)に応じて(S62),4つのループの最適化処理(S63−S66)のいずれかを実行してループ内プログラムを実行する。
最適化されたオブジェクトコードのプログラムは,ループの残り繰り返し回数nが大の場合(S62でnが144回以上の場合),2SIMD化とアンローリング展開とソフトウエアパイプライン展開を行って144回分の演算命令を実行するループS63を実行する。ループS63を通過すると,ループの残り繰り返し回数nは144回減じられる(S67)。
最適化されたオブジェクトコードのプログラムは,最適化ループS63を所定回数通過して演算命令を実行した後,ループの残り回数nが中になると(S62でnが144回未満で16回以上の場合),2SIMD化とアンローリング展開とを行って16回分の演算命令を実行するループS64を実行する。ループS64を通過すると,ループの残り回数nは16回減じられる(S67)。
最適化されたオブジェクトコードのプログラムは,最適化ループS64を所定回数通過して演算命令を実行した後,ループの残り回数nが少になると(S62でnが16回未満で2回以上の場合),2SIMD化を行って2回分の演算命令を実行するループS65を実行する。ループS65を通過すると,ループの残り回数nは2回減じられる(S67)。
最適化されたオブジェクトコードのプログラムは,最適化ループS65を所定回数通過して演算命令を実行した後,ループの残り回数nが微少になると(S62でnが2回未満),SIMD化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループS66を,残り回数だけ演算命令を実行する。そして,残り繰り返し回数がゼロになると(S68のYES),最適化されたオブジェクトコードのプログラムはループの実行を終了する。
[ループ繰り返し回数が中の場合]
図19に戻り,コンピュータがライブラリプログラムを実行することで,DOループの実行時情報を取得し,実行時情報に含まれるDOループの繰り返し回数が中(例えばnが144回未満,16回以上)の場合は,最適化制御行「!loc simd, unroll, noswp」を挿入したチューニングプログラム34_2を生成することを決定する。このチューニングプログラム34_2の場合,コンピュータがコンパイラを実行して,チューニングプログラム34_2を次のような複数のループを有するオブジェクトコードに変換する。
図21は,DOループの繰り返し回数が中(nが144回未満,16回以上)の場合にDOループを最適化したオブジェクトコードのフローチャート図である。図21の最適化されたオブジェクトコードのプログラムは,コンピュータがコンパイラを実行して,図19のチューニングプログラム34_2を最適化して生成するオブジェクトコードのプログラムである。
図21の最適化されたオブジェクトコードのプログラムは,図20と異なり,ループの残り繰り返し回数が大の場合に通過するループS63を有していない。理由は,DOループの繰り返し回数が中(nが144回未満,16回以上)であるので,ループS63は無用なループになるからである。
図21の最適化されたオブジェクトコードのプログラムは,ループ内プログラムを実行開始し(S61),ループの残り繰り返し回数が中(例えばnが16以上,144未満),少(nが2以上,16未満),微少(nが2未満)に応じて(S62),3つのループの最適化処理を行ってループ内プログラムを実行する(S64−S66)。
最適化されたオブジェクトコードのプログラムは,ループの残り繰り返し回数nが中の場合(S62でnが144回未満で16回以上の場合),2SIMD化とアンローリング展開とを行って16回分の演算命令を実行するループS64を実行する。ループS64を通過すると,ループの残り回数nは16回減じられる(S67)。
最適化されたオブジェクトコードのプログラムは,最適化ループS64を所定回数通過して演算命令を実行した後,ループの残り回数nが少になると(S62でnが16回未満で2回以上の場合),2SIMD化を行って2回分の演算命令を実行するループS65を実行する。ループS65を通過すると,ループの残り回数nは2回減じられる(S67)。
最適化されたオブジェクトコードのプログラムは,最適化ループS65を所定回数通過して演算命令を実行した後,ループの残り回数nが微少になると(S62でnが2回未満),SIMD化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループS66を,残り回数だけ実行して残り回数の演算命令を実行する。そして,残り繰り返し回数がゼロになると(S68のYES),最適化されたオブジェクトコードのプログラムはループの実行を終了する。
[ループ繰り返し回数が少の場合]
図19に戻り,コンピュータがライブラリプログラムを実行することで,DOループの実行時情報を取得し,実行時情報に含まれるDOループの繰り返し回数が少(例えばnが16回未満,2回以上)の場合は,最適化制御行「!loc simd, nounroll, noswp」を挿入したチューニングプログラム34_3を生成することを決定する。このチューニングプログラム34_3の場合,コンピュータがコンパイラを実行して,チューニングプログラム34_3を次のような複数のループを有するオブジェクトコードに変換する。
図22は,DOループの繰り返し回数が少(nが15回未満,2回以上)の場合にDOループを最適化したオブジェクトコードのフローチャート図である。図22の最適化されたプログラムは,コンピュータがコンパイラを実行することで,図19のチューニングプログラム34_3を最適化して生成するオブジェクトコードのプログラムである。
図22の最適化されたオブジェクトコードのプログラムは,図20と異なり,ループの残り繰り返し回数が大の場合に通過するループS63と,中の場合に通過するループS64とを有していない。理由は,DOループの繰り返し回数が少(nが16回未満,2回以上)であるので,ループS63,S64は無用なループになるからである。
図22の最適化されたオブジェクトコードのプログラムは,ループ内プログラムを実行開始し(S61),ループの残り繰り返し回数が少(nが2以上,16未満),微少(nが2未満)に応じて(S62),3つのループの最適化処理を行ってループ内プログラムを実行する(S65−S66)。
最適化されたオブジェクトコードのプログラムは,ループの残り繰り返し回数nが少の場合(S62でnが16回未満で2回以上の場合),2SIMD化を行って2回分の演算命令を実行するループS65を実行する。ループS65を通過すると,ループの残り回数nは2回減じられる(S67)。
最適化されたオブジェクトコードのプログラムは,最適化ループS65を所定回数通過して演算命令を実行した後,ループの残り回数nが微少になると(S62でnが2回未満),SIMD化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループS66を,残り回数だけ実行して残り回数の演算命令を実行する。そして,残り繰り返し回数がゼロになると(S68のYES),最適化されたプログラムはループの実行を終了する。
[ループ繰り返し回数が微少の場合]
図19に戻り,コンピュータがライブラリプログラムを実行することで,DOループの実行時情報を取得し,実行時情報に含まれるDOループの繰り返し回数が微少(例えばnが2回未満)の場合は,最適化制御行「!loc nosimd, nounroll, noswp」を挿入したチューニングプログラム34_4を生成することを決定する。このチューニングプログラム34_4の場合,コンピュータがコンパイラを実行して,チューニングプログラム34_4を次のような複数のループを有するオブジェクトコードに変換する。
図23は,DOループの繰り返し回数が少(nが15回未満,2回以上)の場合にDOループを最適化したオブジェクトコードのフローチャート図である。図22の最適化されたプログラムは,図19のチューニングプログラム34_3をコンパイラが最適化することで生成するオブジェクトコードのプログラムである。
図22の最適化されたオブジェクトコードのプログラムは,図20と異なり,ループの残り繰り返し回数が大の場合に通過するループS63と,中の場合に通過するループS64とを有していない。理由は,DOループの繰り返し回数が少(nが16回未満,2回以上)であるので,ループS63,S64は無用なループになるからである。
図22の最適化されたオブジェクトコードのプログラムは,ループ内プログラムを実行開始し(S61),ループの繰り返し回数による判断を行うことなく,SIMD化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループS66を,残り回数だけ実行して残り回数の演算命令を実行する。そして,残り繰り返し回数がゼロになると(S68のYES),最適化されたプログラムはループの実行を終了する。
図20〜23の最適化されたオブジェクトコードのプログラムのメリットとデメリットを説明する。ループの繰り返し回数が大(144回以上)の場合は,図20の最適化されたプログラムを実行すると,全てのループS63−S66が実行され,ソフトウエアパイプライン展開やアンローリング展開により複数の演算命令を効率的に実行する。但し,繰り返し回数の判定工程S62による処理のオーバーヘッドが効率化を阻害する要因になる。しかし,ループS63を実行することによる効率化アップが,複雑な判定工程S62による効率化ダウンに勝り,全体としては効率化アップになる。
ループの繰り返し回数が中(144回未満,16回以上)の場合,図20の最適化されたプログラムを実行すると,ループS63は実行されないため,毎回実行される繰り返し回数の判定工程S62による処理のオーバーヘッドが効率化阻害要因になる。ループの繰り返し回数が中の場合は,図21の最適化されたプログラムのように,決して実行されないループS63を削除することで,繰り返し回数の判定工程S62がシンプルになりオーバーヘッドによる効率化ダウンの程度を緩和することができる。
ループの繰り返し回数が少(16回未満,2回以上)の場合,図20の最適化されたプログラムを実行すると,ループS63,S64は実行されないため,毎回実行される繰り返し回数の判定工程S62による処理のオーバーヘッドの効率化阻害要因が問題になる。図21の最適化されたプログラムの場合も同様の問題を有する。そこで,ループの繰り返し回数が少の場合は,図22の最適化されたプログラムのように,決して実行されないループS63,S64を削除することで,繰り返し回数の判定工程S62がシンプルになりオーバーヘッドによる効率化ダウンの程度を緩和することができる。
ループの繰り返し回数が微少(2回未満)の場合,図23の最適化されたプログラムのようにループS66だけにすることで,繰り返し回数の判定工程S62もなくなり効率化ダウンの要因をなくすことができる。
以上の通り,繰り返し回数が非常に多い通常のDOループの場合は,図20の最適化されたオブジェクトコードのプログラムが効率化アップに向いている。しかし,繰り返し回数が少ないDOループの場合は,その繰り返し回数に見合った図21,図22,図23のいずれかの最適化されたオブジェクトコードのプログラムを選択することで,最大限の効率化アップを期待できる。
図3に戻り,コンピュータがライブラリプログラムを実行することで,最適化制御行を生成し(S14),最適化制御行データ22を出力する(S15)。
図24は,最適化制御行データの一例を示す図である。最適化制御行データ22は,最適化制御行の情報と,それを挿入する対象のプログラム名,関数名またはサブルーチン名,行番号とを有する。図24には,最適化制御行の情報として,マスク方式SIMD化の最適化制御行「!ocl simd」と,繰り返し回数が少のループ用の最適化制御行「!ocl simd, nounroll, noswp」と,リスト方式SIMD化の最適化制御行「!ocl simd_listv」の情報を有している。
そして,図3に示されるとおり,コンピュータがツールプログラムを実行することで,最適化制御行データ22に基づいて,オリジナルプログラム30に最適化制御行を挿入してチューニングプログラム23を生成する。
さらに,コンピュータがコンパイラを実行することで,チューニングプログラム23について挿入されている最適化制御行に基づき,コンパイラが有している最適化を行って,コンピュータが実行可能なオブジェクトコードに変換する。コンピュータが,この最適化制御行に基づいて最適化されたオブジェクトコードを実行することで,オリジナルプログラムの処理が高い効率で実行される。
以上説明したとおり,本実施の形態におけるプログラムの最適化方法によれば,オリジナルプログラムを実行した際に収集したプロファイル情報から,演算待ち時間が長いというボトルネックが検出された場合,ループ内のIF文の演算命令に対してIF文の真率に応じた最適なSIMD化を可能にすることで,演算待ち時間を短縮することができる。さらに,本実施の形態におけるプログラム最適化方法によれば,演算待ち時間が長いというボトルネックが検出された場合,ループの繰り返し回数に応じて最適化を阻害する要因である判定処理によるオーバーヘッドを抑制した最適なオブジェクトコードのプログラムに変換するので,その最適化されたオブジェクトコードを実行した時の判定処理が要因の演算待ち時間を短くすることができる。
以上の実施の形態をまとめると,次の付記のとおりである。
(付記1)
演算処理装置が,
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し,
前記プロファイル情報に基づいて演算待ち時間を算出し,
前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理を有するプログラム最適化方法。
(付記2)
前記SIMD化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する処理では,前記IF文の命令を実行する条件が真になる真率が第3の閾値を超えている場合は,マスク方式SIMD化制御行を挿入し,前記真率が前記第3の閾値以下の場合は,リスト方式SIMD化制御行を挿入し,
前記マスク方式SIMD化制御行が挿入されている場合は,前記IF文の条件にかかわらず前記IF文の命令を順次SIMD演算器で並列に実行し前記IF文の条件が真でない場合の命令実行結果を破棄するように,コンパイラが前記チューニングプログラムをオブジェクトコードに変換し,
前記リスト方式SIMD化制御行が挿入されている場合は,前記コンパイラが,前記ループを,前記IF文の条件を満たすループ制御変数の値を配列に登録する第1のループと,前記配列のサイズだけ回転して前記IF文の命令を実行する第2のループとに変換する,付記1に記載のプログラム最適化方法。
(付記3)
更に,
前記演算待ち時間が第1の閾値より長い場合,前記ループの繰り返し回数が第4の閾値以下の場合は,少ない回転向け最適化制御行を挿入し,前記ループの繰り返し回数が前記第4の閾値を超えている場合は,多い回転向け最適化制御行を挿入する処理を有し,
前記少ない回転向け最適化制御行が挿入されている場合は,前記ループ内の命令をCPUコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成しないように,前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換し,
前記多い回転向け最適化制御行が挿入されている場合は,前記ループ内の命令をCPUコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成するように,前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換する付記1または2に記載のプログラム最適化方法。
(付記4)
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し,
前記プロファイル情報に基づいて演算待ち時間を算出し,
前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理をコンピュータに実行させるプログラム最適化プログラム。
(付記5)
前記SIMD化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する処理では,前記IF文の命令を実行する条件が真になる真率が第3の閾値を超えている場合は,マスク方式SIMD化制御行を挿入し,前記真率が前記第3の閾値以下の場合は,リスト方式SIMD化制御行を挿入し,
前記マスク方式SIMD化制御行が挿入されている場合は,前記IF文の条件にかかわらず前記IF文の命令を順次SIMD演算器で並列に実行し前記IF文の条件が真でない場合の命令実行結果を破棄するように,コンパイラが前記チューニングプログラムをオブジェクトコードに変換し,
前記リスト方式SIMD化制御行が挿入されている場合は,前記コンパイラが,前記ループを,前記IF文の条件を満たすループ制御変数の値を配列に登録する第1のループと,前記配列のサイズだけ回転して前記IF文の命令を実行する第2のループとに変換する,付記4に記載のプログラム最適化プログラム。
(付記6)
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集する手段と,
前記プロファイル情報に基づいて演算待ち時間を算出する手段と,
前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する手段と
を有するプログラム最適化装置。
(付記7)
前記SIMD化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する手段は,前記IF文の命令を実行する条件が真になる真率が第3の閾値を超えている場合は,マスク方式SIMD化制御行を挿入し,前記真率が前記第3の閾値以下の場合は,リスト方式SIMD化制御行を挿入し,
前記マスク方式SIMD化制御行が挿入されている場合は,前記IF文の条件にかかわらず前記IF文の命令を順次SIMD演算器で並列に実行し前記IF文の条件が真でない場合の命令実行結果を破棄するように,コンパイラが前記チューニングプログラムをオブジェクトコードに変換し,
前記リスト方式SIMD化制御行が挿入されている場合は,前記コンパイラが,前記ループを,前記IF文の条件を満たすループ制御変数の値を配列に登録する第1のループと,前記配列のサイズだけ回転して前記IF文の命令を実行する第2のループとに変換する,付記1に記載のプログラム最適化装置。
16:最適化プログラム(コンパイラ,ライブラリ,ツール)
20:オリジナルプログラム
21:オブジェクトコード,実行可能バイナリコード
22:最適化制御行データ
23:チューニングプログラム

Claims (5)

  1. 演算処理装置が,
    最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し,
    前記プロファイル情報に基づいて演算待ち時間を算出し,
    前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
    処理を有するプログラム最適化方法。
  2. 前記SIMD化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する処理では,前記IF文の命令を実行する条件が真になる真率が第3の閾値を超えている場合は,マスク方式SIMD化制御行を挿入し,前記真率が前記第3の閾値以下の場合は,リスト方式SIMD化制御行を挿入し,
    前記マスク方式SIMD化制御行が挿入されている場合は,前記IF文の条件にかかわらず前記IF文の命令を順次SIMD演算器で並列に実行し前記IF文の条件が真でない場合の命令実行結果を破棄するように,コンパイラが前記チューニングプログラムをオブジェクトコードに変換し,
    前記リスト方式SIMD化制御行が挿入されている場合は,前記コンパイラが,前記ループを,前記IF文の条件を満たすループ制御変数の値を配列に登録する第1のループと,前記配列のサイズだけ回転して前記IF文の命令を実行する第2のループとに変換する,請求項1に記載のプログラム最適化方法。
  3. 更に,
    前記演算待ち時間が第1の閾値より長い場合,前記ループの繰り返し回数が第4の閾値以下の場合は,少ない回転向け最適化制御行を挿入し,前記ループの繰り返し回数が前記第4の閾値を超えている場合は,多い回転向け最適化制御行を挿入する処理を有し,
    前記少ない回転向け最適化制御行が挿入されている場合は,前記ループ内の命令をCPUコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成しないように,前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換し,
    前記多い回転向け最適化制御行が挿入されている場合は,前記ループ内の命令をCPUコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成するように,前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換する請求項に記載のプログラム最適化方法。
  4. 最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し,
    前記プロファイル情報に基づいて演算待ち時間を算出し,
    前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
    処理をコンピュータに実行させるプログラム最適化プログラム。
  5. 最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集する手段と,
    前記プロファイル情報に基づいて演算待ち時間を算出する手段と,
    前記演算待ち時間が第1の閾値より長い場合,前記オリジナルプログラムのループ内のSIMD命令率が第2の閾値より低い場合に,前記ループ内のIF文の命令をSIMD化するSIMD化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する手段と
    を有するプログラム最適化装置。
JP2014164671A 2014-08-13 2014-08-13 プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置 Active JP6331865B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2014164671A JP6331865B2 (ja) 2014-08-13 2014-08-13 プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置
US14/799,625 US9760352B2 (en) 2014-08-13 2015-07-15 Program optimization method, program optimization program, and program optimization apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014164671A JP6331865B2 (ja) 2014-08-13 2014-08-13 プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置

Publications (2)

Publication Number Publication Date
JP2016040691A JP2016040691A (ja) 2016-03-24
JP6331865B2 true JP6331865B2 (ja) 2018-05-30

Family

ID=55302229

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014164671A Active JP6331865B2 (ja) 2014-08-13 2014-08-13 プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置

Country Status (2)

Country Link
US (1) US9760352B2 (ja)
JP (1) JP6331865B2 (ja)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9229524B2 (en) * 2012-06-27 2016-01-05 Intel Corporation Performing local power gating in a processor
JP6492943B2 (ja) * 2015-05-07 2019-04-03 富士通株式会社 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム
US9612810B2 (en) * 2015-08-25 2017-04-04 International Business Machines Corporation Profile-based per-device code optimization
US10191792B2 (en) * 2016-03-04 2019-01-29 International Business Machines Corporation Application abnormality detection
US10705836B2 (en) 2018-04-20 2020-07-07 International Business Machines Corporation Mapping components of a non-distributed environment to a distributed environment
JP7263994B2 (ja) 2019-09-17 2023-04-25 富士通株式会社 情報処理方法及び最適化プログラム
US11288046B2 (en) * 2019-10-30 2022-03-29 International Business Machines Corporation Methods and systems for program optimization utilizing intelligent space exploration
JP2021093012A (ja) * 2019-12-11 2021-06-17 富士通株式会社 コンパイルプログラム、および情報処理装置
CN112988194B (zh) * 2021-03-29 2023-12-15 北京市商汤科技开发有限公司 基于设备信息的程序优化方法、装置、电子设备及存储介质
CN114465820B (zh) * 2022-03-31 2024-07-30 京东方科技集团股份有限公司 数据加密方法、数据加密设备、电子设备、程序及介质
WO2024181090A1 (ja) * 2023-02-27 2024-09-06 日本電気株式会社 多重ループ変換装置、情報処理方法および情報処理プログラム

Family Cites Families (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS63632A (ja) 1986-06-19 1988-01-05 Fujitsu Ltd 原始プログラムの最適化処理方式
JPS6353646A (ja) * 1986-08-22 1988-03-07 Nec Corp 最適目的プログラム生成方式
JPH04274519A (ja) * 1991-02-28 1992-09-30 Nec Corp プログラム高速化自動実行方式
US5857088A (en) * 1991-10-24 1999-01-05 Intel Corporation System for configuring memory space for storing single decoder table, reconfiguring same space for storing plurality of decoder tables, and selecting one configuration based on encoding scheme
US5522074A (en) * 1992-12-14 1996-05-28 Nec Corporation Vectorization system for vectorizing loop containing condition induction variables
US5579520A (en) * 1994-05-13 1996-11-26 Borland International, Inc. System and methods for optimizing compiled code according to code object participation in program activities
JPH08263298A (ja) 1995-03-20 1996-10-11 Fujitsu Ltd コンパイラ装置
JP3683281B2 (ja) * 1996-10-18 2005-08-17 富士通株式会社 メモリアクセスの高速化処理装置および方法
US6134710A (en) 1998-06-26 2000-10-17 International Business Machines Corp. Adaptive method and system to minimize the effect of long cache misses
JP4077252B2 (ja) * 2002-06-28 2008-04-16 富士通株式会社 コンパイラプログラムおよびコンパイル処理方法
US7107585B2 (en) * 2002-07-29 2006-09-12 Arm Limited Compilation of application code in a data processing apparatus
US7496908B2 (en) * 2004-01-14 2009-02-24 International Business Machines Corporation Method and apparatus for optimizing code execution using annotated trace information having performance indicator and counter information
US7818720B2 (en) * 2006-01-24 2010-10-19 Freescale Semiconductor, Inc. System and method for control logic code reordering based on stochastic execution time information
US8739143B2 (en) * 2007-01-31 2014-05-27 Hewlett-Packard Development Company, L.P. Profiling metrics for computer programs
US8423987B2 (en) * 2007-01-30 2013-04-16 International Business Machines Corporation Routing performance analysis and optimization within a massively parallel computer
JP5326708B2 (ja) 2009-03-18 2013-10-30 富士通株式会社 演算処理装置および演算処理装置の制御方法
US8387036B2 (en) * 2010-01-27 2013-02-26 Oracle America, Inc. Method and system for execution profiling using loop count variance
US8495607B2 (en) * 2010-03-01 2013-07-23 International Business Machines Corporation Performing aggressive code optimization with an ability to rollback changes made by the aggressive optimizations
US9128747B2 (en) * 2012-03-20 2015-09-08 Infosys Limited Methods and systems for optimizing the performance of software applications at runtime
JP5846006B2 (ja) * 2012-03-29 2016-01-20 富士通株式会社 プログラム、コード生成方法および情報処理装置
CN104603755B (zh) * 2012-09-28 2017-11-14 英特尔公司 循环向量化方法和设备
US9052888B2 (en) * 2013-02-21 2015-06-09 International Business Machines Corporation Vectorization in an optimizing compiler
EP2965194A4 (en) * 2013-03-05 2016-11-30 Intel Corp ANALYSIS OF POTENTIAL ADVANTAGES OF VECTORIZATION
US9063754B2 (en) * 2013-03-15 2015-06-23 Cognitive Electronics, Inc. Profiling and optimization of program code/application
US9720667B2 (en) * 2014-03-21 2017-08-01 Intel Corporation Automatic loop vectorization using hardware transactional memory

Also Published As

Publication number Publication date
US9760352B2 (en) 2017-09-12
US20160048380A1 (en) 2016-02-18
JP2016040691A (ja) 2016-03-24

Similar Documents

Publication Publication Date Title
JP6331865B2 (ja) プログラム最適化方法,プログラム最適化プログラム及びプログラム最適化装置
JP5356531B2 (ja) シーケンス検出又は命令に関連付けられた情報に基づいた命令の最適化性能
Franklin et al. ARB: A hardware mechanism for dynamic reordering of memory references
Franklin et al. The expandable split window paradigm for exploiting fine-grain parallelsim
US6412105B1 (en) Computer method and apparatus for compilation of multi-way decisions
JP3311462B2 (ja) コンパイル処理装置
Marcuello et al. Thread-spawning schemes for speculative multithreading
US5996060A (en) System and method for concurrent processing
CN101965554B (zh) 选择性地提交已执行指令的结果的系统和方法
US6754893B2 (en) Method for collapsing the prolog and epilog of software pipelined loops
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
US9395986B2 (en) Compiling method and compiling apparatus
US9483244B2 (en) Compiling method and compiling device
TWI740851B (zh) 用於向量負載指示之資料處理設備、方法及電腦程式
Packirisamy et al. Exploring speculative parallelism in SPEC2006
Carr et al. Unroll-and-jam using uniformly generated sets
US6516462B1 (en) Cache miss saving for speculation load operation
Michaud et al. An exploration of instruction fetch requirement in out-of-order superscalar processors
Sazeides Modeling value speculation
Borin et al. Lar-cc: Large atomic regions with conditional commits
CN116168765B (zh) 基于改进strobemer的基因序列生成方法及系统
JP3276479B2 (ja) コンパイル方式
August Hyperblock performance optimizations for ILP processors
JPH10105412A (ja) 主記憶の効率的アクセスを実現するオブジェクト生成方法
Ootsu et al. Loop performance improvement for min-cut program decomposition method

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170511

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180223

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180313

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180320

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20180403

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20180416

R150 Certificate of patent or registration of utility model

Ref document number: 6331865

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150