JP2015141543A - ループ分割検出プログラム及びループ分割検出方法 - Google Patents

ループ分割検出プログラム及びループ分割検出方法 Download PDF

Info

Publication number
JP2015141543A
JP2015141543A JP2014013877A JP2014013877A JP2015141543A JP 2015141543 A JP2015141543 A JP 2015141543A JP 2014013877 A JP2014013877 A JP 2014013877A JP 2014013877 A JP2014013877 A JP 2014013877A JP 2015141543 A JP2015141543 A JP 2015141543A
Authority
JP
Japan
Prior art keywords
loop
division
loop division
program
variable
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.)
Granted
Application number
JP2014013877A
Other languages
English (en)
Other versions
JP6201788B2 (ja
Inventor
正樹 新井
Masaki Arai
正樹 新井
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 JP2014013877A priority Critical patent/JP6201788B2/ja
Priority to US14/603,410 priority patent/US9182960B2/en
Publication of JP2015141543A publication Critical patent/JP2015141543A/ja
Application granted granted Critical
Publication of JP6201788B2 publication Critical patent/JP6201788B2/ja
Expired - Fee Related 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
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4442Reducing the number of cache misses; Data prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3636Software debugging by tracing the execution of the program
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3692Test management for test results analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code

Landscapes

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

Abstract

【課題】キャッシュミスが少ないループ分割候補の集合をより効率的に抽出する。【解決手段】ループ分割検出プログラムは,ループ分割対象プログラムを,ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し,キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに,変換する手順と,試験プログラムをループ分割指定パラメータを変更しながら順次実行し,キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第1のループ分割候補群に抽出し,基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する手順と,ループ分割指定パラメータのループ分割を,第1のループ分割候補群内のループ分割候補のループ分割と比較し,キャッシュミス回数が基準回数を超えるループ分割を,試験プログラムの実行対象候補から除外する手順とを有する。【選択図】図3

Description

本発明は,ループ分割検出プログラム及びループ分割検出方法に関する。
ループ分割とは,アプリケーションプログラム内にあるサイズが大きいループを複数のループに分割することである。例えば,スーパーコンピュータが実行するHPC(High Performance Computing)アプリケーションプログラムなどは,サイズが大きいループを有している。そして,実行時間の殆どがこのループで消費されることが多い。大きいサイズのループは,一般的にキャッシュミスが多くなる。その理由は,第1に,大きいサイズのループは多くの命令を有しているので,命令キャッシュでのキャッシュミスが多くなる傾向にある。第2に,大きいサイズのループは多くの変数を有している場合が多く,その場合はデータキャッシュでのキャッシュミスも多くなる傾向にある。
そこで,大きなサイズのループに対して最適なループ分割を行うことにより,キャッシュミスを少なくし,プログラムの実行時間を短くすることができる場合がある。但し,ループ分割をした結果,ループ分割しない場合よりもキャッシュミスが多くなる場合もある。
一方で,コンパイラは,アプリケーションプログラムを最適化する機能を有する。最適化には,例えば,命令の並列化,複数の同じ命令を単一の命令に変更するSIMD(Single Instruction Multiple Data)化,命令の順番を入れ替えて複数の演算器によるパイプライン化を行うソフトウエアパイプライニング,そして,複数のループを単一のループに変更して複数ループによるオーバヘッド処理時間をなくすループアンローリングなどが知られている。
上記の最適化を行うことで,プログラムの実行時間を短くすることができる。但し,ループ分割を行うことで,各分割ループに対してより良い最適化を行うことができる場合がある。また,最適化によりプログラム実行時間を短くすることができるが,ループ分割してキャッシュミスを少なくしたプログラムに最適化を行うことで,プログラム実行時間がより短くなる場合がある。
したがって,ループ分割を行うだけでは,プログラムの実行時間を最短化することはできないし,最適化を行うだけでは,プログラム実行時間を最短化する解を求めることができるとは限らない。
特開2009−104422号公報 国際公開第98/19249号 特開平6−250846号公報 特開2001−5792号公報
中田育男,コンパイラの構造と最適化(第2版),朝倉書店,2009
そこで,ループ分割とプログラムの最適化とを組み合わせることで,最短のプログラム実行時間を有するプログラムを生成することが望ましい。しかしながら,ループ分割したプログラムのキャッシュミスが多い場合でも,分割されたループがコンパイラにとって最適化しやすいループ形状であれば,最適化の結果より高性能(短い実行時間)の結果が得られる場合がある。
最適なループ分割を検出するためには,理論的に可能な全てのループ分割について実行時間などの性能比較を行い,最も性能がよい結果を抽出すればよい。しかし,理論的に可能なループ分割の総数は膨大な数になるので,この総当たり方法で最適解を求めることは現実的ではない。
そこで,実施の形態の一つの目的は,キャッシュミスが少ないループ分割候補の集合をより効率的に抽出することができるループ分割検出プログラム及びループ分割検出方法を提供することにある。
開示された実施の形態の一つの側面は,ループ分割対象プログラムを,ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し,キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに,変換する手順と,
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し,前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第1のループ分割候補群に抽出し,前記基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する手順と,
前記ループ分割指定パラメータのループ分割を,前記第1のループ分割候補群内のループ分割候補のループ分割と比較し,前記キャッシュミス回数が前記基準回数を超えるループ分割を,前記試験プログラムの実行対象候補から除外する手順と,
を有する処理をコンピュータに実行させるループ分割検出プログラムである。
上記の側面によれば,キャッシュミスが少ないループ分割候補の集合を効率的に抽出することができる。
本実施の形態におけるループ分割検出方法を行う情報処理装置の構成図である。 図1のコンピュータのCPU1の概略構成を示す図である。 ループ分割プログラム5がコンピュータにより実行されることにより行われるループ分割処理のフローチャート図である。 コンピュータがソースコードトランスレータTを実行した場合の処理のフローチャート図である。 ループ分割対象プログラムPの一例を示す図である。 テンプレートコードTLの一例を示す図である。 テンプレートコードTLの編集を説明する図である。 ループコードトランスレータTによりループ分割対象プログラムPがソースコード変換された試験プログラムQを示す図である。 コンピュータがループ分割群検出プログラムEを実行した場合の処理のフローチャート図である。 図5のループ分割対象プルグラムPから,最大整数値m=2を有するループ分割指定djに基づいて生成されたループ分割されたプログラムPjを示す図である。 ループ分割対象プログラムPのサンプルプログラムを示す図である。 コンピュータがソースコードトランスレータTを実行することで,図11のループ分割対象プログラムPをソースコード変換して生成した試験プログラムQを示す図である。 d={0, 0, 0, 1, 1, 1, 2, 2, 2},MAX_MISS=999を与えられた試験プログラムQを示す図である。 図13と実質的に同じ試験プログラムQを示す図である。 ループ分割プログラムPjの例を示す図である。 変形例2におけるソースコードトランスレータTによる処理のフローチャート図である。 図16の処理X15のフローチャート図である。 変形例2を説明するための図である。 変形例2による一時配列の読み込み処理と書き込み処理を追加するプログラム例を示す図である。 変形例2による一時配列が追加された試験プログラムの例を示す図である。 変形例2による一時配列が追加された試験プログラムの例を示す図である。 処理X27で試す価値がないと判定されるループ分割指定パラメータdの例を示す図である。
図1は,本実施の形態におけるループ分割検出方法を行う情報処理装置の構成図である。図1に示された情報処理装置(コンピュータ)は,CPU1と,DRAMなどのメインメモリ2と,入出力装置3と,ハードディスク等の大容量の記憶装置4と,それらを接続するバスBUSとを有する。
記憶装置4は,オペレーティングシステムOSと,プログラムを最適化すると共にソースコードをオブジェクトコードに変換するコンパイラCMPとを記憶している。さらに,記憶装置4は,本実施の形態のループ分割処理をコンピュータに実行させるループ分割プログラム5を記憶する。
ループ分割プログラム5は,ループ分割対象プログラムPを試験プログラムQにソースコード変換するソースコードトランスレータTと,試験プログラムQを実行してループ分割の解の集合Aを出力するループ分割群検出プログラムEと,ループ分割の解にもとづいてループ分割されたループ分割プログラムの集合PSETを生成するループ分割プログラム生成プログラムFとを有する。
コンピュータのCPU1は,記憶装置4内のオペレーティングシステムOS,コンパイラCMP,プログラム群T, E, F, P, Q, PSETをメモリ2内に展開して,それらを実行する。
図2は,図1のコンピュータのCPU1の概略構成を示す図である。CPU1は,演算ユニット10と,キャッシュユニット20と,メモリコントローラ30とを有する。演算ユニット10は,実行中のプログラムの命令をメモリ2からフェッチする命令フェッチ11と,フェッチした命令をデコードするデコーダ12と,デコード結果に応じて演算する演算部13とを有する。キャッシュユニット20は,メインメモリ2内のデータを一時的に記憶する高速のキャッシュメモリ22と,演算ユニット10によるメモリアクセスに応答してアクセス先のデータがキャッシュメモリ22内にあるか否かを判定し,アクセスされたデータをキャッシュメモリ22に書き込み,アクセス頻度が少ないキャッシュメモリ内のデータをメインメモリ2に書き出すキャッシュコントローラ21と,キャッシュミスするたびにカウントアップするキャッシュミスカウンタ22とを有する。このキャッシュミスカウンタ22をカウント開始する命令,カウント終了する命令,カウント回数を読み出す命令などのキャッシュミス計測命令が,CPUのライブラリに登録されている。
[ループ分割処理の概略]
図3は,ループ分割プログラム5がコンピュータにより実行されることにより行われるループ分割処理のフローチャート図である。以下,このフローチャートにしたがって,本実施の形態のループ分割処理の概略を説明する。
ループ分割対象プログラムPは,例えば比較的大きなサイズのループを有するHPCアプリケーションプログラムなどである。コンピュータは,ループ分割プログラム5を実行することにより,ループ分割対象プログラムPを入力し,プログラムPの内部のループを複数の分割ループに分割したループ分割プログラムの集合PSETを出力する。
コンピュータは,ソースコードトランスレータTを実行することにより,ループ分割対象プログラムPを試験プログラムQにソースコード変換する(X1)。試験プログラムQは,ループ分割指定パラメータに基づいてループ分割対象プログラムP内のループをループ分割した複数の分割ループを有し,更に,試験プログラムQをコンピュータが実行したときにキャッシュミスの回数を計測するキャッシュミス計測命令を有する。キャッシュミス計測命令は,前述のとおり,CPUのライブラリに登録されている。
コンピュータは,ループ分割群検出プログラムEを実行することにより,試験プログラムQを,ループ分割指定パラメータを変更しながら順次実行し,キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えているループ分割候補を第1のループ分割候補群に抽出し,基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する(X2)。第2のループ分割候補群内のキャッシュミス回数が少ない上位N個のループ分割候補の集合が,ループ分割の解djの集合Aである。
コンピュータは,ループ分割プログラム生成プログラムFを実行することにより,集合A内のループ分割の解djに基づいてループ分割プログラムPjを生成し,ループ分割プログラムPjの集合PSETを生成する(X3)。ループ分割プログラムPjの集合PSETは,N個(Nは複数)のキャッシュミス回数が少ないループ分割されたプログラムの集合である。以上で,ループ分割処理が完了する。
そして,本実施の形態では,コンピュータが,最適化コンパイラCMPを実行することで,集合PSET内のN個のループ分割プログラムPjをそれぞれ最適化処理してコンパイルし,コンパイルされたオブジェクトコードを実行して実行時間を計測し,最高速のループ分割プログラムを検出する(X4)。
[ループ分割処理の詳細]
[ソースコードトランスレータTによる処理X1]
図4は,コンピュータがソースコードトランスレータTを実行した場合の処理のフローチャート図である。コンピュータが,ソースコードトランスレータTを実行することで,図4の処理を行う。まず,コンピュータは,ソースコードトランスレータTを実行することで,ループ分割対象プログラムPを入力する(X11)。そして,コンピュータは,ソースコードトランスレータTを実行することで,試験プログラムの元になるテンプレートコードTLを呼び出す(X12)。コンピュータは,ソースコードトランスレータTを実行することで,テンプレートコードTL内の変数を,ループ分割対象プログラムPに基づいて生成し,テンプレートコードTLに上書きすることで,テンプレートコードTLを編集する(X13)。そして,コンピュータは,ソースコードトランスレータTを実行することで,編集されたテンプレートコードTLを試験プログラムQとして出力する(X14)。これにより,ループ分割対象プログラムPが試験プログラムQにソースコード変換される。以下,各工程X11,X12,X13について,説明する。
図5は,ループ分割対象プログラムPの一例を示す図である。このループ分割プログラムPは,for文のループ内にn個の実行文S1-Snを有する。このループがループ分割対象のループである。
図6は,テンプレートコードTLの一例を示す図である。図7は,テンプレートコードTLの編集を説明する図である。
テンプレートコードTL内の00行の関数read_loop_group(‘分割番号変数名のリスト’) は,与えられるループ分割指定パラメータを読み込み,各分割番号変数に各実行文Sの分割番号をセットする関数文である。トランスレータTは,分割番号変数名のリストを,ループ分割対象ループ内の実行文の数だけ生成する。図5のように実行文がn個の場合は,分割番号変数名のリストは,図7(A)にリスト40で示すように,以下のようになる。
&GS1, &GS2,...&GSn
&GS1は実行文S1が属する分割ループの分割番号変数であり,&GS2は実行文S2が属する分割ループの分割番号変数であり,&GSnは実行文Snが属する分割ループの分割番号変数である。ループ分割指定パラメータについては後述する。
01行の関数read_max_miss(&MAX_MISS)は,キャッシュミス回数の最大値MAX_MISSを読み込む関数文である。このキャッシュミス回数の最大値MAX_MISSは,ループ分割の解djの集合Aである第2のループ分割候補群内のキャッシュミス回数が少ない上位N個のループ分割候補のうち,最もキャッシュミス回数が大きいループ分割候補のキャッシュミス回数である。この最大値MAX_MISSが,第1のループ分割候補群と第2のループ分割候補群とを区別する基準回数になる。
02行の関数start_cache_miss_count()は,キャッシュミスのカウントを開始処理し,10行の関数end_cache_miss_count()は,キャッシュミスのカウントを終了し,キャッシュミス回数を出力し,プログラムを終了させる処理を行う関数である。
03行の'分割数の最大値’は,分割対象ループ内の実行文Sの数nとする。図7(B)に分割数の最大値41で示すとおりである。つまり,図5の例では,分割対象ループ内の実行文Sはn個あり,全ての実行文Sを1個ずつ有するn個のループに分割したときに,分割数が最大値nになる。
04行の‘ループ本体部分のコード’は,図7(C)に示すように生成される。まず,トランスレータTは,外側のループ44として,図5に示したループ分割対象のループのコードである00行と04行のループコードをそのまま利用する。そして,このループ内は次のように作成する。すなわち,トランスレータTは,各実行文Siについて,図7(C)のコード42に示すように,次のコードを作成する。
if(G==GSi){Si;}
このコードは,0から分割数の最大値nまで変化する変数Gが,実行文Siの分割番号変数GSiと等しい場合に,実行文Siを実行することを意味する。これにより,各実行文Siは,自分が所属する分割番号の分割ループ内で実行される。
図7(C)に示された編集後のループ本体部分のコード43は,分割数の最大値nがn=3の例であり,実行文S1,S2,S3それぞれがコードif(G==GSi){Si;}に変換されている。
07行の関数not_promising(G)は,キャッシュミス回数が最大値MAX_MISSを超えた場合,超えたときの実行中の分割番号Gをファイルに出力して,プログラムを終了させる処理を行う。
図8は,ループコードトランスレータTによりループ分割対象プログラムPがソースコード変換された試験プログラムQを示す図である。図8の例は,図5のループ分割対象プログラムのループ内の実行文Siが3個(n=3)の例である。この試験プログラムQの動作の概略は次のとおりである。
まず,試験プログラムQにループ分割指定の候補を表す変数d(ループ分割指定パラメータd)と最大値MAX_MISSを与えて実行すると,複数の実行文Siが変数dに基づいて分割されて実行される。ループ分割指定パラメータdは,例えばd={0,0,1}などであり,この例は,実行文S1,S2が分割番号0の分割ループ内にあり,実行文S3が分割番号1の分割ループ内にあるようにループ分割することを指定する。つまり,ループ分割指定パラメータdは,分割対象ループ内の実行文Siの数だけ分割番号を指定する。
そして,00行の関数read_loop_group(&GS1,&GS2,&GS3)により,ループ分割指定パラメータd={0,0,1}の各分割番号は,分割番号変数GS1, GS2, GS3にセットされる。さらに,01行の関数read_max_miss(&MAX_MISS)により,最大値パラメータMAX_MISSが最大値変数MAX_MISSにセットされる。
さらに,コンピュータは,試験プログラムQを実行することにより,02行の関数start_cache_miss_count()により,キャッシュミスカウンタをカウント開始させる処理を行う。
そして,図8中に示したように,03行から12行のコードは,GS1=0, GS2=0, GS3=1により,実行文S1,S2のループと09-11行のキャッシュミス回数が最大値MAX_MISSを超えた場合に関数not_promising(G)を実行するコードとを有するループと,実行文S3のループと09-11行のコードとを有するループとに,ループ分割されて,実行される。
したがって,コンピュータは,試験プログラムQを実行することで,ループ分割指定パラメータdに基づいてループ内の実行文Siを単一または複数の分割ループに分割して実行する。そして,コンピュータは,各分割ループが終了する度にキャッシュミス回数が最大値MAX_MISS以上になったか否か判定し,以上になればその時の分割番号Gを出力して試験プログラムQを終了し,超えていなければ次の分割ループを実行する。そして,キャッシュミス回数が最大値未満のまま最後まで分割ループを実行すると,キャッシュミス回数を出力して試験プログラムQを終了する。
[ループ分割群検出プログラムEの処理X2]
次に,コンピュータが,ループ分割群検出プログラムEを実行することで,試験プログラムQをループ分割指定パラメータdを変更しながら順次実行し,キャッシュミスが少ない順のN個のループ分割候補を効率的に抽出する処理X2について説明する。
図9は,コンピュータがループ分割群検出プログラムEを実行した場合の処理のフローチャート図である。まず,コンピュータは,プログラムEを実行することで,ループ分割指定パラメータdをd={0,0,0,...0}で,キャッシュミス回数の最大値MAX_MISSを無限大(∞)で,削除データベースXを空で,それぞれ初期化する(X21)。次に,コンピュータは,プログラムEを実行することで,ループ分割指定パラメータdを試験プログラムQに与えて試験プログラムQを実行する(X22)。
コンピュータがループ分割指定パラメータdと最大値MAX_MISSを試験プログラムQに与えて実行すると,図8の試験プログラムQに示されるように,コンピュータは,ループ分割指定パラメータdが示す分割ループの分割番号毎に,分割ループ内の単一または複数の実行文Siを実行し(04-08行),キャッシュミス回数が最大値MAX_MISS以上になるとそのときの分割番号Gを出力するか(09-11行),全分割ループ内の実行文Siの実行を完了してキャッシュミス回数Mdを出力する(13行)。
したがって,コンピュータは,プログラムEを実行することで,処理X22の試験プログラムQを実行した結果の出力がキャッシュミス回数の値Mdの場合は,全実行文Siの実行を完了しキャッシュミス回数が最大値MAX_MISS未満であることを意味するので,候補のループ分割指定パラメータdとキャッシュミス回数Mdとをループ分割の解の集合Aに登録し,キャッシュミス回数が少ない順にソートする(X23)。そして,コンピュータは,ループ分割の解の集合A内のキャッシュミス回数Mdが少ない上位N個の候補を残して,残りを削除し,残したN個の候補のうち最下位のキャッシュミス回数Mdを最大値MAX_MISSにセットする(X23)。
一方,コンピュータは,プログラムEを実行することで,処理X22の出力が分割番号Gの場合は,全実行文Siの実行を完了せずG番目の分割ループを完了した時点でキャッシュミス回数が最大値MAX_MISS以上になったことを意味するので,ループ分割候補dと分割番号Gとからパターンデータxを作成し,パターンデータxを削除データベースXに登録する(X24)。パターンデータxの作成方法については,後述する。
コンピュータは,プログラムEを実行することで,処理X23またはX24の後に,次のループ分割指定パラメータdを求める(X25)。具体的には,ループ分割指定パラメータdをm桁のm進数と見なして,dを1増やす。例えば,分割指定パラメータdが
{0, 1, 2}
であれば,3桁の3進数とみなして1増やすことで,更新したdは
{0, 2, 0}
となる。
もし,ループ分割指定パラメータdが全部0になったら,全てのループ分割の候補を試したことを意味するので,コンピュータは,プログラムEを終了する(X26のYES)。
次に,コンピュータは,プログラムEを実行することで,次のループ分割指定パラメータdによる候補が,処理X22,X23,X24を試す価値があるか否かをチェックする(X27,X28,X29)。
第1の試す価値があるか否かのチェックX27では,コンピュータは,ループ分割指定パラメータdを構成する整数が0を含み,且つ連続する整数であるか否か判定する。この判定結果がYESであれば試す価値があるループ分割候補であるので次のチェック処理X27に進む。判定結果がNOであれば既に試されたループ分割と同じであるので,処理X25に進んで次のループ分割指定パラメータdを生成する。
図22は,処理X27で試す価値がないと判定されるループ分割指定パラメータdの例を示す図である。この例は,ループ分割指定パラメータdが3桁3進数の例であり,0を含まないdと,連続する整数でないdに対して,図中Xが印されると共に,重複する例が記されている。
例えば,d1={1, 2, 2}とd2={0, 1, 1}は,同じループ分割を表すので,0を含まないd1={1, 2, 2}は試す価値がない。また,d3={0, 2, 2}とd4={0, 1, 1}は,同じルー分割を表すので,連続した整数ではないd3={0, 2, 2}は試す価値がない。したがって,第1のチェックX27では,コンピュータは,ループ分割指定パラメータdを構成する整数が0を含み且つ連続する整数である場合に,試す価値があると判定して処理X28に進み,0を含まないかまたは連続しない整数かのいずれかに該当する場合に,試す価値がないと判定して処理X25に進む。
第2の試す価値があるか否かのチェックX28では,コンピュータは,ループ分割指定パラメータdによりループ分割された試験プログラムQを,データ依存解析して,適切なループ分割か否か判定する。ここで,データ依存解析とは,ループ分割された試験プログラムQ内の実行順序が,元のループ分割対象プログラムPのロジックを破壊しているか否かをチェックする解析であり,破壊している場合は,ループ分割された試験プログラムQのループ分割は不適切と判定される。不適切なループ分割と判定されると処理X25に進み,適切なループ分割と判定されると処理X29に進む。元のループ分割対象プログラムPのロジックを破壊する例として,変数を定義する文の前に変数を利用する文が実行されるように,変数の定義の後にその変数を利用するというロジックが逆転しているものがある。
第3の試す価値があるか否かのチェックX29では,コンピュータは,ループ分割指定パラメータdが,削除データベースX内のパターンデータxと一致するか否か判定する。この判定処理は,後で詳述するが,ループ分割指定パラメータdが既にキャッシュミス回数が最大値MAX_MISS以上になって途中終了したループ分割候補と同じ結果になるか否かを判定する。コンピュータは,同じ結果になると判定すれば(X29のYES),試す価値がないと判定して処理X25に進み,同じ結果になると判定されなければ(X29のNO),試す価値があると判定して処理X22に進んで,そのループ分割指定パラメータdで試験プログラムQを実行する。
[処理X24でのパターンデータxの生成処理と,処理X29での判定処理]
処理X24でのパターンデータxの生成処理は次の通りである。ループ分割候補dに対して,試験プログラムQの実行途中でキャッシュミス回数が最大値MAX_MISS以上になった場合に,分割番号Gが出力される。そこで,ループ分割指定パラメータdの中で分割番号G以下の番号を残し,それ以上の番号を記号?(?はワイルドカード)に変換する。例えば,d, Gが以下の場合に,
d={0, 0, 1, 1, 2, 2}
G=1
パターンデータxは次のようになる。
x={0, 0, 1, 1, ?, ?}
記号?は,分割番号Gより大きい整数を表す。
次に,処理X29でのループ分割指定パラメータdが,削除データベースX内のパターンデータxと一致するか否か判定処理は,次の通りである。処理X29では,コンピュータは,判定対象のループ分割指定パラメータdが,パターンデータxの?以外の整数が全て同じか否かを判定する。この判定で全て同じでなければ,候補dはパターンデータxに一致しないと判定する。もし同じと判定すれば,コンピュータは,更に,候補dの?部分の整数を検査する。即ち,コンピュータは,候補dの?部分の整数が全てパターンデータxが含む最大値よりも大きければ,候補dはパターンデータxに一致すると判定する。候補dの?部分の整数が1つでもパターンデータxが含む最大値以下の場合,候補dはパターンデータxに不一致と判定する。
例えば,前述のパターンデータx={0, 0, 1, 1, ?, ?}の場合,一致する候補dと一致しない候補dの例は,次の通りになる。
一致する候補dの例
d5={0, 0, 1, 1, 2, 2}
d6={0, 0, 1, 1, 2, 3}
一致しない候補dの例
d7={0, 0, 1, 1, 0, 0}
d8={0, 0, 1, 1, 1, 2}
候補d5,d6は,実行文S0,S1が分割番号0のループで実行され,実行文S2,S3が分割番号1のループで実行されるので,パターンデータx={0, 0, 1, 1, ?, ?}と同じように,分割番号1のループを終了した時点で,キャッシュミス回数が最大値MAX_MISS以上になることは明らかである。よって,候補d5,d6は,試す価値がないループ分割である。
しかし,候補d7は,実行文S0,S1,S4,S5が分割番号0のループで実行され,実行文S2,S3が分割番号1のループで実行されるので,必ずしもパターンデータx={0, 0, 1, 1, ?, ?}と同じ結果になるとは限らない。同様に,候補d8は,実行文S0,S1が分割番号0のループで実行され,実行文S2,S3,S4が分割番号1のループで実行されるので,必ずしもパターンデータx={0, 0, 1, 1, ?, ?}と同じ結果になるとは限らない。つまり,候補d8の実行文S2,S3,S4を同じループ内で実行した場合のキャッシュミス回数と,パターンデータxの実行文S2,S3を同じループ内で実行した場合のキャッシュミス回数とは,必ずしも一致しないからであり,候補d8のほうがキャッシュミス回数が少なくなる場合もあるからである。
図9のループ分割群検出プログラムEによる処理では,キャッシュミス回数の最大値MAX_MISSは,初期値の無限大(∞)から徐々に減少していくので,初期の段階では,ループ分割の解の集合A内には,キャッシュミス回数が大きいループ分割の候補dも含まれる。しかし,処理X23では,キャッシュミス回数Mdが少ない上位N個の候補dを残して,残りの候補を削除するので,キャッシュミス回数が少ない候補dを取りこぼすことはなく,最終的にキャッシュミス回数Mdが少ない上位N個の候補dを集合Aに残すことができる。
[ループ分割プログラム生成プログラムFの処理X3]
コンピュータが,ステップX3でループ分割プログラム生成プログラムFを実行することで,ループ分割プログラム集合のPSETを生成する処理について,以下に説明する。コンピュータは,プログラムFを実行することで,ループ分割検出プログラムEが検出したループ分割の解の集合A内の解djから,ループ分割プログラム集合PSETのループ分割されたプログラムPjを生成する。
ループ分割の解djからループ分割プログラムPjを生成する処理は,次の通りである。まず,ループ分割指定djが含む最大の整数値mを求める。最大の整数値mは,m+1個のループに分割されることを意味する。よって,ループ分割対象の元のプログラムPが図5の例であれば,図7(C)のループコード44のコピーをm+1個用意する。例えば,図5の例でm=2であれば,図10に示すようにループを3つ用意すれば良い。次に,図10内の'分割kの命令' の部分に(kは整数),ループ分割指定djが示す文をループ分割対象プログラムPからコピーして置けば良い。
図10は,図5のループ分割対象プルグラムPから,最大整数値m=2を有するループ分割指定djに基づいて生成されたループ分割されたプログラムPjを示す図である。図10の例では,3つのループ内に,それぞれに属する実行文Siが’分割kの命令’の中に記述される。
[サンプルプログラムについてのループ分割処理]
上記の説明で本実施の形態におけるループ分割処理が理解できた。そこで,以下,サンプルプログラムPについて,ループ分割処理をより具体的に説明する。
図11は,ループ分割対象プログラムPのサンプルプログラムを示す図である。このループ分割対象プログラムPは,分割対象ループであるfor文の中に実行文S1-S9が含まれている。
(1)図3の処理X1では,コンピュータがソースコードトランスレータTを実行することで,図11のループ分割対象プログラムPをソースコード変換して試験プログラムQを生成する。
図12は,コンピュータがソースコードトランスレータTを実行することで,図11のループ分割対象プログラムPをソースコード変換して生成した試験プログラムQを示す図である。すなわち,コンピュータは,ソースコードトランスレータTを実行して,図10のループ分割対象プログラムPを図12の試験プログラムQに変換する。試験プログラムQ内の各関数の意味は図6,8で説明した通りである。
そこで,図9で説明したとおり,コンピュータは,ループ分割群検出プログラムEを実行して,図12の試験プログラムQにループ分割指定dとキャッシュミス回数の最大値MAX_MISSを与えて実行する。そこで,一例として以下のパラメータd,MAX_MISSを与えたとする。
d={0, 0, 0, 1, 1, 1, 2, 2, 2}
MAX_MISS=999
図13は,d={0, 0, 0, 1, 1, 1, 2, 2, 2},MAX_MISS=999を与えられた試験プログラムQを示す図である。図13において,00行で分割番号変数GS1-GS9にループ分割指定パラメータdの値が設定され,01行でキャッシュミス回数の最大値MAX_MISSに999が設定されている。それ以外のソースコードは,図12と同じである。
図14は,図13と実質的に同じ試験プログラムQを示す図である。図14において,01-08行が分割番号0の分割ループであり,09-16行が分割番号1の分割ループであり,17-24行が分割番号2の分割ループである。各分割ループ内には,実行文S1-S3,S4-S6,S7-S9が埋め込まれている。
(2)図3,図9の処理X2では,コンピュータがループ分割群検出プログラムEを実行して,図14の試験プログラムQを実行する。試験プログラムQを実行すると,次の結果のいずれかになる。
第1の結果:キャッシュミス回数が最大値MAX_MISSより少ない場合に,キャッシュミスの回数Mdを出力して試験プログラムQを終了する(図9のX23)。
第2の結果:キャッシュミス回数が最大値MAX_MISS以上の場合に,キャッシュミス回数が最大値MAX_MISSに達したまたは越えた分割ループの分割番号Gを出力して試験プログラムQを終了する(図9のX24)。
第1の結果の場合は,コンピュータは,プログラムEを実行することで,ループ分割候補dをループ分割の解の集合Aに登録し,キャッシュミス回数が少ない順にソートし,キャッシュミス回数が少ない上位N個の候補dを残す。そして,次の候補のために,最下位のキャッシュミスの回数を最大値MAX_MISSにセットする(X23)。
第2の結果の場合は,コンピュータは,プログラムEを実行することで,ループ分割指定dと分割番号Gとからパターンデータxを作成し,削除データベースXに登録する(X24)。例えば,ループ分割してdと分割番号Gが次の場合は,
d={0, 0, 0, 1, 1, 1, 2, 2, 2}
G=1
パターンデータxは,次のとおりである。
x={0, 0, 0, 1, 1, 1, ?, ?, ?}
ここで,?はG=1より大きい任意の番号を意味する。このパターンデータxと一致するループ分割候補は,その試験プログラムQを実行してもキャッシュミス回数が最大値MAX_MISS以上になることが確定しているので,コンピュータは,試験プログラムを実行する候補から削除する(X29)。例えば,次のようなループ分割候補は,上記のパターンデータxと一致して削除対象になる。
d={0, 0, 0, 1, 1, 1, 2, 2, 3}
d={0, 0, 0, 1, 1, 1, 2, 3, 3}
d={0, 0, 0, 1, 1, 1, 2, 3, 4}
一方,次のようなループ分割候補は,上記のパターンデータxと一致せず試験プログラムQの実行対象になる。
d={0, 0, 0, 1, 1, 1, 0, 2, 2}
d={0, 0, 0, 1, 1, 1, 1, 2, 2}
上記のように,既に試験プログラムQを実行してキャッシュミス回数が最大値MAX_MISS以上になったパターンデータxと実行結果が同じになるループ分割候補を削除することで,無駄に試験プログラムQを実行する処理が行われず。コンピュータは,プログラムEを実行することで,効率的にキャッシュミスが少ないループ分割候補を検出することができる。
(3)図3の処理X3では,コンピュータがループ分割プログラム生成プログラムFを実行することで,集合Aのループ分割の解djに基づいて,集合PSETのループ分割プログラムPjを生成する。例えば,コンピュータが,プログラムEを実行することで,図11のループ分割プログラムPに対して求めたループ分割候補dが次の場合は,
d={0, 0, 1, 1, 1, 1, 2, 2, 2}
コンピュータは,プログラムFを実行することで,図15に示したループ分割プログラムPjを生成する。
図15は,ループ分割プログラムPjの例を示す図である。この例は,d={0, 0, 1, 1, 1, 1, 2, 2, 2}に基づいてループ分割されたプログラムPjである。プログラムPjは,文S1,S2,文S3-S6,文S7-S9にループ分割されている。
(4)図3の処理X4では,コンピュータが,集合PSET内のN個のループ分割プログラムPjを順に最適化コンパイラでコンパイルし,実行時間を評価し,最高速のループ分割プログラムを検出する。この処理X4では,一つのループ分割プログラムPjから,最適化コンパイラの複数の最適化戦略を利用することで,複数の結果を得ることができる。そして,その複数の結果から,最高速のプログラムを検出することでより高速のループ分割プログラムを検出することができる。
集合PSET内のN個のループ分割プログラムPjは,キャッシュミス回数が少ないことが保証済みであるので,これらのループ分割プログラムPjを元にして,各ループに個別の最適化を適用することで,最適化コンパイラの最適化処理だけでは得られなかった高い性能のプログラムを検出できる可能性がある。
[変形例1:ループ分割候補の絞り込み処理]
プログラムの意味を変更しないループ分割指定dの集合サイズは,一般的に巨大になる可能性がある。そこで,以下のようなループ分割候補の絞り込みをすることが望ましい。
第1の絞り込み方法は,次の通りである。ループを分割する場合に,ループ内の実行文Siの数が少ないループに分割することは,ループの回転処理のオーバヘッドが増えるので一般的に好ましくない。また,ループ内の実行文Siが多すぎるとキャッシュミス回数が増大して一般的に好ましくない。そこで,第1の絞り込み方法では,ループ内の実行文Siの数が最小値nmin以下のものを含むループ分割候補と,ループ内の実行文Siの数が最大値nmax以上のものを含むループ分割候補を,ループ分割候補から削除する。この削除処理は,図9の処理X27内で行うことが好ましい。
第2の絞り込み方法は,次の通りである。図9の処理X21ではキャッシュミス回数が最大値MAX_MISSの初期値を無限大に設定した。しかし,ループ分割が可能な候補の数が膨大になる場合は,この最大値MAX_MISSの初期値を任意の値uに設定して,処理X22による結果が最大値MAX_MISS=uより大きな回数の場合の候補dとキャッシュミス回数Mdがループ分割の解の集合Aに入らないようにする。そして,任意の初期値u未満のキャッシュミス回数で実行完了できるループ分割候補が少ないまたは存在しない場合は,初期値uを初期値より大きい値に変更して再度図9の処理を実行する。初期値uを適切に設定することで,ループ分割候補を適切に絞り込むことができ,より効率的にループ分割プログラムPjを検出することができる。
[変形例2:変数に対する一時配列の追加処理]
分割対象プログラム内の分割対象ループがスカラ変数を含む場合は,ループ分割した結果,第1の分割ループ内の変数を,別の第2の分割ループに引き渡す処理が必要になる。このような処理は,第1の分割ループ内にて変数を定義した後にその変数を一時配列に書き込む処理と,第2の分割ループ内にて一時配列を変数に読み出す処理を追加することにより可能になる。したがって,コンピュータは,ソースコードトランスレータTを実行することにより,スカラ変数に対して一時配列の書き込み文と読み込み文を追加する処理を行う。
図16は,変形例2におけるソースコードトランスレータTによる処理のフローチャート図である。また,図17は,図16の処理X15のフローチャート図である。図18は,変形例2を説明するための図である。図19は,変形例2による一時配列の読み込み処理と書き込み処理を追加するプログラム例を示す図である。そして,図20,図21は,変形例2による一時配列が追加された試験プログラムの例を示す図である。
図18のループ分割対象プログラム例51は,実行文S1で変数tmpが次のように定義されている。
S1: tmp=A[i]+B[i]
そして,実行文S2,S3で次のように変数tmpを利用している。
S2: C[i]=tmp*D[i]
S3: E[i]=tmp-C[i]
したがって,実行文S1がループ番号0に,実行文S2,S3がループ番号1,2などに分割されると,ループ番号0で,実行文S1の後に実行文S1で定義した変数tmpを一時的に一時配列に書き込む処理を行い,ループ番号1,2で,実行文S2,S3の前に一時配列を変数tmpに読み込む処理を行うことが必要になる。
図16に示した変形例2におけるソースコードトランスレータTによる処理のフローチャート図では,図4のフローチャートに処理X15が追加されている。処理X15以外の処理X11-X14は,図4と同じである。処理X15では,コンピュータは,実行文Siにスカラ変数vの一時配列Vの読み込み文と書き込み文を追加する。但し,追加が必要か否かは,後述するアルゴリズムにより行う。
図17は,処理X15のフローチャート図である。コンピュータは,前処理として,スカラ変数vの定義が重複して存在する場合は,重複するスカラ変数vをユニークな変数名に変換する(X151)。例えば,図18のプログラム52のように変数名tmpが重複して使用される場合がある。つまり,実行文S1は変数tmpを定義し,実行文S2,S3がその変数tmpを利用している。更に,実行文S4は変数tmpを使用して新たな変数tmpを定義し,実行文S5がその変数tmpを利用している。したがって,実行文S1-S3の変数tmpと実行文S4,S5の変数tmpとは,異なる変数であることが理解できる。
このような場合,上記の重複するが異なる変数tmpはユニークな変数名に変換する必要がある。プログラム53は,プログラム52内の2つの変数tmpを,tmp1とtmp2に変換した例である。
次に,処理X15では,コンピュータは,ループ分割対象プログラムPの各文Siについて,スカラ変数vの値を使用する実行文Siの集合USEを,スカラ変数毎に求める(X152)。スカラ変数vの値を使用する実行文とは,スカラ変数vが右辺に位置する実行文である。
次に,処理X15では,コンピュータは,ループ分割対象プログラムPの各文Siについて,スカラ変数vの値を定義する実行文Siの集合DEFを,スカラ変数毎に求める(X153)。スカラ変数vの値を定義する実行文とは,スカラ変数vが左辺に位置する実行文である。
図18のループ分割対象プログラムPの例では,集合USEと集合DEFは次の通りである。
USE={S2,S3}
DEF={S1}
次に,処理X15では,コンピュータは,各スカラ変数vに対して,それぞれ一時配列Vを導入する。一時配列Vとは,ループが繰り返し実行される場合に,それぞれのループiで生成されたスカラ変数vを配列する変数であり,ループが3回繰り返される場合は,3つのループで生成されたスカラ変数v1,v2,v3は,次のようになる。
v1=V[1]
v2=V[2]
v3=V[3]
次に,処理X15では,コンピュータは,ループ分割対象プログラムPのループ分割対象ループ内の各実行文Siを,一時配列Vを読み込む処理コードと,実行文Siと,一時配列Vを書き込む処理コードとを有するコードに変換する(X155)。この処理X155は,具体的には以下のとおりである。
(1)処理X155では,コンピュータは,各実行文Siを一般形式のコードに変換する。図19に一般形式のコード60が示されている。すなわち,一般形式のコード60は,図7のコード42の実行文Siの前に一時配列V[i]の読み込み処理のコード('V[i]の読み込み処理’)を追加し,実行文Siの後に一時配列V[i]の書き込み処理のコード('V[i]の書き込み処理’)を追加したコードである。
(2)処理X155では,コンピュータは,'V[i]の読み込み処理’の部分のコードを作成する。コンピュータは,(a)もし文Siが変数vを使用していなければ,この部分のコードは空白になる。つまり,文Siが変数vを使用していないので,事前に変数vに一時配列V[i]を読み込む(v = V[i])必要はないからである。更に,コンピュータは,(b)もし文Siが変数vを使用していれば,図19のコード61を作成する。
この図19のコード61は,if文内の条件,「同じ分割ループ内に,文Siより前に変数vを使用する文が存在せず,且つ文Siより前にvを定義する文が存在しない場合」に,読み込み文v=V[i];を実行するコードである。コンピュータは,if文内の上記の条件に対応するコードを,変数vを使用する文の集合USEと,変数vを定義する文の集合DEFを参照して,作成する。つまり,if文内の上記の条件は,図19のコード60内の実行文Siと同じ分割ループGSi内に,集合USEに存在する実行文Siより小さい番号の文が無く,且つ同じ分割ループGSi内に,集合DEFに存在する実行文Siより小さい番号の文が無い,である。
例えば,実行文S3が使用する変数vに対して,集合USEにS2,S4,S5が存在し,集合DEFにS1が存在する場合は,コンピュータは,上記の条件に対応するコードとして,「文S2の分割ループGS2が文S3の分割ループGS3と等しくなく,且つ文S1の分割ループGS1が文S3の分割ループGS3と等しくない」を示す次のコードを作成する。
GS3 != GS1 && GS3 != GS2
ここで,!=は等しくない,&&はANDを意味する。
つまり,「文S2の分割ループGS2が文S3の分割ループGS3と等しくなく,且つ文S1の分割ループGS1が文S3の分割ループGS3と等しくない」場合に,文S3が属する分割ループ内において文S3の前に変数vを使用する処理も定義する処理も存在しないので,文S3の直前で変数vを読み込む処理が必要になる。文S3が属する分割ループ内において文S3の前に変数vを使用する処理が存在すれば,変数vを使用する処理の直前で変数vを読み込む処理が追加されるので,文S3は変数vを使用することができる。また,文S3が属する分割ループ内において文S3の前に変数vを定義する処理が存在すれば,文S3は変数vを使用することが可能になる。
(3)処理X155では,コンピュータは,'V[i]の書き込み処理’の部分のコードを作成する。コンピュータは,(a)もし文Siが変数vを定義していなければ,この部分のコードは空白になる。つまり,文Siが変数vを定義していないので,直後に変数vを一時配列V[i]に書き込む(V[i] = v)必要はないからである。更に,コンピュータは,(b)もし文Siが変数vを定義していれば,図19のコード62を作成する。
この図19のコード62は,if文内の条件,「後の分割ループ内に,文Siより後に変数vを使用する文のどれかが存在する場合」に,書き込み文V[i]=v;を実行するコードである。コンピュータは,if文内の上記の条件に対応するコードを,変数vを使用する文の集合USEを参照して,作成する。つまり,if文内の上記の条件は,図19のコード60内の実行文Siの分割ループGSiの後の分割ループ内に,集合USEに存在する実行文Siより大きい番号の文が存在する,である。
例えば,文S3に対して,集合USEにS4,S5が存在する場合は,コンピュータは,上記の条件に対応するコードとして,「文S3の分割ループGS3が文S4の分割ループGS4と等しくなく,または文S3の分割ループGS3が文S5の分割ループGS5と等しくない」を示す次のコードを作成する。
GS3 != GS4 || GS3 != GS5
ここで,!=は等しくない,||はORを意味する。
つまり,「文S3の分割ループGS3が文S4の分割ループGS4と等しくなく,または文S3の分割ループGS3が文S5の分割ループGS5と等しくない」場合には,文S4またはS5は,文S3の分割ループGS3より後の分割ループGS4またはGS5で変数vを使用するので,文S3の分割ループGS3内で変数vを書き込む処理が必要になる。
なお,トランスレータTによる試験プログラムQを生成する処理の後,ループ分割指定パラメータdを変更しながら試験プログラムQを実行する処理で,実行文Siの実行順が前後反転する場合が起こりうる。したがって,文Siより前に実行される文と後に実行される文は,必ずしも文の番号によらない。しかし,データ依存解析(図9のX28)により,変数vを使用する文は必ず変数vを定義する文の後にしか存在しないことが保証される。したがって,上記の処理X155での(2)(3)の処理において,文Siより前に実行されるか後に実行されるかを考慮する必要はない。ただし,同じ分割ループ内であれば,文Siより前に実行される文の番号はSiより小さく,文Siより後に実行される文の番号はSiより大きいことは,ループ分割指定パラメータdに係わらず真である。
次に,図18の分割対象ループのコード51を例にして,ソースコード変換された試験プログラムQ'について説明する。図20がソースコード変換された試験プログラムQ'である。
コード51の例では,集合USE,DEFは次の通りであった。
USE={S2,S3}
DEF={S1}
したがって,図20の試験プログラムQ'では,05-10行の文S1のコードには,文S1の分割ループGS1が,文S2,S3の分割ループGS2,GS3のいずれかと等しくない場合に(07行),変数tmpを一時配列TMP[i]に書き込む処理,TMP[i]=tmp;(08行)が実行されるコード(07-09行)が追加されている。
更に,図20の試験プログラムQ'では,11-16行の文S2のコードには,文S2の分割ループGS2が,変数vを定義する文S1の分割ループGS1と等しくない場合に(12行),変数tmpに一時配列TMP[i]を読み込む処理,tmp=TMP[i];(13行)が実行されるコード(12-14行)が追加されている。
また,図20の試験プログラムQ'では,17-23行の文S3のコードには,文S3の分割ループGS3が,変数vを定義する文S1の分割ループGS1と等しくなく,且つ変数vを使用する文S2の分割ループGS2と等しくない場合に(18行),変数tmpに一時配列TMP[i]を読み込む処理,tmp=TMP[i];(19行)が実行されるコード(18-20行)が追加されている。
図21は,図20の試験プログラムQ'にループ分割パラメータd10,d11を与えた場合の試験プログラムQ'を示す図である。d10={0, 0, 1}の場合は,文S1,S2が同じ分割ループ内に存在し,文S3は異なる分割ループ内に存在する。そして,文S1の後に変数tmpを一時配列TMP[i]に書き込む処理,TMP[i]=tmp;(02行)が追加され,文S3の前に変数tmpに一時配列TMP[i]を読み込む処理,tmp=TMP[i];(06行)が追加されている。
一方,d10={0, 1, 1}の場合は,文S1が同じ分割ループ内に存在し,文S2,S3は異なる分割ループ内に存在する。そして,文S1の後に変数tmpを一時配列TMP[i]に書き込む処理,TMP[i]=tmp;(02行)が追加され,文S2の前に変数tmpに一時配列TMP[i]を読み込む処理,tmp=TMP[i];(05行)が追加されている。
このように,図20の試験プログラムQ'を作成することで,ループ分割パラメータdに基づいて,ループ分割群検出プログラムEにより実行される試験プログラムQ'を自動的に生成することができる。
以上説明したとおり,本実施の形態によれば,最初にキャッシュミスが少ないループ分割の解の集合を求め,次にコンパイラの最適化を行った解の実行時間を評価することで,より効率的に最小の実行時間を有するループ分割プログラムを検出することができる。
また,本実施の形態によれば,キャッシュミスが少ないループ分割の解の集合を求める処理中に,キャッシュミス回数が基準値以上の分割パターンに基づいて,キャッシュミス回数が改善される見込みのないループ分割候補を,キャッシュミス回数を計測するために実行するループ分割候補から削除するので,無駄な候補の実行が削減され,効率的にキャッシュミスが少ないループ分割候補を絞り込むことができる。
さらに,本実施の形態によれば,試験プログラムQをコンパイルしたオブジェクトコードをループ分割指定パラメータdを変更しながら実行すれば,全てのループ分割候補のキャッシュミス回数を計測できるので,試験プログラムQのコンパイルが一回で良く,キャッシュミスが少ないループ分割候補の絞り込みを効率的に行うことができる。
さらに,本実施の形態によれば,ループ分割が一時配列を利用する場合でも,その影響を考慮した試験プログラムQ’を生成するので,キャッシュミスが少ないループ分割候補の絞り込みを適切に行うことができる。
以上の実施の形態をまとめると,次の付記のとおりである。
(付記1)
ループ分割対象プログラムを,ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し,キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに,変換する手順と,
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し,前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第1のループ分割候補群に抽出し,前記基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する手順と,
前記ループ分割指定パラメータのループ分割を,前記第1のループ分割候補群内のループ分割候補のループ分割と比較し,前記キャッシュミス回数が前記基準回数を超えるループ分割を,前記試験プログラムの実行対象候補から除外する手順と,
を有する処理をコンピュータに実行させるループ分割検出プログラム。
(付記2)
更に,前記処理は,
前記第2のループ分割候補群内のループ分割候補から,前記キャッシュミス回数が少ない順に所望の候補数を残す手順と,
前記基準回数を,前記残されたループ分割候補の最大キャッシュミス回数に更新する手順とを有する付記1に記載されたループ分割検出プログラム。
(付記3)
前記抽出する手順では,前記キャッシュミス回数が基準回数を超えた分割番号と,前記ループ分割とを前記第1のループ分割候補群に登録し,
前記除外する手順では,前記ループ分割指定パラメータのループ分割と,前記第1のループ分割候補群内のループ分割とが,最初の分割番号から前記基準回数を超えた分割番号までのループ分割の組合せが一致する場合に,前記キャッシュミス回数が前記基準回数を超えるループ分割と判定する,
付記1に記載されたループ分割検出プログラム。
(付記4)
更に,前記処理は,
前記ループ分割指定パラメータに基づいて分割される分割ループ内の命令文の数が,第1の命令文数より少ないか,前記第1の命令文数より多い第2の命令文数より多いか,または前記第1の命令文数より少なく且つ前記第2の命令文数より多いか,のいずれかに該当する場合は,前記ループ分割指定パラメータのループ分割候補を,前記試験プログラムの実行対象候補から除外する手順を有する付記1に記載されたループ分割検出プログラム。
(付記5)
前記変換する手順では,前記ループ分割対象プログラム内の変数を使用する命令文の前に前記変数の一時配列変数を読み込む変数読み込み文を追加し,前記変数を定義する命令文の後に前記変数を一時配列変数に書き込む変数書き込み文を追加する,
付記1に記載されたループ分割検出プログラム。
(付記6)
前記変数読み込み文の追加は,前記変数を使用する命令文が属する分割ループ内に,前記変数を使用するまたは定義する命令文が存在しない場合に行い,
前記変数書き込み文の追加は,前記変数を定義する命令文が属する分割ループとは異なる分割ループ内に,前記変数を使用する命令文が存在する場合に行う,
付記5に記載されたループ分割検出プログラム。
(付記7)
ループ分割対象プログラムを,ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し,キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに変換する手順と,
前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し,前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えているループ分割候補を第1のループ分割候補群に抽出し,前記基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する手順を実行させる手順と,
前記ループ分割指定パラメータのループ分割を,前記第1のループ分割候補群内のループ分割候補のループ分割と比較し,前記キャッシュミス回数が前記基準回数を超えるループ分割を,前記試験プログラムの実行対象候補から除外する手順と,
を有する処理を,プロセッサに実行させるループ分割検出方法。
(付記8)
更に,前記処理は,
前記第2のループ分割候補群内のループ分割候補から,前記キャッシュミス回数が少ない順に所望の候補数を残す手順と,
前記基準回数を,前記残されたループ分割候補の最大キャッシュミス回数に更新する手順とを有する付記7に記載されたループ分割検出方法。
(付記9)
前記抽出する手順では,前記キャッシュミス回数が基準回数を超えた分割番号と,前記ループ分割とを前記第1のループ分割候補群に登録し,
前記除外する手順では,前記ループ分割指定パラメータのループ分割と,前記第1のループ分割候補群内のループ分割とが,最初の分割番号から前記基準回数を超えた分割番号までのループ分割の組合せが一致する場合に,前記キャッシュミス回数が前記基準回数を超えるループ分割と判定する,
付記7に記載されたループ分割検出方法。
P:ループ分割対象プログラム
Q:試験プログラム
A:ループ分割の解の集合
PSET:ループ分割プログラムの集合
T:ソースコードトランスレータ
E:ループ分割群検出プログラム
F:ループ分割プログラム生成プログラム
CMP:最適化コンパイラ
OS:オペレーションシステム

Claims (7)

  1. ループ分割対象プログラムを,ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し,キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに,変換する手順と,
    前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し,前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えたループ分割候補を第1のループ分割候補群に抽出し,前記基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する手順と,
    前記ループ分割指定パラメータのループ分割を,前記第1のループ分割候補群内のループ分割候補のループ分割と比較し,前記キャッシュミス回数が前記基準回数を超えるループ分割を,前記試験プログラムの実行対象候補から除外する手順と,
    を有する処理をコンピュータに実行させるループ分割検出プログラム。
  2. 更に,前記処理は,
    前記第2のループ分割候補群内のループ分割候補から,前記キャッシュミス回数が少ない順に所望の候補数を残す手順と,
    前記基準回数を,前記残されたループ分割候補の最大キャッシュミス回数に更新する手順とを有する請求項1に記載されたループ分割検出プログラム。
  3. 前記抽出する手順では,前記キャッシュミス回数が基準回数を超えた分割番号と,前記ループ分割とを前記第1のループ分割候補群に登録し,
    前記除外する手順では,前記ループ分割指定パラメータのループ分割と,前記第1のループ分割候補群内のループ分割とが,最初の分割番号から前記基準回数を超えた分割番号までのループ分割の組合せが一致する場合に,前記キャッシュミス回数が前記基準回数を超えるループ分割と判定する,
    請求項1に記載されたループ分割検出プログラム。
  4. 更に,前記処理は,
    前記ループ分割指定パラメータに基づいて分割される分割ループ内の命令文の数が,第1の命令文数より少ないか,前記第1の命令文数より多い第2の命令文数より多いか,または前記第1の命令文数より少なく且つ前記第2の命令文数より多いか,のいずれかに該当する場合は,前記ループ分割指定パラメータのループ分割候補を,前記試験プログラムの実行対象候補から除外する手順を有する請求項1に記載されたループ分割検出プログラム。
  5. 前記変換する手順では,前記ループ分割対象プログラム内の変数を使用する命令文の前に前記変数の一時配列変数を読み込む変数読み込み文を追加し,前記変数を定義する命令文の後に前記変数を一時配列変数に書き込む変数書き込み文を追加する,
    請求項1に記載されたループ分割検出プログラム。
  6. 前記変数読み込み文の追加は,前記変数を使用する命令文が属する分割ループ内に,前記変数を使用するまたは定義する命令文が存在しない場合に行い,
    前記変数書き込み文の追加は,前記変数を定義する命令文が属する分割ループとは異なる分割ループ内に,前記変数を使用する命令文が存在する場合に行う,
    請求項5に記載されたループ分割検出プログラム。
  7. ループ分割対象プログラムを,ループ分割指定パラメータに基づいて前記ループ分割対象プログラム内のループを複数の分割ループに分割し,キャッシュミスの回数を計測するキャッシュミス計測命令を有する試験プログラムに変換する手順と,
    前記試験プログラムを前記ループ分割指定パラメータを変更しながら順次実行し,前記キャッシュミス計測命令が計測したキャッシュミス回数が基準回数を超えているループ分割候補を第1のループ分割候補群に抽出し,前記基準回数を超えないループ分割候補を第2のループ分割候補群に抽出する手順を実行させる手順と,
    前記ループ分割指定パラメータのループ分割を,前記第1のループ分割候補群内のループ分割候補のループ分割と比較し,前記キャッシュミス回数が前記基準回数を超えるループ分割を,前記試験プログラムの実行対象候補から除外する手順と,
    を有する処理を,プロセッサに実行させるループ分割検出方法。
JP2014013877A 2014-01-29 2014-01-29 ループ分割検出プログラム及びループ分割検出方法 Expired - Fee Related JP6201788B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2014013877A JP6201788B2 (ja) 2014-01-29 2014-01-29 ループ分割検出プログラム及びループ分割検出方法
US14/603,410 US9182960B2 (en) 2014-01-29 2015-01-23 Loop distribution detection program and loop distribution detection method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014013877A JP6201788B2 (ja) 2014-01-29 2014-01-29 ループ分割検出プログラム及びループ分割検出方法

Publications (2)

Publication Number Publication Date
JP2015141543A true JP2015141543A (ja) 2015-08-03
JP6201788B2 JP6201788B2 (ja) 2017-09-27

Family

ID=53679110

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014013877A Expired - Fee Related JP6201788B2 (ja) 2014-01-29 2014-01-29 ループ分割検出プログラム及びループ分割検出方法

Country Status (2)

Country Link
US (1) US9182960B2 (ja)
JP (1) JP6201788B2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2017224038A (ja) * 2016-06-13 2017-12-21 富士通株式会社 キャッシュミス推定プログラム、キャッシュミス推定方法及び情報処理装置
JP2021018585A (ja) * 2019-07-19 2021-02-15 富士通株式会社 情報処理装置及び情報処理方法

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6201788B2 (ja) * 2014-01-29 2017-09-27 富士通株式会社 ループ分割検出プログラム及びループ分割検出方法
JP6492943B2 (ja) * 2015-05-07 2019-04-03 富士通株式会社 計算機、コンパイル方法、コンパイルプログラム、およびパイプライン処理プログラム

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001005792A (ja) * 1999-06-22 2001-01-12 Hitachi Ltd 並列化ループ決定方法
JP2003173262A (ja) * 2001-12-06 2003-06-20 Hitachi Ltd プログラムチューニングシステムとプログラムチューニング方法およびプログラムと記録媒体
JP2005122506A (ja) * 2003-10-17 2005-05-12 Matsushita Electric Ind Co Ltd コンパイラ装置

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3280449B2 (ja) 1993-03-01 2002-05-13 富士通株式会社 コンパイル装置
US5805863A (en) * 1995-12-27 1998-09-08 Intel Corporation Memory pattern analysis tool for use in optimizing computer program code
WO1998019249A1 (fr) 1996-10-30 1998-05-07 Hitachi, Ltd. Procede de distribution de donnees et de determination d'agencement pour ordinateurs en parallele et appareil de realisation de ce procede
US6675374B2 (en) * 1999-10-12 2004-01-06 Hewlett-Packard Development Company, L.P. Insertion of prefetch instructions into computer program code
US7107583B2 (en) * 2001-02-16 2006-09-12 Hewlett-Packard Development Company, L.P. Method and apparatus for reducing cache thrashing
CA2363182C (en) * 2001-11-19 2006-06-06 Ibm Canada Limited-Ibm Canada Limitee Automatic program restructuring to reduce average cache miss penalty
US9170812B2 (en) * 2002-03-21 2015-10-27 Pact Xpp Technologies Ag Data processing system having integrated pipelined array data processor
US7765534B2 (en) * 2004-04-30 2010-07-27 International Business Machines Corporation Compiler with cache utilization optimizations
US7669194B2 (en) * 2004-08-26 2010-02-23 International Business Machines Corporation Fine-grained software-directed data prefetching using integrated high-level and low-level code analysis optimizations
US7840914B1 (en) * 2005-05-13 2010-11-23 Massachusetts Institute Of Technology Distributing computations in a parallel processing environment
US8490065B2 (en) * 2005-10-13 2013-07-16 International Business Machines Corporation Method and apparatus for software-assisted data cache and prefetch control
JP5224498B2 (ja) * 2007-02-28 2013-07-03 学校法人早稲田大学 メモリ管理方法、情報処理装置、プログラムの作成方法及びプログラム
JP4339907B2 (ja) * 2007-10-24 2009-10-07 株式会社日立製作所 マルチプロセッサ向け最適コード生成方法及びコンパイル装置
US9189233B2 (en) * 2008-11-24 2015-11-17 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
JP6201788B2 (ja) * 2014-01-29 2017-09-27 富士通株式会社 ループ分割検出プログラム及びループ分割検出方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2001005792A (ja) * 1999-06-22 2001-01-12 Hitachi Ltd 並列化ループ決定方法
JP2003173262A (ja) * 2001-12-06 2003-06-20 Hitachi Ltd プログラムチューニングシステムとプログラムチューニング方法およびプログラムと記録媒体
JP2005122506A (ja) * 2003-10-17 2005-05-12 Matsushita Electric Ind Co Ltd コンパイラ装置

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2017224038A (ja) * 2016-06-13 2017-12-21 富士通株式会社 キャッシュミス推定プログラム、キャッシュミス推定方法及び情報処理装置
JP2021018585A (ja) * 2019-07-19 2021-02-15 富士通株式会社 情報処理装置及び情報処理方法
JP7230719B2 (ja) 2019-07-19 2023-03-01 富士通株式会社 情報処理装置及び情報処理方法

Also Published As

Publication number Publication date
JP6201788B2 (ja) 2017-09-27
US20150212804A1 (en) 2015-07-30
US9182960B2 (en) 2015-11-10

Similar Documents

Publication Publication Date Title
Shen et al. SeqKit: a cross-platform and ultrafast toolkit for FASTA/Q file manipulation
US11243816B2 (en) Program execution on heterogeneous platform
JP6605573B2 (ja) 並列ディシジョン・ツリー・プロセッサー・アーキテクチャ
JP6427592B2 (ja) データ型に関連するデータプロファイリング操作の管理
US9152389B2 (en) Trace generating unit, system, and program of the same
JP6141365B2 (ja) 逐次コンピュータプログラムコードを並列処理する方法及びシステム
Denti et al. ASGAL: aligning RNA-Seq data to a splicing graph to detect novel alternative splicing events
JP6201788B2 (ja) ループ分割検出プログラム及びループ分割検出方法
CN108197027B (zh) 软件性能优化方法、可存储介质、计算机、计算机程序
US11487535B2 (en) Ranking of software code parts
US10990073B2 (en) Program editing device, program editing method, and computer readable medium
JP2013214832A (ja) 圧縮及び伸長システム、圧縮装置、伸長装置、圧縮及び伸長方法、圧縮プログラム及び伸長プログラム
CN114237911A (zh) 基于cuda的基因数据处理方法、装置和cuda构架
US9715374B2 (en) Multi-branch determination syntax optimization apparatus
US10102099B2 (en) Performance information generating method, information processing apparatus and computer-readable storage medium storing performance information generation program
JP5936135B2 (ja) 情報処理装置、情報処理方法、及び、プログラム
US20160371068A1 (en) Computer that performs compiling, compiler program, and link program
CN114420209A (zh) 基于测序数据的病原微生物检测方法及***
CN113031952A (zh) 深度学习模型的执行代码的确定方法、装置及存储介质
US20170344351A1 (en) Information processing apparatus, compiling management method, and recording medium
WO2018150588A1 (ja) 情報処理装置、情報処理方法及び情報処理プログラム
JP6547345B2 (ja) テストケース生成プログラム、テストケース生成方法およびテストケース生成装置
CN116168765B (zh) 基于改进strobemer的基因序列生成方法及***
CN114091111B (zh) 一种区块链智能合约的存储方法及装置
US10534691B2 (en) Apparatus and method to improve accuracy of performance measurement for loop processing in a program code

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20161004

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20170721

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: 20170801

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170814

R150 Certificate of patent or registration of utility model

Ref document number: 6201788

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees