JP4128439B2 - 配列圧縮方法 - Google Patents
配列圧縮方法 Download PDFInfo
- Publication number
- JP4128439B2 JP4128439B2 JP2002378747A JP2002378747A JP4128439B2 JP 4128439 B2 JP4128439 B2 JP 4128439B2 JP 2002378747 A JP2002378747 A JP 2002378747A JP 2002378747 A JP2002378747 A JP 2002378747A JP 4128439 B2 JP4128439 B2 JP 4128439B2
- Authority
- JP
- Japan
- Prior art keywords
- loop nest
- array
- loop
- compression
- nest
- 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.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
- G06F8/4434—Reducing the memory space required by the program code
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)
Description
【発明の属する技術分野】
本発明は、プログラムにおいて多量のデータを扱うために利用される配列のサイズ、すなわち配列の要素の数を減少させる配列圧縮方式に関する。
【0002】
【従来の技術】
数値計算プログラムなどのように、大量のデータを扱うプログラムを効率よく実行するためには、キャッシュなどを有効に利用することが必要である。そのために様々な手法が考案されてきた。配列圧縮という手法もその1つであり、これは配列のサイズを減らして、ローカリティを向上させる最適化の手法である。
【0003】
配列の圧縮について説明する前に、本発明で用いる配列に関連する用語について説明する。図14はループネストが列となっているループネスト列の例の説明図である。同図の先頭に、添字IおよびJを持つ配列Aについてのループネストが記述されている。
【0004】
このループネストは、添字Jに関するループが外側、Iに関するループが内側となっている入れ子構造となっている。しかしながら以後の説明においては、入れ子構造となっていない1つのループだけのものについてもループネストと呼ぶことにする。
【0005】
次に配列のローカリティ(局所性)について説明する。まず1つの配列Aが領域R内でローカルであるということは、領域R内で定義、または参照されるAの要素が全てR内でローカルであることを意味する。ここで領域とはプログラム全体の中の任意の一部であり、ループネストや、ループネスト列はそれぞれ1つの領域である。
【0006】
また配列Aの要素eが領域R内でローカルであるということは、第1にR内で参照されるeの値は必ずその参照の前にR内で定義されているという条件と、第2にRで定義されたeの値はR内でしか参照されないという条件とを共に満たすことを意味する。
【0007】
図15は配列圧縮の従来例の説明図である。同図において上側で一次元の配列T(I)が定義され、その後参照されて配列A(I)の定義が行われている。ここで配列T(I)の内容がプログラム全体の中の他の領域で参照されることがなければ、T(1)からT(N)までのN個の要素からなるこの配列は1つのスカラ変数Tとして下のように記述することができ、配列のサイズの減少が実現される。
【0008】
このような配列圧縮の従来技術として次の文献がある。
【0009】
【非特許文献1】
G.R.Gao他,“Collective Loop Fusion for Array Contraction”,ACAPS Technical Memo 41,Mcgill Univ.1992.
【0010】
【発明が解決しようとする課題】
図15で説明したようにある配列Aの要素の全てが領域R内でローカルであれば、R内において配列Aを圧縮できる可能性がある。
【0011】
しかしながら一般にこの条件を満たす場合はそれほど多くはなく、従来の圧縮方式では配列圧縮の効果が得られる機会が少ないという問題点があった。
また前述の文献は配列圧縮に関する有名、かつ基本的な論文であるが、この論文の方式はネストの深さが1のケースにしか適用できず、ほとんど実用的な配列圧縮を行うことができないという問題点があった。
【0012】
本発明の課題は、上述の問題点に鑑み、配列Aの要素の全てが領域R内でローカルでなくとも、配列圧縮の効果を得ることができる配列圧縮方法を提供することである。
【0013】
【課題を解決するための手段】
図1は本発明の配列圧縮方法、すなわち配列のサイズを減少させて、ローカリティを向上させる配列圧縮方法の原理的な機能ブロック図である。
【0014】
図1において、1で記憶装置に格納されているプログラムが読み出され、2でプログラムにおけるループネスト内の配列の要素のうちで、プログラム全体から見てそのループネスト内でローカルな要素だけが圧縮されて、スカラ変数に置き換える部分圧縮が行われ、3でローカルでない要素に対して元の配列へのアクセスがプログラム内に挿入される。
【0015】
発明の実施の形態においては、配列の部分圧縮の前に行われるループネスト列内の圧縮候補配列の探索において、ループネスト列内の1つの配列が最初に出現するループネストを求め、そのループネスト内でその配列が定義が先行する要素の多い定義先行の配列であれば、その配列をループネスト列内での圧縮候補とすることもでき、この場合ループネスト列内圧縮候補配列探索の後で行われるプログラム内圧縮候補探索において、前述の1つの配列がプログラム内の他のループネスト列内で圧縮候補とされてない時、その1つの配列を圧縮の候補から除外することもできる。
【0016】
実施の形態においては、部分圧縮の前に行われるループネスト列の複数のサブ・ループネスト列への分割において、前記圧縮候補の配列がループネスト内で定義先行であるような定義先行ループネストをサブループネスト列の先頭とするように分割を行うこともできる。
【0017】
更に実施の形態においては、サブ・ループネスト列への分割と部分圧縮との間で行われるサブ・ループネスト列内のループネストの融合性チェックにおいて、各ループネストの多次元並列化処理から得られ、各ループの変数の変化方向が順方向か逆方向かを示す回転方向の情報と、そのループ変数が圧縮候補配列の添字中に出現する位置とに対応して、サブ・ループネスト列内のループネストの融合のために回転方向を逆転すべきループを決定することも、また各ループネスト内でのループの順序を示す情報と、そのループの変数が圧縮候補配列の添字中に出現する位置とに対応して、ループの順序を反転すべきループネストを決定することもできる。
【0018】
本発明の配列圧縮方法においては、記憶装置に格納されているプログラムが読み出され、そのプログラムにおけるループネスト列内の1つの配列が最初に出現するループネストが求められ、そのループネスト内でその1つの配列が定義が先行する要素の多い定義先行の配列であればその配列がループネスト列内での圧縮候補とされ、圧縮候補とされた配列のうちから圧縮を行うべき配列が選択され、選択された配列の圧縮が行われる。
【0019】
この場合、発明の実施の形態においては、配列の圧縮の前に前述のループネスト列のサブ・ループネスト列への分割を行うこともでき、またサブ・ループネスト列への分割の後で、前述のサブ・ループネスト列内のループネストの融合性チェックとして、回転方向を逆転すべきループの決定とループの順序を反転すべきループネストの決定を行うこともできる。
【0020】
本発明において、プログラム内の配列のサイズを減少させるために計算機で使用されるプログラムとして、記憶装置内から対象となるプログラムを読み出す手順と、そのプログラムにおけるループネスト内の配列の要素のうちで、プログラム全体から見てそのループネスト内でのみローカルな要素を、スカラ変数に置き換える部分圧縮を行う手順と、ローカルでない要素に対しては、元の配列へのアクセスをプログラム内に挿入する手順とを計算機に実行させるためのプログラムが用いられる。
【0021】
以上のように本発明によれば、ある領域に対して定義先行である配列を対象として、配列の部分圧縮が行われる。
【0022】
【発明の実施の形態】
まず本実施形態における配列の部分圧縮について、図2によって説明する。図2はあるプログラムの一部を示し、このプログラム内での配列T(I)の圧縮について考える。
【0023】
図2の上部の右側と左側のループネストは、プログラムの実行時における条件によってそのどちらかが実行される。しかしながら、プログラムのその次の実行時には、条件の変化によって以前の実行時には実行されなかったループネストの処理の実行が行われる可能性がある。したがって、いずれのループネストの処理が実行される場合でも、プログラム全体として配列の要素に矛盾が生じないように配列の圧縮を行う必要がある。
【0024】
上部の左側のループネストにおいては配列T(I)の全ての要素、すなわちT(1)からT(N)まではループネスト内でまず定義され、その値が参照されて使用される。
【0025】
これに対して右側のループネストにおいては、配列T(I)の要素のうち、T(2)からT(N−1)まではループネスト内でまず定義されてその値が参照される。しかしながらT(1)およびT(N)の2つの要素については、まず例えばメモリに格納されている値が参照されて、ループネスト内で再度定義が行われる。
【0026】
従ってそれぞれのループネスト列でローカルであるのは、配列T(I)の要素のうちT(2)からT(N−1)だけであり、T(1)とT(N)の要素はローカルでなく、このローカルでない要素の圧縮を行うことはできない。そこでその他の要素だけを圧縮する部分圧縮を行うことにすると、それぞれのループネストは下に示すような形に変形される。
【0027】
左側のループネスト内の配列T(I)は、従来例の図15におけると同様に1つの要素T1のみに圧縮されるが、I=1およびI=Nに対してはこのT1の値を配列T(I)の要素として、例えばメモリ内に格納しておく必要がある。
【0028】
右側のループネストでは、配列T(I)が左側と同様に1つの要素T1に置き換えられるが、I=1およびI=Nに対しては、T1の値はT(I)の値を参照にすることによって得られ、また最後にI=1およびNに対しては、T1の値を配列T(I)の要素としてメモリなどに格納しておくことになる。
【0029】
このように本実施形態ではある配列が、例えば2つのループネスト内に出現する場合には、その2つのループネストで共にローカルな要素のみ圧縮が行われる。図2の例では、Nが十分大きければ圧縮される要素、すなわちT(2)からT(N−1)の数は多くなり、配列の部分圧縮によって配列のローカリティの向上が実現される。
【0030】
ループネスト内で配列の多くの要素がローカルであるということは、配列Aの要素のうちの多くの要素が、そのループネストの内部でまず最初に定義され、定義された後に必要に応じて参照されることである。このまず最初に定義されるということを、本実施形態では定義先行の配列と呼び、また配列Aの全ての要素または大半の要素がそのループネスト内で定義先行である時に、そのループネストを定義先行ループネストと呼ぶことにする。
【0031】
図3は配列Aに対応する定義先行ループネストの例を示す。(a)ではAの各要素の定義のみが存在し、(b)ではAの全ての要素の定義が参照に先行し、(c)ではI=2からI=N−1までの要素が定義先行であり、Nが十分大きければ配列Aの大半の要素が定義先行であることになる。このように配列AがループネストLに対して定義先行であることが、部分圧縮のための好ましい条件となる。
【0032】
これに対して配列Aの要素のうち、大半のものがループネストの中で最初に参照される場合、すなわち配列Aがループネストに対して参照先行である場合には、その配列Aの部分圧縮を行っても、図2で説明したように最後に、例えばメモリに格納すべき要素の数が多くなり、全体としての処理の効率化には必ずしも結びつかない。
【0033】
図4はそのような参照先行ループネストの例である。同図(a)では全ての要素の参照のみが行われており、(b)では全ての要素の参照が最初に行われ、(c)ではI=KとI=K+1の2つの要素のみについて定義が先行し、その他の大半の要素は参照先行となっている。
【0034】
このように部分圧縮を行うためには、配列AがループネストLに対して定義先行であることが好ましいが、単にその条件を満足するループネストを探索するだけでは配列圧縮を効果的に行えることはまれであり、多くの場合、複数のループネストを融合することによって初めて配列の圧縮が可能となることが多い。
【0035】
図5はこのようなループネストの融合の例である。同図の左側でT(I)を定義するループネストと、定義された配列T(I)を参照して配列A(I)を定義するループネストとの列において、右側のように2つのループネストを融合することにより、図15で説明したように配列の圧縮が可能となる。
【0036】
このように配列圧縮を効果的に行うためには、ループネスト列内の複数のループネストをどのように融合すべきかを決定する必要がある。このことは、結局1つのループネスト列を複数のサブ・ループネスト列に分割し、各サブ・ループネスト列の内部で配列を圧縮することに相当する。図6はこのサブ・ループネスト列への分割の説明図である。同図においては、ループネストLn0からLn3までのループネスト列が、ループネストLn0からLn2までのサブ・ループネスト列0と、ループネストLn3だけのサブ・ループネスト列1に分割されている。
【0037】
図7は以上の説明に対応した配列圧縮処理の全体フローチャートである。同図において処理が開始されると、まずステップS1でループネスト列抽出、すなわちプログラムの中からループネスト列を選び出す処理が実行され、ステップS2でループネスト列内圧縮候補探索、すなわち各ループネスト列の中で圧縮の候補となる配列の探索が行われる。この探索においては、後述するように、その配列が定義先行であるか否かをチェックすることによって、圧縮候補の探索が行われる。
【0038】
続いてステップS3で、プログラム全体から見ても圧縮の候補となる配列の探索が行われる。ここではステップS2で各ループネスト列内で圧縮の候補となった配列のうちで、他のループネスト列内で圧縮の候補とならなかった配列が除外されて、プログラム全体での圧縮候補の探索が行われる。
【0039】
ステップS4ではループネスト列のサブ・ループネスト列への分割が行われる。この処理では、後述するようにループネスト列内で配列Aが定義先行であるループネストの前でループネスト列が分割され、そのループネストから始まるループネスト列が新たなサブ・ループネスト列とされる分割処理が行われる。
【0040】
ステップS5でループネスト並列化の処理が行われる。この処理では、各ループネストの内部のループが並行して実行可能となるような変換が行われる。この並列化の処理は公知の技術であるが、これについても更に後述する。
【0041】
ステップS6でサブ・ループネスト列の融合性チェックが行われる。すなわち、サブ・ループネスト列の内部の複数のループネストが1つのループネストに融合できるか否かがチェックされる。融合可能か否かをチェックするためにループの方向、すなわちループの変数の変化が順方向か逆方向かがチェックされ、必要に応じて方向を逆転すべきループが決定される。
【0042】
また順序チェックとしてネスト、すなわち入れ子の内部のループの順序がチェックされ、必要に応じて順序の変換が行われる。更に並列性のチェックとして、融合の結果並列処理が不可能となって逐次処理を行われなければならなくなることがないかがチェックされ、これらのチェックによって融合不可能と判定された場合には融合も、また融合によって可能となる配列の圧縮も実行されない。
【0043】
ステップS7では融合可能と判定されたそれぞれのサブ・ループネスト列の中のループネストが1つのループネストに融合され、最後にステップS8で圧縮すべきことが決定した配列が圧縮されて、処理を終了する。
【0044】
続いて図7の各ステップの処理について更に詳細に説明する。図8はステップS2におけるループネスト列内圧縮候補探索処理の詳細フローチャートである。同図において処理が開始されと、まずステップS11で全てのループネスト列の集合がSLとされ、ステップS12で集合SLからループネスト(LN)列が1つ取り出され、ステップS13でLN列が取り出せたか否かが判定され、取り出せていない場合には処理を終了する。
【0045】
取り出せた場合には、ステップS14でそのループネスト列、すなわちLN列内の配列の集合がSAとされ、ステップS15で集合SAから1つの配列Aが取り出され、ステップS16で配列Aが取り出せたか否かが判定され、取り出せなかった場合にはそのループネスト列に対する処理を終了し、次のループネスト列に対する処理がステップS12から繰り返される。
【0046】
ステップS16で配列Aが取り出せた場合には、ステップS17でその配列Aが非候補配列集合、すなわち圧縮候補でない配列の集合内にあるか否かが判定され、ある場合にはステップS21で集合SAから配列Aが除かれてこの配列Aに対する処理を終わり、次の配列に対する処理がステップS15から繰り返される。
【0047】
ステップS17でAが非候補配列集合内に存在しない場合には、ステップS18で配列Aが最初に出現するループネストLNが求められ、ステップS19で配列AがLNに対して定義先行であるか否かが判定され、定義先行でない場合にはステップS20で集合SAから配列Aが除かれ、配列Aが非候補配列集合に入れられた後にステップS15からの処理が繰り返され、またステップS19で配列Aが定義先行である場合には、ステップS20の処理を実行することなく、ステップS15以降の処理が繰り返される。
【0048】
図9は図7のステップS3におけるプログラム内圧縮候補探索処理の詳細フローチャートである。同図において処理が開始されると、ステップS25で全てのループネスト列の集合がSLとされ、ステップS26で集合SLから1つのループネスト列が取り出され、ステップS27でループネスト列が取り出せたか否かが判定され、取り出せない場合には処理を終了する。
【0049】
取り出せた場合には、ステップS28でそのLN列に対する集合SA、すなわち図8のステップS14でLN列に対して求められた配列からステップS20,S21で配列が除かれた結果の配列の集合内に非候補配列集合、すなわち圧縮対象とならない配列の集合内の配列があるか否かが判定され、そのような配列があれば集合SAからそれが除かれ、ステップS26以降の処理が繰り返される。
【0050】
図10は図7のステップS4におけるループネスト列分割処理の詳細フローチャートである。同図において処理が開始されると、ステップS31で全てのループネスト列の集合がSLとされ、ステップS32で集合SLから1つのループネスト(LN)列が取り出され、ステップS33でLN列が取り出せたか否かが判定され、、取り出せなかった場合には処理を終了する。
【0051】
LN列が取り出せた場合には、ステップS34でそのLN列に対応する集合SAが空か否かが判定され、空の場合にはステップS32で次のループネスト列を取り出す処理以降が繰り返される。
【0052】
集合SAが空でない場合には、ステップS35でSAから1つの配列Aが取り出され、ステップS36で配列Aが取り出されたか否かが判定され、取り出せなかった場合にはステップS32以降の処理が繰り返される。
【0053】
取り出せた場合には、ステップS37で配列Aが含まれるループネスト(LN)の集合FAが求められ、ステップS38で集合FAから1つの(最も上の)ループネストが取り出されてそれがLAとされ、ステップS39でLAが取り出せたか否かが判定され、取り出せなかった場合には、次の配列AをSAから取り出すステップS35以降の処理が繰り返される。
【0054】
ステップS39でLAが取り出せた場合には、ステップS40でそのループネストLAに対して配列Aが定義先行であるか否かが判定され、定義先行である場合には、ステップS41でそのループネストLAの前でループネスト列が切られ、LAから新たなサブ・ループネスト列とされた後に、またAが定義先行でない場合には、直ちに次に上の配列LNを取り出すステップS38以降の処理が繰り返される。
【0055】
続いて図7のステップS5でループネスト並列化の処理が行われる。ループネスト並列化とは、例えば図14で説明した先頭のループネストにおいてJ=1からMに対応するそれぞれのループの処理を複数のプロセッサ、例えばM台のプロセッサに割り当てて並列的に実行可能とする処理である。このような並列化が多くの次元に対して可能となるような並列化が行われる。この多次元並列化が行われると、例えば2次元の配列でIについての1からN,Jについての1からMまでの処理をすべて並列に実行することが可能となる。
【0056】
この並列化処理では、できるだけ多くのループが逆転・順序交換可能となるような変換が行われる。ここで逆転とはループの変数の変化の方向が順方向であれば逆方向に、逆方向であれば順方向となるようにすることであり、また順序交換とはループネストの内部でのループの順序を交換することである。このような変換が行われた後には最も外側のN個のループが全ての実行文を囲んで、任意の順序で交換可能な形式となる。このような並列化については次の文献がある。
【0057】
【非特許文献2】
中田育男著「コンパイラの構成と最適化」p.409 朝倉書店
次にステップS6でサブ・ループネスト列の融合性チェックが行われる。この処理では、前述のように融合を行うために逆転すべきループを決定するループ方向チェック、順序を交換すべきループを決定するループ順序チェック、および融合の結果逐次ループ化されないことをチェックする並列性チェックの3つが行われる。これらのチェックによって配列圧縮のために融合が必要であるにも拘わらず融合可能とならない場合には、ステップS7におけるサブ・ループネスト列融合およびステップS8の配列圧縮はそのサブ・ループネスト列内のループネストに対しては行われない。
【0058】
この融合性チェックについて図11のループネスト列の例を用いて更に説明する。N次元並列化されたループネストLn において、その最外N個のループをl=(l1 ,・・・,lN ),ループ変数をlv =(lv1,・・・・,lvN)とする。li(1<i<N)がdoall並列化可能なら、liは順方向および逆方向の双方で回転させることが可能であり、パイプライン並列化可能なら、どちらか一方のみでしか回転できない。ここで、ループ回転方向ベクタを
ldvLn =(e1 ,・・・,eN )
と定義する。ただし、
【0059】
【数1】
【0060】
である。
ここでdoall並列化とは、前述のように例えばJ=1からMまでの処理をM台のプロセッサに割り当てて並列実行させる場合にもプロセッサ間の同期が全く不要の条件で並列化することであり、パイプライン並列化とは、例えばI=1についてJ=1〜Mの並列処理が終わってから、I=2についての並列処理に移るような制限のある並列化である。
【0061】
またLn 中のM次元配列Aに対し、部分データ依存ベクタ
pdvA:Ln=(pdvA:Ln(1),・・・,pdvA:Ln(M))
を定義する。ただし、その各要素pdvA:Ln(i)は、
・ループ変数lvj(1<i<N)が配列Aのi次元目の添字にしか出現せず、ループネスト中の全てのAのi次元目の添字が同じで、i次元目の添字には他のループ変数が出現しない場合、添字中のlvjの係数が正ならpdvA:Ln(i)=j,負ならpdvA:Ln(i)=−j
・上記以外の場合には、pdvA:Ln(i)=0
である。
【0062】
さて、本発明の手法では、各ループネストの並列化されたループどうしを融合する。2つのループネストLn1,Ln2中にM次元配列Aのみが存在する場合を考える。
【0063】
pdvA:Ln1 (i)=i1 ,pdvA:Ln1 (j)=j1
pdvA:Ln2 (i)=i2 ,pdvA:Ln2 (j)=j2 (i≠j)とすると、以下が成り立つ。
【0064】
(1)i1 =0かつi2 ≠0ならば、Ln2中のi2 ループは融合の対象とならない。
(2)i1 ≠0かつi2 =0ならば、Ln1中のi1 ループは融合の対象とならない。
【0065】
(3)i1 ≠0かつi2 ≠0の場合、i1 とi2 の符号を等しくできれば、i1 ループとi2 ループとを融合できる。
(4)i1 とi2 ,j1 とj2 の符号を等しくでき、それらが全て0でない場合、|i1 |と|j1 |との大小関係と|i2 |と|j2 |との大小関係が異なるならば、i1 とj1 、あるいはi2 とj2 とをループ交換すれば、i1 とi2 ,j1 ,j2 とを共に融合できる。
【0066】
図11のループLn1においてJ,Iについての2つのループがともにdoall並列化可能であるとして、そのループ回転方向ベクタは(±1,±2)となる。
【0067】
またJはループ変数の順序で1、配列の添字として2次元、Iは順序で2、添字として1次元の変数であり、またdoall並列化可能なことから符号として±を用いてLn1の部分データ依存ベクタは(±2,±1)となる。
【0068】
同様にして、
ldvLn1 =ldvLn2 =(±1,±2)
pdvA:Ln1 =(±2,±1),pdvA:Ln2 =(±2,±1)
である。I,Jループを共に融合する場合を考える。もし、Ln2のI,Jループの回転方向が共に逆転していれば、
pdvA:Ln1 =(±2,±1),pdvA:Ln2 = 外1
【0069】
【外1】
【0070】
となる。2つのpdvの要素の符号が逆転していることは、融合するためには、どちらかのループネストの各ループを逆転させる必要があることを示している。また、Ln2のループの入れ子の順番が逆になっていれば、
pdvA:Ln1 =(±2,±1),pdvA:Ln2 =(±1,±2)
となる。2つのpdvの要素の順序が逆転していることは、融合するためには、どちらかのループネストをループ交換する必要があることを示している。
【0071】
以上の処理によってサブ・ループネスト列の融合のためにループの逆転、順序交換などが行われ、ステップS7でサブ・ループネスト列の中のループネストが1つのループネストに融合され、図7のステップS8で圧縮の候補となっていた配列のうちで最終的に圧縮することが決定した配列の圧縮が行われる。
【0072】
図12はステップS8で行われる配列の部分圧縮の例である。同図で(a)には3つのループネスト列LS1 ,LS2 ,およびLS3 がある。配列Aはプログラム内でこれら3つのループネスト列以外には出現しないものとする。
【0073】
図12(a)は、同図(b)のように変換できる。LS1 では(S1),(S2)で配列AがA1に置き換えられ、(S3)においてLS2 やLS3 による参照の可能性を考慮して、A(1)とA(N)との値が配列Aに書き戻されている。
【0074】
LS2 では(S0)において、LS2 以外で定義されたA(1)の値がA(I)からロードされ、A2(1)とされている。LS2 ではA(1)の値を更新しないため、(S3)においてA2(N)の値だけがA(N)に書き戻されている。LS3 はLS2 と同様にして変換されている。
【0075】
図12(b)のA1,A2,およびA3は各ループネスト列内でローカルな配列となるため、それぞれ(c)に示すようにスカラ変数に圧縮できる。このように一部の要素が参照先行的であっても、配列圧縮を行うことができる。この圧縮が部分圧縮であり、従来の配列圧縮を従来圧縮と呼ぶことにする。
【0076】
図12(c)の各ループネスト列において、(S0)や(S3)があまり実行されなければ、例えばメモリ内の配列へのアクセスが減って、スカラ変数に対するアクセスがほとんどとなり、性能向上が見込まれる。すなわち部分圧縮により性能を向上させるためには、各ループネスト列内における参照先行的な要素をできるだけ少なくすることが必要である。参照先行的な要素がどの位であれば性能向上が見込めるかは一概にはいえないが、全ての要素の5〜10%程度以下であれば、かなりの性能向上が見込めると判断して、部分圧縮を行うことにする。
【0077】
但し図7のステップS8で行われる圧縮は部分圧縮に限定されず、従来圧縮を含むこともできる。ある配列が1つのループネスト列内でローカルであれば、その配列に対しては従来圧縮を適用できることは当然である。
【0078】
部分圧縮を全く行うことがないという前提に立つ場合には、配列の圧縮方式は図7と異なる実現方式となると考えられるが、部分圧縮と従来圧縮とを並用する場合には図7で説明した実現方式が有効である。仮にステップS8で従来圧縮しか実行できない場合に、最初から部分圧縮を実行しないことを前提とする方式とのいずれが有効であるかは実現方式に依存すると考えられる。
【0079】
以上説明した配列圧縮方式は、あるプログラムが作成され、そのプログラムが例えばあるコンピュータの記憶装置に格納された後に、同じコンピュータによってプログラムとして実行されることができる。図13はそのようなプログラムのコンピュータへのローディングを説明する図である。
【0080】
図13においてコンピュータシステムは中央処理装置(CPU)10、リードオンリメモリ(ROM)11、ランダムアクセスメモリ(RAM)12、通信インタフェース13、記憶装置14、入出力装置15、可搬型記憶媒体の読み取り装置16、およびこれらの全てが接続されたバス17によって構成されている。
【0081】
記憶装置14としてはハードディスク、磁気ディスクなど様々な形式の記憶装置を使用することができ、このような記憶装置14、またはROM11に図7〜図10のフローチャートに示されたプログラムや、本発明の特許請求の範囲の請求項10のプログラムなどが格納され、そのようなプログラムがCPU10によって実行されることにより、本実施形態における配列圧縮が可能となる。
【0082】
このようなプログラムは、プログラム提供者18側からネットワーク19、および通信インタフェース13を介して、例えば記憶装置14に格納されることも、また市販され、流通している可搬型記憶媒体20に格納され、読み取り装置16にセットされて、CPU10によって実行されることも可能である。可搬型記憶媒体20としてはCD−ROM、フレキシブルディスク、光ディスク、光磁気ディスクなど様々な形式の記憶媒体を使用することができ、このような記憶媒体に格納されたプログラムが読み取り装置16によって読み取られることにより、例えば図7におけるループネスト列抽出から配列圧縮までの処理が可能となる。
【0083】
【発明の効果】
以上詳細に説明したように、本発明によれば配列の圧縮方式として定義先行要素が多い配列に対する部分圧縮を行うことによって、配列のサイズを縮小し、使用メモリ量を削減し、かつローカリティを向上させることができる。特にループの融合を組み合わせることによって、圧縮を適用できる機会が増え、圧縮の効果が大きくなり、コンピュータの処理性能向上に寄与するところが大きい。
【図面の簡単な説明】
【図1】本発明の配列圧縮方式の原理的な機能ブロック図である。
【図2】配列の部分圧縮方法の説明図である。
【図3】定義先行ループネストの例を示す図である。
【図4】参照先行ループネストの例を示す図である。
【図5】ループネストの融合例の説明図である。
【図6】ループネスト列の分割の説明図である。
【図7】配列圧縮処理の全体フローチャートである。
【図8】ループネスト列内圧縮候補探索処理のフローチャートである。
【図9】プログラム内圧縮候補探索処理のフローチャートである。
【図10】ループネスト列分割処理のフローチャートである。
【図11】融合性チェックの対象としてのループネスト列を示す図である。
【図12】配列部分圧縮の例を説明する図である。
【図13】本発明におけるプログラムのコンピュータへのローディングを説明する図である。
【図14】ループネストとループネスト列の説明図である。
【図15】配列圧縮の従来方式の説明図である。
【符号の説明】
10 中央処理装置(CPU)
11 リードオンリメモリ(ROM)
12 ランダムアクセスメモリ(RAM)
14 記憶装置
19 ネットワーク
20 可搬型記憶媒体
Claims (2)
- 配列のサイズを減少させる配列圧縮装置において、
記憶装置に格納されているプログラムを読み出す読出手段と、
該プログラムのうち、1以上のループを含むループネストが列となったループネスト列内において配列が最初に出現するループネストを求めるループネスト抽出手段と、
前記ループネスト抽出手段により求めたループネストに対して、該配列が、該ループネスト内で定義されている定義先行の配列であれば、該配列をループネスト列内での圧縮の候補とする圧縮候補探索手段と、
前記圧縮候補の配列を含む定義先行ループネストをサブ・ループネスト列の先頭とするように前記ループネスト列の分割を行う分割手段と、
前記分割手段により分割されてサブ・ループネスト列の先頭とされたループネストの配列の要素のうちで、プログラム全体から見て該ループネスト内で参照される前に該ループネスト内で定義される第1の条件及び該ループネストで定義された値は該ループネスト内でのみ参照される第2の条件を満たす、該ループネスト内でのみローカルな要素をスカラ変数に置き換える部分圧縮を行う部分圧縮手段と、
前記分割手段により分割されてサブ・ループネスト列の先頭とされたループネストの配列の要素のうちで、ローカルでない要素に対しては、記憶手段に記憶されている値を参照するステップ及び該参照した値を用いて該ローカルでない要素を再定義するステップを、前記ループネスト内に記述する記述手段と、
を備えたことを特徴とする配列圧縮装置。 - 前記ループネスト列内圧縮候補配列探索と、前記部分圧縮との間に行われるプログラム内圧縮候補配列探索において、
前記ループネスト列内で圧縮候補とされた配列がプログラム内の他のループネスト列内で圧縮候補とされてないとき、該配列を圧縮の候補から除外することを特徴とする請求項1記載の配列圧縮装置。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002378747A JP4128439B2 (ja) | 2002-12-26 | 2002-12-26 | 配列圧縮方法 |
US10/741,591 US7805413B2 (en) | 2002-12-26 | 2003-12-22 | Array compression method |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2002378747A JP4128439B2 (ja) | 2002-12-26 | 2002-12-26 | 配列圧縮方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2004213113A JP2004213113A (ja) | 2004-07-29 |
JP4128439B2 true JP4128439B2 (ja) | 2008-07-30 |
Family
ID=32815491
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002378747A Expired - Fee Related JP4128439B2 (ja) | 2002-12-26 | 2002-12-26 | 配列圧縮方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US7805413B2 (ja) |
JP (1) | JP4128439B2 (ja) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4952317B2 (ja) * | 2007-03-16 | 2012-06-13 | 富士通株式会社 | 退避データ判別方法、退避データ判別プログラムおよび退避データ判別装置 |
JP5148674B2 (ja) * | 2010-09-27 | 2013-02-20 | 株式会社東芝 | プログラム並列化装置およびプログラム |
US9304898B2 (en) * | 2011-08-30 | 2016-04-05 | Empire Technology Development Llc | Hardware-based array compression |
JP6160232B2 (ja) * | 2013-05-17 | 2017-07-12 | 富士通株式会社 | コンパイルプログラムおよびコンパイル方法 |
US10707898B2 (en) * | 2017-07-25 | 2020-07-07 | Fidelity Information Services, Llc | Tracing engine-based software loop escape analysis and mixed differentiation evaluation |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6281816B1 (en) * | 1999-08-24 | 2001-08-28 | International Business Machines Corporation | Method and apparatus for reducing data expansion during data compression |
US6816856B2 (en) * | 2001-06-04 | 2004-11-09 | Hewlett-Packard Development Company, L.P. | System for and method of data compression in a valueless digital tree representing a bitset |
-
2002
- 2002-12-26 JP JP2002378747A patent/JP4128439B2/ja not_active Expired - Fee Related
-
2003
- 2003-12-22 US US10/741,591 patent/US7805413B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US7805413B2 (en) | 2010-09-28 |
JP2004213113A (ja) | 2004-07-29 |
US20040260708A1 (en) | 2004-12-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20220391678A1 (en) | Neural network model processing method and apparatus, computer device, and storage medium | |
US20220391665A1 (en) | Method for splitting neural network model by using multi-core processor, and related product | |
JP6449886B2 (ja) | オブジェクトネットワークをモデル化するシステム及び方法 | |
Snavely et al. | Skeletal graphs for efficient structure from motion | |
Peng et al. | Paris: The next destination for fast data series indexing and query answering | |
CN110837584B (zh) | 一种分块并行构造后缀数组的方法及系统 | |
CN108027816B (zh) | 数据管理系统、数据管理方法及记录介质 | |
WO2020164644A2 (zh) | 神经网络模型拆分方法、装置、计算机设备和存储介质 | |
JP4128439B2 (ja) | 配列圧縮方法 | |
CN115605862A (zh) | 训练用于3d模型数据库查询的可微分渲染器和神经网络 | |
CN112733536A (zh) | 词嵌入方法和设备以及词搜索方法 | |
WO2023221626A1 (zh) | 一种内存分配的方法和装置 | |
CN115828992A (zh) | 处理神经网络模型的方法 | |
CN112379846B (zh) | 一种用于磁盘文件的快速读取方法和系统 | |
US20060136204A1 (en) | Database construction apparatus and method | |
CN111370070B (zh) | 一种针对大数据基因测序文件的压缩处理方法 | |
US8543574B2 (en) | Partial-matching for web searches | |
KR20230099120A (ko) | 동적 후보 공간을 이용한 연속적 부분 그래프 매칭 방법 및 장치 | |
CN115858797A (zh) | 一种基于ocr技术生成中文近义词的方法及系统 | |
Cruz et al. | Accelerating set similarity joins using gpus | |
JP5695586B2 (ja) | Xml文書検索装置及びプログラム | |
JP6276386B2 (ja) | データ構造、情報処理装置、情報処理方法、及びプログラム記録媒体 | |
CN111326216B (zh) | 一种针对大数据基因测序文件的快速划分方法 | |
EP3959720B1 (en) | Method of aligning strings of characters representing genomic data and related hardware device | |
CN112712094B (zh) | 模型的训练方法、装置、设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20050915 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20080109 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20080212 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20080414 |
|
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: 20080513 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20080514 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110523 Year of fee payment: 3 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120523 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130523 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130523 Year of fee payment: 5 |
|
LAPS | Cancellation because of no payment of annual fees |