WO2005078579A1 - プログラム変換装置およびプログラム変換方法 - Google Patents

プログラム変換装置およびプログラム変換方法 Download PDF

Info

Publication number
WO2005078579A1
WO2005078579A1 PCT/JP2005/001670 JP2005001670W WO2005078579A1 WO 2005078579 A1 WO2005078579 A1 WO 2005078579A1 JP 2005001670 W JP2005001670 W JP 2005001670W WO 2005078579 A1 WO2005078579 A1 WO 2005078579A1
Authority
WO
WIPO (PCT)
Prior art keywords
loop
instruction
program
conversion
array
Prior art date
Application number
PCT/JP2005/001670
Other languages
English (en)
French (fr)
Inventor
Teruo Kawabata
Hajime Ogawa
Taketo Heishi
Yasuhiro Yamamoto
Shohei Michimoto
Original Assignee
Matsushita Electric Industrial Co., 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 Matsushita Electric Industrial Co., Ltd. filed Critical Matsushita Electric Industrial Co., Ltd.
Priority to JP2005517928A priority Critical patent/JPWO2005078579A1/ja
Priority to US10/565,530 priority patent/US20060248520A1/en
Publication of WO2005078579A1 publication Critical patent/WO2005078579A1/ja

Links

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

Definitions

  • the present invention relates to a program conversion device, and more particularly to a program conversion device for a processor provided with an instruction set including an instruction to wait for a predetermined response from an external device at the time of execution.
  • FIG. 17 is a diagram for explaining loop division processing when a plurality of array accesses exist in a loop.
  • FIG. 25 is a diagram for explaining a loop division process in a case where elements accessed in a loop are properly aligned on a main memory and V ⁇ .
  • FIG. 26 is a diagram for explaining loop division processing in a case where elements accessed in a loop are properly aligned on the main storage and V ⁇ .
  • FIG. 30 is a diagram for describing structural conversion for a loop other than the innermost loop.
  • FIG. 33 is a diagram for describing a simple loop splitting process when peeling is required when a PreTouch instruction is inserted.
  • the assembler 150 is a program that converts an assembler file 143 described in an assembler language into an object file 144 described in a machine language.
  • the linker 151 is a program that combines a plurality of object files 144 to generate an execution program 145.
  • FIG. 4 is a diagram showing a configuration of the compiler.
  • the compiler 149 includes a syntax analysis unit 182, an optimization information analysis unit 183, a general optimization unit 184, an instruction scheduling unit 185, a loop structure conversion unit 186, an instruction optimal arrangement unit 187, and a code output unit. 188.
  • Each configuration processing unit is realized as a program.
  • the optimization information analysis unit 183 is a processing unit that reads and analyzes information necessary for the optimization processing of the intermediate language such as the cache parameter 142, the profile data 147, the control options and the pragmas.
  • the general optimization unit 184 is a processing unit that performs general optimization processing on the intermediate code.
  • the instruction scheduling unit 185 is a processing unit that optimizes the order of instructions and performs instruction scheduling. Both compile options and pragmas are instructions to the compiler.
  • the syntax analysis process (SI), the optimization information analysis process (S2), the general optimization process (S3), the instruction scheduling process (S4), and the assembler code output process (S7) are general processes. The detailed description will not be repeated here.
  • LC indicates the number of cycles of latency
  • IC indicates the number of cycles per iteration
  • LCZIC indicates the number of loops in each loop when the loop is divided into a plurality of innermost loops
  • LB * LC / IC indicates the access capacity in each loop.
  • FIG. 8 is a flowchart showing details of the conditional inner loop splitting process (S32 in FIG. 6).
  • loop A In the prefetch instruction arrangement processing, the following processing is repeated for all loops (loop A). First, it is checked whether or not the loop of interest is a loop into which an instruction is to be inserted (S61). Information on whether or not the instruction insertion target loop is obtained from the analysis result of the loop structure conversion unit 186.
  • FIG. 15 shows an intermediate language program after inserting a prefetch instruction into the intermediate language program shown in FIG.
  • a prefetch instruction (dpref) is newly inserted inside the basic block starting with [BGNBBLK] B4!
  • dpref & A [i + 32]
  • the number of loops of the innermost loop included in the program 302 is divided by the ratio of the element sizes of the array A and the array B.
  • both array A and array B have the same element size. Therefore, the innermost loop is divided into two equal parts as in a program 303 shown in FIG. 17 (c), and the innermost loop is divided into two innermost loops with 16 loops.
  • a prefetch instruction is inserted immediately before each innermost loop.
  • a prefetch instruction (dpref (& A [i + 32])) for prefetching an element of array A for one line is inserted, and immediately before the second innermost loop. Is inserted with a prefetch instruction (dpref (& B [i + 32])) for prefetching an element of array B for one line.
  • the program size of the machine instruction finally generated is reduced. Can be smaller.
  • the processing speed may be slightly lower than that of the copy type.
  • FIG. 18 is a diagram for explaining a loop division process when a plurality of array accesses exist in a loop.
  • a peeling convolution process is performed on the program 312 to obtain a program 315 as shown in FIG. 18 (e).
  • the peeling convolution process is the same as that described with reference to FIG.
  • a program 316 shown in FIG. 18 (f) is created so as to divide the number of loops of the innermost loop by the ratio of the element size of array A and array B, and to conditional branch the number of loops.
  • the value of the variable K is changed alternately, and the value of the loop counter N is changed to correspond to the value of the variable K.
  • the pre-fetching is performed in the conditional branch expression so that the elements of the array A and the array B are alternately pre-fetched one line at a time as the value of K changes. ⁇ Insert a switch command.
  • FIG. 19 is a diagram for explaining the loop division processing when a plurality of array accesses exist in a loop and the sizes of the array elements are not all the same.
  • the value of the variable K is set in the range from 0 to 2 for each innermost loop processing. Then, the number of loops N of the innermost loop is set to one of 22, 21 and 21 by the conditional branching process using the value of the variable K. After that, the innermost loop of the loop number N is executed.
  • a prefetch instruction (dpref (& A [i + 64]) is executed, and the value of the variable K becomes 1 In this case, the prefetch instruction (dp ref (& A [i + 96])) is executed. If the value of the variable K is 2, the prefetch instruction (dpref (& B [i + 64])) is executed. Perform optimization.
  • FIG. 23 is another diagram for explaining the loop division processing of the loop processing in which the number of loops is indefinite.
  • n 32— (A & Mask)>> Cor ⁇ ' ⁇ (3)
  • a program 403 as shown in FIG. 27C is generated. Also, as shown in FIG. 27D, an optimized program 404 can be obtained by inserting a prefetch instruction (dpref (& A [i + 32])).
  • the loop processing is duplicated, and the prefetch instruction is executed outside the innermost loop. For this reason, it is possible to prevent useless issuance of the prefetch instruction, and it is possible to improve the processing speed during program execution. Further, by duplicating the loop processing, the number of cycles from execution of the prefetch instruction to execution of the next prefetch instruction can be secured. For this reason, the latency can be hidden and the interlock can be prevented.
  • the instructions arranged by the instruction optimum arranging unit 187 are not limited to the prefetch instructions, but may be ordinary memory access instructions or instructions that activate external processing and wait for the processing result. It may be a response waiting instruction, an instruction that may result in an interlock as a result of execution, or an instruction that requires a plurality of cycles before a predetermined resource can be referred to after execution.
  • the response waiting command includes not only a command that always waits for a response, but also a command that may or may not wait for a response.
  • a connoir system that outputs a code that conceals the latency of various processes and prevents interlocking, using a CPU of a computer without a cache as a target processor, may be used.
  • a program 526 as shown in FIG. 34 (c) is generated. Further, as shown in FIG. 34 (d), an optimized program 528 is obtained by inserting a cache area reservation instruction (PreTouch (& A [i])).

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

 インターロックを引き起こす可能性のある命令を無駄に発行せずに、プログラム実行時の処理速度を向上させるコンパイラは、実行時にインターロックを起こす可能性のある命令を備えたプロセッサ向けのコンパイラであって、入力プログラムに対し、ループ回数がx回のループをループ回数がy回のループに分割し、前記ループ回数がy回のループを内側ループとし、ループ回数がx/y回のループを外側ループとする二重ループ変換を行うループ構造変換部(186)と、前記二重ループ変換後のプログラムに対して、インターロックを起こす可能性のある命令の配置を行う命令最適配置部(187)としてコンピュータを機能させることを特徴とする。                                                                                 

Description

明 細 書
プログラム変換装置およびプログラム変換方法
技術分野
[0001] 本発明はプログラム変換装置に関し、特に実行時に外部力もの所定の応答を待つ 命令を含む命令セットを備えたプロセッサ向けのプログラム変換装置に関する。 背景技術
[0002] 近年、プロセッサの処理速度は急激に向上している力 それに比べてメインメモリの アクセス速度向上は小さぐ両者の速度差は年々大きくなつている。このため、情報 処理装置の高速処理においてメモリアクセスがボトルネックとなることが従来指摘され ている。
[0003] この問題を解消するために、記憶階層の考え方力 キャッシュ機構が用いられてい る。キャッシュ機構では、プロセッサで必要とされるデータを主記憶から高速なキヤッ シュへ予め転送(プリフェッチ)しておく。これにより、プロセッサからのメモリアクセスに 高速に対応することが可能である。
[0004] し力し、プロセッサがキャッシュ上に無いデータにアクセスした場合にはキャッシュミ スが発生してしまう。このため、主記憶からキャッシュへのデータの転送時間がかかつ てしまうという問題がある。
[0005] ユーザがキャッシュを意識することなくプログラミングを行い、そのプログラムが実行 されれば、このようなキャッシュミスが頻発することが想定される。その結果、キャッシュ ミスによるペナルティがプロセッサの性能を大きく劣化させることになる。そのため、コ ンノイラがキャッシュを考慮した最適化を行う必要がある。
[0006] キャッシュ最適化の技術の一つとしてプリフェッチ命令の挿入が挙げられる。プリフ エッチ命令とは、あるメモリアドレスの参照が起こる前に、そのアドレスのデータを前も つて主記憶力もキャッシュへ転送しておくものである。プリフェッチ命令の挿入による 最適化では、当該メモリアドレスの参照が起こる少し前のサイクルにプリフェッチ命令 の挿入をおこなうものである。
[0007] 例えば、図 1 (a)に示すようなループ処理に対しては、図 1 (b)に示すようにデータ が参照されるまでのレイテンシを考慮し、数イタレーシヨン先で参照されるデータをプ リフエツチするようにプリフェッチ命令 (dpref O )がループ内に挿入される。なお、ここ では、 int型の配列 aの要素は 4バイト、キャッシュのラインサイズを 128バイトとする。 発明の開示
発明が解決しょうとする課題
[0008] し力し、図 1 (b)に示すコードでは、 1イタレーシヨンにつき配列 aの参照とプリフェツ チとがそれぞれ行われている力 参照は 4byteずつしか行われないのに対して、プリ フェッチは 1ライン(128byte)単位で行われる。
[0009] よって、 1回のプリフェッチで 32回分の参照に対応できるため、残り 31回は無駄に プリフェッチが行われていることになる。すなわち、同じラインのプリフェッチ命令を連 続発行してしまっている。
[0010] また、プロセッサによっては、 dpref命令によるデータ転送中に、次の dpref命令を 実行しょうとすると、前の dpref命令による主記憶力 キャッシュへのデータ転送が終 了していないにもかかわらず、次の dpref命令が発行されてしまい、本来インターロッ クを解消するために dpref命令を挿入したにも関わらず、インターロックが起こってし まつ。
[0011] よって、上記のようにループの 1イタレーシヨンが短ぐ 2つの dpref命令の間隔が短 いと、 dpref命令による主記憶力もキャッシュへのデータ転送に力かる時間(レイテン シ)が顕在化し、力えって性能を悪ィ匕させてしまう。
[0012] また、 dpref命令の実行時以外であっても、メモリアクセス命令などのように、命令発 行後に何らかの応答待ちが発生するような命令の場合であっても、インターロックを 起こす可能性がある。
[0013] 本発明は、上述の課題を解決するためになされたもので、インターロックを引き起こ す可能性のある命令を無駄に発行せずに、プログラム実行時の処理速度を向上させ るプログラム変換装置およびプログラム変換方法を提供することを目的とする。
[0014] また、命令発行後に何らかの応答待ちが発生する命令を無駄に発行せずに、プロ グラム実行時の処理速度を向上させるプログラム変換装置およびプログラム変換方 法を提供することを目的とする。 [0015] また、プログラム実行時にインターロックを引き起こさないプログラム変換装置およ びプログラム変換方法を提供することを目的とする。 課題を解決するための手段
[0016] 上記目的を達成するために、本発明に係るプログラム変換装置は、実行時に外部 力もの所定の応答を待つ命令を含む命令セットを備えたプロセッサ向けのプログラム 変換装置であって、入力プログラムに含まれる繰返し回数力 回のループを、繰返し 回数力 回のループを内側ループとし、繰返し回数力 Zy回のループを外側ループ とするネスト構造への変換である二重ループ変換を行うループ構造変換手段と、前 記内側ループの外部の位置に、前記命令を配置することにより、当該命令を含む出 力プログラムに変換する命令配置手段とを備えることを特徴とする。
[0017] これにより、例えば図 2に示すように、図 1 (a)に示すようなループ処理を二重ルー プ化し、最内ループの外側にプリフェッチ命令を挿入することができる。これにより、 無駄なプリフェッチ実行がなくなる。よって、処理速度が向上する。また、ある dpref命 令が実行されてカゝら次の dpref命令が実行されるまでの間に、主記憶からキャッシュ へのデータ転送に力かるレイテンシを隠蔽することが可能になり、インターロックが生 じにくくなる。
[0018] すなわち、本発明によると、ループを二重化することにより、内側ループの外側でィ ンターロックを起こす可能性のある命令を実行するようにすれば、当該命令を無駄に 発行せずに、プログラム実行時の処理速度を向上させることができる。
[0019] また、ループを二重化することにより、インターロックを起こす可能性のある命令を発 行してから次のインターロックを起こす可能性のある命令までの間のサイクル数を確 保することができる。このため、プログラム実行時にインターロックを引き起こしにくくな る。
[0020] なお、プログラム変換装置は、コンパイラ、 OS (Operating System)、または CP
U等の集積回路として実現可能である。
[0021] 応答待ち命令には、上述した dpref命令のようにインターロックを起こす可能性のあ る命令や、命令実行時に外部からの所定の応答を待つ命令の他に、応答を待つ場 合と待たな!、場合とがある命令も含む。 [0022] なお、本発明は、このような特徴的な手段を備えるプログラム変換装置として実現す ることができるだけでなぐプログラム変換装置が備える特徴的な手段をステップとす るプログラム変換方法として実現したり、プログラム変換装置としてコンピュータを機能 させるプログラムとして実現したりすることもできる。そして、このようなプログラムは、 C D— ROM (Compact Disc-Read Only Memory)等の記録媒体やインターネット等の伝 送媒体を介して流通させることができるのは言うまでもない。
発明の効果
[0023] 本発明によると、プログラム実行時の処理速度を向上させることができる。
また、プログラム実行時にインターロックを引き起こしに《なる。
図面の簡単な説明
[0024] [図 1]図 1は、従来の最適化技術の問題点を説明するための図である。
[図 2]図 2は、本発明によるループ処理の構造変換を説明するための図である。
[図 3]図 3は、本実施の形態に係るコンパイラシステムの構成を示す図である。
[図 4]図 4は、コンパイラの構成を示す図である。
[図 5]図 5は、コンパイラが実行する処理のフローチャートである。
[図 6]図 6は、ループ構造変換処理の詳細を説明するための図である。
[図 7]図 7は、コピー型内側ループ分割処理の詳細を示すフローチャートである。
[図 8]図 8は、条件型内側ループ分割処理の詳細を示すフローチャートである。
[図 9]図 9は、プリフェッチ命令配置処理の詳細を示すフローチャートである。
[図 10]図 10は、プリフェッチ命令挿入処理の詳細を示すフローチャートである。
[図 11]図 11は、ピーリングが必要な 、場合のシンプルループ分割処理にっ 、て説明 するための図である。
[図 12]図 12は、ピーリングが必要のない場合のソースプログラムの一例を示す図であ る。
[図 13]図 13は、図 12に示したソースプログラムに対応する中間言語のプログラムを 示す図である。
[図 14]図 14は、図 13に示された中間言語のプログラムを二重ループに構造変換し た後の中間言語のプログラムを示す図である。 [図 15]図 15は、図 14に示された中間言語のプログラムにプリフェッチ命令を挿入した 後の中間言語のプログラムを示す図である。
[図 16]図 16は、ピーリングが必要な場合のシンプルループ分割処理について説明す るための図である。
[図 17]図 17は、ループ内に複数の配列アクセスが存在する場合のループ分割処理 について説明するための図である。
[図 18]図 18は、ループ内に複数の配列アクセスが存在する場合のループ分割処理 について説明するための図である。
[図 19]図 19は、ループ内に複数の配列アクセスが存在し、かつ配列の要素のサイズ がすべて同じではない場合のループ分割処理について説明するための図である。
[図 20]図 20は、ループ内に複数の配列アクセスが存在し、かつ配列の要素のサイズ がすべて同じではない場合のループ分割処理について説明するための図である。
[図 21]図 21は、ループ内にストライドが異なる複数の配列アクセスが存在する場合の ループ分割処理について説明するための図である。
[図 22]図 22は、ループ回数が不定なループ処理のループ分割処理を説明するため の図である。
[図 23]図 23は、ループ回数が不定なループ処理のループ分割処理を説明するため の他の図である。
圆 24]図 24は、ループ分割が不要な場合の最適化処理を説明するための図である
[図 25]図 25は、ループ内でアクセスされる要素が主記憶上で適切にァラインされて Vヽな 、場合のループ分割処理を説明するための図である。
[図 26]図 26は、ループ内でアクセスされる要素が主記憶上で適切にァラインされて Vヽな 、場合のループ分割処理を説明するための図である。
[図 27]図 27は、ァラインされていない配列要素を動的に特定して、ループ処理の最 適化を行う処理について説明するための図である。
[図 28]図 28は、ァラインされていない配列要素を説明するための図である。
[図 29]図 29は、ァラインされていない配列要素をプロファイル情報を用いて特定し、 ループ処理の最適化を行う処理について説明するための図である。
[図 30]図 30は、最内ループ以外のループに対する構造変換について説明するため の図である。
[図 31]図 31は、プラグマ「# pragma —loop— tiling— dpref 変数名 [,変数名]」 により変数が指定された場合の最適化処理について説明するための図である。
[図 32]図 32は、 PreTouch命令挿入時におけるピーリングが必要ない場合のシンプ ルループ分割処理について説明するための図である。
[図 33]図 33は、 PreTouch命令挿入時におけるピーリングが必要な場合のシンプル ループ分割処理について説明するための図である。
[図 34]図 34は、ァラインされていない配列要素を動的に特定して、ループ処理の最 適化を行う処理について説明するための図である。
符号の説明
141 ソースプログラム
142 キャッシュノ ラメータ
143 アセンブラフアイノレ
144 才ブジェクトフアイノレ
145 実行プログラム
146 実行ログデータ
147 プロファイルデータ
148 コンノイラシステム
149 コンパイラ
150 アセンブラ
151 リンカ
152 シミュレータ
153 プロファイラ
181 最適化補助情報
182 構文解析部
183 最適化情報解析部 184 一般最適化部
185 命令スケジューリング部
186 ループ構造変換部
187 命令最適配置部
188 コード出力部
発明を実施するための最良の形態
[0026] [システム構成]
図 3は、本実施の形態に係るコンパイラシステムの構成を示す図である。コンパイラ システム 148は、 C言語等の高級言語で記述されたソースプログラム 141を機械語の 実行プログラム 145に変換するソフトウェアシステムであり、コンパイラ 149と、ァセン ブラ 150と、リンカ 151とを含む。
[0027] コンパイラ 149は、キャッシュを備えるコンピュータの CPU (Central Processing Unit)をターゲットプロセッサとし、ソースプログラム 141をアセンブラ言語で記述され たアセンブラファイル 143に変換するプログラムである。コンパイラ 149は、ソースプロ グラム 141をアセンブラファイル 143に変換する際に、キャッシュのラインサイズやレイ テンシサイクル等に関する情報であるキャッシュパラメータ 142や、後述するプロファ ィルデータ 147に基づいて、最適化処理を行い、アセンブラファイル 143を出力する
[0028] アセンブラ 150は、アセンブラ言語で記述されたアセンブラファイル 143を機械語で 記述されたオブジェクトファイル 144に変換するプログラムである。リンカ 151は、複数 のオブジェクトファイル 144を結合し、実行プログラム 145を生成するプログラムであ る。
[0029] 実行プログラム 145の開発ツールとして、シミュレータ 152およびプロファイラ 153が 用意されている。シミュレータ 152は、実行プログラム 145をシミュレートし、実行時の 各種実行ログデータ 146を出力するプログラムである。プロファイラ 153は実行ログデ ータ 146を解析し、プログラムの実行順序等を解析したプロファイルデータ 147を出 力するプログラムである。
[0030] [コンパイラの構成] 図 4は、コンパイラの構成を示す図である。コンパイラ 149は、構文解析部 182と、 最適化情報解析部 183と、一般最適化部 184と、命令スケジューリング部 185と、ル ープ構造変換部 186と、命令最適配置部 187と、コード出力部 188とを含む。各構 成処理部は、プログラムとして実現される。
[0031] 構文解析部 182は、ソースプログラム 141を入力として受け、構文解析処理を行つ た後、中間言語のプログラムを出力する処理部である。
[0032] 最適化情報解析部 183は、キャッシュパラメータ 142、プロファイルデータ 147、コ ンノィルオプションおよびプラグマなどの中間言語の最適化処理に必要な情報を読 み込み、解析する処理部である。一般最適化部 184は、中間コードに一般的な最適 化処理を施す処理部である。命令スケジューリング部 185は、命令の並びを最適化し 、命令スケジューリングを行う処理部である。コンパイルオプションおよびプラグマは いずれもコンパイラに対する指示である。
[0033] ループ構造変換部 186は、一重ループを二重ループに変換する処理部である。命 令最適配置部 187は、変換された二重ループ内にプリフェッチ命令を配置する処理 部である。コード出力部 188は、最適化された中間言語仕様のプログラムをァセンブ ラ言語で記述されたプログラムに変換してアセンブラファイル 143を出力する処理部 である。
[0034] [処理の流れ]
次に、コンパイラ 149の実行する処理の流れについて説明する。図 5は、コンパイラ 149が実行する処理のフローチャートである。
[0035] 構文解析部 182は、ソースプログラム 141の構文解析を行い、中間コードを生成す る(Sl)。最適化情報解析部 183は、キャッシュパラメータ 142、プロファイルデータ 1 47、コンノィルオプションおよびプラグマなどを解析する(S2)。一般最適化部 184 は、最適化情報解析部 183における解析結果に従い、一般的な中間コードの最適 化を行う(S3)。命令スケジューリング部 185は、命令のスケジューリングを行う(S4)。 ループ構造変換部 186は、中間コードに含まれるループ構造に着目し、必要であれ ば一重ループ構造を二重ループ構造に変換する(S5)。命令最適配置部 187は、ル ープ構造内で参照されるデータをプリフェッチする命令を中間コードに挿入する(S6 ) oコード出力部 188は、中間コードをアセンブラコードに変換し、アセンブラファイル
143として出力する(S7)。
[0036] 構文解析処理 (SI)、最適化情報解析処理 (S2)、一般的な最適化処理 (S3)、命 令スケジューリング処理 (S4)およびアセンブラコード出力処理 (S7)は、一般的な処 理と同様であるため、その詳細な説明はここでは繰返さない。
[0037] 以下、ループ構造変換処理(S5)およびプリフェッチ命令配置処理(S6)について 詳細に説明する。
[0038] 図 6は、ループ構造変換処理(図 5の S6)の詳細を説明するための図である。ルー プ構造変換部 186は、ループ回数が即値で与えられており算出可能であるか、それ 以外の変数等で与えられており算出不可能であるかを判断する(S11)。すなわち、 ループ回数が固定であるか不定であるかを判断する。
[0039] ループ回数が不定の場合には(SI 1で NO)、プラグマまたはコンパイルオプション により最低のループ回数の指定がある力またはプログラム実行時に動的にループ回 数を判定し、ループ分割をする旨の指定があるかについて判断する(S12)。
[0040] V、ずれかの指定がある場合 (S 12で YES)またはループ回数が固定値の場合には
(S 11で YES)、ループ内で参照されている配列の添え字が解析可能か否かについ て調べる(S13)。すなわち、ループカウンタがある規則性を持って変化している場合 には解析可能であると判断される。例えば、ループカウンタの値力 タレーシヨン内で 書換えられるような場合には、解析不可能であると判断される。
[0041] 添え字が解析可能である場合には(S 13で YES)、ループ処理内で参照される各 配列について 1イタレーシヨンで参照される要素のバイト数を求め、そのうち最小の値 LBを導出する(S14)。
[0042] 次に、キャッシュのラインサイズ CSを値 LBで割った値が 1よりも大きいか否か判断 する(S15)。 CSZLBの値が 1よりも大きい場合には(S15で YES)、ループ処理の 配列がァラインされている力否かを調べる(S16)。配列がァラインされているか否か の判断は、プラグマやコンノィルオプション等によりァラインされているとの指示があ る力否かにより判断される。
[0043] 配列がァラインされていない場合には(S17で NO)、「LB * LCZIC」が CSよりも 大きいか否かについて判断する(S 16)。ここで、 LCは、レイテンシのサイクル数を示 し、 ICは 1イタレーシヨンあたりのサイクル数を示す。「LCZIC」は、ループを複数の 最内ループに分割した場合の各ループのループ回数を示しており、「LB * LC/IC 」は、各ループでのアクセス容量を示している。
[0044] 「LB * LCZIC」がラインサイズ CSよりも大きい場合には、(S16で YES)、分割後 の各ループ処理では 1ラインサイズ以上の要素の参照が行われる。このため、分割要 因をサイクルとし、各ループ処理を二重ループ化した際の最内ループのループ回数 DTを次式(1)に従い導出する(S18)。
[0045] DT= (LC-1) /IC+ 1 …ひ)
「LB * LC/ICJがラインサイズ CS以下の場合(S 16で NO)または配列がァライン されている場合には(S 17で YES)、分割要因をサイズとし、各ループ処理を二重ル ープ化した際の最内ループのループ回数 DTを次式(2)に従い導出する(S19)。
[0046] DT= (CS-1) /LB+ 1 - -- (2)
最内ループのループ回数 DTが導出処理(S 18または S 19)後、最内ループのル ープ回数 DTが 1よりも大きいか否か判断される(S20)。 DTが 1の場合には(S20で NO)、最内ループのループ回数 DTが 1回であるため、ループを二重ループに構造 変換する必要がない。このため、ループ構造変換処理 (S 5)を終了させる。
[0047] 最内ループのループ回数 DTが 2以上の場合には(S20で YES)、ループを二重ル ープに構造変換した場合の外側のループ構造が作成される(S21)。外側ループ構 造を生成する際に、ピーリング処理が必要力否かを判断する(S22)。ピーリング処理 およびピーリング処理が必要力否かの判断方法については後述する。
[0048] ピーリング処理が必要な場合には(S22で NO)、ピーリング処理を行 、、ピーリング コードを生成する(S24)。その後、コンパイルオプション「一 0」または「一 Os」による指 定があるか否かを調べる(S25)。ここで、コンパイルオプション「一 0」は、プログラムサ ィズおよび実行処理速度ともに平均的なアセンブラコードをコンノイラに出力させる ための指示である。コンパイルオプション「一 Os」は、プログラムサイズ抑制を重視した アセンブラコードをコンパイラに出力させるための指示である。
[0049] ピーリング処理する必要がないか(S22で YES)またはコンパイルオプション「一 0」 または「一 Os」の指定がな!、場合には(S25で NO)、内側ループ (最内ループ)のル ープ回数の条件式を生成する(S23)。
[0050] コンパイルオプション「一 0」または「一 Os」の指定がある場合には(S25で YES)、ピ 一リングされたループ処理を二重ループに畳み込み、最内ループのループ回数の 条件式を生成する(S26)。
[0051] 最内ループのループ回数条件生成処理(S23、 S26)の後、最内ループにおける 参照の対象配列は 1つであるか否力調べられる(S27)。最内ループにおける参照の 対象配列が 1つの場合には、(S27で YES)、ループ構造変換処理 (S5)を終了する
[0052] 最内ループにおける参照の対象配列が 2つ以上ある場合には(S27で NO)、最内 ループの分割個数を導出し、分割後の各最内ループのループ回数の比率を決定す る(S28)。その後、分割後の最内ループ回数 DTを分割個数で割った値が 1よりも大 きいか否力判断する(S29)。すなわち、当該値が 1以下の場合には(S29で NO)、 分割後の各ループ回数が 1回以下であるため、分割する意味がない。このため、ル ープ構造変換処理 (S5)を終了させる。
[0053] 当該値が 1よりも大きい場合には(S29で YES)、分割後の各ループ回数が 2回以 上である。この場合には、コンパイルオプション「一 0」または「一 Ot」による指定がある か否かを調べる(S30)。コンパイルオプション「一 Ot」は、実行処理速度向上を重視し たアセンブラコードをコンパイラに出力させるための指示である。
[0054] コンパイルオプション「一 0」または「一 Os」による指定がある場合には(S30で YES) 、後述する実行処理速度向上を重視したコピー型内側ループ分割処理 (S31)を実 行し、ループ構造変換処理 (S5)を終了する。
[0055] コンパイルオプション「一 0」または「一 Os」による指定がない場合には(S30で NO)、 後述するプログラムサイズ抑制を重視した条件型内側ループ分割処理 (S32)を実行 し、ループ構造変換処理 (S5)を終了する。
[0056] 図 7は、コピー型内側ループ分割処理(図 6の S31)の詳細を示すフローチャートで ある。
[0057] 最内ループのループ回数 DTを分割個数で割った値を細分割後内側ループ回数 とする(S41)。次に、内側ループを分割個数分だけ複製し、生成する(S42)。その 後、細分割後の各内側ループ回数を細分割後内側ループ回数に修正する(S43)。 さらに、 DTを分割個数で割った剰余を細分割後の先頭ループのループ回数に加算 し (S44)、コピー型内側ループ分割処理を終了する。
[0058] 図 8は、条件型内側ループ分割処理(図 6の S32)の詳細を示すフローチャートであ る。
[0059] 最内ループのループ回数 DTを分割個数で割った値を細分割後内側ループ回数 とする(S51)。次に、内側ループ回数条件の切換え switchテーブルを生成する(S5 2)。すなわち、内側ループ回数を順次切り替えるように、 C言語で言うところの switc h文を生成する。なお、 if文であってもよい。
[0060] テーブル生成後、細分割後の各内側ループ回数条件を細分割後の内側ループ回 数に修正する(S53)。その後、 DTを分割個数で割った剰余を細分割後の先頭ルー プの回数条件に加算し (S54)、条件型内側ループ分割処理を終了する。
[0061] 図 9は、プリフェッチ命令配置処理(図 5の S6)の詳細を示すフローチャートである。
[0062] プリフェッチ命令配置処理では、すべてのループについて以下の処理を繰返す( ループ A)。まず、着目しているループが命令挿入対象のループであるか否かを調べ る(S61)。命令挿入対象のループであるか否かの情報は、ループ構造変換部 186 の解析結果より取得される。
[0063] 命令挿入対象のループの場合には(S61で YES)、そのループに対して条件型ル ープ分割が行われて 、るか否かを調べる(S62)。条件型ループ分割が行われて!/ヽ れば、各条件文における命令挿入位置を解析し (S63)、プリフ ツチ命令を挿入す る(S64)。命令挿入対象のループに対して条件型ループ分割が行われていなけれ ば(S62で NO)、そのループに対してコピー型ループ分割が行われているか否かを 調べる(S65)。コピー型ループ分割が行われていれば(S65で YES)、そのループ の手前の命令挿入位置を解析する(S66)。その後、プリフ ツチ命令が挿入される( S67)。ピーリングされたループの場合には(S68で YES)、当該ループの手前に命 令挿入するように命令挿入位置が解析され (S69)、その位置にプリフ ツチ命令が 挿入される(S70)。 [0064] 図 10は、プリフェッチ命令挿入処理(図 9の S64、 S67および S 70)の詳細を示すフ ローチャートである。
[0065] 命令挿入処理では、挿入命令、挿入位置、挿入アドレス等カゝらなる情報リストがす ベて空になるまで以下を繰返す (ループ B)。
[0066] プリフェッチ命令を挿入しょうとして 、る配列要素がァライン済みである力否かを判 断する(S72)。ァラインされていなければ(S72で NO)、サイクル要因に従ってルー プ分割されたものであるの力、サイズ要因に従ってループ分割されたものであるのか を調べる(S73)。
[0067] ァライン済みであるか(S72で YES)またはサイクル要因でループ分割されたもので あれば(S73で YES)、 1ライン先のデータをプリフェッチする命令を挿入する(S74) 。ァラインされておらず、かつサイズ要因でループ分割されたものであれば(S73で N 0)、 2ライン先のデータをプリフ ツチする命令を挿入する(S75)。最後に、解析済 みの情報を情報リストから削除する(S76)。
[0068] [コンパイルオプション]
コンパイラシステム 148では、コンパイラに対するコンパイルオプションとして、ォプ シヨン「一 fno— loop— tiling— dpref」が用意される。このオプションが指定されれば、プ ラグマの指定に関わらず、ループに対する構造変換は行わない。本オプションの指 定がなければ、構造変換の実施はプラグマ指定の有無に従う。
[0069] [プラグマ指定]
本指定は、直後のループに対するものである。
[0070] プラグマ「 # pragma —loop— tiling— dpref 変数名 [,変数名 ]」により変数が指 定された場合には、プラグマ指定された変数のみに着目してループ分割を行う。指 定する変数は、配列でも、ポインタでもよい。
[0071] プラグマ「 # pragma —loop— tiling— dpref— all」によりループが指定された場 合には、ループ内で参照される配列の全てに着目して構造変換が行われる。
[0072] 以下、いくつかの具体的曲面におけるループ分割処理について説明する。なお、 以降の処理では、説明の簡単ィ匕のため C言語によるプログラム記述を行っているが、 実際には中間言語による最適化処理が行われる。 [0073] [シンプルループ分割]
図 11は、ピーリングが必要な 、場合のシンプルループ分割処理にっ 、て説明する ための図である。
[0074] 図 11 (a)に示すようなソースプログラム 282が入力された場合について考える。この ソースプログラム 282では、配列 Aの要素が順次参照され、変数 sumに加算される。 ここで、配列 Aの各要素のサイズは 4バイトであるものとし、キャッシュの 1ラインサイズ は 128バイト(以降の説明でも、キャッシュのラインサイズは 128バイトであるものとす る。)であるものとする。すなわち、キャッシュの 1ラインには配列 Aの要素が 32個記憶 される。また、ソースプログラム 282に含まれるループのィテレーシヨンの回数 128回 は、 32の整数倍である。このため、ソースプログラム 282は、図 11 (b)のプログラム 28 4に示すように、二重ループに構造変換することができる。すなわち、最内ループで は 32回の繰り返し処理を行い、その外のループでは、最内ループを 4回繰返すルー プ処理を行う。最内ループ処理ではキャッシュの 1ライン分のデータが参照される。そ の後、図 11 (c)のプログラム 286に示されるように、最内ループの実行前に、プリフエ ツチ命令 (dpref (&A[i+ 32]) )が挿入される。プリフェッチ命令を挿入することによ り、最内ループ実行時には、当該ループで参照される配列 Aの要素がキャッシュに乗 つて ヽること〖こなる。
[0075] 図 12—図 15は、ピーリングが不要なシンプルループ分割処理における中間言語 の推移を説明するための図である。
[0076] 図 12は、図 11 (a)と同様に、ピーリングが必要のない場合のソースプログラムの一 例を示す図である。図 13は、図 12に示したソースプログラム 240に対応する中間言 語のプログラムである。 [BGNBBLK]と [ENDBBLK]とで挟まれた内部の命令列が 1つの基本ブロックに対応しており、 [BGNBBLK] B1で始まる基本ブロックが forル ープの直前までの処理を示しており、 [BGNBBLK] B2で始まる基本ブロックが for ループを示しており、 [BGNBBLK] B3で始まる基本ブロックが forループの後の処 理を示している。
[0077] 図 14は、図 13に示された中間言語のプログラムを二重ループに構造変換した後の 中間言語のプログラムを示している。 [BGNBBLK] B2で始まる基本ブロックが最内 ループに対応しており、 [BGNBBLK]B4および [BGNBBLK]B5で始まるループ がその外側のループに対応して 、る。
[0078] 図 15は、図 14に示された中間言語のプログラムにプリフェッチ命令を挿入した後の 中間言語のプログラムを示している。プログラム 270では、 [BGNBBLK]B4で始まる 基本ブロックの内部にプリフェッチ命令(dpref)が新たに挿入されて!、る。
[0079] 図 16は、ピーリングが必要な場合のシンプルループ分割処理について説明するた めの図である。
[0080] 図 16 (a)に示すようなソースプログラム 292が入力された場合について考える。この ソースプログラム 292では、配列 Aの要素が順次参照され、変数 sumに加算される。 ここで、配列 Aの各要素のサイズは 4バイトであるものとする。すなわち、キャッシュの 1 ラインには配列 Aの要素が 32個記憶される。また、ソースプログラム 292に含まれる ループのィテレーシヨンの回数は 140回であるものとする。すなわち、 1ラインに記憶 される配列 Aの要素数 32で割った場合に余りが出る数である。
[0081] このような場合には、図 16 (b)に示すプログラム 294のように、 140を 32で割った余 りのループ回数をピーリングし、それ以外の部分を図 11 (b)と同様に二重ループ構 造に構造変換する。その後、ピーリングされた部分を二重ループ構造に含ませるた めのピーリング畳み込み処理を行い、図 16 (c)に示すようなプログラム 296が得られ る。すなわち、通常状態では最内ループで 32回の繰り返し処理が行われ、最後に最 内ループが実行される場合には、残りの 12 ( = 140— 128)回の繰り返し処理が行わ れる。その後、図 16 (d)のプログラム 298に示されるように、最内ループの実行前に、 プリフ ツチ命令(dpref ( & A [i + 32] ) )が挿入される。
[0082] [複数配列アクセスが存在する場合 (ピーリング必要なし) ]
図 17は、ループ内に複数の配列アクセスが存在する場合のループ分割処理につ いて説明するための図である。
[0083] 図 17 (a)に示すようなソースプログラム 301が入力された場合について考える。この ソースプログラム 301では、配列 Aおよび配列 Bの要素が順次参照され、当該要素同 士の積が変数 sumに加算される。ここで、配列 Aおよび配列 Bの各要素はそれぞれ 4 バイトであるものとする。すなわち、キャッシュの 1ラインには配列 Aの要素が 32個記 憶される。または、配列 Bの要素が 32個記憶される。すなわち、 1ラインに格納される 要素数は配列 Aと配列 Bとで同じである。また、ソースプログラム 301に含まれるルー プのィテレーシヨンの回数 128回は、 32の整数倍である。このため、ソースプログラム 301は、図 17 (b)のプログラム 302に示すように、ピーリングをすることなく二重ルー プに構造変換することができる。
[0084] 複数配列アクセスが存在する場合の二重ループ構造は、コピー型と呼ばれる実行 処理速度を向上させるための最適化と、条件型と呼ばれるプログラムサイズを小さく するための最適化との二種類がある。
[0085] まず、コピー型の最適化について説明する。プログラム 302に含まれる最内ループ のループ回数を配列 Aと配列 Bとの要素の大きさの比で分割する。ここでは、配列 A と配列 Bとはともに同じ要素の大きさである。したがって、図 17 (c)に示すプログラム 3 03のように最内ループを二等分し、ループ回数が 16回の最内ループ 2つに分割す る。次に、図 17 (d)のプログラム 304に示すように、各最内ループの直前にプリフェツ チ命令を挿入する。最初の最内ループの直前には、 1ライン分の配列 Aの要素をプリ フ ツチするためのプリフ ツチ命令(dpref (&A[i+ 32] ) )が挿入され、 2番目の最 内ループの直前には、 1ライン分の配列 Bの要素をプリフェッチするためのプリフェツ チ命令(dpref ( & B [i+ 32] ) )が挿入される。
[0086] このようにプリフェッチ命令間にループ処理を挿入させることにより、異なる配列に 対するプリフェッチ命令が連続することが無くなり、プリフェッチ命令実行によるレイテ ンシを隠蔽することができる。このため、実行処理速度を向上させることができる。
[0087] 次に、条件型の最適化について説明する。条件型の場合も、コピー型の場合と同 様にして最内ループのループ回数を配列 Aと配列 Bとの要素の大きさの比で分割す る。ただし、プログラム 303のように最内ループを 2つ並べるのではなぐ図 17 (e)に 示すプログラム 305のように最内ループの個数は 1つであり、そのループ回数を条件 分岐させるようにしている。すなわち、変数 K= lの場合と、 Κ=0の場合とで最内ル ープのループ回数 Νを変えるようにしている。ただし、この例では変数 Κの値に関係 なく最内ループの回数 Νは 16回となっている。次に、図 17 (f)に示すプログラム 306 のように、 K= lの場合には配列 Αの要素を 1ライン分プリフェッチし、 K=0の場合に は配列 Bの要素を 1ライン分プリフェッチするように条件分岐式およびプリフェッチ命 令の挿入が行われる。なお、ここでは、最適化によりループ回数 Nは即値 16に置き 換えられている。
[0088] このように、最内ループの個数を 1つにし、条件分岐式で最内ループのループ回数 およびプリフェッチ命令を変えるようにすることにより、最終的に生成される機械 令のプログラムサイズを小さくすることができる。ただし、条件分岐処理があるため、コ ピー型に比べて処理速度が多少遅くなる可能性がある。
[0089] [複数配列アクセスが存在する場合 (ピーリング必要) ]
図 18は、ループ内に複数の配列アクセスが存在する場合のループ分割処理につ いて説明するための図である。
[0090] 図 18 (a)に示すようなソースプログラム 311が入力された場合について考える。この ソースプログラム 311では、配列 Aおよび配列 Bの要素が順次参照され、当該要素同 士の積が変数 sumに加算される。ここで、配列 Aおよび配列 Bの各要素はそれぞれ 4 バイトであるものとする。すなわち、キャッシュの 1ラインには配列 Aの要素が 32個記 憶される。または、配列 Bの要素が 32個記憶される。すなわち、 1ラインに格納される 要素数は配列 Aと配列 Bとで同じである。また、ソースプログラム 311に含まれるルー プのイタレーシヨンの回数は 140回であるものとする。
[0091] したがって、ソースプログラム 311を二重ループに構造変換する場合には、図 16 (b )に示したプログラム 294と同様、図 18 (b)に示すようにピーリング処理されたプロダラ ム 312が生成される。
[0092] コピー型の最適化を行う際には、配列 Aと配列 Bとの要素の大きさの比で最内ルー プを分割する。すると、図 18 (c)に示すプログラム 313が生成される。次に、図 18 (d) のプログラム 314に示すように、最初の最内ループの直前には、 1ライン分の配列 A の要素をプリフェッチするためのプリフェッチ命令(dpref (&A[i+ 32] ) )が挿入され 、 2番目の最内ループの直前には、 1ライン分の配列 Bの要素をプリフェッチするため のプリフェッチ命令(dpref (&B[i+ 32]) )が揷入される。なお、ピーリング処理され た最終ループの直前にはプリフェッチ命令は挿入されない。これは、その前の二重 ループ処理におけるプリフェッチ命令実行により所望のデータがキャッシュにプリフエ ツチされている力 である。
[0093] 条件型の最適化を行う際には、プログラム 312に対してピーリング畳み込み処理を 行い、図 18 (e)に示されるようなプログラム 315を得る。ピーリング畳み込み処理は、 図 16を参照して説明したものと同様である。次に、最内ループのループ回数を配列 Aと配列 Bとの要素の大きさの比で分割し、当該ループ回数を条件分岐させるように 図 18 (f)に示すプログラム 316を作成する。プログラム 316においては、変数 Kの値 を交互に変更させ、変数 Kの値に対応するようにループカウンタ Nの値を変化させる 。次に、図 18 (g)のプログラム 317に示すように、 Kの値の変化に伴い、配列 Aおよび 配列 Bの要素を 1ライン分ずつ交互にプリフ ツチするように、条件分岐式中にプリフ ヱツチ命令を挿入する。
[0094] このように、ピーリングが必要な場合であっても、コピー型の場合にはピーリングの 部分を二重ループとは別のループにし、条件型の場合には、条件分岐式によりピー リングの場合のループカウンタの回数を変えるようにすることにより、ループ内に複数 の配列アクセスがあり、かつピーリングが必要な場合であっても、プリフェッチによるレ ィテンシを考慮した最適化を行うことができる。
[0095] [サイズが異なる複数配列アクセスが存在する場合 (ピーリング必要なし) ]
図 19は、ループ内に複数の配列アクセスが存在し、かつ配列の要素のサイズがす ベて同じではない場合のループ分割処理について説明するための図である。
[0096] 図 19 (a)に示すようなソースプログラム 321が入力された場合を考える。ここで、配 列 Aの要素は 4バイト、配列 Bの要素は 2バイトとする。すなわち、キャッシュの 1ライン には配列 Aの要素が 32個、配列 Bの要素が 64個記憶される。
[0097] この場合、要素サイズの小さ!/、配列 Bに着目し、配列 Bの要素に応じたループの構 造変換を行う。すなわち、図 19 (b)のプログラム 322のように、最内ループのループ 回数を 1ラインに収まるキャッシュ Bの要素数 64にし、二重ループに構造変換する。 最内ループでは、配列 Bに関しては 1ライン分の要素が消費される力 配列 Aに関し ては 2ライン分の要素が消費されることになる。このため、最内ループ処理を実行する ためには合計 3ライン分のデータが必要になる。
[0098] このため、コピー型の最適化を行う際には、図 19 (c)のプログラム 323に示すように 、最内ループを 3つに分割し、図 19 (d)のプログラム 324に示すように、各最内ルー プの直前にプリフェッチ命令を挿入する。ここでは、 1番目の最内ループの直前には 、 2ライン先の配列 Aの要素をプリフェッチするプリフェッチ命令(dpref (&A[i+64] ) )を挿入し、 2番目の最内ループの直前には 3ライン先の配列 Aの要素をプリフェツ チするプリフェッチ命令(1 ;[(&八 + 96]) )を揷入し、 3番目の最内ループの直 前には 1ライン先の配列 Bの要素をプリフェッチするプリフェッチ命令(dpref (&B[i + 64]) )を挿入している。また、 3つの最内ループのループ回数を処理順に 22、 21 および 21としている。これは、最外ループの条件分岐判断が 3番目の最内ループ実 行後に行われるため、 3番目の最内ループのループ回数を少なくすることにより、全 体としての処理速度を向上させるためである。
[0099] また、条件型の最適化を行う際には、図 19 (e)のプログラム 325に示すように、 1回 の最内ループ処理につき、変数 Kの値を 0から 2までの範囲内で更新させ、変数 Kの 値による条件分岐処理により最内ループのループ回数 Nを 22、 21および 21のうち のいずれかに設定する。その後、ループ回数 Nの最内ループを実行させる。次に、 図 19 (f)のプログラム 326に示すように、変数 Kの値が 0の場合にはプリフェッチ命令 (dpref ( & A [i + 64] ) )を実行させ、変数 Kの値が 1の場合にはプリフ ツチ命令(dp ref (&A[i+ 96] ) )を実行させ、変数 Kの値が 2の場合にはプリフ ツチ命令(dpref ( &B [i+ 64] ) )を実行させるように最適化を行う。
[0100] [サイズが異なる複数配列アクセスが存在する場合 (ピーリング必要) ]
図 20は、ループ内に複数の配列アクセスが存在し、かつ配列の要素のサイズがす ベて同じではない場合のループ分割処理について説明するための図である。
[0101] 図 20 (a)に示すソースプログラム 331は、図 19 (a)に示したソースプログラム 321と ループ回数が異なるのみである。したがって、ソースプログラム 321と同様、配列 Aの 要素は 4バイト、配列 Bの要素は 2バイトである。図 20 (b)に示すように、ソースプログ ラム 321のループを二重ループに構造変換し、ループ回数 140を配列 Bの 1ライン分 の要素数 64で割った余りをピーリング処理すると、プログラム 322が得られる。コピー 型の最適化処理を行う場合には、図 19 (c)および図 19 (d)を参照して説明したように 、二重ループの最内ループを 3分割し、プリフェッチ命令を挿入することにより、図 20 (c)に示すプログラム 333が得られる。条件型の最適化処理を行う場合には、図 19 ( e)および図 19 (f)を参照して説明したように、条件分岐式によりループ回数およびプ リフエツチ命令を制御し、最終的に図 20 (e)に示すプログラム 335が得られる。
[0102] [ストライドが異なる複数配列アクセスが存在する場合]
図 21は、ループ内にストライドが異なる複数の配列アクセスが存在する場合のルー プ分割処理について説明するための図である。
[0103] ストライドとは、ループ処理における配列要素の増分値 (アクセス幅)のことを示す。
図 21 (a)に示すようなソースプログラム 341が入力された場合を考える。ここで、配列 Aの要素および配列 Bの要素はともに 4バイトであるものとする。ソースプログラム 341 では、ループのイタレーシヨンごとに、配列 Aの要素は 1ずつ増加するのに対し、配列 Bの要素は 2ずつ増加する。すなわち、配列 Bのアクセス幅は配列 Aのアクセス幅の 2 倍である。最小アクセス幅の配列 Aに着目すると、 1ラインには配列 Aの要素が 32個 収まる。このため、最内ループのループ回数を 32回とした二重ループへの構造変換 を行うと、図 21 (b)に示すプログラム 342が得られる。最内ループでは、配列 Aに関し ては 1ライン分の要素が消費されるが、配列 Bに関しては 2ライン分の要素が消費され ることになる。このため、最内ループ処理を実行するためには合計 3ライン分のデータ が必要になる。
[0104] よって、コピー型の最適化を行う際には、図 21 (c)のプログラム 343に示すように、 最内ループを 3つに分割し、図 21 (d)のプログラム 344に示すように、各最内ループ の直前にプリフェッチ命令を挿入する。ここでは、 1番目の最内ループの直前には、 1 ライン先の配列 Aの要素をプリフェッチするプリフェッチ命令(dpref (&A[i+ 32]) ) を挿入し、 2番目の最内ループの直前には 2ライン先の配列 Bの要素をプリフェッチ するプリフェッチ命令(dpref ( &B [i * 2 + 64] ) )を挿入し、 3番目の最内ループの直 前には 3ライン先の配列 Bの要素をプリフェッチするプリフェッチ命令(dpref (&B[i * 2 + 96]) )を挿入している。
[0105] また、条件型の最適化を行う際には、図 21 (e)のプログラム 345に示すように、 1回 の最内ループ処理につき、変数 Kの値を 0から 2までの範囲内で更新させ、変数 Kの 値による条件分岐処理により最内ループのループ回数 Nを 11、 11および 10のうち のいずれかに設定する。その後、ループ回数 Nの最内ループを実行させる。次に、 図 21 (f)のプログラム 346に示すように、変数 Kの値が 0の場合にはプリフェッチ命令 (dpref ( & A [i + 32] ) )を実行させ、変数 Kの値が 1の場合にはプリフ ツチ命令 (dp ref (&B[i * 2 + 64]) )を実行させ、変数 Kの値が 2の場合にはプリフ ツチ命令(dp ref ( &B [i * 2 + 96] ) )を実行させるように最適化を行う。
[0106] [ループ回数が不定な場合]
図 22は、ループ回数が不定なループ処理のループ分割処理を説明するための図 である。
[0107] 図 22 (a)に示すソースプログラム 351が入力された場合を考える。ソースプログラム 351に含まれるループ回数は変数 Valにより特定され、コンパイル時には不定である 。しかし、最低 128回は繰り返し処理が行われることがプラグマ指定「# pragma _ min— iteration = 128」により、保証されている。ここで、配列 Aは 4バイトであるもの とする。すなわち、キャッシュの 1ラインには配列 Aの要素が 32個記憶される。
[0108] プラグマ指定に従い、ループ処理を最初の 128回のループ処理と、それ以降の変 数 Valで特定されるループ回数のループ処理とに分割し、それぞれをシンプルルー プの場合と同様に二重ループィ匕すると図 22 (b)に示すプログラム 352が得られる。
[0109] コピー型の最適化処理を行う場合には、プログラム 352の最内ループの直前に 1ラ イン先の配列 Aの要素をプリフェッチするためのプリフェッチ命令(dpref (&A[i+ 32 ]) )を挿入することにより、図 22 (c)に示すプログラム 353が得られる。
[0110] 条件型の最適化処理を行う場合には、後半のループ処理をピーリング畳み込みし 、最外ループ回数が 128回になるまでは、最内ループの回数を 32回にし、それ以降 は最内ループの回数を (Val— 128)回に設定する分岐命令を挿入する。すると、図 2 2 (d)に示すようなプログラム 354が得られる。
[0111] 最後に、最内ループの実行前にプリフェッチ命令 (dpref (&A[i+ 32]) )を挿入す ることにより図 22 (e)に示すようなプログラム 355が得られる。
[0112] 図 23は、ループ回数が不定なループ処理のループ分割処理を説明するための他 の図である。
[0113] 図 23 (a)に示すソースプログラム 361が入力された場合を考える。ソースプログラム 361に含まれるループ回数は変数 Nにより特定され、コンパイル時には不定である。 また、ソースプログラム 361は、ソースプログラム 351と異なり、最低のループ回数を 示すプラグマ指定がない。
[0114] ループ回数が小さなループ処理に対してループの構造変換を行い、最適化を行つ たとしても、最適化の効果が表れにくい。このため、このような場合には、最適化の効 果を高めるために、ループ回数があるしきい値よりも大きければ最適化されたループ 処理を実行し、それ以外の場合には通常のループ処理を実行するようにする。例え ば、あるしきい値を 1024とした場合には、図 23 (b)のプログラム 362に示されるように 、ループ回数 Nが 1024を超える場合には、最初の 1024回のループ処理について は二重ループを実行し、残りの回数のループ処理については、ピーリングされたルー プ処理を行うようにする。また、ループ回数 Nが 1024以下の場合には、二重ループ は実行せずに、ピーリングされたループ処理を実行するようにする。その後、二重ル 一プの最内ループの直前にプリフ ツチ命令(dpref ( & A [i + 32] ) )を挿入すること により図 23 (c)に示すような最適化されたプログラム 363が生成される。
[0115] [ループ分割が不要な場合]
図 24は、ループ分割が不要な場合の最適化処理を説明するための図である。図 2 4 (a)に示すソースプログラム 371が入力された場合には、ループ中で 1ライン分のデ ータ (A[i]— A[i+ 31])を完全に使い切ってしまう。このような場合には、二重ルー プ化する必要はない。このため、図 24 (b)に示すプログラム 372ようにループの先頭 にループ内で使用されるデータの 1ライン先のデータをプリフェッチするプリフェッチ 命令 (dpref (&A[i+ 32]) )を挿入することにより最適化が行われる。
[0116] また、ループ内の処理サイクル数がプリフェッチ命令で必要とされる処理サイクル数 よりも大きいような場合にも、ループを二重化する必要はなぐループの先頭にプリフ エッチ命令を挿入してもプリフェッチ命令のレイテンシは隠蔽することができる。
[0117] [ループ内でアクセスされる要素がァラインされて ヽな 、場合]
図 25および図 26は、ループ内でアクセスされる要素が主記憶上で適切にァライン されて 、な 、場合のループ分割処理を説明するための図である。これまでの説明で は、ループ内でアクセスされる要素が主記憶上で適切にァラインされている場合を想 定して話を進めてきた。ァラインされていることが予めプラグマや、コンパイルォプショ ンの指定によりわかっている場合には、上述の例で説明したような最適化が行われる
[0118] しかし、一般的にはコンノイラは、それらの要素がァラインされている力否かは実行 時まではわ力もない。このため、コンパイラは、ループ内アクセス要素が主記憶上で 適切にァラインされていないことを前提として最適化を行う必要がある。
[0119] すなわち、図 25 (a)に示すようなソースプログラム 381が与えられた場合に、配列 A の要素サイズを 4バイトとすると、図 11を参照して説明したシンプルループ分割と同 様にして、最適化が行われる。ただし、要素がァラインされていないことを前提として V、るため、最内ループの前に挿入されるプリフェッチ命令(dpref ( & A [i+64] ) )は 2 ライン先の配列 Aの要素をプリフェッチ指定している。また、ループ処理に先立って、 ループ内でアクセスされる配列の要素 A[0]— A[63]を確保するために、プリフェツ チ命令(dpref ( & A [0] )および dpref ( & A [32] ) )がプリフ ツチのレイテンシを十 分隠蔽できる位置に挿入され、図 25 (b)に示すようなプログラム 382が生成される。
[0120] また、図 26 (a)に示されるようなソースプログラム 391が与えられた場合には、図 16 と同様にして、ピーリング処理された部分のループを畳み込んだ後に、 2ライン先の 配列 Aの要素をプリフェッチする命令(dpref (&A[i+ 64]) )が挿入される。また、プ ログラム 382と同様にプリフ ツチ命令(dpref (&A[0])および dpref (&A[32]) )が 挿入され、図 26 (b)に示すような最適化されたプログラム 392が生成される。
[0121] [動的ァライン解析コードの挿入による構造変換分割]
図 27は、ァラインされていない配列要素を動的に特定して、ループ処理の最適化 を行う処理について説明するための図である。図 27 (a)に示すソースプログラム 401 が入力された場合を考える。ここで、配列 Aの要素は 4バイトであるものとする。
[0122] 配列 Aの先頭アドレス(要素 A[0]のアドレス)の所定のビットがキャッシュのラインを 示しており、そのビット内のさらにあるビットは、ラインの先頭からのオフセットを示して いる。したがって、「A&Mask」というビット同士の論理演算を行うことにより、ラインの 先頭からのオフセットを取り出すことができる。ここで、マスク値 Maskはあらかじめ定 められた値である。配列 Aの先頭アドレスから取り出されたオフセット値を予め定めら れた補正値 Corだけ右シフトすることにより、配列 Aの先頭要素 A[0]が 1ライン内で 先頭力も何番目に位置しているかがわかる。よって、次式(3)にしたがって、ライン上 でァラインされて 、な 、要素の数 nを求めることができる。
[0123] n= 32—(A&Mask) > >Cor · '· (3)
すなわち、図 28に示すように、キャッシュ 431にフェッチした場合に、ァラインされな い配列 Αの要素 (Α[0]— Α[η-1])とァラインされる配列 Αの要素とが区別されること になる。
[0124] したがって、図 27 (b)のプログラム 402に示すように、式(3)に従 ヽァラインされて!/ヽ ない配列 Aの要素数 nを求める。次に、要素数 nに従って、ァラインされていない配列 Aの要素(A[0]— A[n— 1])についてのループ処理を行う。その後、ァラインされて いる配列 Aの要素(A[n]以降の要素)については、図 11に示したシンプルループ分 割の場合と同様に二重ループィ匕を行う。
[0125] その後、ピーリングされているループ 405について、畳み込み処理を行うと、図 27 ( c)に示すようなプログラム 403が生成される。また、図 27 (d)に示すように、プリフェツ チ命令 (dpref ( & A [i+ 32] ) )を挿入することにより、最適化されたプログラム 404が 得られる。
[0126] [プロファイル情報を用いた構造変換分割]
図 29は、ァラインされていない配列要素をプロファイル情報を用いて特定し、ルー プ処理の最適化を行う処理にっ 、て説明するための図である。ァラインされて!/、な!ヽ 配列の要素数を図 27のように計算力 求めるのではなぐプロファイル情報から取得 する。取得したァラインされていない配列の要素数 Nに基づいて、図 27に示したのと 同様の処理を行い、図 29 (a)に示すソースプログラム 411を図 29 (b)に示すプログラ ム 412のように変換する。その後、ピーリングされたループ部分を畳み込み、図 29 (c )に示すプログラム 413を得る。最後に、図 29 (d)に示すプリフェッチ命令を挿入する ことにより最適化されたプログラム 414を得る。
[0127] [最内ループ以外のループに対する構造変換]
図 30は、最内ループ以外のループに対する構造変換について説明するための図 である。 [0128] 図 30 (a)に示すソースプログラム 421が与えられた場合を考える。ソースプログラム 421では、二重ループ処理が行われており、最内ループ処理 424で参照される配列 Aの要素は 1バイトであるものとする。最内ループ処理 424のループ回数は 4回であ るため、最内ループ処理 424では配列 Aの要素が 4バイト分参照される。したがって、 最内ループ処理 424で参照される要素のバイト数が小さいため、このような場合には 、最内ループ処理 424を 1つの固まりとして考え、最外ループを、図 30 (b)に示すプ ログラム 422のように、二重ループに構造変換する。その後、 2番目のループ処理の 実行前にキャッシュの 1ライン分の配列 Aの要素をプリフェッチする命令(dpref (& A [j + 128]) )が挿入され、図 30 (c)に示すような最適化されたプログラム 423が得ら れる。
[0129] [プラグマ「 # pragma —loop— tiling— dpref 変数名 [,変数名 ]」による変数指 定]
図 31は、プラグマ「# pragma —loop— tiling— dpref 変数名 [,変数名]」により 変数が指定された場合の最適化処理について説明するための図である。図 31 (a)に 示すように、プラグマ「 # pragma —loop— tiling— dpref bjとの指定がソースプロ グラム中に含まれる場合には、ループ内の配列 bのみに着目して構造変換が行われ 、配列 aは無視される。従って、図 31 (b)に示すような二重ループィ匕が実行され、配 列 bをプリフェッチする命令のみが挿入される。
[0130] 以上説明したように、本実施の形態に係るコンパイラシステムによると、ループ処理 を二重化し、最内ループの外側でプリフェッチ命令を実行するようにしている。このた め、無駄なプリフェッチ命令の発行を防ぐことができ、プログラム実行時の処理速度を 向上させることができる。また、ループ処理を二重化することにより、プリフェッチ命令 を実行してカゝら次のプリフェッチ命令を実行するまでのサイクル数を確保することがで きる。このため、レイテンシを隠蔽し、インターロックを防ぐことができる。
[0131] 以上、本発明の実施の形態に係るコンパイルシステムについて、実施の形態に基 づいて説明したが、本発明は、この実施の形態に限定されるものではない。
[0132] 例えば、命令最適配置部 187で配置される命令は、プリフ ツチ命令に限られず、 通常のメモリアクセス命令や外部処理を起動してその処理結果を待つ命令などのよう な応答待ち命令、実行した結果、結果的にインターロックを起こす可能性のある命令 、実行後に所定の資源が参照可能になるまでに複数サイクルを要する命令などであ つてもよい。応答待ち命令には、常に応答を待つ命令の他に、応答を待つ場合と待 たな 、場合とがある命令も含む。
[0133] また、キャッシュを備えないコンピュータの CPUをターゲットプロセッサとして、各種 処理のレイテンシを隠蔽し、インターロックを防ぐようなコードを出力するコンノィルシ ステムであってもよい。
[0134] さらに、 CPUで実行させる機械 令列を逐次解釈しながら、本実施の形態で説 明したループ構造変換等の処理を実行する OS (Operating System)として実現し てもよい。
[0135] また、以下に示すような PreTouch命令のように、インターロックを起こす可能性の ない命令に対しても本発明は適用可能である。 PreTouch命令とは、引数で指定さ れる変数を記憶するための領域をキャッシュ上に事前に確保するのみの処理を行う 命令である。以下に、ループの構造変換を行い、 PreTouch命令を挿入する処理に ついて説明する。
[0136] [シンプルループ分割]
図 32は、 PreTouch命令挿入時において、対象領域がキャッシュサイズでァライン されており、ピーリングが必要な 、場合のシンプルループ分割処理にっ 、て説明す るための図である。
[0137] 図 32 (a)に示すようなソースプログラム 502が入力された場合につ!、て考える。この ソースプログラム 502では、ループ回数 iと変数 valとの演算結果 (乗算結果)を配列 A の要素に順次代入する処理を定義している。ここで、配列 Aの各要素のサイズは 4バ イトであるものとし、キャッシュの 1ラインサイズは 128バイト(以降の説明でも、キヤッシ ュのラインサイズは 128バイトであるものとする。)であるものとする。すなわち、キヤッ シュの 1ラインには配列 Aの要素が 32個記憶される。また、ソースプログラム 502に含 まれるループのィテレーシヨンの回数 128回は、 32の整数倍である。
[0138] このため、ソースプログラム 502は、図 32 (b)のプログラム 504に示すように、二重 ループに構造変換することができる。すなわち、最内ループでは 32回の繰り返し処 理を行い、その外のループでは、最内ループを 4回繰返すループ処理を行う。最内 ループ処理ではキャッシュの 1ライン分のデータが配列 Aに代入される。その後、図 3 2 (c)のプログラム 506に示されるように、最内ループの実行前に、キャッシュ領域確 保命令(PreTouch (&A[i] ) )が挿入される。 PreTouch命令を挿入することにより、 最内ループ実行時には、当該ループで定義される配列 Aの要素がキャッシュ領域に 確保されていることになる。これにより、不要なメインメモリからのデータ転送を引き起 こすことがなくなり、バス占有率を軽減することができるようになる。
[0139] 図 33は、 PreTouch命令挿入時におけるピーリングが必要な場合のシンプルルー プ分割処理について説明するための図である。
[0140] 図 33 (a)に示すようなソースプログラム 512が入力された場合について考える。この ソースプログラム 512では、ループ回数 iと変数 valとの演算結果 (乗算結果)が配列 A の要素に順次代入する処理を定義している。ここで、配列 Aの各要素のサイズは 4バ イトでキャッシュサイズにァラインされているものとする。すなわち、キャッシュの 1ライ ンには配列 Aの要素が 32個記憶される。また、ソースプログラム 512に含まれるルー プのィテレーシヨンの回数は 140回であるものとする。すなわち、 1ラインに記憶される 配列 Aの要素数 32で割った場合に余りが出る数である。
[0141] このような場合には、図 33 (b)に示すプログラム 514のように、 140を 32で割った余 りのループ回数をピーリングし、それ以外の部分を図 32 (b)と同様に二重ループ構 造に構造変換する。その後、ピーリングされた部分を二重ループ構造に含ませるた めのピーリング畳み込み処理を行い、図 33 (c)に示すようなプログラム 516が得られ る。すなわち、通常状態では最内ループで 32回の繰り返し処理が行われ、最後に最 内ループが実行される場合には、残りの 12 ( = 140— 128)回の繰り返し処理が行わ れる。その後、図 33 (d)のプログラム 518に示されるように、最内ループの実行前に、 キャッシュ領域確保命令 (PreTouch (&A[i] ) )が挿入される。ただし、領域確保処 理は、 1ライン単位で行なわれる。このため、オブジェクト A以外の領域を確保する可 能性がある最後の最内ループ実行時には、 PreTouch命令を発行しないようにし、 オブジェクト A以外の領域を確保しな 、ようにする。
[0142] [動的ァライン解析コードの挿入による構造変換分割] 図 34は、ァラインされていない配列要素を動的に特定して、ループ処理の最適化 を行う処理について説明するための図である。図 34 (a)に示すソースプログラム 522 が入力された場合を考える。ここで、配列 Aの要素は 4バイトであるものとする。
[0143] 配列 Aの先頭アドレス(要素 A[0]のアドレス)の所定のビットがキャッシュのラインを 示しており、そのビット内のさらにあるビットは、ラインの先頭からのオフセットを示して いる。したがって、「A&Mask」というビット同士の論理演算を行うことにより、ラインの 先頭からのオフセットを取り出すことができる。ここで、マスク値 Maskはあらかじめ定 められた値である。ここでは、 [Mask = 0x7F]としている。ループ初回にアクセスされ る配列 Aの要素のアドレスから取り出されたオフセット値を、マスク値 Maskから減算を 行い、予め定められた補正値 Corだけ右シフトすることにより、配列 Aの要素 A[X]が 1ライン内で先頭力 何番目に位置しているかがわかる。よって、次式 (4)にしたがつ て、ライン上でァラインされて ヽな 、要素の数 PRLGを求めることができる。
[0144] PRLG = (Mask — (&A[X]) & Mask) > >Cor · '· (4)
さらに、ループの最後に参照される配列 Αの要素 (Α[Υ— 1])の次の要素 (Α[Υ]) 力 S iライン内で先頭力も何番目に位置しているかを、次式(5)に従って求めることによ り、 1ラインを満たしきれていない要素の数 EPLGで求めることができる。
[0145] EPLG = (&A[Y]) & Mask) > >Cor · '· (5)
さらに、 1ライン分の処理を余ることなく行うループ回数 KRNLを次式(6)に従って 求めることができる。
[0146] KNRL = ( Y-X) - (PRLG + EPLG) · '· (6)
すなわち、図 34 (b)のプログラム 524に示すように、キャッシュの領域に配列 Αが割 当てられる場合に、ァラインされない配列 Aの要素 (A[X]— A[X+PRLG-1])と、 ァラインされかつ 1ラインの倍数のサイズとなる配列 Aの要素(A[X+PRLG]— A[X + PRLG+KRNL— 1])と、ァラインされているが 1ラインのサイズを満たさない配列 Aの要素( A [X + PRLG + KRNL]一 A [X + PRLG + KRNL + ERLG— 1 ] )とが区 另 IJされること〖こなる。
[0147] したがって、図 34 (b)のプログラム 524に示すように、式 (4)に従ったァラインされて いない配列 Aの要素数 PRLGを求める処理等が行なわれる。次に、要素数 PRLGに 従って、ァラインされていない配列 Aの要素(A[X]— A[X+PRLG—1])についての ループ処理を行う。その後、ァラインされている配列 Aの要素(A[X+PRLG]— A[ X+PRLG+KRNL— 1]の要素)については、図 32 (b)に示したシンプルループ分 割の場合と同様に二重ループィ匕を行う。さらに、 EPLG>0であるならば、ピーリング 処理が必要となる為、図 33 (b)に示したピーリング必要時の場合と同様にピーリング 処理を行う。
[0148] その後、ピーリングされているループについて、畳み込み処理を行うと、図 34 (c)に 示すようなプログラム 526が生成される。また、図 34 (d)に示すように、キャッシュ領域 確保命令(PreTouch (&A[i]) )が揷入することにより、最適化されたプログラム 528 が得られる。
[0149] ただし、領域確保命令を挿入するのは、ァラインされて!/ヽる領域でかつキャッシュの 1ライン全てを使用する最内ループに対してのみである。
産業上の利用可能性
[0150] 本発明はインターロックを起こす可能性のある命令の発行を制御するコンパイラ、 O S、プロセッサで実行されるプロセス等に適用できる。

