(57)【特許請求の範囲】
【請求項１】
演算処理装置が，
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し，
前記プロファイル情報に基づいて演算待ち時間を算出し，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理を有するプログラム最適化方法。
【請求項２】
前記ＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する処理では，前記ＩＦ文の命令を実行する条件が真になる真率が第３の閾値を超えている場合は，マスク方式ＳＩＭＤ化制御行を挿入し，前記真率が前記第３の閾値以下の場合は，リスト方式ＳＩＭＤ化制御行を挿入し，
前記マスク方式ＳＩＭＤ化制御行が挿入されている場合は，前記ＩＦ文の条件にかかわらず前記ＩＦ文の命令を順次ＳＩＭＤ演算器で並列に実行し前記ＩＦ文の条件が真でない場合の命令実行結果を破棄するように，コンパイラが前記チューニングプログラムをオブジェクトコードに変換し，
前記リスト方式ＳＩＭＤ化制御行が挿入されている場合は，前記コンパイラが，前記ループを，前記ＩＦ文の条件を満たすループ制御変数の値を配列に登録する第１のループと，前記配列のサイズだけ回転して前記ＩＦ文の命令を実行する第２のループとに変換する，請求項１に記載のプログラム最適化方法。
【請求項３】
更に，
前記演算待ち時間が第１の閾値より長い場合，前記ループの繰り返し回数が第４の閾値以下の場合は，少ない回転向け最適化制御行を挿入し，前記ループの繰り返し回数が前記第４の閾値を超えている場合は，多い回転向け最適化制御行を挿入する処理を有し，
前記少ない回転向け最適化制御行が挿入されている場合は，前記ループ内の命令をＣＰＵコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成しないように，前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換し，
前記多い回転向け最適化制御行が挿入されている場合は，前記ループ内の命令をＣＰＵコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成するように，前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換する請求項２に記載のプログラム最適化方法。
【請求項４】
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し，
前記プロファイル情報に基づいて演算待ち時間を算出し，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理をコンピュータに実行させるプログラム最適化プログラム。
【請求項５】
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集する手段と，
前記プロファイル情報に基づいて演算待ち時間を算出する手段と，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する手段と
を有するプログラム最適化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，プログラム最適化方法，プログラム最適化プログラム及びプログラム最適化装置に関する。
【背景技術】
【０００２】
コンパイラは，オリジナルのプログラムを解析して，予め決められた最適化を行い，コンピュータが実行可能なオブジェクトコードに変換する。しかし，コンパイラはあらかじめ決められた条件の下でそれぞれの最適化処理を行うだけであり，様々なソースプログラムに対して個別に最も理想的な最適化を行うことは容易ではない。
【０００３】
プログラムの最適化については，例えば，以下の特許文献１〜４に記載されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０００−３５８９４号公報
【特許文献２】特開昭６３−６３２号公報
【特許文献３】特開２０１０−２１８３６７号公報
【特許文献４】特開平０８−２６３２９８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
プログラムの最適化は，プログラムのアルゴリズムを改良することによる最適化だけでなく，プログラムを実行するコンピュータのハードウエアを考慮した最適化も必要である。しかしながら，プログラムの最適化は，対象のプログラムの構造にかかわらず一律に行われるのが一般的である。そのため，プログラムの構造によっては，またはプログラムを実行するコンピュータのハードウエアの構成によっては，一律に適用される最適化が必ずしも最適な結果をもたらすとはかぎらず，かえって効率を低下させる場合もある。
【０００６】
そこで，実施の形態の第１の側面の目的は，有効な最適化を行うプログラムの最適化方法。プログラム最適化プログラム及びプログラム最適化装置を提供することにある。
【課題を解決するための手段】
【０００７】
実施の形態の第１の側面は，演算処理装置が，最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し，
前記プロファイル情報に基づいて演算待ち時間を算出し，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理を有するプログラム最適化方法である。
【発明の効果】
【０００８】
第１の側面によれば，プログラムに対して有効な最適化を行うことができる。
【図面の簡単な説明】
【０００９】
【図１】コンパイラの処理を示すフローチャート図である。
【図２】本実施の形態におけるプログラム最適化装置の構成を示す図である。
【図３】最適化処理のフローチャート図である。
【図４】ソースコードで記述した実行可能バイナリコードの一例を示す図である。
【図５】図３のボトルネック解析S12のフローチャート図である。
【図６】ボトルネックの計算例を示す図である。
【図７】ボトルネックの計算例を示す図である。
【図８】図３の最適化の解析工程S13のフローチャート図である。
【図９】ＳＩＭＤ命令率の算出処理例を示す図である。
【図１０】ループ内にＩＦ文があるプログラム例とＩＦ文がないプログラム例とを示す図である
【図１１】工程Ｓ３６，Ｓ３７で挿入されるマスク方式ＳＩＭＤ化とリスト方式ＳＩＭＤ化の最適化制御行を示す図である。
【図１２】ＣＰＵコア（演算処理部）の構成例を示す図である。
【図１３】マスク方式ＳＩＭＤ化による最適化の説明をする図である。
【図１４】マスク方式ＳＩＭＤ化されたオブジェクトコードを実行した場合にＳＩＭＤ演算器の動作例を示す図である。
【図１５】リスト方式ＳＩＭＤ化で最適化されるオブジェクトコードの例を示す図である。
【図１６】図１５のオブジェクトコード３２＿ＯＣをＣＰＵコアが実行した場合のＳＩＭＤ演算器の動作例を示す図である。
【図１７】アンローリング展開を説明する図である。
【図１８】ソフトウエアパイプライン展開を説明する図である。
【図１９】本実施の形態におけるＤＯループのオリジナルプログラムの最適化制御行の例を示す図である。
【図２０】ＤＯループの繰り返し回数が大の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。
【図２１】ＤＯループの繰り返し回数が中（ｎが１４４回未満，１６回以上）の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。
【図２２】ＤＯループの繰り返し回数が少（ｎが１５回未満，２回以上）の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。
【図２３】ＤＯループの繰り返し回数が少（ｎが１５回未満，２回以上）の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。
【図２４】最適化制御行データの一例を示す図である。
【発明を実施するための形態】
【００１０】
図１は，コンパイラの処理を示すフローチャート図である。コンパイラは，オリジナルのソースコードのプログラムを入力し（Ｓ１０），オリジナルプログラムの構文を解析し（Ｓ１１），解析結果に基づいて最適化したオブジェクトコードのプログラムに変換する（Ｓ１２）。そして，コンパイラは，変換したオブジェクトコードのプログラムを出力する（Ｓ１３）。
【００１１】
コンパイラによる最適化には，変換後のプログラムを実行するコンピュータのハードウエアに基づくものがある。たとえば，コンピュータ等の情報処理装置が有するＣＰＵ（Central Processing Unit，演算処理装置）のＣＰＵコアは，それぞれ，内部に演算器を複数有し，１つの命令を用いて複数のデータに対する同じ処理を並列して実行するＳＩＭＤ（Single Instruction Multiple Data）演算を行う。また，ＣＰＵコアは，パイプライン構成を有し，連続する命令をパイプラインに展開して複数の命令を並列に処理する。このようなＳＩＭＤ演算器を有効に利用したり，ソフトウエアをパイプライン展開する機能を利用したりすることで，プログラム実行時の効率を高めることができる。
【００１２】
また，コンパイラは，オリジナルプログラムのループ内の命令をループ内で複数（ｎ個）に展開して，ループの回数をｎ分の１に減らすアンローリング展開を行う。オリジナルプログラムをアンローリング展開することで，ループの回数に応じて増大する処理のオーバーヘッドを減らし，ＳＩＭＤ化を容易にして，プログラムの実行効率を高めることができる。
【００１３】
本実施の形態では，上記のＳＩＭＤ演算器の利用や，ソフトウエアのパイプライン展開やアンローリング展開を利用して，オリジナルプログラムを最適化しようとするものである。
【００１４】
最初に，本明細書内のいくつかのキーワードについて簡単に説明する。オリジナルプログラムは，最適化対象のプログラムである。チューニングプログラムは，オリジナルプログラムに最適化制御行を挿入したプログラムである。コンパイラはチューニングプログラムの最適化制御行に基づいてそのプログラムに最も適した最適化処理を行ってオブジェクトコードのプログラムに変換する。
【００１５】
プロファイル情報とは，オリジナルプログラムを実行することで得られる様々な情報であり，ハードウエアモニタ情報と実行時情報とを有する。ハードウエアモニタ情報は，プログラムの実行時に実行される浮動小数点命令情報，整数命令情報，ＳＩＭＤ命令情報などであり，プログラムを実行するＣＰＵ内に設けられたモニタ回路がそれらの情報を収集し，出力する。実行時情報は，プログラム内のループの繰り返し回数や代入式の実行回数などであり，例えばオリジナルプログラムを実行する時にそれらの回数をカウントする命令をオリジナルプログラムに挿入することで収集可能である。
【００１６】
ボトルネックとは，プログラムの性能を阻害しているまたは決定している要因を示す情報であり，プログラムを実行した時に取得するハードウエアモニタ情報から所定の計算式により算出される。
【００１７】
最適化制御行とは，コンパイラがプログラムを最適化する際にコンパイラによる最適化の指針になる制御コマンドであり，本実施の形態の最適化装置がボトルネックとプロファイル情報とに基づいて自動的に決定し，オリジナルプログラム内に挿入する。オリジナルプログラムに最適化制御行を挿入することで，チューニングプログラムが生成される。コンパイラは，このチューニングプログラムをコンパイルする際に，最適化制御行の指示に応じて最適化したオブジェクトコードに変換する。
【００１８】
図２は，本実施の形態におけるプログラム最適化装置の構成を示す図である。プログラム最適化装置は，プロセッサであるＣＰＵ１０と，メインメモリ１３と，入出力装置１４と，ハードディスク等の大容量メモリ１５と，それらを接続するバス１６とを有する。ＣＰＵ１０は，デコーダ，演算器，レジスタなどを有するＣＰＵコア１１と，１次キャッシュメモリL1と，２次キャッシュメモリL2と，プログラムを実行した時にハードウエアモニタ情報を取得するモニタ回路１２とを有する。
【００１９】
モニタ回路１２は，例えば，コンパイラによりオリジナルプログラムから変換された実行可能バイナリコード（オブジェクトコード）をコンピュータが実行した際に，例えば，実行した総命令数，浮動小数点ロードメモリアクセス待ち回数，整数ロードメモリアクセス待ち回数，入出力アクセス待ち回数，整数ロードキャッシュアクセス待ち回数，全体の待ち回数，有効総命令数，演算待ち回数，ストア待ち回数，浮動小数点演算待ち回数，L2デマンドミス回数，L2プリフェッチミス回数，L2デマンドライトバック回数，L2プリフェッチライトバック回数，ＳＩＭＤロード・ストア命令数，ＳＩＭＤ浮動小数点命令数，ＳＩＭＤfma命令数などのハードウエアモニタ情報を収集し，外部に出力することができる。なお，fma命令は積と和の演算を１回で行う命令である。
【００２０】
これらのハードウエアモニタ情報に基づいて，後述するとおり，ＳＩＭＤ命令率，キャッシュヒット・ミス率，メモリスループットなどを算出することができる。
【００２１】
モニタ回路１２は，上記の実行可能バイナリコードを実行するコンピュータのプロセッサに備えられているハードウエア回路であり，取得可能なハードウエアモニタ情報は，プロセッサに依存する。
【００２２】
図２のプログラム最適化装置のハードディスク１５内には，オリジナルプログラム２０またはチューニングプログラム２３を最適化して実行可能バイナリコード（オブジェクトコード）２１に変換するコンパイラが記憶されている。また，ハードディスク１５内には，コンパイラが生成した実行可能バイナリコード（オブジェクトコード）を実行することで得られるプロファイル情報を収集し，プログラムの特性を解析し，最適化制御行及び挿入位置情報（中間データ，最適化制御行データ）を生成するライブラリプログラムと，オリジナルプログラムに最適化制御行を挿入してチューニングプログラムを生成するツールプログラムとが記憶されている。コンパイラとライブラリプログラムとツールプログラムは，オリジナルプログラムを最適化する最適化プログラム１６に対応する。また，ハードディスク１５内には，オリジナルプログラム２０と，実行可能バイナリコード（オブジェクトコード）２１と，最適化制御行に関する最適化制御行データ（中間データ）２２と，チューニングプログラム２３も記憶される。
【００２３】
図３は，最適化処理のフローチャート図である。図２のプログラム最適化装置が，最適化プログラム１６を構成するコンパイラと，ライブラリプログラムと，ツールプログラムを実行することで，図３の最適化処理を実行する。最適化処理は次の通りである。
【００２４】
S10：コンパイラがオリジナルプログラムをコンパイルして実行可能バイナリコード２１を生成する。この実行可能バイナリコード２１には，コンピュータが実行することでオリジナルプログラムの実行時情報を抽出する仕組みが組み込まれている。実行時情報には，オリジナルプログラムの行単位の実行回数，ループの繰り返し回数，代入式の実行回数などが含まれ，それらの情報は，プログラム名と関数名と行番号と関連付けられて抽出される。
【００２５】
図４は，ソースコードで記述した実行可能バイナリコードの一例を示す図である。この例によれば，サブルーチン「sub」内に，実行時情報とハードウエアモニタ情報を収集するための命令文「call STAR_COLLECTION」と，収集を終了させる命令文「call STOP_COLLECTION」とが挿入されている。
【００２６】
S11：コンピュータに実行可能バイナリコード２１を実行させることで，上記の実行時情報とハードウエアモニタ情報とを有するオリジナルプログラムのプロファイル情報を収集する。ハードウエアモニタ情報は，前述のとおりコンピュータのプロセッサが有するモニタ回路が収集し，出力する。
【００２７】
S12：次に，コンピュータがライブラリプログラムを実行することで，収集したプロファイル情報に基づいてオリジナルプログラムのボトルネック候補の計算を行う。オリジナルプログラムのボトルネックには，演算待ち時間が長い，メインメモリのロード待ち時間が長い，メインメモリのストア待ち時間が長い，キャッシュメモリのアクセス待ち時間が長い，メインメモリのスループットが大きいなどがある。工程S12では，これらのボトルネック候補の計算を行い，最適化により改善すべきボトルネックを解析する。
【００２８】
S13：改善すべきボトルネックが検出されると，コンピュータがライブラリプログラムを実行することで，そのボトルネックを改善する最適化を解析し，どの最適化をすべきかを決定する。ボトルネック毎に性能向上を阻害している要因が異なるので，改善すべきボトルネックに応じた最適化解析を行う必要がある。
【００２９】
S14：次に，コンピュータがライブラリプログラムを実行することで，最適化の解析結果に対応した最適化制御行を生成し，最適化制御行を挿入すべきプログラム名，関数名またはサブルーチン名，行番号などの諸情報を取得する。
【００３０】
S15：さらに，コンピュータがライブラリプログラムを実行することで，最適化制御行とそれを挿入すべきプログラム情報や位置情報を有する最適化制御行データ２２を生成し，出力する。この最適化制御行データ２２は，最適化制御行とそれを挿入すべきプログラム名や行番号などの挿入位置情報が所定のフォーマットで配列されている。
【００３１】
S16：最後に，コンピュータがツールプログラムを実行することで，最適化制御行データ２２に基づいて，オリジナルプログラムに最適化制御行を挿入し，最適化済みプログラムであるチューニングプログラム２３を出力する。その後，コンピュータがコンパイラを実行することで，このチューニングプログラム２３を最適化制御行にしたがって最適化したオブジェクトコードを生成する。つまり，最適化制御行は，コンパイラに，コンパイラが有している種々の最適化処理のうちどの最適化処理を行うかを指示する一種のコマンドである。
【００３２】
上記のとおり，本実施の形態によれば，図２のプログラム最適化装置が図３の最適化処理を行うことで，従来，ユーザが膨大な時間をかけて行っていた最適化制御行を挿入する作業時間を短縮することができる。また，オリジナルプログラムを実行した際に得られる実行時情報が可変であり，オリジナルプログラム内の複数のループの特性が異なる場合でも，ループ毎に適切な最適化制御行を挿入することができる。
【００３３】
図５は，図３のボトルネック解析S12のフローチャート図である。図２のプログラム最適化装置のコンピュータがライブラリプログラムを実行することで，オリジナルプログラムのボトルネック候補の算出を行う。コンピュータは，S20-S28の間の処理をオリジナルプログラムの解析範囲が終了するまで繰り返す。
【００３４】
S21：コンピュータがライブラリプログラムを実行することで，プロファイル情報から実行時情報を取得しながら，オリジナルプログラム内のループ構造に達したか否かを判断する(S23,S22)。そして，コンピュータはライブラリプログラムを実行することで，オリジナルプログラム内のループ構造に達する毎に（S23のYES），ループ内のハードウエアモニタ情報を取得し(S24)，候補となる例えば図５に示される５つのボトルネックを算出する（S25,S26）。一般に，ボトルネックが発生するのはループ構造であるので，本実施の形態のプログラム最適化装置は，オリジナルプログラム内のループを解析範囲とし，ループ毎にボトルネックを解析し，ループ内に挿入すべき最適化制御行を生成する。
【００３５】
ボトルネックの候補には，演算待ち時間，メインメモリのロード（ロードメモリアクセス）待ち時間，キャッシュメモリのアクセス待ち時間，メインメモリのストア（ストアメモリアクセス）待ち時間，メモリスループットなどが含まれる。
【００３６】
演算待ち時間は，プロセッサ内で命令がデコードされて演算すべきことが決定した後，演算器の予約部にエントリされてから実際に演算が開始されるまでの待ち時間である。演算待ち時間には浮動小数点演算待ち時間と，整数演算待ち時間とが含まれる。
【００３７】
ロードメモリアクセス待ち時間は，メモリに対するロード命令の実行が待たされる時間であり，浮動小数点ロードメモリアクセス待ち時間と，整数ロードメモリアクセス待ち時間とが含まれる。
【００３８】
キャッシュアクセス待ち時間は，キャッシュメモリへのロードアクセス命令の実行が待たされる時間であり，浮動小数点と整数のロードキャッシュアクセス待ち時間が含まれる。
【００３９】
ストアメモリアクセス待ち時間は，メモリに対するストア命令の実行が待たされる時間であり，浮動小数点と整数のストアメモリアクセス待ち時間が含まれる。
【００４０】
メモリスループットは，メモリアクセスされたデータ容量の合計容量を総命令数の実行に要した時間で除算した値であり，メインメモリの利用効率を示す指標である。一般に，メモリスループットが閾値を超えるほど高い場合は，他のボトルネックを改善してもプログラムの効率の改善にはつながらない場合が多く，メモリスループットが閾値以下の低い場合は，他のボトルネックを改善することでプログラムの効率を改善する場合が多い。メモリスループットが閾値を超えている場合の改善策は，例えば，コンピュータのメモリ容量を増大するなどのハードウエアの改善などである。
【００４１】
コンピュータは，上記のボトルネックの算出値を，解析範囲であるループ毎に求めてメモリやハードディスク内に記憶する。
【００４２】
そして，コンピュータはライブラリプログラムを実行することで，計算した各ボトルネックの値に基づいて，解析範囲であるループ毎に改善すべきボトルネックについて最適化解析を行い，各ボトルネックに対応する性能向上を阻害する要因を検出する（S27）。
【００４３】
図６，図７は，ボトルネックの計算例を示す図である。図６には，メモリまたはハードディスクに記憶されているプロファイル情報テーブル２４と，ボトルネック計算処理例S25と，ボトルネック計算により求められた値を格納するボトルネック情報テーブル２５が示されている。図６には，ボトルネック計算処理Ｓ２５の例として，浮動小数点演算待ち時間とメモリスループットとが示されている。
【００４４】
また，図７には，ロードメモリアクセス待ち（浮動小数点ロードメモリアクセス待ち，整数ロードメモリアクセス待ち）（S25-1），キャッシュアクセス待ち（浮動小数点ロードキャッシュアクセス待ち，整数ロードキャッシュアクセス）（S25-2），ストアメモリアクセス待ち，I/Oアクセス待ち（S25-3），メモリスループット（S25-4）の計算式が示されている。
【００４５】
図６のＳ２５に示されるとおり，浮動小数点演算待ち（時間）は，ハードウエアモニタ回路が収集した浮動小数点待ち回数の合計時間である。１０９はCPU周波数のギガヘルツに対応する。また，メモリスループットは，L2キャッシュメモリへのアクセス要求（demand:dm）に対するキャッシュミス数，L2キャッシュメモリへのプリフェッチ要求（prefetch:pf）に対するキャッシュミス数，L2キャッシュメモリへのアクセス要求時のライトバック（write back:wb）の回数，L2キャッシュメモリへのプリフェッチ要求時のライトバックの回数の合計に，キャッシュメモリの１つのキャッシュラインの容量（１２８バイト）を乗算したメモリアクセスの総容量を，総命令数で除算して求められる。
【００４６】
図７に示した各種待ちの演算式は図に示されるとおりである。また，メモリスループットを求める式は図６と同じである。
【００４７】
［演算待ち時間が閾値を越える場合の最適化の解析］
図８は，図３の最適化の解析工程S13のフローチャート図である。図８に示した最適化の解析は，図５においてボトルネックの一つである演算待ち時間が閾値を越えていたため，演算待ちのボトルネックを改善すべきと判断された場合の最適化の解析処理を示している。すなわち，図８の最適化の解析は，演算待ちを改善するためにどの最適化制御行をどこに挿入すべきかを解析する処理である。また，図８の最適化の解析工程は，解析範囲であるループ毎に行われる。
【００４８】
S30,S31：コンピュータはライブラリプログラムを実行することで，既に収集して記憶していたハードウエアモニタ情報を取得する。そして，コンピュータは，ＳＩＭＤ演算器で複数のデータに対する演算命令を並列に処理したか否かを示すＳＩＭＤ命令率を算出する。このＳＩＭＤ命令率は，解析単位であるループ内のＳＩＭＤ命令率である。
【００４９】
図９は，ＳＩＭＤ命令率の算出処理例を示す図である。コンピュータは，ハードウエアモニタ情報を含むプロファイル情報テーブルのデータから，図示される演算式によりＳＩＭＤ命令率を算出し，最適化情報のデータテーブル２７に格納する。この演算式によれば，ＳＩＭＤ命令率は，ＳＩＭＤロード・ストア命令数と，ＳＩＭＤ浮動小数点命令数と，ＳＩＭＤｆｍａ命令数との和を，有効総命令数で除算して求められる。ｆｍａ（Fused Multiply and Add）命令とは，積と和の演算を１回で行う命令である。ＳＩＭＤ命令率は，ＳＩＭＤロード・ストア命令数と，ＳＩＭＤ浮動小数点命令数と，ＳＩＭＤｆｍａ命令数と，有効総命令数は，ハードウエアモニタ情報としてモニタ回路から収集される。
【００５０】
図９の演算式は，図２のＣＰＵのＣＰＵコアのＳＩＭＤ演算器が，ロード・ストア命令を並列に処理する演算器と，浮動小数点演算命令を並列に処理する演算器と，ｆｍａ命令とを並列に処理する演算器を有することを前提にしている。したがって，プログラムを実行するコンピュータのＣＰＵコアのＳＩＭＤ演算器の構成に対応して，ＳＩＭＤ命令率の演算式が異なる。
【００５１】
S32：ＳＩＭＤ命令率が所定の閾値を越えていない場合（Ｓ３２のＮＯ），コンピュータは，ＩＦ文の命令をＳＩＭＤ化する最適化制御文を追加できるか否かを検討する（Ｓ３３−Ｓ３７）。ここでは，図３の工程Ｓ１０，Ｓ１１で，コンピュータがコンパイラを実行して，オリジナルプログラム２０をコンパイルし，生成した実行可能バイナリコード２１を実行してプロファイル情報を収集したときは，ＩＦ文の命令をＳＩＭＤ化していないことを前提とする。一般に，ＩＦ文の命令はＩＦ文の条件が満たされる場合に実行されるので，ＳＩＭＤ化して並列演算すると逆に効率が低下する場合がある。したがって，コンパイラはＩＦ文の命令をＳＩＭＤ化しないように最適化することが行われる場合がある。
【００５２】
コンピュータは，ＳＩＭＤ命令率が閾値を越えている場合（Ｓ３２のＹＥＳ），ＩＦ文の命令をＳＩＭＤ化できるかの検討は行わない。
【００５３】
また，ＳＩＭＤ命令率が閾値を越えているかいないかにかかわらず，コンピュータは，ループ構造の繰り返し回数に適合した最適化処理を解析して挿入すべき最適化制御文を検討する（Ｓ３８−Ｓ４１）。
【００５４】
S33,S33_1：コンピュータは，ライブラリプログラムを実行することで，オリジナルプログラムの解析範囲であるループ内の文種別情報を取得し，ループ内にＩＦ文が存在するか否かをチェックする。もしループ内にＩＦ文が存在する場合は，工程Ｓ３４−Ｓ３７によりＩＦ文に適したＳＩＭＤ化を指示する最適化制御文を決定する。
【００５５】
図１０は，ループ内にＩＦ文があるプログラム例とＩＦ文がないプログラム例とを示す図である。図１０（Ａ）は，ＤＯループ内にＩＦ文が存在し，ループ制御変数ｉが１からｎまでＩＦ文の条件を満たす場合に図示された演算命令の実行を繰り返すプログラム３０である。図１０（Ｂ）は，ＤＯループ内にＩＦ分が存在せずループ制御変数ｉが１からｎまで図示された演算命令を繰り返すプログラム３１である。
【００５６】
S34,S35：コンピュータは，ライブラリプログラムを実行することで，ＩＦ文の実行時情報を取得し，ＩＦ文の真率を算出する。そして，コンピュータは，ＩＦ文の真率が所定の閾値，例えば５０％，を越えるか否かをチェックする。
【００５７】
S36,S37：コンピュータは，ライブラリプログラムを実行することで，ＩＦ文の真率が大きい場合と小さい場合とでＳＩＭＤ化方式の選択を行う。すなわち，コンピュータは，ＩＦ文の真率が所定の閾値を越えている場合は，最適化制御行としてマスク方式ＳＩＭＤ化を指示する制御行に決定し（Ｓ３６），ＩＦ文の真率が所定の閾値以下の場合は，最適化制御行としてリスト方式ＳＩＭＤ化を指示する制御行に決定する（Ｓ３７）。
【００５８】
図１１は，工程Ｓ３６，Ｓ３７で挿入されるマスク方式ＳＩＭＤ化とリスト方式ＳＩＭＤ化の最適化制御行を示す図である。オリジナルプログラム２０は，図１０（Ａ）に示したプログラム３０と同じである。そして，コンピュータは，ＩＦ文の条件，Ｐ（ｉ）＞ｑ，が真になる率が閾値の５０％を越える場合は，マスク方式ＳＩＭＤ化を制御する下線の最適化制御行，「!ocl simd」，をDO文の前に挿入したプログラム３２を生成することを決定する（Ｓ３６）。また，コンピュータは，真率が５０％以下の場合は，リスト方式ＳＩＭＤ化を制御する下線の最適化制御行，「!ocl simd_listv」,をDO文の前に挿入したプログラム３３を生成することを決定する（Ｓ３７）。
【００５９】
図８に戻り，ＳＩＭＤ命令率が所定の閾値を越えている場合（Ｓ３２でＹＥＳ）と，ＳＩＭＤ命令率が所定の閾値以下の場合（Ｓ３２のＮＯ）のいずれの場合でも，コンピュータはライブラリプログラムを実行することで，ループの実行時情報を取得し（Ｓ３８），ループの繰り返し回数が所定の閾値を越えている場合（Ｓ３９のＹＥＳ），通常のループ構造に対する最適化を行う最適化制御行を選択し，ループの繰り返し回数が所定の閾値以下の場合（Ｓ３９のＮＯ），少回転向けループ構造に対する最適化を行う最適化制御行を選択する。
【００６０】
十分な繰り返し回数実行される通常のループ構造に対する最適化（Ｓ４０）では，コンパイラは，ＤＯループをアンローリング展開してＳＩＭＤ化しやすいオブジェクトコードに変換し，オブジェクトコードを実行するＣＰＵコアはソフトウエアパイプライン化により命令の実行効率を上げて命令の実行サイクル数を少なくする。一方，繰り返し回数が少ない少回転のループ構造に対する最適化（Ｓ４１）では，コンパイラは，繰り返し回数が少なすぎて利用されないソフトウエアパイプライン化の処理ループや，アンローリング展開する処理ループを，オブジェクトコード内に生成せずに，複数のループを選択するためのオーバーヘッドを削減できるようにする。
【００６１】
以下，マスク方式ＳＩＭＤ化とリスト方式ＳＩＭＤ化について説明し，さらに，通常のループ構造の最適化の例と少回転数ループ向け最適化の例について説明する。
【００６２】
［マスク方式ＳＩＭＤ化とリスト方式ＳＩＭＤ化］
以下，マスク方式ＳＩＭＤ化とリスト方式ＳＩＭＤ化について簡単に説明する。まず，前提として，チューニングプログラムを実行するコンピュータのＣＰＵコアの構成例について説明する。
【００６３】
図１２は，ＣＰＵコア（演算処理部）の構成例を示す図である。図１２のＣＰＵコア３００は，浮動小数点演算，浮動小数点ロード，または浮動小数点ストアを複数のデータに対して実行するＳＩＭＤ命令に応じたＳＩＭＤ処理を行うことができる。また，１つのデータに対して実行する非ＳＩＭＤ命令に応じた処理も行うことができる。
【００６４】
図１２のＣＰＵコア３００は，プログラムカウンタＰＣまたは分岐予測機構が予測する分岐先アドレスのいずれかを選択する命令フェッチアドレス生成器３０１と，分岐命令の分岐予測を行う分岐予測部３０２と，命令が記憶されている一次命令キャッシュ３０３と，一次命令キャッシュから読み出した命令を一時的に格納する命令バッファ３０４と，命令をデコードする命令デコーダ３０５を有する。命令デコーダ３０５は，後述するとおり，命令に対応する制御信号を生成すると共に，命令で指定されている格納先レジスタにリネーミングレジスタを割り当てる。
【００６５】
更に，ＣＰＵコア３００は，格納先レジスタに割り当てられたリネーミングレジスタとの対応関係を記憶するレジスタリネーミング部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は，命令デコーダ３０５から発行された命令のキューであり，命令を実行する実行ユニットに対応して設けられる。特に，固定小数点演算用リザベーションステーションRSEと浮動小数点演算用リザベーションステーションRSFは，アウトオブオーダで，つまり入力データや演算器の準備が整った命令から対応する演算器に命令を発行する。一方，コミットスタックエントリCSEは，全ての命令のエントリについて命令の完了を判定し，アウトオブオーダで開始された命令をインオーダで完了させる。
【００６７】
そして，ＣＰＵコア３００は，オペランドデータ選択部３１０と，オペランドアドレス生成器３１１と，一次データキャッシュ部３１２と，ストアバッファ部３１３とを有する。また，ＣＰＵコア３０は，固定小数点演算を行う演算器３２０と，浮動小数点演算を行うＳＩＭＤ演算器３３０と，固定小数点リネーミングレジスタ３２１と，浮動小数点リネーミングレジスタFR_REGと，固定小数点レジスタ３２２と，浮動小数点ＳＩＭＤレジスタFS_REGと，プログラムカウンタPCとを有する。
【００６８】
命令フェッチアドレス生成器３０１は，プログラムカウンタPCのカウント値または分岐予測部３０２からの情報を基に命令アドレスを選択し，一次命令キャッシュ３０３に対して命令フェッチリクエストを発行する。分岐予測部３０２は，分岐リザベーションステーションRSBRのエントリに基づいて分岐予測を行う。一次命令キャッシュ３０３は，命令フェッチリクエストに応じて読み出した命令を命令バッファ３０４に格納する。そして，命令バッファ３０４から命令デコーダに対し，プログラムにより指定された命令の順番通りに，すなわちインオーダで命令が供給され，命令デコーダ３０５は命令バッファ３０４から供給された命令をインオーダでデコードする。
【００６９】
命令デコーダ３０５は，デコードした命令の種類に応じて４つのリザベーションステーションRSA，RSE，RSF，またはRSBRに対して，必要なエントリを作成する。これとともに命令デコーダ３０５は，コミットスタックエントリCSEに対して，デコードしたすべての命令に対応するエントリを作成する。また，命令デコーダ３０５は，命令が指定するアーキテクチャレジスタ内のレジスタに，リネーミングレジスタ内のレジスタを割り当てる。
【００７０】
レジスタリネーミング部REG_RENは，リザベーションステーションRSA，RSEまたはRSFのいずれかにエントリが作成された時に，命令が指定するアーキテクチャレジスタに割り当てられたリネーミングレジスタのアドレスを記憶する。指定されたアーキテクチャレジスタと割当リネーミングレジスタとの対応関係はレジスタリネーミング部内のリネーミングマップに登録される。ＣＰＵコアは，アーキテクチャレジスタとして，固定小数点レジスタ３２２および浮動小数点ＳＩＭＤレジスタFS_REGを有する。これらのレジスタは，演算処理結果を格納する格納レジスタとして，命令により指定される。またリネーミングレジスタとして，固定小数点リネーミングレジスタ３２１および浮動小数点リネーミングレジスタFR_REGを有する。
【００７１】
命令デコーダ３０５は，固定小数点レジスタ３２２が格納先のレジスタとして使用される場合には，リネーミングレジスタとして固定小数点リネーミングレジスタ３２１のアドレスを割り当てる。また，命令デコーダ３０５は，浮動小数点ＳＩＭＤレジスタが格納先のレジスタとして使用される場合には，リネーミングレジスタとして浮動小数点リネーミングレジスタFR_REGを割り当てる。前述の格納先レジスタのアドレスに対して割り当てられたリネーミングレジスタのアドレスは，対応関係として，その命令に対応するリザベーションステーションRSA，RSE，RSFと，コミットスタックエントリCSEに出力される。
【００７２】
リザベーションステーションRSA，RSE，RSFは，保持されたエントリのうち，処理に必要な資源，例えばデータや演算器の準備ができたものから順次出力し，後段の演算器などのブロックに対してエントリに対応する処理を実行させる。これにより，命令がアウトオブオーダで実行開始され，命令の処理結果は，固定小数点リネーミングレジスタ３２１または浮動小数点リネーミングレジスタFR_REGに一時的に格納される。
【００７３】
浮動小数点リザベーションステーションRSFには，例えば浮動小数点演算命令に対応するエントリが格納される。演算器３３０は，リザベーションステーションRSFからのエントリに基づいて，演算の対象となる入力データを選択し，浮動小数点演算を実行する。浮動小数点命令の実行時には，ＳＩＭＤ演算器３３０の演算結果は浮動小数点リネーミングレジスタFR_REGに一時的に格納される。
【００７４】
また，浮動小数点ストア命令の実行時には，ＳＩＭＤ演算器３３０は演算対象として選択したデータをストアバッファ部３１３に出力する。そして，ストアバッファ部３１３は，オペランドアドレス生成器３１１から出力されたオペランドアドレスを指定して，ＳＩＭＤ演算器３３０から出力されたデータを一次データキャッシュ部３１２に書き込む。
【００７５】
コミットスタックエントリCSEは，命令デコーダ３０５によりデコードされたすべての命令に対応するエントリを保持し，各エントリに対応する処理の実行状況を管理し，これらの命令をインオーダで完了させる。例えば，コミットスタックエントリCSEは，次に完了させるべきエントリに対応する処理の結果が，固定小数点リネーミングレジスタ３２１または浮動小数点リネーミングレジスタFR_REGに格納されると共に，前の順番の命令が完了したと判定すると，リネーミングレジスタに格納されたデータを固定小数点レジスタ３２２または浮動小数点SIMDレジスタFS_REGに出力させる。これにより，各リザベーションステーションでアウトオブオーダで実行された命令がインオーダで完了する。
【００７６】
そして，ＳＩＭＤ演算器３３０は，複数の演算器を有する。それに対応して浮動小数点リネーミングレジスタＦＲ＿ＲＥＧと浮動小数点ＳＩＭＤレジスタＦＳ＿ＲＥＧも複数有する。例えば，１つの命令で４つの組のデータを並列処理できる４-ＳＩＭＤ処理に対応する場合は，ＳＩＭＤ演算器３３０は４つの演算器を有する。
【００７７】
そして，浮動小数点ＳＩＭＤレジスタFS_REGは，ＳＩＭＤ演算器と同数のレジスタを有する。同様に，浮動小数点リネーミングレジスタFR_REGも，同数のレジスタを有する。
【００７８】
図１２において，整数演算を行う演算器３２０と固定小数点レジスタ３２２と固定小数点リネーミングレジスタ３２１を有する固定小数点演算ユニットを，ＳＩＭＤ処理に対応できるように，複数個有しても良い。但し，図１２では，浮動小数点処理に対してのみＳＩＭＤ処理ができるように構成されている。
【００７９】
図１２の浮動小数点演算ユニットを構成する浮動小数点リザベーションステーションRSFと，ＳＩＭＤ演算器３３０と，浮動小数点ＳＩＭＤレジスタFS_REGと，浮動小数点リネーミングレジスタFR_REGは，ＳＩＭＤ命令と非ＳＩＭＤ命令を次のように処理する。ＳＩＭＤ命令の場合は，ＳＩＭＤ演算器３３０内の複数の演算器が並行して処理を行い，それぞれに対して割り当てられている浮動小数点リネーミングレジスタFR_REGに処理結果を一時的に格納する。そして，コミットスタックエントリCSEが順番が前の命令の完了と現在の命令の完了を検出すると，浮動小数点リネーミングレジスタFR_REG内のレジスタに一時的に格納された処理結果が，浮動小数点ＳＩＭＤレジスタFS_REG内の複数のレジスタに格納される。
【００８０】
一方，非ＳＩＭＤ命令に対しても，同様に演算器の処理結果が浮動小数点リネーミングレジスタFR_ERGに一時的に格納され，コミットスタックエントリCSEが前述の命令完了を検出すると，浮動小数点リネーミングレジスタFR_ERG内のレジスタに一時的に格納された処理結果が，浮動小数点ＳＩＭＤレジスタFS_REG内のレジスタに格納される。
【００８１】
［マスク方式ＳＩＭＤ化］
次に，マスク方式のＳＩＭＤ化する最適化について説明する。図１１のオリジナルプログラム３０は，ＤＯループ内にＩＦ文を含み，ＩＦ文の条件式が真の場合に演算命令を実行する。演算命令は，例えば加算演算の場合，第１，第２の数値をメモリからレジスタにロードし，両レジスタ内の第１，第２の数値を加算してレジスタに格納し，レジスタ内の加算結果をメモリにストアするという３つの命令文で構成される。したがって，ソースコードの加算命令は，ロード命令と加算命令とストア命令とに分解されたオブジェクトコードに変換されて，ＣＰＵにより実行される。その分解された命令を実行することで，コンピュータは，上記の加算対象の数値のロード命令を先行して実行し，ロード命令の完了を待って複数のＳＩＭＤ演算器で加算演算を実行し，最後に加算結果をメモリに格納するストア命令を実行する。
【００８２】
そのため，一般に，コンパイラがＩＦ文の演算命令をＳＩＭＤ化する場合，ＩＦ文の条件が真か偽かにかかわらず，ＤＯループにより連続して実行されるＩＦ文内の演算命令を，全てＳＩＭＤ演算器で演算し，最後のストア命令をＩＦ文の条件が真の場合のみ実行し，偽の場合は実行しないように，コンパイラがプログラムを最適化する。このようなＳＩＭＤ化をマスク方式ＳＩＭＤ化と称する。つまり，ＩＦ文の条件が偽の場合に最後のストア命令をマスクして実行させないようにする。このようなマスク方式ＳＩＭＤ化を行うことで，ＤＯループの連続する演算命令を複数のＳＩＭＤ演算器を利用して並列に処理し，演算速度を向上させることができる。
【００８３】
ただし，マスク方式ＳＩＭＤ化を行うと，ＩＦ文の演算命令を実行する条件が真になる真率が低い場合，演算した結果を破棄する確率が高くなり逆に効率を下げる結果になる。つまり，ＳＩＭＤ化による効率アップよりも無駄な演算を行う効率ダウンのほうが大きくなり，効率を低下させることがある。
【００８４】
図１３は，マスク方式ＳＩＭＤ化による最適化の説明をする図である。コンピュータがライブラリプログラムを実行することで，オリジナルプログラム３０内のＤＯループ内のＩＦ文についてＩＦ文の真率が５０％を越えることを検出すると，最適化制御行としてマスク方式ＳＩＭＤ化を指示する「!ocl simd」をＤＯループの前に挿入することを決定する。その結果，マスク方式ＳＩＭＤ化の最適化制御行「!ocl simd」をＤＯループの前に挿入されたチューニングプログラム３２が生成される。このチューニングプログラムの生成は，後述するとおり，コンピュータがツールプログラムを実行することにより行われる。
【００８５】
そして，コンピュータはコンパイラを実行することで，チューニングプログラム３２を最適化制御行にしたがって最適化し，マスク方式ＳＩＭＤ化を可能にするオブジェクトコード３２＿ＯＣを生成する。図１３に示したオブジェクトコード３２＿ＯＣは，理解を容易にするために擬似的なアセンブラ言語で記述されている。このオブジェクトコード３２＿ＯＣに示されるとおり，ＩＦ文内の演算命令は，複数のロード命令loadと乗算命令MPXと加算命令addとストア命令store*に変換される。そして，ストア命令store*は，ＩＦ文の条件が真の場合にのみ実行され，偽の場合には実行されないという命令であり，通常のストア命令storeとは異なるストア命令である。通常のストア命令storeの場合は，ＩＦ文の条件が真か偽かにかかわらず指定された値をメモリに記憶する処理を行う。このように，コンパイラがソースプログラムの演算命令をオブジェクトコードに変換する際に，オブジェクトコードの演算命令群の最後のストア命令に特殊なストア命令store*を採用することで，上記のマスク方式ＳＩＭＤ化を可能にすることができる。
【００８６】
チューニングプログラム３２から変換されたオブジェクトコード３２＿ＯＣをプロセッサのＣＰＵコアが実行すると，ＣＰＵコアは，ＤＯループで繰り返されるＩＦ文の演算命令を，ＩＦ文の条件が真か偽かにかかわらず，複数のＳＩＭＤ演算器で並行して実行する。但し，ＩＦ文の条件が偽の演算命令については，ＣＰＵコアは，命令群の最後に記述されている演算結果をメモリに格納するストア命令を実行せずに演算結果を破棄する。ＤＯループ内で繰り返されるＩＦ文の演算命令を全てＳＩＭＤ化することでＳＩＭＤ化に要するオーバーヘッドを抑制することができる。一方で，ＩＦ文の条件が偽の場合に演算処理が無駄になる。しかし，ＩＦ文の条件の真率が高い場合は，演算処理が無駄になることによる効率ダウンよりも，繰り返されるＩＦ文の演算命令を全てＳＩＭＤ化して並列に演算することによる効率アップのほうが勝る。したがって，本実施の形態では，ＩＦ文の条件の真率が所定の閾値を越えていれば，マスク方式ＳＩＭＤ化で効率化するのが望ましい。
【００８７】
図１４は，マスク方式ＳＩＭＤ化されたオブジェクトコードを実行した場合にＳＩＭＤ演算器の動作例を示す図である。この例では，ＣＰＵコアが２つのＳＩＭＤ演算器を有するものとする。図１３のオリジナルプログラム３０の変数ｎ１がｎ１＝１０と仮定すると，ＤＯループ内のＩＦ文が１０回繰り返される。その１０回の演算命令を２つのＳＩＭＤ演算器で並行に実行すると，図１４に示されるとおり５回のサイクルで１０回の演算命令を実行することができる。但し，各演算命令は，ロード命令と乗算命令と加算命令とストア命令の命令群からなり，最後のストア命令はＩＦ文の条件が真の場合のみ実行され，偽の場合は実行されず演算結果は破棄される。マスク方式ＳＩＭＤ化でＩＦ文の条件が真の場合のみ実行される命令の他の例として，データ転送命令などがある。データ転送命令は演算結果をメモリのあるアドレスに転送する命令である。
【００８８】
［リスト方式ＳＩＭＤ化］
次に，リスト方式ＳＩＭＤ化する最適化について説明する。ＤＯループ内のＩＦ文の演算命令をＳＩＭＤ化する場合，前述のマスク方式ＳＩＭＤ化するのが一般的である。しかし，ＩＦ文の条件の真率が所定の閾値以下になると，マスク方式ＳＩＭＤ化では演算結果を廃棄する確率が高くなり，ＳＩＭＤ化による効率アップよりも無駄な演算を実行したことによる効率ダウンのほうが強くなる。
【００８９】
そこで，コンピュータはライブラリプログラムを実行することで，ＤＯループ内のＩＦ文の条件の真率が所定の閾値より低い場合，リスト方式ＳＩＭＤ化の最適化制御行を生成することを決定する。リスト方式ＳＩＭＤ化では，コンピュータがコンパイラを実行することで，オリジナルプログラムのＤＯループを，ＩＦ文の条件を満たすループ制御変数の値を配列に登録する第１のループと，その登録した配列のサイズ分だけ回転してＩＦ文内の演算命令を実行する第２のループとを有するプログラム（オブジェクトコード）に変換する。その結果，ＣＰＵコアは，そのオブジェクトコードを実行して，第２のループ内の回転回数の演算命令をＳＩＭＤ演算器で並列に実行する。第１のループでＩＦ文の条件が真になるループ制御変数の値を事前に登録しているので，第２のループで実行する演算命令は全てＩＦ文の条件が真の場合の演算命令である。したがって，リスト方式ＳＩＭＤ化によれば，ＩＦ文の条件の真率が低くても，マスク方式ＳＩＭＤ化の場合のように無駄になる演算はなくなり，ＳＩＭＤ化による効率アップが，２つのループを実行することによる効率ダウンを上回ることになる。
【００９０】
図１５は，リスト方式ＳＩＭＤ化で最適化されるオブジェクトコードの例を示す図である。図１５には，リスト方式ＳＩＭＤ化を指示する最適化制御行「!ocl simd listv」が挿入されたチューニングプログラム３２と，最適化制御行「!ocl simd listv」に基づいてコンパイラにより最適化されたオブジェクトコード３２＿ＯＣの例が示されている。図１５のオブジェクトコード３２＿ＯＣは，理解を容易にするためにバイナリコードではなく，チューニングプログラムと同じソースコードで記述されている。
【００９１】
リスト方式ＳＩＭＤ化を指示する最適化制御行が挿入されると，コンピュータはコンパイラを実行することで，チューニングプログラム３２のＤＯループを，ＩＦ文の条件を満たすループ制御変数ｉの値を配列ｉｄｘ（ｊ）に登録する第１のループ３２＿ＯＣ＿１と，その登録した配列ｉｄｘ（ｊ）のサイズ分だけ回転してＩＦ文内の演算命令を実行する第２のループ３２＿ＯＣ＿２とを有するプログラム（オブジェクトコード）３２＿ＯＣに変換する。今仮に，第１のループ３２＿ＯＣ＿１でＩＦ文の条件ｐ（ｉ）＞ｑが真になるのが，ループ制御変数ｉがｉ＝１，３，５，７の場合とすると，第２のループ３２＿ＯＣ＿２の配列ｉｄｘ（ｊ）は，
idx(1)=1, idx(2)=3, idx(3)=5, idx(4)=7となるので，第２のループでの演算命令は４回繰り返されるだけになり，その演算命令の演算結果は全てストアされ，演算の無駄が発生しない。
【００９２】
図１６は，図１５のオブジェクトコード３２＿ＯＣをＣＰＵコアが実行した場合のＳＩＭＤ演算器の動作例を示す図である。オブジェクトコード３２＿ＯＣでは演算命令が４回繰り返されるので，２つのＳＩＭＤ演算器により２サイクルで実行を完了できる。しかも，演算結果が無駄に破棄されることはない。
【００９３】
上記のように，ＩＦ文の演算命令を実行する条件の真率が低い場合は，リスト方式ＳＩＭＤ化によりオリジナルプログラムを最適化することで，条件が真の場合の演算命令だけがＳＩＭＤ化されて並列演算されるので，ＳＩＭＤ化による効率アップが２つのＤＯループに分割したことによる効率ダウンを上回り，全体の効率アップにつながる。
【００９４】
［通常のループ構造の最適化と少回転数ループ向け最適化］
ループ構造の最適化は，上記の複数の命令を複数のＳＩＭＤ演算器で並列に実行するＳＩＭＤ化に加えて，ループ構造のオリジナルプログラムをアンローリング展開して繰り返し回数を減らす最適化方法と，連続する命令群をＣＰＵコア内のパイプライン構造により並列に実行して処理サイクルを短縮するソフトウエアパイプライン化の最適化方法とが有効である。
【００９５】
しかし，上記のアンローリング展開やソフトウエアパイプライン化による最適化は，ループ構造の繰り返し回数が一定の回数以上でないと効率アップにならない。コンパイラが，繰り返し回数が少ないループ構造に対して，アンローリング展開を行うループや，ソフトウエアパイプライン化を行うループを有するオブジェクトコードに変換しても，大きな効率アップの効果は期待できないばかりか，逆に無駄なループを有することによるループ選択の判断工程が効率ダウンの要因になる。
【００９６】
そこで，本実施の形態では，図８に示したとおり，コンピュータはライブラリプログラムを実行することで，ＤＯループ内のＩＦ文の演算命令をＳＩＭＤ化すること（Ｓ３６，Ｓ３７）に加えて，ループの繰り返し回数が十分に多い場合は通常の最適化を行うような最適化制御行を生成し，ループの繰り返し回数が少ない場合は少回転数のループ向けの最適化を行うような最適化制御行を生成する。
【００９７】
通常の最適化を行う最適化制御行が挿入されたチューニングプログラムの場合，コンパイラは，オリジナルプログラムのＤＯループをアンローリング展開するループと，ＣＰＵコアにおいてソフトウエアパイプライン展開するループとを有するオブジェクトコードを生成する。
【００９８】
一方，少回転数のループ向けの最適化を行う最適化制御行が挿入されたチューニングプログラムの場合，コンパイラは，オブジェクトコード内に，上記のアンローリング展開するループを生成せず，ソフトウエアパイプライン展開するループを生成しない。
【００９９】
図１７は，アンローリング展開を説明する図である。図１７にはチューニングプログラム３２の一例が示されている。このチューニングプログラム３２は，繰り返し回数がｎのＤＯループを有する。この繰り返し回数ｎが十分に多い場合，コンピュータはコンパイラを実行して，チューニングプログラム３２のＤＯループ内の１個の演算命令を８個に展開して，ＤＯループがループ制御変数ｉが１からｎまで８飛びで繰り返し実行されるように変更したオブジェクトコード３２＿ＯＣを生成する。これにより，オブジェクトコード３２＿ＯＣでは，ＤＯループの繰り返し回転数を１／８に減じることができ，演算命令を繰り返し実行するために必要なオーバーヘッドの工数を減じることができる。また，ＤＯループ内の演算命令を８個に増やしたことで，繰り返し回数毎に８個の演算命令を複数のＳＩＭＤ演算器によりＳＩＭＤ化して実行できるようになり，プログラムの実行効率を高めることができる。
【０１００】
但し，ＤＯループの繰り返し回数が，少なくともアンローリング展開数（図１７の例では８回）以上残っていることがアンローリング展開により効率化できる条件である。
【０１０１】
図１８は，ソフトウエアパイプライン展開を説明する図である。図１８のチューニングプログラム３０の例は，変数ｂと変数ｃとを加算して変数ａに代入する演算命令をｎ回繰り返すＤＯループである。コンパイラは，このような演算命令を，変数ｂをメモリからロードする命令と，変数ｃをメモリからロードする命令と，ロードした変数ｂ，ｃを加算する命令と，加算結果ａをメモリにストアする命令とに分解し，オブジェクトコードに変換する。
【０１０２】
そこで，オブジェクトコードを実行するプロセッサマシンモデルとして，ロード命令loadのレイテンシが３サイクル，加算命令addのレイテンシが３サイクル，ストア命令storeのレイテンシが１サイクル，ロード命令とストア命令用の演算器の数が３個，演算器に予約可能な命令の数であるコミット数が４，但しロード命令とストア命令は３命令までしか予約できないと仮定する。
【０１０３】
図１８中のパイプライン展開例４０，４１は，縦方向が時間軸，横方向が命令を実行する演算器の数に対応する。
【０１０４】
チューニングプログラム３０の演算命令を１つずつ順番に実行すると，ＣＰＵコア内のパイプラインが実行する命令は，最適化前のパイプライン展開例４０に示すとおりであり，一つの演算命令を実行するのに７サイクルを要する。すなわち，ＣＰＵコアは，一対のロード命令を並列に実行し，ロード命令のレイテンシ３サイクル後に加算命令を実行し，加算命令のレイテンシ３サイクル後にストア命令を実行する。
【０１０５】
それに対して，最適化によりソフトウエアパイプライン展開する例４１の場合は，ＣＰＵコア内のパイプラインが，最初にＣＰＵコアの２つの演算器が一対のロード命令loadを連続して実行し，最初から３サイクル後に最初の一対のロード命令により取得したデータｂ，ｃを加算する加算命令addを実行し，その後加算命令addを連続して実行する。さらに，最初から６サイクル後に最初の加算命令により求めたデータをストアするストア命令storeを実行し，その後ストア命令storeを連続して実行する。その結果，パイプラインは９回の演算命令を１５サイクルで完了する。例４１には，実線の３つの命令群と，破線の３つの命令群と，一点鎖線の３つの命令群とが区別して示されている。
【０１０６】
特に，ロード命令とストア命令を実行する演算器の個数が３個であり，ロード命令と加算命令のレイテンシが３サイクルであるので，ＤＯループの繰り返し回数が９回転以上になると，図１８中に太枠で示したように全演算器が演算待ちをすることなく命令を実行する最も効率化された状況を生み出すことができる。したがって，ＤＯループの繰り返し回数が９回転以上の場合に，ソフトウエアパイプライン展開を行うことで効率化を最大限にアップすることができる。
【０１０７】
図１９は，本実施の形態におけるＤＯループのオリジナルプログラムの最適化制御行の例を示す図である。前提として，ＣＰＵコアはＳＩＭＤ演算器が２つある２ＳＩＭＤ構成であり，アンローリング展開の展開数が８であり，ソフトウエアパイプライン展開の効果は最低でも９回の命令を展開した場合に最大の効率化を図ることができるものとする。このような前提の場合，２ＳＩＭＤ化と展開数８のアンローリング展開と最低数９のソフトウエアパイプライン展開を行うことで効率化アップの効果が期待できる条件は，ＤＯループの繰り返し回数が２×８×９＝１４４回以上であることである。また，２ＳＩＭＤ化と展開数８のアンローリング展開とを行うことで効率化アップの効果が期待できる条件は，ＤＯループの繰り返し回数が２×８＝１６回以上であることである。さらに，２ＳＩＭＤ化のみを行うことで効率化アップの効果が期待できる条件は，ＤＯループの繰り返し回数が２回以上であることである。
【０１０８】
［ループ繰り返し回数が大の場合］
そこで，図１９の最適化制御行の例では，オリジナルプログラム３１は，図１０（Ｂ）に示したものと同じであり，ＤＯループ内にＩＦ文が存在せず繰り返し回数がｎ回のループを有するプログラムである。コンピュータがライブラリプログラムを実行することで，ＤＯループの実行時情報を取得し，実行時情報に含まれるＤＯループの繰り返し回数が大（例えばｎが１４４回以上）の場合は，最適化制御行として何も挿入しないチューニングプログラム３４＿１を生成することを決定する。このチューニングプログラム３４＿１は，オリジナルプログラム３１に何も最適化制御行が挿入されていない。この場合は，コンピュータがコンパイラを実行して，チューニングプログラム３４＿１を次のような複数のループを有するオブジェクトコードに変換する。
【０１０９】
図２０は，ＤＯループの繰り返し回数が大の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。図２０の最適化されたオブジェクトコードは，コンピュータがコンパイラを実行して，図１９のチューニングプログラム３４＿１のループを最適化して生成したオブジェクトコードである。
【０１１０】
この最適化されたオブジェクトコードによるプログラムは，ループ内プログラムを実行開始し（Ｓ６１），ループの残り繰り返し回数が大（例えばｎが１４４回以上），中（例えばｎが１６以上，１４４未満），少（ｎが２以上，１６未満），微少（ｎが２未満）に応じて（Ｓ６２），４つのループの最適化処理（Ｓ６３−Ｓ６６）のいずれかを実行してループ内プログラムを実行する。
【０１１１】
最適化されたオブジェクトコードのプログラムは，ループの残り繰り返し回数ｎが大の場合（Ｓ６２でｎが１４４回以上の場合），２ＳＩＭＤ化とアンローリング展開とソフトウエアパイプライン展開を行って１４４回分の演算命令を実行するループＳ６３を実行する。ループＳ６３を通過すると，ループの残り繰り返し回数ｎは１４４回減じられる（Ｓ６７）。
【０１１２】
最適化されたオブジェクトコードのプログラムは，最適化ループＳ６３を所定回数通過して演算命令を実行した後，ループの残り回数ｎが中になると（Ｓ６２でｎが１４４回未満で１６回以上の場合），２ＳＩＭＤ化とアンローリング展開とを行って１６回分の演算命令を実行するループＳ６４を実行する。ループＳ６４を通過すると，ループの残り回数ｎは１６回減じられる（Ｓ６７）。
【０１１３】
最適化されたオブジェクトコードのプログラムは，最適化ループＳ６４を所定回数通過して演算命令を実行した後，ループの残り回数ｎが少になると（Ｓ６２でｎが１６回未満で２回以上の場合），２ＳＩＭＤ化を行って２回分の演算命令を実行するループＳ６５を実行する。ループＳ６５を通過すると，ループの残り回数ｎは２回減じられる（Ｓ６７）。
【０１１４】
最適化されたオブジェクトコードのプログラムは，最適化ループＳ６５を所定回数通過して演算命令を実行した後，ループの残り回数ｎが微少になると（Ｓ６２でｎが２回未満），ＳＩＭＤ化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループＳ６６を，残り回数だけ演算命令を実行する。そして，残り繰り返し回数がゼロになると（Ｓ６８のＹＥＳ），最適化されたオブジェクトコードのプログラムはループの実行を終了する。
【０１１５】
［ループ繰り返し回数が中の場合］
図１９に戻り，コンピュータがライブラリプログラムを実行することで，ＤＯループの実行時情報を取得し，実行時情報に含まれるＤＯループの繰り返し回数が中（例えばｎが１４４回未満，１６回以上）の場合は，最適化制御行「!loc simd, unroll, noswp」を挿入したチューニングプログラム３４＿２を生成することを決定する。このチューニングプログラム３４＿２の場合，コンピュータがコンパイラを実行して，チューニングプログラム３４＿２を次のような複数のループを有するオブジェクトコードに変換する。
【０１１６】
図２１は，ＤＯループの繰り返し回数が中（ｎが１４４回未満，１６回以上）の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。図２１の最適化されたオブジェクトコードのプログラムは，コンピュータがコンパイラを実行して，図１９のチューニングプログラム３４＿２を最適化して生成するオブジェクトコードのプログラムである。
【０１１７】
図２１の最適化されたオブジェクトコードのプログラムは，図２０と異なり，ループの残り繰り返し回数が大の場合に通過するループＳ６３を有していない。理由は，ＤＯループの繰り返し回数が中（ｎが１４４回未満，１６回以上）であるので，ループＳ６３は無用なループになるからである。
【０１１８】
図２１の最適化されたオブジェクトコードのプログラムは，ループ内プログラムを実行開始し（Ｓ６１），ループの残り繰り返し回数が中（例えばｎが１６以上，１４４未満），少（ｎが２以上，１６未満），微少（ｎが２未満）に応じて（Ｓ６２），３つのループの最適化処理を行ってループ内プログラムを実行する（Ｓ６４−Ｓ６６）。
【０１１９】
最適化されたオブジェクトコードのプログラムは，ループの残り繰り返し回数ｎが中の場合（Ｓ６２でｎが１４４回未満で１６回以上の場合），２ＳＩＭＤ化とアンローリング展開とを行って１６回分の演算命令を実行するループＳ６４を実行する。ループＳ６４を通過すると，ループの残り回数ｎは１６回減じられる（Ｓ６７）。
【０１２０】
最適化されたオブジェクトコードのプログラムは，最適化ループＳ６４を所定回数通過して演算命令を実行した後，ループの残り回数ｎが少になると（Ｓ６２でｎが１６回未満で２回以上の場合），２ＳＩＭＤ化を行って２回分の演算命令を実行するループＳ６５を実行する。ループＳ６５を通過すると，ループの残り回数ｎは２回減じられる（Ｓ６７）。
【０１２１】
最適化されたオブジェクトコードのプログラムは，最適化ループＳ６５を所定回数通過して演算命令を実行した後，ループの残り回数ｎが微少になると（Ｓ６２でｎが２回未満），ＳＩＭＤ化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループＳ６６を，残り回数だけ実行して残り回数の演算命令を実行する。そして，残り繰り返し回数がゼロになると（Ｓ６８のＹＥＳ），最適化されたオブジェクトコードのプログラムはループの実行を終了する。
【０１２２】
［ループ繰り返し回数が少の場合］
図１９に戻り，コンピュータがライブラリプログラムを実行することで，ＤＯループの実行時情報を取得し，実行時情報に含まれるＤＯループの繰り返し回数が少（例えばｎが１６回未満，２回以上）の場合は，最適化制御行「!loc simd, nounroll, noswp」を挿入したチューニングプログラム３４＿３を生成することを決定する。このチューニングプログラム３４＿３の場合，コンピュータがコンパイラを実行して，チューニングプログラム３４＿３を次のような複数のループを有するオブジェクトコードに変換する。
【０１２３】
図２２は，ＤＯループの繰り返し回数が少（ｎが１５回未満，２回以上）の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。図２２の最適化されたプログラムは，コンピュータがコンパイラを実行することで，図１９のチューニングプログラム３４＿３を最適化して生成するオブジェクトコードのプログラムである。
【０１２４】
図２２の最適化されたオブジェクトコードのプログラムは，図２０と異なり，ループの残り繰り返し回数が大の場合に通過するループＳ６３と，中の場合に通過するループＳ６４とを有していない。理由は，ＤＯループの繰り返し回数が少（ｎが１６回未満，２回以上）であるので，ループＳ６３，Ｓ６４は無用なループになるからである。
【０１２５】
図２２の最適化されたオブジェクトコードのプログラムは，ループ内プログラムを実行開始し（Ｓ６１），ループの残り繰り返し回数が少（ｎが２以上，１６未満），微少（ｎが２未満）に応じて（Ｓ６２），３つのループの最適化処理を行ってループ内プログラムを実行する（Ｓ６５−Ｓ６６）。
【０１２６】
最適化されたオブジェクトコードのプログラムは，ループの残り繰り返し回数ｎが少の場合（Ｓ６２でｎが１６回未満で２回以上の場合），２ＳＩＭＤ化を行って２回分の演算命令を実行するループＳ６５を実行する。ループＳ６５を通過すると，ループの残り回数ｎは２回減じられる（Ｓ６７）。
【０１２７】
最適化されたオブジェクトコードのプログラムは，最適化ループＳ６５を所定回数通過して演算命令を実行した後，ループの残り回数ｎが微少になると（Ｓ６２でｎが２回未満），ＳＩＭＤ化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループＳ６６を，残り回数だけ実行して残り回数の演算命令を実行する。そして，残り繰り返し回数がゼロになると（Ｓ６８のＹＥＳ），最適化されたプログラムはループの実行を終了する。
【０１２８】
［ループ繰り返し回数が微少の場合］
図１９に戻り，コンピュータがライブラリプログラムを実行することで，ＤＯループの実行時情報を取得し，実行時情報に含まれるＤＯループの繰り返し回数が微少（例えばｎが２回未満）の場合は，最適化制御行「!loc nosimd, nounroll, noswp」を挿入したチューニングプログラム３４＿４を生成することを決定する。このチューニングプログラム３４＿４の場合，コンピュータがコンパイラを実行して，チューニングプログラム３４＿４を次のような複数のループを有するオブジェクトコードに変換する。
【０１２９】
図２３は，ＤＯループの繰り返し回数が少（ｎが１５回未満，２回以上）の場合にＤＯループを最適化したオブジェクトコードのフローチャート図である。図２２の最適化されたプログラムは，図１９のチューニングプログラム３４＿３をコンパイラが最適化することで生成するオブジェクトコードのプログラムである。
【０１３０】
図２２の最適化されたオブジェクトコードのプログラムは，図２０と異なり，ループの残り繰り返し回数が大の場合に通過するループＳ６３と，中の場合に通過するループＳ６４とを有していない。理由は，ＤＯループの繰り返し回数が少（ｎが１６回未満，２回以上）であるので，ループＳ６３，Ｓ６４は無用なループになるからである。
【０１３１】
図２２の最適化されたオブジェクトコードのプログラムは，ループ内プログラムを実行開始し（Ｓ６１），ループの繰り返し回数による判断を行うことなく，ＳＩＭＤ化もアンローリング展開もソフトウエアパイプライン展開も何も行わないループＳ６６を，残り回数だけ実行して残り回数の演算命令を実行する。そして，残り繰り返し回数がゼロになると（Ｓ６８のＹＥＳ），最適化されたプログラムはループの実行を終了する。
【０１３２】
図２０〜２３の最適化されたオブジェクトコードのプログラムのメリットとデメリットを説明する。ループの繰り返し回数が大（１４４回以上）の場合は，図２０の最適化されたプログラムを実行すると，全てのループＳ６３−Ｓ６６が実行され，ソフトウエアパイプライン展開やアンローリング展開により複数の演算命令を効率的に実行する。但し，繰り返し回数の判定工程Ｓ６２による処理のオーバーヘッドが効率化を阻害する要因になる。しかし，ループＳ６３を実行することによる効率化アップが，複雑な判定工程Ｓ６２による効率化ダウンに勝り，全体としては効率化アップになる。
【０１３３】
ループの繰り返し回数が中（１４４回未満，１６回以上）の場合，図２０の最適化されたプログラムを実行すると，ループＳ６３は実行されないため，毎回実行される繰り返し回数の判定工程Ｓ６２による処理のオーバーヘッドが効率化阻害要因になる。ループの繰り返し回数が中の場合は，図２１の最適化されたプログラムのように，決して実行されないループＳ６３を削除することで，繰り返し回数の判定工程Ｓ６２がシンプルになりオーバーヘッドによる効率化ダウンの程度を緩和することができる。
【０１３４】
ループの繰り返し回数が少（１６回未満，２回以上）の場合，図２０の最適化されたプログラムを実行すると，ループＳ６３，Ｓ６４は実行されないため，毎回実行される繰り返し回数の判定工程Ｓ６２による処理のオーバーヘッドの効率化阻害要因が問題になる。図２１の最適化されたプログラムの場合も同様の問題を有する。そこで，ループの繰り返し回数が少の場合は，図２２の最適化されたプログラムのように，決して実行されないループＳ６３，Ｓ６４を削除することで，繰り返し回数の判定工程Ｓ６２がシンプルになりオーバーヘッドによる効率化ダウンの程度を緩和することができる。
【０１３５】
ループの繰り返し回数が微少（２回未満）の場合，図２３の最適化されたプログラムのようにループＳ６６だけにすることで，繰り返し回数の判定工程Ｓ６２もなくなり効率化ダウンの要因をなくすことができる。
【０１３６】
以上の通り，繰り返し回数が非常に多い通常のＤＯループの場合は，図２０の最適化されたオブジェクトコードのプログラムが効率化アップに向いている。しかし，繰り返し回数が少ないＤＯループの場合は，その繰り返し回数に見合った図２１，図２２，図２３のいずれかの最適化されたオブジェクトコードのプログラムを選択することで，最大限の効率化アップを期待できる。
【０１３７】
図３に戻り，コンピュータがライブラリプログラムを実行することで，最適化制御行を生成し（Ｓ１４），最適化制御行データ２２を出力する（Ｓ１５）。
【０１３８】
図２４は，最適化制御行データの一例を示す図である。最適化制御行データ２２は，最適化制御行の情報と，それを挿入する対象のプログラム名，関数名またはサブルーチン名，行番号とを有する。図２４には，最適化制御行の情報として，マスク方式ＳＩＭＤ化の最適化制御行「!ocl simd」と，繰り返し回数が少のループ用の最適化制御行「!ocl simd, nounroll, noswp」と，リスト方式ＳＩＭＤ化の最適化制御行「!ocl simd_listv」の情報を有している。
【０１３９】
そして，図３に示されるとおり，コンピュータがツールプログラムを実行することで，最適化制御行データ２２に基づいて，オリジナルプログラム３０に最適化制御行を挿入してチューニングプログラム２３を生成する。
【０１４０】
さらに，コンピュータがコンパイラを実行することで，チューニングプログラム２３について挿入されている最適化制御行に基づき，コンパイラが有している最適化を行って，コンピュータが実行可能なオブジェクトコードに変換する。コンピュータが，この最適化制御行に基づいて最適化されたオブジェクトコードを実行することで，オリジナルプログラムの処理が高い効率で実行される。
【０１４１】
以上説明したとおり，本実施の形態におけるプログラムの最適化方法によれば，オリジナルプログラムを実行した際に収集したプロファイル情報から，演算待ち時間が長いというボトルネックが検出された場合，ループ内のＩＦ文の演算命令に対してＩＦ文の真率に応じた最適なＳＩＭＤ化を可能にすることで，演算待ち時間を短縮することができる。さらに，本実施の形態におけるプログラム最適化方法によれば，演算待ち時間が長いというボトルネックが検出された場合，ループの繰り返し回数に応じて最適化を阻害する要因である判定処理によるオーバーヘッドを抑制した最適なオブジェクトコードのプログラムに変換するので，その最適化されたオブジェクトコードを実行した時の判定処理が要因の演算待ち時間を短くすることができる。
【０１４２】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１４３】
（付記１）
演算処理装置が，
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し，
前記プロファイル情報に基づいて演算待ち時間を算出し，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理を有するプログラム最適化方法。
【０１４４】
（付記２）
前記ＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する処理では，前記ＩＦ文の命令を実行する条件が真になる真率が第３の閾値を超えている場合は，マスク方式ＳＩＭＤ化制御行を挿入し，前記真率が前記第３の閾値以下の場合は，リスト方式ＳＩＭＤ化制御行を挿入し，
前記マスク方式ＳＩＭＤ化制御行が挿入されている場合は，前記ＩＦ文の条件にかかわらず前記ＩＦ文の命令を順次ＳＩＭＤ演算器で並列に実行し前記ＩＦ文の条件が真でない場合の命令実行結果を破棄するように，コンパイラが前記チューニングプログラムをオブジェクトコードに変換し，
前記リスト方式ＳＩＭＤ化制御行が挿入されている場合は，前記コンパイラが，前記ループを，前記ＩＦ文の条件を満たすループ制御変数の値を配列に登録する第１のループと，前記配列のサイズだけ回転して前記ＩＦ文の命令を実行する第２のループとに変換する，付記１に記載のプログラム最適化方法。
【０１４５】
（付記３）
更に，
前記演算待ち時間が第１の閾値より長い場合，前記ループの繰り返し回数が第４の閾値以下の場合は，少ない回転向け最適化制御行を挿入し，前記ループの繰り返し回数が前記第４の閾値を超えている場合は，多い回転向け最適化制御行を挿入する処理を有し，
前記少ない回転向け最適化制御行が挿入されている場合は，前記ループ内の命令をＣＰＵコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成しないように，前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換し，
前記多い回転向け最適化制御行が挿入されている場合は，前記ループ内の命令をＣＰＵコアでパイプライン処理するパイプライン展開または前記ループ内の命令を複数の同じ命令に展開するアンローディング展開の実行ループを生成するように，前記コンパイラが前記チューニングプログラムをオブジェクトコードに変換する付記１または２に記載のプログラム最適化方法。
【０１４６】
（付記４）
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集し，
前記プロファイル情報に基づいて演算待ち時間を算出し，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する
処理をコンピュータに実行させるプログラム最適化プログラム。
【０１４７】
（付記５）
前記ＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する処理では，前記ＩＦ文の命令を実行する条件が真になる真率が第３の閾値を超えている場合は，マスク方式ＳＩＭＤ化制御行を挿入し，前記真率が前記第３の閾値以下の場合は，リスト方式ＳＩＭＤ化制御行を挿入し，
前記マスク方式ＳＩＭＤ化制御行が挿入されている場合は，前記ＩＦ文の条件にかかわらず前記ＩＦ文の命令を順次ＳＩＭＤ演算器で並列に実行し前記ＩＦ文の条件が真でない場合の命令実行結果を破棄するように，コンパイラが前記チューニングプログラムをオブジェクトコードに変換し，
前記リスト方式ＳＩＭＤ化制御行が挿入されている場合は，前記コンパイラが，前記ループを，前記ＩＦ文の条件を満たすループ制御変数の値を配列に登録する第１のループと，前記配列のサイズだけ回転して前記ＩＦ文の命令を実行する第２のループとに変換する，付記４に記載のプログラム最適化プログラム。
【０１４８】
（付記６）
最適化対象のオリジナルプログラムをコンピュータに実行させて実行時の分析結果を含むプロファイル情報を収集する手段と，
前記プロファイル情報に基づいて演算待ち時間を算出する手段と，
前記演算待ち時間が第１の閾値より長い場合，前記オリジナルプログラムのループ内のＳＩＭＤ命令率が第２の閾値より低い場合に，前記ループ内のＩＦ文の命令をＳＩＭＤ化するＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入してチューニングプログラムを生成する手段と
を有するプログラム最適化装置。
【０１４９】
（付記７）
前記ＳＩＭＤ化制御行を前記オリジナルプログラムのループに挿入して前記チューニングプログラムを生成する手段は，前記ＩＦ文の命令を実行する条件が真になる真率が第３の閾値を超えている場合は，マスク方式ＳＩＭＤ化制御行を挿入し，前記真率が前記第３の閾値以下の場合は，リスト方式ＳＩＭＤ化制御行を挿入し，
前記マスク方式ＳＩＭＤ化制御行が挿入されている場合は，前記ＩＦ文の条件にかかわらず前記ＩＦ文の命令を順次ＳＩＭＤ演算器で並列に実行し前記ＩＦ文の条件が真でない場合の命令実行結果を破棄するように，コンパイラが前記チューニングプログラムをオブジェクトコードに変換し，
前記リスト方式ＳＩＭＤ化制御行が挿入されている場合は，前記コンパイラが，前記ループを，前記ＩＦ文の条件を満たすループ制御変数の値を配列に登録する第１のループと，前記配列のサイズだけ回転して前記ＩＦ文の命令を実行する第２のループとに変換する，付記１に記載のプログラム最適化装置。
【符号の説明】
【０１５０】
１６：最適化プログラム（コンパイラ，ライブラリ，ツール）
２０：オリジナルプログラム
２１：オブジェクトコード，実行可能バイナリコード
２２：最適化制御行データ
２３：チューニングプログラム
【図１】
0006331865.tif 000002
【図２】
0006331865.tif 000003
【図３】
0006331865.tif 000004
【図４】
0006331865.tif 000005
【図５】
0006331865.tif 000006
【図６】
0006331865.tif 000007
【図７】
0006331865.tif 000008
【図８】
0006331865.tif 000009
【図９】
0006331865.tif 000010
【図１０】
0006331865.tif 000011
【図１１】
0006331865.tif 000012
【図１２】
0006331865.tif 000013
【図１３】
0006331865.tif 000014
【図１４】
0006331865.tif 000015
【図１５】
0006331865.tif 000016
【図１６】
0006331865.tif 000017
【図１７】
0006331865.tif 000018
【図１８】
0006331865.tif 000019
【図１９】
0006331865.tif 000020
【図２０】
0006331865.tif 000021
【図２１】
0006331865.tif 000022
【図２２】
0006331865.tif 000023
【図２３】
0006331865.tif 000024
【図２４】
0006331865.tif 000025