JPH05265770A - 計算機言語処理方法 - Google Patents
計算機言語処理方法Info
- Publication number
- JPH05265770A JPH05265770A JP4061984A JP6198492A JPH05265770A JP H05265770 A JPH05265770 A JP H05265770A JP 4061984 A JP4061984 A JP 4061984A JP 6198492 A JP6198492 A JP 6198492A JP H05265770 A JPH05265770 A JP H05265770A
- Authority
- JP
- Japan
- Prior art keywords
- loop
- index
- array
- data
- division
- 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
Links
Landscapes
- Devices For Executing Special Programs (AREA)
Abstract
(57)【要約】
【目的】本発明は,階層型メモリを有する計算機上で動
作するプログラム10について,オブジェクトプログラム
15への翻訳時に最適化処理を行う計算機言語処理方法に
関し,多重ループ中のデータを高速にアクセスすること
ができる最適化を広範囲に実施し,プログラムの実行性
能を向上させることを目的とする。 【構成】最適化処理部13において,タイトな構造を持つ
ループを検出し,ブロッキング可能なループを認識す
る。そして,データの重なり解析を利用することによ
り,最内ループにおける配列データのアクセス距離が短
くなるようにループを入れ換える。次に,ブロッキング
可能な候補配列を抽出し,候補配列の中から分割対象配
列と分割対象インデックスを決定する。分割後の配列が
キャッシュメモリのサイズに収まるように,分割のブロ
ック長を決定し, ループの変形を行う。
作するプログラム10について,オブジェクトプログラム
15への翻訳時に最適化処理を行う計算機言語処理方法に
関し,多重ループ中のデータを高速にアクセスすること
ができる最適化を広範囲に実施し,プログラムの実行性
能を向上させることを目的とする。 【構成】最適化処理部13において,タイトな構造を持つ
ループを検出し,ブロッキング可能なループを認識す
る。そして,データの重なり解析を利用することによ
り,最内ループにおける配列データのアクセス距離が短
くなるようにループを入れ換える。次に,ブロッキング
可能な候補配列を抽出し,候補配列の中から分割対象配
列と分割対象インデックスを決定する。分割後の配列が
キャッシュメモリのサイズに収まるように,分割のブロ
ック長を決定し, ループの変形を行う。
Description
【0001】
【産業上の利用分野】本発明は,階層型メモリを有する
計算機上で動作するプログラムについて,オブジェクト
プログラムへの翻訳時に最適化処理を行う計算機言語処
理方法に関する。
計算機上で動作するプログラムについて,オブジェクト
プログラムへの翻訳時に最適化処理を行う計算機言語処
理方法に関する。
【0002】最近のハードウェアは,主記憶の他に,よ
り高速なメモリ(以下,キャシュメモリという)を実装
した階層型メモリ構造を持つものが一般的である。アク
セス頻度の高いデータは,キャシュメモリに格納され高
速にアクセスされる。一般に,キャシュメモリと主記憶
のアクセスとの差は数〜数十マシンサイクルと言われて
おり,主記憶の方が圧倒的にメモリアクセスのコストが
大きい。
り高速なメモリ(以下,キャシュメモリという)を実装
した階層型メモリ構造を持つものが一般的である。アク
セス頻度の高いデータは,キャシュメモリに格納され高
速にアクセスされる。一般に,キャシュメモリと主記憶
のアクセスとの差は数〜数十マシンサイクルと言われて
おり,主記憶の方が圧倒的にメモリアクセスのコストが
大きい。
【0003】従って,高級言語で記述されたプログラム
をコンパイルする際に,できるだけキャッシュメモリが
有効利用されるように最適化を行えば,プログラムの実
行性能が向上する。そのための適切な技術手段が必要と
される。
をコンパイルする際に,できるだけキャッシュメモリが
有効利用されるように最適化を行えば,プログラムの実
行性能が向上する。そのための適切な技術手段が必要と
される。
【0004】
【従来の技術】従来の最適化コンパイラでは,ユーザが
記述したソースプログラムに対して,命令数の削減/命
令の並べ換えにより,メモリアクセスの縮小化/パイプ
ラインにおけるディレイの縮小化を実施し,処理の向上
を図ってきた。
記述したソースプログラムに対して,命令数の削減/命
令の並べ換えにより,メモリアクセスの縮小化/パイプ
ラインにおけるディレイの縮小化を実施し,処理の向上
を図ってきた。
【0005】しかし,頻繁にメモリアクセスが必要な配
列データ等のデータをキャシュメモリに保持する方法
は,ほとんどの場合,ハードウェアのキャシュメモリの
管理方式に処理が委ねられている。ハードウェアで実現
されているキャシュメモリの制御方式では,ソースプロ
グラム上でキャシュメモリのミスヒットが認識できる場
合でも,キャシュメモリへのデータの配置・更新が一意
的に処理される。このため,ソフトウェアにより,ユー
ザプログラムの特徴に合わせてデータをキャシュメモリ
上へ配置することが,性能向上の観点から重要な問題と
なる。
列データ等のデータをキャシュメモリに保持する方法
は,ほとんどの場合,ハードウェアのキャシュメモリの
管理方式に処理が委ねられている。ハードウェアで実現
されているキャシュメモリの制御方式では,ソースプロ
グラム上でキャシュメモリのミスヒットが認識できる場
合でも,キャシュメモリへのデータの配置・更新が一意
的に処理される。このため,ソフトウェアにより,ユー
ザプログラムの特徴に合わせてデータをキャシュメモリ
上へ配置することが,性能向上の観点から重要な問題と
なる。
【0006】上記の問題点をソフトウェアで解決する手
段として,ブロッキングと呼ばれる最適化技術が存在す
る。ブロッキング最適化の目的は,多重のループで構成
されるループ構造に対して,その最内ループで使用され
る配列をキャシュサイズに収まるように分割して,配列
データが常にキャシュメモリ上に保持されるようにルー
プの変形を行うことにある。
段として,ブロッキングと呼ばれる最適化技術が存在す
る。ブロッキング最適化の目的は,多重のループで構成
されるループ構造に対して,その最内ループで使用され
る配列をキャシュサイズに収まるように分割して,配列
データが常にキャシュメモリ上に保持されるようにルー
プの変形を行うことにある。
【0007】図10の(イ)にブロッキングの最適化が
適用可能なループの例を示す。このループでは,配列b
(k,j)は,インデックスiが更新される毎に,同一
の配列要素をアクセスする。従って,最内ループにおけ
る配列bに対するメモリアクセスの軌跡は,図10の
(ロ)に示すように,同じ軌跡が繰り返される。
適用可能なループの例を示す。このループでは,配列b
(k,j)は,インデックスiが更新される毎に,同一
の配列要素をアクセスする。従って,最内ループにおけ
る配列bに対するメモリアクセスの軌跡は,図10の
(ロ)に示すように,同じ軌跡が繰り返される。
【0008】もし,最内ループの配列bのサイズがキャ
シュサイズを超えているならば,一定間隔ごとに,キャ
シュメモリ上でミスヒットが生じることになる。キャシ
ュメモリを有効に利用するためには,配列bをキャシュ
サイズに格納できる大きさに分割し,分割を指示するル
ープを,最外ループの外に生成することが必要となる。
シュサイズを超えているならば,一定間隔ごとに,キャ
シュメモリ上でミスヒットが生じることになる。キャシ
ュメモリを有効に利用するためには,配列bをキャシュ
サイズに格納できる大きさに分割し,分割を指示するル
ープを,最外ループの外に生成することが必要となる。
【0009】現状のブロッキングによる最適化では,以
下の問題点があった。 (1) 通常のユーザプログラムでは,ループ変形を実施せ
ずに,ブロッキングの最適化を実施できることは非常に
稀である。そのため,本最適化機能をより広範囲に適用
するためには,インデックス交換/ループ分割といっ
た,各種のループ変形の最適化との融合が必要になる。
この適用順序によって,ブロッキングが適用できるルー
プが認識できる場合とできない場合がある。しかしなが
ら,従来技術では,これらを考慮する処理が行われてい
ないので,広範囲に最適化を適用することはできなかっ
た。
下の問題点があった。 (1) 通常のユーザプログラムでは,ループ変形を実施せ
ずに,ブロッキングの最適化を実施できることは非常に
稀である。そのため,本最適化機能をより広範囲に適用
するためには,インデックス交換/ループ分割といっ
た,各種のループ変形の最適化との融合が必要になる。
この適用順序によって,ブロッキングが適用できるルー
プが認識できる場合とできない場合がある。しかしなが
ら,従来技術では,これらを考慮する処理が行われてい
ないので,広範囲に最適化を適用することはできなかっ
た。
【0010】(2) ブロッキング可能なデータが検出でき
た場合,どのインデックスで配列を分割するかの決定が
性能向上に大きな影響を及ぼす。どのインデックスで配
列データを分割するかは,配列データの大きさ,対象候
補の個数およびループの実行順序関係に依存するが,従
来の処理系では,発見的な方法を取っているため,適切
な分割がなされないことがあった。
た場合,どのインデックスで配列を分割するかの決定が
性能向上に大きな影響を及ぼす。どのインデックスで配
列データを分割するかは,配列データの大きさ,対象候
補の個数およびループの実行順序関係に依存するが,従
来の処理系では,発見的な方法を取っているため,適切
な分割がなされないことがあった。
【0011】(3) ハードウェアに実装されているキャシ
ュサイズとブロッキング対象となった配列データとか
ら,最適な分割値(またはブロック長)を決定する必要
がある。しかしながら,複数の配列データが分割対象と
なった場合を含めて最適な分割値の決定方式が確立され
ておらず,適切な分割値が得られないことがあった。
ュサイズとブロッキング対象となった配列データとか
ら,最適な分割値(またはブロック長)を決定する必要
がある。しかしながら,複数の配列データが分割対象と
なった場合を含めて最適な分割値の決定方式が確立され
ておらず,適切な分割値が得られないことがあった。
【0012】
【発明が解決しようとする課題】本発明は上記問題点の
解決を図り,翻訳対象プログラムについて,多重ループ
中のデータを高速にアクセスすることができる最適化を
広範囲に実施し,かつ適切な分割を可能とすることによ
り,プログラムの実行性能を向上させることを目的とす
る。
解決を図り,翻訳対象プログラムについて,多重ループ
中のデータを高速にアクセスすることができる最適化を
広範囲に実施し,かつ適切な分割を可能とすることによ
り,プログラムの実行性能を向上させることを目的とす
る。
【0013】
【課題を解決するための手段】図1は,本発明の原理説
明図である。図1において,10はコンパイル対象とな
るソースプログラム,11はコンパイラが動作するCP
Uおよびメモリなどからなる処理装置,12はソースプ
ログラム10を入力し,構文解析および意味解析を行う
構文・意味解析部,13は構文・意味解析部12の処理
結果による中間テキストについて最適化を行う最適化処
理部,14は命令スケジューリングやレジスタ割り付け
を行い,オブジェクトコードを生成して出力するオブジ
ェクト生成出力部,15はコンパイル結果のオブジェク
トプログラムを表す。
明図である。図1において,10はコンパイル対象とな
るソースプログラム,11はコンパイラが動作するCP
Uおよびメモリなどからなる処理装置,12はソースプ
ログラム10を入力し,構文解析および意味解析を行う
構文・意味解析部,13は構文・意味解析部12の処理
結果による中間テキストについて最適化を行う最適化処
理部,14は命令スケジューリングやレジスタ割り付け
を行い,オブジェクトコードを生成して出力するオブジ
ェクト生成出力部,15はコンパイル結果のオブジェク
トプログラムを表す。
【0014】本発明では,主記憶とキャッシュメモリの
階層型メモリを有する計算機をターゲットとするソース
プログラム10をコンパイルする際に,最適化処理部1
3において以下の処理を行う。
階層型メモリを有する計算機をターゲットとするソース
プログラム10をコンパイルする際に,最適化処理部1
3において以下の処理を行う。
【0015】 タイトな構造を持つループを検出し,
ブロッキング可能なループを認識する。タイトな構造と
は,ループ制御変数以外のループ回帰変数がないこと,
ループ外への飛び出しがないこと,手続き呼出しが存在
しないことである。
ブロッキング可能なループを認識する。タイトな構造と
は,ループ制御変数以外のループ回帰変数がないこと,
ループ外への飛び出しがないこと,手続き呼出しが存在
しないことである。
【0016】 検出したループがタイトな構造を持た
ない場合,処理を行う。 データの重なり解析を利用することにより,インデ
ックス交換が可能なループの範囲を識別し,最内ループ
における配列データのアクセス距離が短くなるように外
側ループと最内ループとを入れ換えて,インデックス交
換を実施する。
ない場合,処理を行う。 データの重なり解析を利用することにより,インデ
ックス交換が可能なループの範囲を識別し,最内ループ
における配列データのアクセス距離が短くなるように外
側ループと最内ループとを入れ換えて,インデックス交
換を実施する。
【0017】 ループの深さとインデックスとの関
係,最内ループの配列をアクセスするインデックスとル
ープとの関係により,ブロッキング可能な候補配列を抽
出し,候補配列の中から分割対象配列と分割対象インデ
ックスを決定する。
係,最内ループの配列をアクセスするインデックスとル
ープとの関係により,ブロッキング可能な候補配列を抽
出し,候補配列の中から分割対象配列と分割対象インデ
ックスを決定する。
【0018】 分割後の配列がキャッシュメモリのサ
イズに収まるように,キャッシュメモリのサイズおよび
ループ回転数に基づいて,分割のブロック長を決定す
る。 分割すべき配列データ,分割すべきインデックスお
よび分割のブロック長をもとに,分割数を指示するルー
プを元のループの外に生成し,ループの変形を行う。
イズに収まるように,キャッシュメモリのサイズおよび
ループ回転数に基づいて,分割のブロック長を決定す
る。 分割すべき配列データ,分割すべきインデックスお
よび分割のブロック長をもとに,分割数を指示するルー
プを元のループの外に生成し,ループの変形を行う。
【0019】 検出したループがタイトな構造でない
場合には,ループ分割によってタイトなループ構造に再
構成する。 タイトなループ構造への再構成が成功したならば,
処理以下を実行する。失敗したならば,そのループの
最適化を諦め,次のループの検出を行う。
場合には,ループ分割によってタイトなループ構造に再
構成する。 タイトなループ構造への再構成が成功したならば,
処理以下を実行する。失敗したならば,そのループの
最適化を諦め,次のループの検出を行う。
【0020】処理によるループ変形によって,キャッ
シュメモリにおけるミスヒットを減少させ,実行性能を
向上させることができる。
シュメモリにおけるミスヒットを減少させ,実行性能を
向上させることができる。
【0021】
【作用】本発明は,以下の方式を採用することにより,
従来技術によるブロッキングの問題点を改善するもので
ある。
従来技術によるブロッキングの問題点を改善するもので
ある。
【0022】(1) ブロッキング可能な配列を認識する場
合に,ループ分割,インデックス交換等のループ変形の
最適化を利用して,ブロッキングの適用範囲を広げる。 (2) 最適な分割値(またはブロック長)を決定する。
合に,ループ分割,インデックス交換等のループ変形の
最適化を利用して,ブロッキングの適用範囲を広げる。 (2) 最適な分割値(またはブロック長)を決定する。
【0023】ブロッキング可能な配列データを分割する
場合には,ループの回転数で割り切れて,かつキャシュ
メモリに十分に収まる大きさとなるように分割値を決定
する。また,ブロッキング可能な配列データが複数存在
する場合においても,複数の配列データがキャシュサイ
ズに十分収まるように,最適な分割値を決定する。
場合には,ループの回転数で割り切れて,かつキャシュ
メモリに十分に収まる大きさとなるように分割値を決定
する。また,ブロッキング可能な配列データが複数存在
する場合においても,複数の配列データがキャシュサイ
ズに十分収まるように,最適な分割値を決定する。
【0024】これによって,主記憶へのアクセスを少な
くした効率のよいオブジェクトプログラムを生成するこ
とが可能になる。
くした効率のよいオブジェクトプログラムを生成するこ
とが可能になる。
【0025】
【実施例】以下,図1に示す最適化処理部13における
本発明に関係する部分の実施例の処理を,詳細に説明す
る。
本発明に関係する部分の実施例の処理を,詳細に説明す
る。
【0026】1)ブロッキング可能なループの認識 ブロッキングにより,実行結果が変わらない条件は,最
内ループに対して,(1) ループ制御変数以外のループ回
帰変数がない,(2) ループ外への飛び出しがない,(3)
手続き呼出しが存在しない,という3つの要件を満たす
タイトなループ構造を持つことである。また,この条件
に付け加えて,ブロッキングの最適化処理が実施可能で
あるためには,多重ループにおいて,最内ループの配列
の演算が最外ループのインデックスに依存せず,最外ル
ープのインデックスが変化しても,最内ループでは,常
にデータアクセスの法則性が変化しないことが必要であ
る。
内ループに対して,(1) ループ制御変数以外のループ回
帰変数がない,(2) ループ外への飛び出しがない,(3)
手続き呼出しが存在しない,という3つの要件を満たす
タイトなループ構造を持つことである。また,この条件
に付け加えて,ブロッキングの最適化処理が実施可能で
あるためには,多重ループにおいて,最内ループの配列
の演算が最外ループのインデックスに依存せず,最外ル
ープのインデックスが変化しても,最内ループでは,常
にデータアクセスの法則性が変化しないことが必要であ
る。
【0027】ブロッキングの対象ループは,上述したよ
うに,タイトなループに対してのみ実施されるため,対
象となる多重ループがタイトなループでない場合,タイ
トなループ構造への再構成を実施する。この処理によ
り,ブロッキング可能なループの適用範囲を広げること
ができる。
うに,タイトなループに対してのみ実施されるため,対
象となる多重ループがタイトなループでない場合,タイ
トなループ構造への再構成を実施する。この処理によ
り,ブロッキング可能なループの適用範囲を広げること
ができる。
【0028】図2は,そのループ分割によるループ再構
成の例を示している。ループ分割とは,図2の(イ)に
示すように,1つのループをそれぞれ同じループ制御変
数を持つ複数のループに分ける処理である。本発明で
は,タイトでない多重ループを複数のタイトなループに
分割することにより,タイトなループの最適化を可能と
する。タイトな多重ループとは,ループが直列の入れ子
をなし,最内のループのみに,実行文が出現する多重ル
ープのことを言う。
成の例を示している。ループ分割とは,図2の(イ)に
示すように,1つのループをそれぞれ同じループ制御変
数を持つ複数のループに分ける処理である。本発明で
は,タイトでない多重ループを複数のタイトなループに
分割することにより,タイトなループの最適化を可能と
する。タイトな多重ループとは,ループが直列の入れ子
をなし,最内のループのみに,実行文が出現する多重ル
ープのことを言う。
【0029】ループ分割は,以下の手順で行う。 (1) タイトなループの検出 最内ループから最外ループへとループを検出し,最内ル
ープにしか実行文が存在しないループをタイトなループ
として認識する。それ以外のループは,タイトなループ
として検出できないので,タイトでない多重ループを複
数のタイトなループに分割する必要がある。
ープにしか実行文が存在しないループをタイトなループ
として認識する。それ以外のループは,タイトなループ
として検出できないので,タイトでない多重ループを複
数のタイトなループに分割する必要がある。
【0030】(2) タイトでない多重ループの検索と分割
対象ループの検索 最内ループから外側ループへと検索し,以下のいずれか
の条件を満足するループをループ分割の対象とする。
対象ループの検索 最内ループから外側ループへと検索し,以下のいずれか
の条件を満足するループをループ分割の対象とする。
【0031】−最内ループと外側ループとの間に実行文
(ループ制御のための命令は除く)が存在する。 −同じ深さのタイトな兄弟ループが存在する。
(ループ制御のための命令は除く)が存在する。 −同じ深さのタイトな兄弟ループが存在する。
【0032】−ループ内からの飛び出しが存在しない。 (3) ループ分割 例えば,図2(ロ)の(a) に示す多重ループは,最内ル
ープと外側ループとの間に実行文Aが存在する。のル
ープから検索すると,とのループの間に,実行文A
が存在することがわかるので,がループ分割の対象と
なる。このループ分割により,ループは図2(ロ)の
(b) に示すようになる。
ープと外側ループとの間に実行文Aが存在する。のル
ープから検索すると,とのループの間に,実行文A
が存在することがわかるので,がループ分割の対象と
なる。このループ分割により,ループは図2(ロ)の
(b) に示すようになる。
【0033】図2(ハ)の(a) に示す多重ループは,同
じ深さのタイトな兄弟ループが存在する例である。の
ループから検索する。,のループは分割の対象とは
ならない。双方を検索した後,とを比較すると,同
じ深さのタイトな兄弟ループであることがわかるので,
図2(ハ)の(b) に示すようにループ分割を行う。
じ深さのタイトな兄弟ループが存在する例である。の
ループから検索する。,のループは分割の対象とは
ならない。双方を検索した後,とを比較すると,同
じ深さのタイトな兄弟ループであることがわかるので,
図2(ハ)の(b) に示すようにループ分割を行う。
【0034】2)ループ入れ換え処理 2.1) インデックス交換可能ループの判定 例えば,多次元配列がタイトな多重ループ内で,最内ル
ープの制御変数が一次元目以外の次元を引用している場
合,一次元目の配列要素を引用している外側ループが最
内ループになるようにループを入れ換える処理を,ルー
プのインデックス交換という。インデックス交換を実施
することにより,メモリ上の連続領域をアクセスするこ
とになり,メモリアクセス効率が向上する。
ープの制御変数が一次元目以外の次元を引用している場
合,一次元目の配列要素を引用している外側ループが最
内ループになるようにループを入れ換える処理を,ルー
プのインデックス交換という。インデックス交換を実施
することにより,メモリ上の連続領域をアクセスするこ
とになり,メモリアクセス効率が向上する。
【0035】例えば図3の(イ)に示すループでは,
(ロ)に示す,,,…の順番で配列Aの各要素に
アクセスすることになる。従って,不連続領域へのアク
セスとなる。配列Bも同様である。なお,この飛び飛び
にアクセスするデータの間隔を,配列データのアクセス
距離という。
(ロ)に示す,,,…の順番で配列Aの各要素に
アクセスすることになる。従って,不連続領域へのアク
セスとなる。配列Bも同様である。なお,この飛び飛び
にアクセスするデータの間隔を,配列データのアクセス
距離という。
【0036】インデックス交換により,図3の(ハ)に
示すように,最内ループと外側ループとを入れ換える
と,アクセスの順番は,(ニ)に示す,,,…の
ようになり,最内ループの配列A(I,J),B(I,
J)は,連続領域のアクセスとなる。
示すように,最内ループと外側ループとを入れ換える
と,アクセスの順番は,(ニ)に示す,,,…の
ようになり,最内ループの配列A(I,J),B(I,
J)は,連続領域のアクセスとなる。
【0037】インデックス交換の目的は,このように配
列データのアクセス距離が最小となるようにすることで
ある。インデックス交換が可能であるかどうかは,ルー
プ中の配列要素の依存関係による。そこで,“データの
重なり解析”により,インデックス交換が可能なループ
の範囲を識別し,インデックス交換を実施する。
列データのアクセス距離が最小となるようにすることで
ある。インデックス交換が可能であるかどうかは,ルー
プ中の配列要素の依存関係による。そこで,“データの
重なり解析”により,インデックス交換が可能なループ
の範囲を識別し,インデックス交換を実施する。
【0038】データの重なり解析とは,次のような処理
である。一般に,多重ループのインデックス交換やルー
プ分割等のループの構造を大幅に変換する最適化では,
そのループ中の配列要素の依存関係を認識する必要があ
る。このとき,ループ内の配列要素の振る舞いを,添字
と制御変数の関係から単純化した形にすることで,デー
タの重なり(依存)関係を調べて,上記で述べた最適化
処理が実施できるかどうかを判断する。データの重なり
解析は,このようなときに行う処理であり,具体的には
次の情報を解析する処理である。
である。一般に,多重ループのインデックス交換やルー
プ分割等のループの構造を大幅に変換する最適化では,
そのループ中の配列要素の依存関係を認識する必要があ
る。このとき,ループ内の配列要素の振る舞いを,添字
と制御変数の関係から単純化した形にすることで,デー
タの重なり(依存)関係を調べて,上記で述べた最適化
処理が実施できるかどうかを判断する。データの重なり
解析は,このようなときに行う処理であり,具体的には
次の情報を解析する処理である。
【0039】(1) 配列要素のインデックス空間上での定
義・参照の順序関係。 この情報解析では,個々の配列要素の定義・参照情報の
他に,最内ループで演算を実施する異なる配列要素同士
が,互いに同一領域をアクセスするかの情報も収集す
る。
義・参照の順序関係。 この情報解析では,個々の配列要素の定義・参照情報の
他に,最内ループで演算を実施する異なる配列要素同士
が,互いに同一領域をアクセスするかの情報も収集す
る。
【0040】(2) 単純変数同士の演算における先行順序
関係。 以上のデータの重なり解析処理は,ベクトル化コンパイ
ラで採用されているデータの依存関係の解析と同様でよ
く,よく知られている処理であるので,ここでの説明は
この程度にとどめる。
関係。 以上のデータの重なり解析処理は,ベクトル化コンパイ
ラで採用されているデータの依存関係の解析と同様でよ
く,よく知られている処理であるので,ここでの説明は
この程度にとどめる。
【0041】もし,インデックス交換が不可能なループ
であれば,現状のインデックスの並びで,ブロッキング
可能かどうかの判定を行う。本方式を以下のような順序
に拡張することにより,ブロッキングを実施する配列が
決定した後に,インデックス交換を実施することが可能
である。
であれば,現状のインデックスの並びで,ブロッキング
可能かどうかの判定を行う。本方式を以下のような順序
に拡張することにより,ブロッキングを実施する配列が
決定した後に,インデックス交換を実施することが可能
である。
【0042】(1) インデックス交換をする部分を,交換
できるインデックス空間に置き換える。 (2) “ブロッキング可能な配列データ”の候補集合を求
める。
できるインデックス空間に置き換える。 (2) “ブロッキング可能な配列データ”の候補集合を求
める。
【0043】(3) “交換できるインデックス空間”でイ
ンデックス交換を実施する。 (1) 〜(3) の操作を繰り返し実施することにより,より
きめこまかなブロッキングの処理を実現できる。
ンデックス交換を実施する。 (1) 〜(3) の操作を繰り返し実施することにより,より
きめこまかなブロッキングの処理を実現できる。
【0044】3)ブロッキング可能な配列データの検出 3.1) 配列データ再利用の解析 ループの深さとインデックスとの関係,最内ループの配
列をアクセスするインデックスとループとの関係によ
り,ブロッキング可能な配列を決定する。
列をアクセスするインデックスとループとの関係によ
り,ブロッキング可能な配列を決定する。
【0045】本解析方法は,“データの重なり解析”の
ように,最内ループで主記憶アクセスされる定義と参照
のデータが重なっているか等の情報は一切収集しない。
ブロッキングに必要なデータの依存関係の解析は,解析
中のインデックスXに対して,最内ループで,Xの値が
変化した時,同一順序の配列のアクセスが存在するかど
うかだけを調べればよい。
ように,最内ループで主記憶アクセスされる定義と参照
のデータが重なっているか等の情報は一切収集しない。
ブロッキングに必要なデータの依存関係の解析は,解析
中のインデックスXに対して,最内ループで,Xの値が
変化した時,同一順序の配列のアクセスが存在するかど
うかだけを調べればよい。
【0046】この配列データ再利用の解析処理について
の詳しい説明は,本実施例の説明の後に〔補足説明1〕
として述べる。 3.2) 分割対象配列および分割対象インデックスの決定 ブロッキングをどの配列に対して実施するか,またどの
インデックスで実施するかの決定プロセスを図4に示
す。
の詳しい説明は,本実施例の説明の後に〔補足説明1〕
として述べる。 3.2) 分割対象配列および分割対象インデックスの決定 ブロッキングをどの配列に対して実施するか,またどの
インデックスで実施するかの決定プロセスを図4に示
す。
【0047】(a) 分割対象インデックスの決定では,ま
ずブロッキング可能な候補配列およびインデックスの候
補の抽出を行う。 (b) 次に,キャッシュメモリのサイズと,ブロッキング
対象データのサイズとを比較する。
ずブロッキング可能な候補配列およびインデックスの候
補の抽出を行う。 (b) 次に,キャッシュメモリのサイズと,ブロッキング
対象データのサイズとを比較する。
【0048】(c) 配列データのアクセス距離を計算す
る。 (d) 以上の結果から,配列の次元数を考慮し,分割イン
デックスを決定する。以上の処理(a) 〜(d) を繰り返
す。このときに注意すべき点は以下のとおりである。
る。 (d) 以上の結果から,配列の次元数を考慮し,分割イン
デックスを決定する。以上の処理(a) 〜(d) を繰り返
す。このときに注意すべき点は以下のとおりである。
【0049】(1) もしループの回転数が翻訳時に確定し
ないならば,配列の宣言を参照して,要素すべてをアク
セスするとみなして計算する。 (2) ブロッキング対象の配列データの形状が翻訳時に確
定しない場合,例えば“b(i*8,k*8)”や“b
(c(i,k))”の場合,翻訳時に正確な分割値を求
めることができない。この場合には,ブロッキングを実
施しない。
ないならば,配列の宣言を参照して,要素すべてをアク
セスするとみなして計算する。 (2) ブロッキング対象の配列データの形状が翻訳時に確
定しない場合,例えば“b(i*8,k*8)”や“b
(c(i,k))”の場合,翻訳時に正確な分割値を求
めることができない。この場合には,ブロッキングを実
施しない。
【0050】(3) 次元数の考慮は,1次元配列,2次元
配列,N次元(N>=3)配列と分離して考える。な
お,この次元数の考慮については,後述する〔補足説明
2〕で詳しく説明する。
配列,N次元(N>=3)配列と分離して考える。な
お,この次元数の考慮については,後述する〔補足説明
2〕で詳しく説明する。
【0051】4)ブロック長の決定 ブロッキングを行うにあたり,性能を大きく左右する要
因となるのが,“ブロッキング対象の配列をいくつに分
割するか”である。分割のブロック長をSTRIDEと
呼び,最適なSTRIDEを求めることが,ブロッキン
グ最適化の鍵となる。このSTRIDEを決定する方法
を,〔補足説明3〕として後述する。
因となるのが,“ブロッキング対象の配列をいくつに分
割するか”である。分割のブロック長をSTRIDEと
呼び,最適なSTRIDEを求めることが,ブロッキン
グ最適化の鍵となる。このSTRIDEを決定する方法
を,〔補足説明3〕として後述する。
【0052】ブロック長を決定する場合の最大の要因
は,ハードウェアが持つデータキャシュの大きさであ
る。データキャシュが大きい場合,より多量のデータを
データキャシュ上に保持することが可能(STRIDE
を大きくとることが可能)であり,反対に少量のデータ
しかキャシュ上に保持することができないときには,S
TRIDEを小さくすることが必要となる。以下に,S
TRIDEの決定要因を示す。
は,ハードウェアが持つデータキャシュの大きさであ
る。データキャシュが大きい場合,より多量のデータを
データキャシュ上に保持することが可能(STRIDE
を大きくとることが可能)であり,反対に少量のデータ
しかキャシュ上に保持することができないときには,S
TRIDEを小さくすることが必要となる。以下に,S
TRIDEの決定要因を示す。
【0053】(1) ループの回転数が翻訳時に確定してい
る場合 分割後の配列がキャシュサイズに収まり,かつループの
回転数で割り切れるSTRIDEを選択する。ブロッキ
ング対象ループが2つあり,相互の回転数が違う場合に
は,最内ループの回転数に合わせて,STRIDEを決
定する。また回転数が素数の場合には,配列要素が収ま
る最大値をSTRIDEとする。
る場合 分割後の配列がキャシュサイズに収まり,かつループの
回転数で割り切れるSTRIDEを選択する。ブロッキ
ング対象ループが2つあり,相互の回転数が違う場合に
は,最内ループの回転数に合わせて,STRIDEを決
定する。また回転数が素数の場合には,配列要素が収ま
る最大値をSTRIDEとする。
【0054】(2) ループの回転数が翻訳時に確定してい
ない場合 回転数が翻訳時に確定しない場合にもブロッキングを実
施することができる。このとき注意すべき点は,“ST
RIDEの合計が回転数を超える場合”を常に考慮しな
ければならないことである。この場合には,以下の手順
でSTRIDEを決定する。
ない場合 回転数が翻訳時に確定しない場合にもブロッキングを実
施することができる。このとき注意すべき点は,“ST
RIDEの合計が回転数を超える場合”を常に考慮しな
ければならないことである。この場合には,以下の手順
でSTRIDEを決定する。
【0055】i) 回転数が翻訳時に確定しない場合に
は,配列の要素すべてをアクセスするとみなし,キャシ
ュサイズに格納可能なSTRIDEを決定する。方法は
回転数が既知の場合と同様である。
は,配列の要素すべてをアクセスするとみなし,キャシ
ュサイズに格納可能なSTRIDEを決定する。方法は
回転数が既知の場合と同様である。
【0056】ii) STRIDEが決定した後,新たにル
ープを生成する。ループの回転数が不明であるため,S
TRIDEと回転数との比較のためのコードを生成する
必要がある。このとき,条件付転送命令を持つハードウ
ェアでは,STRIDEと回転数との比較を条件付転送
命令に置き換える。この置き換えにより,分岐のオーバ
ヘッドを縮小することが可能となる。
ープを生成する。ループの回転数が不明であるため,S
TRIDEと回転数との比較のためのコードを生成する
必要がある。このとき,条件付転送命令を持つハードウ
ェアでは,STRIDEと回転数との比較を条件付転送
命令に置き換える。この置き換えにより,分岐のオーバ
ヘッドを縮小することが可能となる。
【0057】図5に,STRIDEの和とループの回転
数(N)の関係を示す。この図から明らかなように,ル
ープの回転数が不明である場合には,比較判断の命令が
必要になる。
数(N)の関係を示す。この図から明らかなように,ル
ープの回転数が不明である場合には,比較判断の命令が
必要になる。
【0058】図6は,そのためのループの終了条件を判
定する命令の例を示している。例えば図6に示す“do i
=ii,min(ii+istride-1, n)”のように,翻訳時にループ
の回転数(変数n)が確定しない場合には,STRID
E(変数istride)のそれまでの合計値と,回転
数(n)のうち小さいほうを選び,それをループの終了
条件とする。 5)ループ変形 分割すべき配列データ,分割すべきインデックス,およ
びブロック長(STRIDE)が決定した後,分割数を
指示するループをオリジナルループの外に生成する。ブ
ロッキングを実施した場合,オリジナルループと比較し
て,ループが深くなるが,最内ループのブロッキング対
象となったデータがキャシュにミスヒットしないことを
考慮すると,新たに生成したループのオーバヘッドは無
視できる。 〔補足説明1〕 配列データの再利用解析 配列データの再利用解析では,“最内ループで使用され
る配列データが,どのインデックス空間で使用されるの
か”のデータを収集する。このデータをインデックス・
ディペンデンス・ベクトル(Index dependence vector)
と呼ぶ。
定する命令の例を示している。例えば図6に示す“do i
=ii,min(ii+istride-1, n)”のように,翻訳時にループ
の回転数(変数n)が確定しない場合には,STRID
E(変数istride)のそれまでの合計値と,回転
数(n)のうち小さいほうを選び,それをループの終了
条件とする。 5)ループ変形 分割すべき配列データ,分割すべきインデックス,およ
びブロック長(STRIDE)が決定した後,分割数を
指示するループをオリジナルループの外に生成する。ブ
ロッキングを実施した場合,オリジナルループと比較し
て,ループが深くなるが,最内ループのブロッキング対
象となったデータがキャシュにミスヒットしないことを
考慮すると,新たに生成したループのオーバヘッドは無
視できる。 〔補足説明1〕 配列データの再利用解析 配列データの再利用解析では,“最内ループで使用され
る配列データが,どのインデックス空間で使用されるの
か”のデータを収集する。このデータをインデックス・
ディペンデンス・ベクトル(Index dependence vector)
と呼ぶ。
【0059】例えば,図7の(イ)に示す例で説明する
と,Index dependence vector は,以下のようになる。
最内ループの配列データのインデックスj,k,iと,
ループの深さとの関係は,図7の(ロ)に示すようにな
る。この各インデックスに対応したループの深さが,In
dex vectorの並びになる。このケースでは,Index vect
orは{j,k,i}の順番になる。ここで,インデック
スが関与するものを“1”,関与しないものを“0”と
し,Index dependence vector を定める。
と,Index dependence vector は,以下のようになる。
最内ループの配列データのインデックスj,k,iと,
ループの深さとの関係は,図7の(ロ)に示すようにな
る。この各インデックスに対応したループの深さが,In
dex vectorの並びになる。このケースでは,Index vect
orは{j,k,i}の順番になる。ここで,インデック
スが関与するものを“1”,関与しないものを“0”と
し,Index dependence vector を定める。
【0060】その結果,Index dependence vector は,
図7の(ハ)に示すように, c(i,j) ={1,0,1 }: a(i,k) ={0,1,1 }: b(k,
j) ={1,1,0 } となる。
図7の(ハ)に示すように, c(i,j) ={1,0,1 }: a(i,k) ={0,1,1 }: b(k,
j) ={1,1,0 } となる。
【0061】これをもとに,最外ループに対して再利用
(Reuse)可能な配列データを求める。各ループのインデ
ックスのIndex vectorを定義し,Index dependence vec
torとの減算を実施する。減算した結果は,結果Vector
に格納される。
(Reuse)可能な配列データを求める。各ループのインデ
ックスのIndex vectorを定義し,Index dependence vec
torとの減算を実施する。減算した結果は,結果Vector
に格納される。
【0062】Result(k1,・・・,kn) = Idv(j1,・・・,jn)
− Iv(i1,・・・,in) (n:ループの深さ) 各インデックスに対して減算の結果を求める。Result
(1) ={r1,・・・,rn },インデックスIn(1<in<n)で再
利用可能なデータは,該当するIndex Vectorの欄が('−
1')の場合である。それ以外の数値の場合('0')は,ア
クセスする配列が調査対象のインデックスを含んでいる
ため,最外ループに対して再利用不可能となる。
− Iv(i1,・・・,in) (n:ループの深さ) 各インデックスに対して減算の結果を求める。Result
(1) ={r1,・・・,rn },インデックスIn(1<in<n)で再
利用可能なデータは,該当するIndex Vectorの欄が('−
1')の場合である。それ以外の数値の場合('0')は,ア
クセスする配列が調査対象のインデックスを含んでいる
ため,最外ループに対して再利用不可能となる。
【0063】図7の例で説明すると,まず, Index Dependence Vector : c(i,j) = (1,0,1) a
(i,k) = (0,1,1) b(k,j) = (1,1,0) を求め,次に,Index jに対して再利用可能なデータを
収集する。インデックス'j' のIndex Vectorは, Iv
(j)= (1,0,0)である。
(i,k) = (0,1,1) b(k,j) = (1,1,0) を求め,次に,Index jに対して再利用可能なデータを
収集する。インデックス'j' のIndex Vectorは, Iv
(j)= (1,0,0)である。
【0064】Index Dependence Vector とIndex Vector
の減算を行う。 c(i,j) : (1,0,1)− (1,0,0)= ( 0,0,1) a(i,k) : (0,1,1)− (1,0,0)= (-1,1,1) ★再利用可能 b(k,j) : (1,1,0)− (1,0,0)= ( 0,1,0) このとき,インデックス 'j' に対して,配列a(i,
k)は再利用があることを意味し,インデックス 'i',
'k' に対してブロッキング可能となる。
の減算を行う。 c(i,j) : (1,0,1)− (1,0,0)= ( 0,0,1) a(i,k) : (0,1,1)− (1,0,0)= (-1,1,1) ★再利用可能 b(k,j) : (1,1,0)− (1,0,0)= ( 0,1,0) このとき,インデックス 'j' に対して,配列a(i,
k)は再利用があることを意味し,インデックス 'i',
'k' に対してブロッキング可能となる。
【0065】以上のように簡単なベクトルの減算によ
り,再利用可能な配列データと,対象インデックスを求
めることができる。 〔補足説明2〕 ブロッキング対象データの次元数の考
慮 [1次元配列の場合]分割対象の配列が1次元のとき,
分割対象となるインデックスは1つしかない。再利用可
能な配列データのインデックスが最内ループのインデッ
クスに依存していないならば,ブロッキングは実施しな
い。最内ループのインデックスに依存しているときのみ
分割する。
り,再利用可能な配列データと,対象インデックスを求
めることができる。 〔補足説明2〕 ブロッキング対象データの次元数の考
慮 [1次元配列の場合]分割対象の配列が1次元のとき,
分割対象となるインデックスは1つしかない。再利用可
能な配列データのインデックスが最内ループのインデッ
クスに依存していないならば,ブロッキングは実施しな
い。最内ループのインデックスに依存しているときのみ
分割する。
【0066】[2次元配列の場合]対象となる配列デー
タの各要素が,最内とそのすぐ外側のループのインデッ
クスでアクセスされるならば,両方のインデックスに対
して,ブロッキングを実施する。もし最内ループしか含
まないとき,最内ループのインデックスのみで分割す
る。両方のインデックスを含まないとき,ブロッキング
は実施しない。
タの各要素が,最内とそのすぐ外側のループのインデッ
クスでアクセスされるならば,両方のインデックスに対
して,ブロッキングを実施する。もし最内ループしか含
まないとき,最内ループのインデックスのみで分割す
る。両方のインデックスを含まないとき,ブロッキング
は実施しない。
【0067】[3次元以上配列の場合] −最内ループに着目してブロッキングを実施する。外側
ループに着目したブロッキングは翻訳コストの面から実
施しない。
ループに着目したブロッキングは翻訳コストの面から実
施しない。
【0068】−ブロッキングを行うためにインデックス
交換が必要なときは,ブロッキングは実施しない。最内
ループのインデックスでアクセスされる配列のみブロッ
キングの対象とする。 〔補足説明3〕 STRIDE(分割長)の決定 ループの回転数が翻訳時に確定している場合,分割後の
配列がキャシュサイズに収まり,かつループの回転数で
割り切れるSTRIDE(分割長)を選択する。
交換が必要なときは,ブロッキングは実施しない。最内
ループのインデックスでアクセスされる配列のみブロッ
キングの対象とする。 〔補足説明3〕 STRIDE(分割長)の決定 ループの回転数が翻訳時に確定している場合,分割後の
配列がキャシュサイズに収まり,かつループの回転数で
割り切れるSTRIDE(分割長)を選択する。
【0069】(1) 正方形に分割する場合 キャシュサイズをC(Byte),ブロッキング対象の
配列データがN個存在するものとし,配列の1要素の大
きさをE(Byte)とすると,1つの配列に分配する
ことができるキャシュサイズは STRIDE=SQRT((C/E) /N) の式で求められる。なお,SQRTは,平方根を求める
関数である。
配列データがN個存在するものとし,配列の1要素の大
きさをE(Byte)とすると,1つの配列に分配する
ことができるキャシュサイズは STRIDE=SQRT((C/E) /N) の式で求められる。なお,SQRTは,平方根を求める
関数である。
【0070】回転数は翻訳時に確定しているので,分割
値に近似していて,かつループの回転数で割り切れる数
値が最適なSTRIDEになる。 ブロッキング対象ループが2つあり,相互の回転数
が違う場合 最内ループの回転数をベースとして,最適なSTRID
E値を決定する。外側のループの回転数の決定では,回
転数を超えるかどうかの判定を生成する。
値に近似していて,かつループの回転数で割り切れる数
値が最適なSTRIDEになる。 ブロッキング対象ループが2つあり,相互の回転数
が違う場合 最内ループの回転数をベースとして,最適なSTRID
E値を決定する。外側のループの回転数の決定では,回
転数を超えるかどうかの判定を生成する。
【0071】 回転数が素数のとき 上記の式で求めたSTRIDEで分割する。STRID
E値が回転数を超えたかの判定を生成する。
E値が回転数を超えたかの判定を生成する。
【0072】(2) 最内ループのみブロッキングを実施す
る場合 最内ループの最適なSTRIDE値をXとして,その他
のN−1個のループの回転数を Ic(i){1≦i≦N−
1},対象配列の1要素の大きさをBとすると,一つの
配列要素に分配できるキャシュサイズは, STRIDE=C/B* (Π Ic(N−1)) の式で求めることができる。これが,キャシュに収まる
STRIDE長の最大値となる。以下,正方形に分割す
る方式と同様にして,最適なSTRIDE長を決定す
る。次に,本発明の具体的な適用例について,図8およ
び図9に従って説明する。
る場合 最内ループの最適なSTRIDE値をXとして,その他
のN−1個のループの回転数を Ic(i){1≦i≦N−
1},対象配列の1要素の大きさをBとすると,一つの
配列要素に分配できるキャシュサイズは, STRIDE=C/B* (Π Ic(N−1)) の式で求めることができる。これが,キャシュに収まる
STRIDE長の最大値となる。以下,正方形に分割す
る方式と同様にして,最適なSTRIDE長を決定す
る。次に,本発明の具体的な適用例について,図8およ
び図9に従って説明する。
【0073】 図8の(イ)に示すFORTRANソ
ースプログラムについて,本発明による最適化を実施す
るものとする。なお,実際には,ソースプログラムを中
間テキストに変換したものについて最適化を行うが,こ
こでは,説明をわかりやすくするため,ソースプログラ
ム形式で表記する。
ースプログラムについて,本発明による最適化を実施す
るものとする。なお,実際には,ソースプログラムを中
間テキストに変換したものについて最適化を行うが,こ
こでは,説明をわかりやすくするため,ソースプログラ
ム形式で表記する。
【0074】このプログラムのループを検出し,タイト
なループ構造であることがわかったならば,データの依
存関係の情報収集を実施した後に,最内ループの配列要
素のアクセスができるだけ連続となるように,インデッ
クス交換を実施する。
なループ構造であることがわかったならば,データの依
存関係の情報収集を実施した後に,最内ループの配列要
素のアクセスができるだけ連続となるように,インデッ
クス交換を実施する。
【0075】 インデックスIが最内ループ,インデ
ックスJが最外ループのインデックスとなるようにルー
プを変形する。これにより,図8の(ロ)に示すように
変形される。
ックスJが最外ループのインデックスとなるようにルー
プを変形する。これにより,図8の(ロ)に示すように
変形される。
【0076】 個々の配列要素に対して,Index depe
ndence vector を求める。インデックスとループの深さ
との関係から, Index dependence vector は,図8の
(ハ)に示すようになる。
ndence vector を求める。インデックスとループの深さ
との関係から, Index dependence vector は,図8の
(ハ)に示すようになる。
【0077】 最外ループに対して,常に同じデータ
アクセスの軌跡を描く配列を求める。図9の(イ)に示
すように,Jの Index vector は(1,0,0)であ
る。これをもとに,各配列のIndex dependence vector
と,Jの Index vector との減算を行う。この結果,J
のインデックス部が“−1”の配列要素,すなわちA
(I,K)が,インデックスJに対して,常に同じデー
タのアクセスの軌跡を描くデータであることがわかる。
アクセスの軌跡を描く配列を求める。図9の(イ)に示
すように,Jの Index vector は(1,0,0)であ
る。これをもとに,各配列のIndex dependence vector
と,Jの Index vector との減算を行う。この結果,J
のインデックス部が“−1”の配列要素,すなわちA
(I,K)が,インデックスJに対して,常に同じデー
タのアクセスの軌跡を描くデータであることがわかる。
【0078】 図9の(ロ)に示す処理を行う。すな
わち,配列A(I,K)とキャッシュサイズ(Cとす
る)を比較し,A(I,K)<Cのとき,本最適化は必
要ないので,ループ変形は実施しない。A(I,K)>
Cのとき,A(I,K)<Cとなるように,I,Kを分
割する。
わち,配列A(I,K)とキャッシュサイズ(Cとす
る)を比較し,A(I,K)<Cのとき,本最適化は必
要ないので,ループ変形は実施しない。A(I,K)>
Cのとき,A(I,K)<Cとなるように,I,Kを分
割する。
【0079】ここで,A(I,K)>Cであるとする。
前述した方法により,分割のサイズを計算し,それぞれ
ISTRIDE,KSTRIDEとする。 この分割長ISTRIDE,KSTRIDEに従っ
て,ループ変形を実施する。すなわち,分割数を指示す
るループ“DO KK=1,R,KSTRIDE", “DO II=1,N,ISTRIDE
”を,元のループの外に生成する。また,K,Jの回
転数が不明であることから,Kの回転数Rと分割数の合
計,Iの回転数Nと分割数の合計の比較によるループ終
了条件を定める命令を生成する。この結果,ループは,
図9の(ハ)に示すように変形される。図9の(ハ)に
示す最適化結果に従って,オブジェクトプログラムを生
成すれば,キャッシュメモリのミスヒットが少ない性能
のよいオブジェクトプログラムが得られることになる。
前述した方法により,分割のサイズを計算し,それぞれ
ISTRIDE,KSTRIDEとする。 この分割長ISTRIDE,KSTRIDEに従っ
て,ループ変形を実施する。すなわち,分割数を指示す
るループ“DO KK=1,R,KSTRIDE", “DO II=1,N,ISTRIDE
”を,元のループの外に生成する。また,K,Jの回
転数が不明であることから,Kの回転数Rと分割数の合
計,Iの回転数Nと分割数の合計の比較によるループ終
了条件を定める命令を生成する。この結果,ループは,
図9の(ハ)に示すように変形される。図9の(ハ)に
示す最適化結果に従って,オブジェクトプログラムを生
成すれば,キャッシュメモリのミスヒットが少ない性能
のよいオブジェクトプログラムが得られることになる。
【0080】
【発明の効果】以上説明したように,本発明によれば,
ブロッキングを行う前に,ループ分割,インデックス交
換等のループ変形を実施することにより,ブロッキング
の適用範囲を広げることが可能となる。また,ブロッキ
ングの効果により,一番実行コストが高い最内ループで
のキャシュメモリへのミスヒットを減少させ,主記憶参
照アクセスのオーバヘッドを削減することができるよう
になる。
ブロッキングを行う前に,ループ分割,インデックス交
換等のループ変形を実施することにより,ブロッキング
の適用範囲を広げることが可能となる。また,ブロッキ
ングの効果により,一番実行コストが高い最内ループで
のキャシュメモリへのミスヒットを減少させ,主記憶参
照アクセスのオーバヘッドを削減することができるよう
になる。
【図1】本発明の原理説明図である。
【図2】本発明の実施例に係るループ分割によるループ
再構成の例を示す図である。
再構成の例を示す図である。
【図3】本発明の実施例に係るインデックス交換の説明
図である。
図である。
【図4】本発明の実施例に係る分割対象インデックス決
定プロセス説明図である。
定プロセス説明図である。
【図5】本発明の実施例に係るSTRIDEの合計と回
転数の比較判断説明図である。
転数の比較判断説明図である。
【図6】本発明の実施例に係るループの終了条件の判定
説明図である。
説明図である。
【図7】本発明の実施例に係るループの深さ/インデッ
クス/配列アクセスの関係説明図である。
クス/配列アクセスの関係説明図である。
【図8】本発明の適用例説明図である。
【図9】本発明の適用例説明図である。
【図10】本発明に関係する最内ループのメモリアクセ
スの軌跡説明図である。
スの軌跡説明図である。
10 ソースプログラム 11 処理装置 12 構文・意味解析部 13 最適化処理部 14 オブジェクト生成出力部 15 オブジェクトプログラム
Claims (2)
- 【請求項1】 多重ループを含むソースプログラム(10)
を,階層型メモリを有する計算機上で動作するオブジェ
クトプログラム(15)に変換する計算機言語処理方法にお
いて,タイトな構造を持つループを検出し,ブロッキン
グ可能なループを認識する処理過程(,)と,デー
タの重なり解析を利用することにより,インデックス交
換が可能なループの範囲を識別し,最内ループにおける
配列データのアクセス距離が短くなるように外側ループ
と最内ループとを入れ換えて,インデックス交換を実施
する処理過程()と,ループの深さとインデックスと
の関係,最内ループの配列をアクセスするインデックス
とループとの関係により,ブロッキング可能な候補配列
を抽出し,候補配列の中から分割対象配列と分割対象イ
ンデックスを決定する処理過程()と,分割後の配列
がキャッシュメモリのサイズに収まるように,キャッシ
ュメモリのサイズおよびループ回転数に基づいて,分割
のブロック長を決定する処理過程()と,分割すべき
配列データ,分割すべきインデックスおよび分割のブロ
ック長をもとに,分割数を指示するループを元のループ
の外に生成し,ループの変形を行う処理過程()とを
有し,生成するオブジェクトプログラムの最適化処理を
行うことを特徴とする計算機言語処理方法。 - 【請求項2】 請求項1記載の計算機言語処理方法にお
いて,ブロッキング対象ループがタイトなループ構造で
ない場合に,ループ分割によってタイトなループ構造に
再構成する処理過程()を有することを特徴とする計
算機言語処理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP4061984A JP2677482B2 (ja) | 1992-03-18 | 1992-03-18 | 計算機言語処理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP4061984A JP2677482B2 (ja) | 1992-03-18 | 1992-03-18 | 計算機言語処理方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH05265770A true JPH05265770A (ja) | 1993-10-15 |
JP2677482B2 JP2677482B2 (ja) | 1997-11-17 |
Family
ID=13186963
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP4061984A Expired - Fee Related JP2677482B2 (ja) | 1992-03-18 | 1992-03-18 | 計算機言語処理方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2677482B2 (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005122506A (ja) * | 2003-10-17 | 2005-05-12 | Matsushita Electric Ind Co Ltd | コンパイラ装置 |
JPWO2005078579A1 (ja) * | 2004-02-12 | 2007-10-18 | 松下電器産業株式会社 | プログラム変換装置およびプログラム変換方法 |
JP2010244208A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | プリフェッチ生成プログラムおよびコンパイラ装置 |
JP2011197876A (ja) * | 2010-03-18 | 2011-10-06 | Fujitsu Ltd | 最適化処理プログラム,最適化処理装置および最適化処理方法 |
-
1992
- 1992-03-18 JP JP4061984A patent/JP2677482B2/ja not_active Expired - Fee Related
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2005122506A (ja) * | 2003-10-17 | 2005-05-12 | Matsushita Electric Ind Co Ltd | コンパイラ装置 |
JPWO2005078579A1 (ja) * | 2004-02-12 | 2007-10-18 | 松下電器産業株式会社 | プログラム変換装置およびプログラム変換方法 |
JP2010244208A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | プリフェッチ生成プログラムおよびコンパイラ装置 |
JP2011197876A (ja) * | 2010-03-18 | 2011-10-06 | Fujitsu Ltd | 最適化処理プログラム,最適化処理装置および最適化処理方法 |
Also Published As
Publication number | Publication date |
---|---|
JP2677482B2 (ja) | 1997-11-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6269438B1 (en) | Method for identifying hard-to-predict branches to enhance processor performance | |
JP3790683B2 (ja) | コンピュータ装置、その例外処理プログラム及びコンパイル方法 | |
US8793675B2 (en) | Loop parallelization based on loop splitting or index array | |
Gao et al. | Collective loop fusion for array contraction | |
US5193190A (en) | Partitioning optimizations in an optimizing compiler | |
US9798528B2 (en) | Software solution for cooperative memory-side and processor-side data prefetching | |
Sarkar | Automatic selection of high-order transformations in the IBM XL FORTRAN compilers | |
US7350061B2 (en) | Assigning free register to unmaterialized predicate in inverse predicate expression obtained for branch reversal in predicated execution system | |
Rus et al. | Hybrid analysis: static & dynamic memory reference analysis | |
US6301706B1 (en) | Compiler method and apparatus for elimination of redundant speculative computations from innermost loops | |
US6412105B1 (en) | Computer method and apparatus for compilation of multi-way decisions | |
US6721943B2 (en) | Compile-time memory coalescing for dynamic arrays | |
US20050144602A1 (en) | Methods and apparatus to compile programs to use speculative parallel threads | |
US20040093591A1 (en) | Method and apparatus prefetching indexed array references | |
JP4751510B2 (ja) | メモリアクセス最適化方法 | |
Hakak et al. | A new split based searching for exact pattern matching for natural texts | |
Funke et al. | Efficient generation of machine code for query compilers | |
US20030126591A1 (en) | Stride-profile guided prefetching for irregular code | |
Vanka et al. | Efficient and accurate data dependence profiling using software signatures | |
US7313787B2 (en) | Compiler and method for optimizing object codes for hierarchical memories | |
JP2677482B2 (ja) | 計算機言語処理方法 | |
Sundararajah et al. | Locality transformations for nested recursive iteration spaces | |
CN114546401A (zh) | 基于循环折叠的二进制程序体积优化器 | |
Sasak-Okoń et al. | Speculative query execution in RDBMS based on analysis of query stream multigraphs | |
US6637026B1 (en) | Instruction reducing predicate copy |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 19970708 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080725 Year of fee payment: 11 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090725 Year of fee payment: 12 |
|
LAPS | Cancellation because of no payment of annual fees |