Claims

請求の範囲
[1] 実行時に外部からの所定の応答を待つ命令を含む命令セットを備えたプロセッサ 向けのプログラム変換装置であって、
入力プログラムに含まれる繰返し回数力 Sx回のループを、繰返し回数力 Sy回のルー プを内側ループとし、繰返し回数力 Zy回のループを外側ループとするネスト構造 への変換である二重ループ変換を行うループ構造変換手段と、
前記内側ループの外部の位置に、前記命令を配置することにより、当該命令を含 む出力プログラムに変換する命令配置手段と
を備えることを特徴とするプログラム変換装置。
[2] 前記ループ構造変換手段は、
前記入力プログラムに含まれるループを検出するループ検出部と、
前記ループの繰返し回数を検出する繰返し回数検出部と、
前記命令実行時の前記所定の応答を待つサイクル数である応答待ちサイクル数を 検出する応答待ちサイクル数検出部と、
前記ループの 1回の繰り返し処理に要する 1シーケンスサイクル数を検出する 1シ 一ケンスサイクル数検出部と、
前記ループを、繰返し回数が(前記応答待ちサイクル数 Z前記 1シーケンスサイク ル数)回であるループに分割するループ分割部と、
繰返し回数が(前記応答待ちサイクル数 Z前記 1シーケンスサイクル数)回のルー プを内側ループとし、繰返し回数が(前記ループの繰返し回数 Z前記内側ループの 繰返し回数)回をループの外側ループとするネスト構造への変換である二重ループ 変換を行う二重ループ変換部と
を有することを特徴とする請求項 1に記載のプログラム変換装置。
[3] さらに、最適化に関する最適化指示情報を受け取る最適化指定情報受け取り手段 を備える
ことを特徴とする請求項 1に記載のプログラム変換装置。
[4] 前記最適化指定情報受け取り手段は、前記入力プログラムに含まれるループの最 低繰り返し回数を受け取り、 前記ループ構造変換手段は、ループの実行回数が不定な場合は、前記最低繰り 返し回数に基づ 、て、前記最低繰り返し回数の繰り返し処理を前記ループより取り出 し、取り出したループの繰り返し処理に対して二重ループ変換を行う
ことを特徴とする請求項 3に記載のプログラム変換装置。
[5] 前記命令は、インターロックを発生させる可能性のある命令である
ことを特徴とする請求項 1に記載のプログラム変換装置。
[6] 前記インターロックを発生させる可能性のある命令は、主記憶装置からキャッシュへ のデータのプリフェッチ命令である
ことを特徴とする請求項 5に記載のプログラム変換装置。
[7] さらに、命令のスケジューリングを行うスケジューリング手段を備え、
前記ループ構造変換手段は、
前記繰り返し回数力 回のループを、前記スケジューリング手段により得られた結果 から、前記プリフェッチを実行するのに必要なサイクル数分だけ実行されるような繰り 返し回数力 回のループに分割し、繰り返し回数力 回のループを内側ループ、繰り 返し回数力 SxZy回のループを外側ループとするネスト構造への変換である二重ルー プ変換を行う
ことを特徴とする請求項 6に記載のプログラム変換装置。
[8] 前記命令は、実行後に、所定の資源が参照可能状態になるまでに複数サイクルを 要する命令である
ことを特徴とする請求項 1に記載のプログラム変換装置。
[9] 前記複数を要する命令は、主記憶装置またはキャッシュをアクセスする命令である ことを特徴とする請求項 8に記載のプログラム変換装置。
[10] 前記ループ構造変換手段は、
前記繰り返し回数力 回のループを、当該ループ内で参照される配列のアドレスが キャッシュのラインサイズ進む分だけ実行されるような繰り返し回数力 Sy回のループに 分割し、繰り返し回数力 回のループを内側ループ、繰り返し回数力 Zy回のルー プを外側ループとする二重ループ変換を行う
ことを特徴とする請求項 1に記載のプログラム変換装置。
[11] 前記ループ構造変換手段は、前記配列が複数存在する場合に、二重ループ変換 を行った前記繰り返し回数力 回のループを、さらに、前記配列の数に基づいて案分 する案分変換を行う
ことを特徴とする請求項 10に記載のプログラム変換装置。
[12] 前記案分変換は、複数の前記配列について、その配列要素のサイズが異なるとき には、前記サイズ比に応じて前記繰り返し回数力 回のループを案分する ことを特徴とする請求項 11に記載のプログラム変換装置。
[13] 前記案分変換は、複数の前記配列について、ループの繰り返し処理を 1回を行うの に進むアドレスであるストライドが異なるときに、前記ストライド比に応じて前記繰り返し 回数力 回のループを案分する
ことを特徴とする請求項 11記載のプログラム変換装置。
[14] 前記案分変換は、内側ループを変換する際に、配分された各ループに対応する条 件文を生成して、配分された各ループを同一の内側ループで実行されるように案分 変換を行う
ことを特徴とする請求項 11に記載のプログラム変換装置。
[15] 前記ループ構造変換手段は、
前記繰り返し回数力 回のループを、前記繰り返し回数力 回のループに分割する 際に、 xZyを演算した際の余り zが 0でなければ、 z回の繰り返し処理に対してピーリ ング処理を行ない、二重ループ変換を行う
ことを特徴とする請求項 10に記載のプログラム変換装置。
[16] 前記ループ構造変換手段は、
前記余り zが 0でなければ、内側ループのループ回数力 回である力 z回であるかを 判定する判定する条件文を生成し、二重ループ変換を行う
ことを特徴とする請求項 15記載のプログラム変換装置。
[17] 前記ループ構造変換手段は、ループの実行回数が不定な場合は、前記ループの 実行回数を実行時に判定し、判定結果に基づいて繰り返し回数を動的に変化させる ような二重ループ変換を行う
ことを特徴とする請求項 10に記載のプログラム変換装置
[18] さらに、配列がキャッシュのラインサイズにァラインされているという情報を受け取る 受け取り手段を備え、
前記命令配置手段は、前記繰り返し回数が X回のループに対して、当該ループに おける X回の繰り返し処理で参照されるデータよりも一つ先のキャッシュのラインに記 憶されるデータをプリフェッチするプリフェッチ命令を配置する
ことを特徴とする請求項 10に記載のプログラム変換装置
[19] 前記最適化指定情報受け取り手段は、配列がキャッシュのラインのどの相対位置か らアクセスを開始するかと!/、う情報を受け、
前記ループ構造変換手段は、当該情報に基づ 、て前記に二重ループ変換を行う ことを特徴とする請求項 10に記載のプログラム変換装置。
[20] 前記命令配置手段は、前記配列がキャッシュのラインサイズにァラインされていな い場合には、前記繰り返し回数力 回のループに対して、当該ループにおける X回の 繰り返し処理で参照されるデータよりも二つ先のキャッシュのラインに記憶されるデー タをプリフェッチするプリフェッチ命令を配置する
ことを特徴とする請求項 10に記載のプログラム変換装置。
[21] 前記ループ構造変換手段は、前記配列がキャッシュのラインサイズにァラインされ て ヽな 、場合には、前記配列がキャッシュのラインのどの相対位置力 アクセスを開 始するかを判定し、判定結果に応じて二重ループ構造変換を行う
ことを特徴とする請求項 10に記載のプログラム変換装置。
[22] さらに、着目する配列に関する情報を受け取る受け取り手段を備え、
前記ループ構造変換手段は、当該配列に対してのみ着目し、二重ループ変換を 行う
ことを特徴とする請求項 10に記載のプログラム変換装置。
[23] 前記ループ構造変換手段は、最内ループを 1つのかたまりとみなして、外側のルー プに対してさらに二重ループ変換を行う
ことを特徴とする請求項 1に記載のプログラム変換装置。
[24] 実行時に外部からの所定の応答を待つ命令を含む命令セットを備えたプロセッサ 向けのプログラム変換方法であって、 入力プログラムに含まれる繰返し回数力 Sx回のループを、繰返し回数力 Sy回である ループを内側ループとし、繰返し回数力 Zy回のループを外側ループとするネスト 構造への変換である二重ループ変換を行うステップと、
前記内側ループの外部の位置に、前記命令を配置し、当該命令を含む出力プログ ラムに変換するステップと
を含むことを特徴とするプログラム変換方法。
実行時に外部からの所定の応答を待つ命令を含む命令セットを備えたプロセッサ 向けのプログラム変換方法のプログラムであって、
入力プログラムに含まれる繰返し回数力 Sx回のループを、繰返し回数力 Sy回である ループを内側ループとし、繰返し回数力 Zy回のループを外側ループとするネスト 構造への変換である二重ループ変換を行うステップと、
前記内側ループの外部の位置に、前記命令を配置し、当該命令を含む出力プログ ラムに変換するステップと
をコンピュータに実行させることを特徴とするプログラム。
PCT/JP2005/001670 2004-02-12 2005-02-04 プログラム変換装置およびプログラム変換方法 WO2005078579A1 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2005517928A JPWO2005078579A1 (ja) 2004-02-12 2005-02-04 プログラム変換装置およびプログラム変換方法
US10/565,530 US20060248520A1 (en) 2004-02-12 2005-02-04 Program conversion device and program conversion method

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2004-035430 2004-02-12
JP2004035430 2004-02-12

Publications (1)

Publication Number Publication Date
WO2005078579A1 true WO2005078579A1 (ja) 2005-08-25

Family

ID=34857682

Family Applications (1)

Application Number Title Priority Date Filing Date
PCT/JP2005/001670 WO2005078579A1 (ja) 2004-02-12 2005-02-04 プログラム変換装置およびプログラム変換方法

Country Status (4)

Country Link
US (1) US20060248520A1 (ja)
JP (1) JPWO2005078579A1 (ja)
CN (1) CN100409187C (ja)
WO (1) WO2005078579A1 (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008269450A (ja) * 2007-04-24 2008-11-06 Fujitsu Ltd プロセッサ及びプリフェッチ制御方法
JP2010244208A (ja) * 2009-04-02 2010-10-28 Fujitsu Ltd プリフェッチ生成プログラムおよびコンパイラ装置
WO2014030387A1 (ja) * 2012-08-22 2014-02-27 三菱電機株式会社 キャッシュメモリコントローラ及びキャッシュメモリコントロール方法

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7774764B2 (en) * 2005-12-21 2010-08-10 Intel Corporation Method and system for efficient range and stride checking
US8443351B2 (en) * 2006-02-23 2013-05-14 Microsoft Corporation Parallel loops in a workflow
US7797692B1 (en) * 2006-05-12 2010-09-14 Google Inc. Estimating a dominant resource used by a computer program
JP5148674B2 (ja) * 2010-09-27 2013-02-20 株式会社東芝 プログラム並列化装置およびプログラム
US9164743B2 (en) * 2012-07-02 2015-10-20 International Business Machines Corporation Strength reduction compiler optimizations for operations with unknown strides
US9760356B2 (en) * 2014-09-23 2017-09-12 Intel Corporation Loop nest parallelization without loop linearization
US9489181B2 (en) * 2014-10-09 2016-11-08 National Instruments Corporation Correlation analysis of program structures
US9772824B2 (en) * 2015-03-25 2017-09-26 International Business Machines Corporation Program structure-based blocking
JP6665720B2 (ja) * 2016-07-14 2020-03-13 富士通株式会社 情報処理装置、コンパイルプログラム、コンパイル方法、およびキャッシュ制御方法
US11614941B2 (en) * 2018-03-30 2023-03-28 Qualcomm Incorporated System and method for decoupling operations to accelerate processing of loop structures
CN109086049B (zh) * 2018-07-25 2021-11-02 北京金和网络股份有限公司 遍历用户在线状态数据的方法
US11614889B2 (en) * 2018-11-29 2023-03-28 Advanced Micro Devices, Inc. Aggregating commands in a stream based on cache line addresses
KR20210127923A (ko) * 2019-02-26 2021-10-25 인텔 코포레이션 컴파일러를 위한 작업부하 지향적 상수 전파
JP2022107377A (ja) * 2021-01-08 2022-07-21 富士通株式会社 情報処理装置、コンパイル方法、及びコンパイルプログラム

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0594470A (ja) * 1991-09-30 1993-04-16 Nec Corp ベクトル化方式
JPH0922361A (ja) * 1995-07-06 1997-01-21 Hitachi Ltd データプリフェッチ方法
JPH10283192A (ja) * 1997-04-09 1998-10-23 Hitachi Ltd プリフェッチコード生成方式
JPH10293692A (ja) * 1997-04-17 1998-11-04 Hitachi Ltd 多重ループ向けデータプリフェッチ方法、プロセッサおよびプログラム生成方法
US5854934A (en) * 1996-08-23 1998-12-29 Hewlett-Packard Company Optimizing compiler having data cache prefetch spreading
JPH11134199A (ja) * 1997-10-30 1999-05-21 Hitachi Ltd プリフェッチコード生成方式
JP2000207224A (ja) * 1999-01-14 2000-07-28 Hitachi Ltd ソフトウェアプリフェッチ方法
JP2001290657A (ja) * 2000-04-07 2001-10-19 Hitachi Ltd ソフトウェアプリフェッチ方法

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2677482B2 (ja) * 1992-03-18 1997-11-17 富士通株式会社 計算機言語処理方法
JPH07306790A (ja) * 1994-05-16 1995-11-21 Hitachi Ltd ループ最適化方式
US5704053A (en) * 1995-05-18 1997-12-30 Hewlett-Packard Company Efficient explicit data prefetching analysis and code generation in a low-level optimizer for inserting prefetch instructions into loops of applications
US5805863A (en) * 1995-12-27 1998-09-08 Intel Corporation Memory pattern analysis tool for use in optimizing computer program code
TW343318B (en) * 1996-09-23 1998-10-21 Advanced Risc Mach Ltd Register addressing in a data processing apparatus
US5819074A (en) * 1996-12-05 1998-10-06 Hewlett-Packard Co. Method of eliminating unnecessary code generation in a circuit compiler
US6038398A (en) * 1997-05-29 2000-03-14 Hewlett-Packard Co. Method and apparatus for improving performance of a program using a loop interchange, loop distribution, loop interchange sequence
US6059841A (en) * 1997-06-19 2000-05-09 Hewlett Packard Company Updating data dependencies for loop strip mining
US6070011A (en) * 1997-10-21 2000-05-30 Hewlett-Packard Co. Compiler for performing a loop fusion, dependent upon loop peeling and/or loop reversal
JPH11259437A (ja) * 1998-03-12 1999-09-24 Hitachi Ltd 不要バリア命令の削減方式
JP3551353B2 (ja) * 1998-10-02 2004-08-04 株式会社日立製作所 データ再配置方法
US7107583B2 (en) * 2001-02-16 2006-09-12 Hewlett-Packard Development Company, L.P. Method and apparatus for reducing cache thrashing
US7222337B2 (en) * 2001-05-31 2007-05-22 Sun Microsystems, Inc. System and method for range check elimination via iteration splitting in a dynamic compiler
JP3847672B2 (ja) * 2002-07-03 2006-11-22 松下電器産業株式会社 コンパイラ装置及びコンパイル方法

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0594470A (ja) * 1991-09-30 1993-04-16 Nec Corp ベクトル化方式
JPH0922361A (ja) * 1995-07-06 1997-01-21 Hitachi Ltd データプリフェッチ方法
US5854934A (en) * 1996-08-23 1998-12-29 Hewlett-Packard Company Optimizing compiler having data cache prefetch spreading
JPH10283192A (ja) * 1997-04-09 1998-10-23 Hitachi Ltd プリフェッチコード生成方式
JPH10293692A (ja) * 1997-04-17 1998-11-04 Hitachi Ltd 多重ループ向けデータプリフェッチ方法、プロセッサおよびプログラム生成方法
JPH11134199A (ja) * 1997-10-30 1999-05-21 Hitachi Ltd プリフェッチコード生成方式
JP2000207224A (ja) * 1999-01-14 2000-07-28 Hitachi Ltd ソフトウェアプリフェッチ方法
JP2001290657A (ja) * 2000-04-07 2001-10-19 Hitachi Ltd ソフトウェアプリフェッチ方法

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008269450A (ja) * 2007-04-24 2008-11-06 Fujitsu Ltd プロセッサ及びプリフェッチ制御方法
JP2010244208A (ja) * 2009-04-02 2010-10-28 Fujitsu Ltd プリフェッチ生成プログラムおよびコンパイラ装置
WO2014030387A1 (ja) * 2012-08-22 2014-02-27 三菱電機株式会社 キャッシュメモリコントローラ及びキャッシュメモリコントロール方法

Also Published As

Publication number Publication date
US20060248520A1 (en) 2006-11-02
CN100409187C (zh) 2008-08-06
JPWO2005078579A1 (ja) 2007-10-18
CN1918546A (zh) 2007-02-21

Similar Documents

Publication Publication Date Title
WO2005078579A1 (ja) プログラム変換装置およびプログラム変換方法
Luk et al. Cooperative prefetching: Compiler and hardware support for effective instruction prefetching in modern processors
US7386844B2 (en) Compiler apparatus and method of optimizing a source program by reducing a hamming distance between two instructions
US5797013A (en) Intelligent loop unrolling
US6367071B1 (en) Compiler optimization techniques for exploiting a zero overhead loop mechanism
US5790874A (en) Information processing apparatus for reducing power consumption by minimizing hamming distance between consecutive instruction
JP4231516B2 (ja) 実行コードの生成方法及びプログラム
JP4844971B2 (ja) インタープリタの最適化をプログラム・コード変換の間に実行する方法及び装置
Wehmeyer et al. Influence of memory hierarchies on predictability for time constrained embedded software
Chang et al. The importance of prepass code scheduling for superscalar and superpipelined processors
US8886887B2 (en) Uniform external and internal interfaces for delinquent memory operations to facilitate cache optimization
JP2005078264A (ja) コンピュータシステム、コンパイラ装置およびオペレーティングシステム
US6148439A (en) Nested loop data prefetching using inner loop splitting and next outer loop referencing
US6202143B1 (en) System for fetching unit instructions and multi instructions from memories of different bit widths and converting unit instructions to multi instructions by adding NOP instructions
WO1999030231A1 (fr) Procede permettant d'optimiser l'acces memoire
Peterson Architectural and compiler support for effective instruction prefetching: a cooperative approach
KR20040094888A (ko) 단일 스레드 응용을 지원하기 위한 시간-멀티플렉스된스펙큘레이티브 멀티 스레딩
US7313787B2 (en) Compiler and method for optimizing object codes for hierarchical memories
US7689976B2 (en) Compiler apparatus and linker apparatus
Adve et al. Changing interaction of compiler and architecture
JP3840149B2 (ja) コンパイラ、演算処理システム及び演算処理方法
JPH10187460A (ja) バイナリ・プログラム変換装置および方法
Uh et al. Techniques for effectively exploiting a zero overhead loop buffer
Canedo et al. Compiling for reduced bit-width queue processors
JPH06290057A (ja) ループ最適化方法

Legal Events

Date Code Title Description
WWE Wipo information: entry into national phase

Ref document number: 2005517928

Country of ref document: JP

AK Designated states

Kind code of ref document: A1

Designated state(s): AE AG AL AM AT AU AZ BA BB BG BR BW BY BZ CA CH CN CO CR CU CZ DE DK DM DZ EC EE EG ES FI GB GD GE GH GM HR HU ID IL IN IS JP KE KG KP KR KZ LC LK LR LS LT LU LV MA MD MG MK MN MW MX MZ NA NI NO NZ OM PG PH PL PT RO RU SC SD SE SG SK SL SY TJ TM TN TR TT TZ UA UG US UZ VC VN YU ZA ZM ZW

AL Designated countries for regional patents

Kind code of ref document: A1

Designated state(s): GM KE LS MW MZ NA SD SL SZ TZ UG ZM ZW AM AZ BY KG KZ MD RU TJ TM AT BE BG CH CY CZ DE DK EE ES FI FR GB GR HU IE IS IT LT LU MC NL PL PT RO SE SI SK TR BF BJ CF CG CI CM GA GN GQ GW ML MR NE SN TD TG

121 Ep: the epo has been informed by wipo that ep was designated in this application
WWE Wipo information: entry into national phase

Ref document number: 2006248520

Country of ref document: US

Ref document number: 10565530

Country of ref document: US

WWE Wipo information: entry into national phase

Ref document number: 200580004685.6

Country of ref document: CN

NENP Non-entry into the national phase

Ref country code: DE

WWW Wipo information: withdrawn in national office

Country of ref document: DE

WWP Wipo information: published in national office

Ref document number: 10565530

Country of ref document: US

122 Ep: pct application non-entry in european phase