JPH08212081A - メモリ割り付け方法、並びにコンパイル方法およびコンパイラ - Google Patents
メモリ割り付け方法、並びにコンパイル方法およびコンパイラInfo
- Publication number
- JPH08212081A JPH08212081A JP7043465A JP4346595A JPH08212081A JP H08212081 A JPH08212081 A JP H08212081A JP 7043465 A JP7043465 A JP 7043465A JP 4346595 A JP4346595 A JP 4346595A JP H08212081 A JPH08212081 A JP H08212081A
- Authority
- JP
- Japan
- Prior art keywords
- cache
- symbol
- location
- symbols
- array
- 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.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
(57)【要約】 (修正有)
【目的】キャッシュメモリを有するコンピュータの利用
において、キャッシュライン競合によって生じるキャッ
シュミスにより大幅な性能低下を引き起こすプログラム
に対して、キャッシュ競合の発生を削減するメモリ割り
付け方法を提供する。 【構成】記憶領域内でのシンボルの割り付け順序を決め
101、割り付け対象シンボルを、互いにキャッシュ競
合を避けるべきシンボルからなる部分集合に分類する1
02。そして各シンボルについて、それが最初に割り付
けるシンボルならば通常のロケーションを割り当てる1
05。そうでなければ仮のロケーションL'を求めた後1
06、L'をもとに、部分集合中の他のシンボルとキャッ
シュ競合を起こさないようなロケーションを求め10
7、それをシンボルテーブルに登録する108。これを
すべてのシンボルに対して繰り返す109。
において、キャッシュライン競合によって生じるキャッ
シュミスにより大幅な性能低下を引き起こすプログラム
に対して、キャッシュ競合の発生を削減するメモリ割り
付け方法を提供する。 【構成】記憶領域内でのシンボルの割り付け順序を決め
101、割り付け対象シンボルを、互いにキャッシュ競
合を避けるべきシンボルからなる部分集合に分類する1
02。そして各シンボルについて、それが最初に割り付
けるシンボルならば通常のロケーションを割り当てる1
05。そうでなければ仮のロケーションL'を求めた後1
06、L'をもとに、部分集合中の他のシンボルとキャッ
シュ競合を起こさないようなロケーションを求め10
7、それをシンボルテーブルに登録する108。これを
すべてのシンボルに対して繰り返す109。
Description
【0001】
【産業上の利用分野】本発明は、キャッシュメモリを有
するコンピュータの利用において、競合性のキャッシュ
ミスを削減するメモリ割り付け方法、並びにそのような
メモリ割り付け方法を適用したコンパイル方法およびコ
ンパイラに関する。
するコンピュータの利用において、競合性のキャッシュ
ミスを削減するメモリ割り付け方法、並びにそのような
メモリ割り付け方法を適用したコンパイル方法およびコ
ンパイラに関する。
【0002】
【従来の技術】多くの計算機システムでは、高速に動作
するCPU(中央処理装置)とアクセス速度の遅い主メモ
リ(以降、単にメモリとも呼ぶ)との速度のギャップを
埋めるために、キャッシュメモリと呼ばれるアクセス速
度の速い比較的小容量の記憶装置を備えている。キャッ
シュメモリに関しては、たとえば「情報処理、ボリュー
ム33、ナンバー11(1992)、第1348頁から
1357頁」に記載がある。
するCPU(中央処理装置)とアクセス速度の遅い主メモ
リ(以降、単にメモリとも呼ぶ)との速度のギャップを
埋めるために、キャッシュメモリと呼ばれるアクセス速
度の速い比較的小容量の記憶装置を備えている。キャッ
シュメモリに関しては、たとえば「情報処理、ボリュー
ム33、ナンバー11(1992)、第1348頁から
1357頁」に記載がある。
【0003】上記文献に記載されているように、キャッ
シュメモリ(以下、単にキャッシュと呼ぶ)と主メモリ
との間の転送単位はブロックまたはラインと呼ばれる。
また、キャッシュ上のブロックはキャッシュブロック
(またはキャッシュライン)、主メモリ上のブロックは
メモリブロックと呼ばれる。ブロックのマッピング方
式、すなわちメモリ上のあるメモリブロックを、キャッ
シュ上のどのキャッシュブロックに置くかを決定する方
式に関しては、フルアソシアティブ方式、セットアソシ
アティブ方式、およびダイレクトマップ方式の3種類が
ある。
シュメモリ(以下、単にキャッシュと呼ぶ)と主メモリ
との間の転送単位はブロックまたはラインと呼ばれる。
また、キャッシュ上のブロックはキャッシュブロック
(またはキャッシュライン)、主メモリ上のブロックは
メモリブロックと呼ばれる。ブロックのマッピング方
式、すなわちメモリ上のあるメモリブロックを、キャッ
シュ上のどのキャッシュブロックに置くかを決定する方
式に関しては、フルアソシアティブ方式、セットアソシ
アティブ方式、およびダイレクトマップ方式の3種類が
ある。
【0004】ダイレクトマップ方式では、各メモリブロ
ックが1つのキャッシュブロックにマッピングされる。
そのため、一度キャッシュブロックに転送されたデータ
であっても、同一のキャッシュブロックにマッピングさ
れる別のメモリブロックの参照があると、キャッシュブ
ロック上のデータはキャッシュブロックから追い出さ
れ、次の参照ではキャッシュミスを生じる。このような
現象をキャッシュ競合またはキャッシュライン競合と呼
び、これによって生じるキャッシュミスを競合性キャッ
シュミスという。
ックが1つのキャッシュブロックにマッピングされる。
そのため、一度キャッシュブロックに転送されたデータ
であっても、同一のキャッシュブロックにマッピングさ
れる別のメモリブロックの参照があると、キャッシュブ
ロック上のデータはキャッシュブロックから追い出さ
れ、次の参照ではキャッシュミスを生じる。このような
現象をキャッシュ競合またはキャッシュライン競合と呼
び、これによって生じるキャッシュミスを競合性キャッ
シュミスという。
【0005】たとえばキャッシュメモリのサイズが2の
N乗バイトである場合、ダイレクトマップ方式では、メ
モリアドレスの下位Nビットによりキャッシュブロック
のアドレスを決めることが多い。よって2つのデータの
メモリアドレスの下位Nビットが偶然一致していた場
合、入るべきキャッシュブロックが同じになるので、そ
の2つのデータはキャッシュ競合を起こす。
N乗バイトである場合、ダイレクトマップ方式では、メ
モリアドレスの下位Nビットによりキャッシュブロック
のアドレスを決めることが多い。よって2つのデータの
メモリアドレスの下位Nビットが偶然一致していた場
合、入るべきキャッシュブロックが同じになるので、そ
の2つのデータはキャッシュ競合を起こす。
【0006】セットアソシアティブ方式では、各メモリ
ブロックが複数のキャッシュブロックにマッピングさ
れ、そのうち空いているどれか1つのキャッシュブロッ
クに置かれる。空いているキャッシュブロックがなけれ
ば、やはりキャッシュ競合が起きる。なお、1つのメモ
リブロックがn個のキャッシュブロックにマッピングさ
れるものをnウェイ・セットアソシアティブと呼ぶ。ま
たnを連想数と呼ぶ。
ブロックが複数のキャッシュブロックにマッピングさ
れ、そのうち空いているどれか1つのキャッシュブロッ
クに置かれる。空いているキャッシュブロックがなけれ
ば、やはりキャッシュ競合が起きる。なお、1つのメモ
リブロックがn個のキャッシュブロックにマッピングさ
れるものをnウェイ・セットアソシアティブと呼ぶ。ま
たnを連想数と呼ぶ。
【0007】ダイレクトマップ方式およびセットアソシ
アティブ方式のキャッシュでは、プログラムによっては
キャッシュ競合が多発し性能が大きく低下することがあ
る。これについて以下説明する。なお、以下では、ブロ
ック長が32バイト、容量が32キロバイトのダイレク
トマップ方式のキャッシュを仮定する。メモリアドレス
からキャッシュアドレス(キャッシュラインのキャッシ
ュ内でのアドレス)への変換は、メモリアドレス(32
ビット)の下位15ビット(2の15乗=32キロ)を
とり、さらにそれを(1ブロックが32バイトなので)
右に5ビットシフトした値をそのまま使うものとする。
言い換えればメモリアドレスの上位から数えて18ビッ
ト目から27ビット目までがキャッシュアドレスとな
る。
アティブ方式のキャッシュでは、プログラムによっては
キャッシュ競合が多発し性能が大きく低下することがあ
る。これについて以下説明する。なお、以下では、ブロ
ック長が32バイト、容量が32キロバイトのダイレク
トマップ方式のキャッシュを仮定する。メモリアドレス
からキャッシュアドレス(キャッシュラインのキャッシ
ュ内でのアドレス)への変換は、メモリアドレス(32
ビット)の下位15ビット(2の15乗=32キロ)を
とり、さらにそれを(1ブロックが32バイトなので)
右に5ビットシフトした値をそのまま使うものとする。
言い換えればメモリアドレスの上位から数えて18ビッ
ト目から27ビット目までがキャッシュアドレスとな
る。
【0008】図2は、キャッシュ競合が多発するFORTRA
Nプログラムの例を示したものである。以下、このプロ
グラムを簡単に説明する。
Nプログラムの例を示したものである。以下、このプロ
グラムを簡単に説明する。
【0009】201〜203は、要素が8バイトのREAL
(実数)型で、要素数が4096個の1次元配列A,B,C,D,E
をCOMMON領域(メモリ領域の1つ)に確保することを示
している。204はINTEGER(整数)型の変数I,Jを使用
することを示している。以上は変数の宣言部分で、20
5〜210が実行部分である。205〜207はループ
で、変数Iを1から4096まで変えながら、B(I)+C(I)
を計算し、その値をA(I)に代入することを示している。
208〜210もループで、変数Jを1から4096ま
で変えながら、E(J)*2.0を計算し、その値をD(J)に代入
することを示している。211はプログラムの終わりを
意味する。
(実数)型で、要素数が4096個の1次元配列A,B,C,D,E
をCOMMON領域(メモリ領域の1つ)に確保することを示
している。204はINTEGER(整数)型の変数I,Jを使用
することを示している。以上は変数の宣言部分で、20
5〜210が実行部分である。205〜207はループ
で、変数Iを1から4096まで変えながら、B(I)+C(I)
を計算し、その値をA(I)に代入することを示している。
208〜210もループで、変数Jを1から4096ま
で変えながら、E(J)*2.0を計算し、その値をD(J)に代入
することを示している。211はプログラムの終わりを
意味する。
【0010】ここで、ループ中の配列要素へのアクセス
A(I),B(I),C(I),D(I),E(I)は通常キャッシュ競合を起こ
す。なぜなら、配列A,B,C,D,Eのサイズはすべて32キ
ロバイト(=4096*8バイト)であり、キャッシュ
サイズと同じであるので、これらの配列がメモリ上で並
べられた場合、その先頭要素のメモリアドレスの差がキ
ャッシュサイズの倍数となっているからである。これに
ついて図16を用いてさらに詳しく説明する。
A(I),B(I),C(I),D(I),E(I)は通常キャッシュ競合を起こ
す。なぜなら、配列A,B,C,D,Eのサイズはすべて32キ
ロバイト(=4096*8バイト)であり、キャッシュ
サイズと同じであるので、これらの配列がメモリ上で並
べられた場合、その先頭要素のメモリアドレスの差がキ
ャッシュサイズの倍数となっているからである。これに
ついて図16を用いてさらに詳しく説明する。
【0011】図16は、図2のプログラムを従来のコン
パイラでコンパイルしたときの、配列データA,B,C,D,E
のメモリへの割り付け状況を示した図である。1601
はメモリを表し、1つのセルが8バイト分のデータを保
持する。1602はメモリのロケーション(先頭を0と
したときのアドレス)を表している。1603はそのセ
ルに保持される配列要素を表している。
パイラでコンパイルしたときの、配列データA,B,C,D,E
のメモリへの割り付け状況を示した図である。1601
はメモリを表し、1つのセルが8バイト分のデータを保
持する。1602はメモリのロケーション(先頭を0と
したときのアドレス)を表している。1603はそのセ
ルに保持される配列要素を表している。
【0012】図示するように、配列要素はメモリ上でA
(1),A(2),…,A(4096),B(1),…,B(4096),C(1),…,C(409
6),D(1),…,D(4096),E(1),…,E(4096)の順に隙間なく並
べられる。すると、たとえばA(1)のロケーションとB(1)
のロケーションの差は32768バイト、すなわち32キロ
バイトとなる。よってキャッシュが32キロバイトのダ
イレクトマップ方式では、同じキャッシュアドレスの差
が0、すなわちキャッシュ競合を起こすことになる。他
の配列も同様に、添字が同じ配列要素同士はすべてキャ
ッシュ競合を起こしていることがわかる。これにより実
行時にどのようにキャッシュミスが発生するかを、図1
7を用いて説明する。
(1),A(2),…,A(4096),B(1),…,B(4096),C(1),…,C(409
6),D(1),…,D(4096),E(1),…,E(4096)の順に隙間なく並
べられる。すると、たとえばA(1)のロケーションとB(1)
のロケーションの差は32768バイト、すなわち32キロ
バイトとなる。よってキャッシュが32キロバイトのダ
イレクトマップ方式では、同じキャッシュアドレスの差
が0、すなわちキャッシュ競合を起こすことになる。他
の配列も同様に、添字が同じ配列要素同士はすべてキャ
ッシュ競合を起こしていることがわかる。これにより実
行時にどのようにキャッシュミスが発生するかを、図1
7を用いて説明する。
【0013】図17は、図2のプログラムを実行したと
きに発生するキャッシュミス状況を示したものである。
1701は、プログラムの実行で行われる配列要素の参
照(メモリアクセス)を実行順に番号付けした番号を表
す。1702はそこで参照される配列要素を表す。17
03はその参照(メモリアクセス)がキャッシュミスと
なるかどうかを表す。1704は、キャッシュミスした
場合に、新たにメモリからキャッシュに持ってくるデー
タを表す。ここで、例えばA(1:4)はA(1),A(2),A(3),A
(4)の4つのデータを表す。1705は、新たにデータ
をキャッシュに持ってきたときに、キャッシュから追い
出されるデータがあればそれを示している。1706は
キャッシュミスが起こったときにそれが競合性キャッシ
ュミスかどうかを示す。
きに発生するキャッシュミス状況を示したものである。
1701は、プログラムの実行で行われる配列要素の参
照(メモリアクセス)を実行順に番号付けした番号を表
す。1702はそこで参照される配列要素を表す。17
03はその参照(メモリアクセス)がキャッシュミスと
なるかどうかを表す。1704は、キャッシュミスした
場合に、新たにメモリからキャッシュに持ってくるデー
タを表す。ここで、例えばA(1:4)はA(1),A(2),A(3),A
(4)の4つのデータを表す。1705は、新たにデータ
をキャッシュに持ってきたときに、キャッシュから追い
出されるデータがあればそれを示している。1706は
キャッシュミスが起こったときにそれが競合性キャッシ
ュミスかどうかを示す。
【0014】たとえば参照番号1では、B(1)が参照さ
れ、B(1)は今までキャッシュに入っていないのでキャッ
シュミスを起こす。それによりメモリからB(1:4)がキャ
ッシュに持ってこられる(キャッシュブロックは32バ
イトで配列要素は8バイトなので、1度に4要素分のデ
ータが持ってこられる)。次に、参照番号2でC(1)が参
照され、C(1)も今までキャッシュに入っていないのでキ
ャッシュミスを起し、それによりメモリからC(1:4)がキ
ャッシュに持ってこられる。ここで、先ほど示したとお
りB(1:4)とC(1:4)はキャッシュ競合を起こしているの
で、B(1:4)がキャッシュから追い出される。すると、参
照番号4でB(2)が参照されたとき、本来ならB(1:4)が一
度キャッシュに持ってこられたのでキャッシュヒットと
なるはずが、キャッシュ競合によりキャッシュから追い
出されているのでキャッシュミスとなる。すなわち競合
性のキャッシュミスが生じている。以降、このような状
況が連続発生し、図17に示すように、結果としてすべ
ての配列要素参照がキャッシュミスを起こすことがわか
る。
れ、B(1)は今までキャッシュに入っていないのでキャッ
シュミスを起こす。それによりメモリからB(1:4)がキャ
ッシュに持ってこられる(キャッシュブロックは32バ
イトで配列要素は8バイトなので、1度に4要素分のデ
ータが持ってこられる)。次に、参照番号2でC(1)が参
照され、C(1)も今までキャッシュに入っていないのでキ
ャッシュミスを起し、それによりメモリからC(1:4)がキ
ャッシュに持ってこられる。ここで、先ほど示したとお
りB(1:4)とC(1:4)はキャッシュ競合を起こしているの
で、B(1:4)がキャッシュから追い出される。すると、参
照番号4でB(2)が参照されたとき、本来ならB(1:4)が一
度キャッシュに持ってこられたのでキャッシュヒットと
なるはずが、キャッシュ競合によりキャッシュから追い
出されているのでキャッシュミスとなる。すなわち競合
性のキャッシュミスが生じている。以降、このような状
況が連続発生し、図17に示すように、結果としてすべ
ての配列要素参照がキャッシュミスを起こすことがわか
る。
【0015】以上、図2のプログラムのループ内では、
すべての配列要素参照でキャッシュミスが発生すること
が分かる。なお、このような競合性キャッシュミスは、
ダイレクトマップ方式のキャッシュだけではなく、セッ
トアソシアティブ方式でも起こりうる。例えば図2のプ
ログラムの場合、連想数が2のセットアソシアティブで
もやはりキャッシュ競合によるキャッシュミスが生じ
る。なぜなら、図2のプログラムの最初のループ(20
5〜207)では、A(I),B(I),C(I)の3つの要素のキャ
ッシュアドレスが等しくなっているのに対し、連想数が
2であるから、どうしてもキャッシュから追い出されて
しまうものが生じてしまうからである。
すべての配列要素参照でキャッシュミスが発生すること
が分かる。なお、このような競合性キャッシュミスは、
ダイレクトマップ方式のキャッシュだけではなく、セッ
トアソシアティブ方式でも起こりうる。例えば図2のプ
ログラムの場合、連想数が2のセットアソシアティブで
もやはりキャッシュ競合によるキャッシュミスが生じ
る。なぜなら、図2のプログラムの最初のループ(20
5〜207)では、A(I),B(I),C(I)の3つの要素のキャ
ッシュアドレスが等しくなっているのに対し、連想数が
2であるから、どうしてもキャッシュから追い出されて
しまうものが生じてしまうからである。
【0016】このようなプログラムに関してキャッシュ
ミスを減少させるには、以下のような方法が考えられて
いる。
ミスを減少させるには、以下のような方法が考えられて
いる。
【0017】(1)キャッシュサイズを増大する。
【0018】(2)ダイレクトマップ方式でなくセット
アソシアティブ方式またはフルアソシアティブ方式を使
う。またはセットアソシアティブ方式の連想数を増大す
る。
アソシアティブ方式またはフルアソシアティブ方式を使
う。またはセットアソシアティブ方式の連想数を増大す
る。
【0019】(3)キャッシュブロックアドレスを決定
するとき、単にメモリアドレスの下位Nビットを用いる
のではなく、下位Nビットと上位ビットとの排他的論理
和をとる(これにより、キャッシュブロックアドレスを
分散させる)ようにする。
するとき、単にメモリアドレスの下位Nビットを用いる
のではなく、下位Nビットと上位ビットとの排他的論理
和をとる(これにより、キャッシュブロックアドレスを
分散させる)ようにする。
【0020】しかし、以上の方法は、すべてキャッシュ
装置そのものを変更するものであり、ハードウェアの変
更なしには達成できないものである。
装置そのものを変更するものであり、ハードウェアの変
更なしには達成できないものである。
【0021】これに対して、キャッシュ装置を変更せず
に、メモリ割り付けの方法を変えることによりキャッシ
ュ競合を回避する方法が知られている。例えば図2のプ
ログラムのように、配列の要素数が2のべき乗になって
いる場合、キャッシュ競合がおきる可能性が高い(キャ
ッシュサイズも通常、2のべき乗である)。そこで、こ
れを避けるため、 (4)プログラムで使用する配列の要素数を2のべき乗
にしないようにする(2のべき乗より少し大きい値にす
る) (5)要素数が2のべき乗の配列を複数宣言する場合
は、それらを並べて宣言するのではなく、間にパディン
グ(プログラムでは使用しない領域)用のデータ宣言を
入れるなどの方法を用いる。たとえば、図2のプログラ
ムでは、配列の大きさは4096でなく4097にする
とか、配列AとBの間にパディング用の小さな配列を宣言
することなどである。
に、メモリ割り付けの方法を変えることによりキャッシ
ュ競合を回避する方法が知られている。例えば図2のプ
ログラムのように、配列の要素数が2のべき乗になって
いる場合、キャッシュ競合がおきる可能性が高い(キャ
ッシュサイズも通常、2のべき乗である)。そこで、こ
れを避けるため、 (4)プログラムで使用する配列の要素数を2のべき乗
にしないようにする(2のべき乗より少し大きい値にす
る) (5)要素数が2のべき乗の配列を複数宣言する場合
は、それらを並べて宣言するのではなく、間にパディン
グ(プログラムでは使用しない領域)用のデータ宣言を
入れるなどの方法を用いる。たとえば、図2のプログラ
ムでは、配列の大きさは4096でなく4097にする
とか、配列AとBの間にパディング用の小さな配列を宣言
することなどである。
【0022】しかし、(4)および(5)の方法はソー
スプログラムを変更することが必要となる。
スプログラムを変更することが必要となる。
【0023】これに対して、ソースプログラムは変更せ
ずに、 (6)ソースプログラムをコンパイルするときに、適当
な場所にパディングを入れることを指示する という方法もある。たとえば「HI−UX/WE2 最
適化FORTRAN 使用の手引き(マニュアル番号3
000−3−309−10)(1994年)第83頁」
には、これを可能とするようなコンパイルオプションの
記載がある。
ずに、 (6)ソースプログラムをコンパイルするときに、適当
な場所にパディングを入れることを指示する という方法もある。たとえば「HI−UX/WE2 最
適化FORTRAN 使用の手引き(マニュアル番号3
000−3−309−10)(1994年)第83頁」
には、これを可能とするようなコンパイルオプションの
記載がある。
【0024】このオプションでは、「CPAD(L,P)」とい
う指定により、コモン領域の先頭からLの整数倍目で配
列が切り替わるとき、そこにPバイトのパディングを入
れることを指示する。例えば図2のプログラムの場合、
「CPAD(32768,10)」とコンパイル時に指定することによ
り、32768バイト目、すなわち配列Aが終わったところで
10バイトのパディングが埋め込まれることになる。これ
により、ソースプログラムを修正することなく、パディ
ングを埋め込むことができる。
う指定により、コモン領域の先頭からLの整数倍目で配
列が切り替わるとき、そこにPバイトのパディングを入
れることを指示する。例えば図2のプログラムの場合、
「CPAD(32768,10)」とコンパイル時に指定することによ
り、32768バイト目、すなわち配列Aが終わったところで
10バイトのパディングが埋め込まれることになる。これ
により、ソースプログラムを修正することなく、パディ
ングを埋め込むことができる。
【0025】
【発明が解決しようとする課題】以上のように、ダイレ
クトマップ方式のキャッシュは、構成が簡単のため高速
化、大容量化が容易であるという利点があるが、プログ
ラムによってはキャッシュ競合が発生し性能が大幅に低
下するという欠点がある。また、セットアソシアティブ
方式のキャッシュでも、連想数が少ない場合には同じよ
うな欠点が発生する。
クトマップ方式のキャッシュは、構成が簡単のため高速
化、大容量化が容易であるという利点があるが、プログ
ラムによってはキャッシュ競合が発生し性能が大幅に低
下するという欠点がある。また、セットアソシアティブ
方式のキャッシュでも、連想数が少ない場合には同じよ
うな欠点が発生する。
【0026】このようなキャッシュ競合を回避する従来
技術のうち上述の(1)、(2)および(3)の方法
は、キャッシュ装置そのものの変更が必要であり、コス
トがかかるという問題点がある。キャッシュメモリのコ
ストは容量の同じ主メモリのコストと比較してかなり高
価なので、キャッシュ容量増大には限度がある。また、
連想数の大きいセットアソシアティブやフルアソシアテ
ィブ方式は、それを実現するハードウェアが複雑になる
ので、キャッシュのアクセス速度が低下し、大容量化も
困難である。
技術のうち上述の(1)、(2)および(3)の方法
は、キャッシュ装置そのものの変更が必要であり、コス
トがかかるという問題点がある。キャッシュメモリのコ
ストは容量の同じ主メモリのコストと比較してかなり高
価なので、キャッシュ容量増大には限度がある。また、
連想数の大きいセットアソシアティブやフルアソシアテ
ィブ方式は、それを実現するハードウェアが複雑になる
ので、キャッシュのアクセス速度が低下し、大容量化も
困難である。
【0027】一方、(4)および(5)の方法は、ソー
スプログラムの変更が必要となり、プログラムを作成す
るユーザにとって負担となるという問題点がある。つま
りユーザがキャッシュ競合のことを意識してプログラム
を書く必要が生じるし、またプログラムの変更によって
プログラムのわかりやすさが失われる恐れがある。
スプログラムの変更が必要となり、プログラムを作成す
るユーザにとって負担となるという問題点がある。つま
りユーザがキャッシュ競合のことを意識してプログラム
を書く必要が生じるし、またプログラムの変更によって
プログラムのわかりやすさが失われる恐れがある。
【0028】(6)の方法についても、同様にユーザの
負担が残る。すなわち、パディングを入れる場所と入れ
る量をユーザ自身が判断して決めなければならないの
で、ユーザにキャッシュとプログラムに関する細かい知
識を要求する。また、プログラムの変更に伴いコンパイ
ルオプションも変更しなければならない。また、上記の
様な指定方法では、融通性が少ないという問題点があ
る。すなわち、ある場所には何バイト、またある場所に
は何バイト、といったようにパディングを挿入すること
が難しい。
負担が残る。すなわち、パディングを入れる場所と入れ
る量をユーザ自身が判断して決めなければならないの
で、ユーザにキャッシュとプログラムに関する細かい知
識を要求する。また、プログラムの変更に伴いコンパイ
ルオプションも変更しなければならない。また、上記の
様な指定方法では、融通性が少ないという問題点があ
る。すなわち、ある場所には何バイト、またある場所に
は何バイト、といったようにパディングを挿入すること
が難しい。
【0029】本発明の目的は、以上の問題点を解決しつ
つ、キャッシュ競合によって生じるキャッシュミスによ
り大幅な性能低下を引き起こすプログラムに対して、キ
ャッシュ競合の発生を削減する方法を提供することにあ
る。
つ、キャッシュ競合によって生じるキャッシュミスによ
り大幅な性能低下を引き起こすプログラムに対して、キ
ャッシュ競合の発生を削減する方法を提供することにあ
る。
【0030】
【課題を解決するための手段】前記目的は、次のような
ステップから成るメモリ割り付け方法によりメモリ割り
付けを行うことによって達成される。すなわち、本発明
は、ソースプログラムをコンパイルしてオブジェクトプ
ログラムを生成するコンパイラにおけるメモリ割り付け
方法であって、プログラムで参照されているシンボル
を、その属性とともに、所定のテーブルに登録するステ
ップ(a)と、登録されたシンボルの集合を、互いにキャ
ッシュ競合を避けるべきシンボルからなる部分集合に分
類するステップ(b)と、上記各シンボルに対して、同じ
部分集合に属するシンボル同士でキャッシュ競合が発生
しないように、メモリ上のロケーションを決定するステ
ップ(c)とを備えたことを特徴とする。
ステップから成るメモリ割り付け方法によりメモリ割り
付けを行うことによって達成される。すなわち、本発明
は、ソースプログラムをコンパイルしてオブジェクトプ
ログラムを生成するコンパイラにおけるメモリ割り付け
方法であって、プログラムで参照されているシンボル
を、その属性とともに、所定のテーブルに登録するステ
ップ(a)と、登録されたシンボルの集合を、互いにキャ
ッシュ競合を避けるべきシンボルからなる部分集合に分
類するステップ(b)と、上記各シンボルに対して、同じ
部分集合に属するシンボル同士でキャッシュ競合が発生
しないように、メモリ上のロケーションを決定するステ
ップ(c)とを備えたことを特徴とする。
【0031】ロケーションを決定するステップ(c)は、
同じ部分集合に属するシンボル同士のキャッシュアドレ
スの差が所定値より小さくならないように各シンボルの
ロケーションを決定する。また、シンボルを登録するス
テップ(a)は、登録するシンボルの属性としてそのシン
ボルが参照されるループ情報を含むようにし、部分集合
に分類するステップ(b)は、そのループ情報を参照する
ことにより同じループ内で参照されるシンボル同士を同
じ部分集合に分類するようにする。
同じ部分集合に属するシンボル同士のキャッシュアドレ
スの差が所定値より小さくならないように各シンボルの
ロケーションを決定する。また、シンボルを登録するス
テップ(a)は、登録するシンボルの属性としてそのシン
ボルが参照されるループ情報を含むようにし、部分集合
に分類するステップ(b)は、そのループ情報を参照する
ことにより同じループ内で参照されるシンボル同士を同
じ部分集合に分類するようにする。
【0032】シンボルを登録するステップ(a)において
登録するシンボルとして、プログラムで参照されている
配列を含むようにしてもよい。登録するシンボルが配列
である場合、部分集合に分類するステップ(b)は、該配
列の形、すなわち配列の次元数、下限値、および上限値
が、それぞれ等しい配列同士を同じ部分集合に分類す
る。また、ロケーションを決定するステップ(c)は、前
記配列の先頭要素同士のキャッシュアドレスの差が所定
値より小さくならないように各配列のロケーションを決
定する。
登録するシンボルとして、プログラムで参照されている
配列を含むようにしてもよい。登録するシンボルが配列
である場合、部分集合に分類するステップ(b)は、該配
列の形、すなわち配列の次元数、下限値、および上限値
が、それぞれ等しい配列同士を同じ部分集合に分類す
る。また、ロケーションを決定するステップ(c)は、前
記配列の先頭要素同士のキャッシュアドレスの差が所定
値より小さくならないように各配列のロケーションを決
定する。
【0033】特に、ロケーションを決定するステップ
(c)は、前記配列の先頭要素同士のキャッシュアドレス
の差が所定のしきい値Tより小さくならないように各配
列のロケーションを決定し、かつそのとき該しきい値T
の値はプログラム中でのその配列の参照状況に基づいて
決定するようにするとよい。
(c)は、前記配列の先頭要素同士のキャッシュアドレス
の差が所定のしきい値Tより小さくならないように各配
列のロケーションを決定し、かつそのとき該しきい値T
の値はプログラム中でのその配列の参照状況に基づいて
決定するようにするとよい。
【0034】さらに、ロケーションを決定するステップ
(c)は、同じ部分集合に属するシンボル同士でキャッシ
ュ競合が発生しないようにロケーションを決定するため
に、同じ部分集合に属するシンボルのキャッシュアドレ
スが、互いに一定間隔をおいて並ぶように各シンボルの
ロケーションを決定するようにしてもよい。
(c)は、同じ部分集合に属するシンボル同士でキャッシ
ュ競合が発生しないようにロケーションを決定するため
に、同じ部分集合に属するシンボルのキャッシュアドレ
スが、互いに一定間隔をおいて並ぶように各シンボルの
ロケーションを決定するようにしてもよい。
【0035】
【作用】プログラムで参照されているシンボルをその属
性とともに登録するステップにより、そのシンボルと別
のシンボルでキャッシュ競合を積極的に回避すべきかを
判断する材料が得られる。属性とは、たとえばそのシン
ボルの記憶領域、データの型、そのシンボルが参照され
る手続き(サブルーチン)またはループ、そのシンボル
が配列ならばその次元数、各次元の下限値、上限値、要
素の型、要素のサイズなどである。
性とともに登録するステップにより、そのシンボルと別
のシンボルでキャッシュ競合を積極的に回避すべきかを
判断する材料が得られる。属性とは、たとえばそのシン
ボルの記憶領域、データの型、そのシンボルが参照され
る手続き(サブルーチン)またはループ、そのシンボル
が配列ならばその次元数、各次元の下限値、上限値、要
素の型、要素のサイズなどである。
【0036】登録されたシンボルを、互いにキャッシュ
競合を避けるべきシンボルからなる部分集合に分類する
ステップにより、2つのシンボルが与えられたとき、そ
の2つのシンボルのロケーションをキャッシュ競合を回
避するように調整すべきかどうかが判断できる。互いに
キャッシュ競合が起こらないようにするべきシンボルと
いうのは、たとえば同一のループ中で参照されるシンボ
ル同士などである。
競合を避けるべきシンボルからなる部分集合に分類する
ステップにより、2つのシンボルが与えられたとき、そ
の2つのシンボルのロケーションをキャッシュ競合を回
避するように調整すべきかどうかが判断できる。互いに
キャッシュ競合が起こらないようにするべきシンボルと
いうのは、たとえば同一のループ中で参照されるシンボ
ル同士などである。
【0037】各シンボルに対してメモリ上のロケーショ
ンを決定するステップでは、同じ部分集合に属するシン
ボル同士でキャッシュ競合が発生しないようにロケーシ
ョンを決定する。そのためには、たとえば同じ部分集合
に属するシンボル同士のキャッシュアドレスの差がある
所定値より小さくならないように各シンボルのロケーシ
ョンを調整する。
ンを決定するステップでは、同じ部分集合に属するシン
ボル同士でキャッシュ競合が発生しないようにロケーシ
ョンを決定する。そのためには、たとえば同じ部分集合
に属するシンボル同士のキャッシュアドレスの差がある
所定値より小さくならないように各シンボルのロケーシ
ョンを調整する。
【0038】また、互いにキャッシュ競合を避けるべき
シンボルからなる部分集合に分類するステップでは、各
シンボルの属性にはプログラム内での参照状況に関する
情報(たとえばどのループで参照されるかなど)を含む
ことにより、単にシンボルの宣言部だけを見て判断する
よりも適切なロケーションを決められる。
シンボルからなる部分集合に分類するステップでは、各
シンボルの属性にはプログラム内での参照状況に関する
情報(たとえばどのループで参照されるかなど)を含む
ことにより、単にシンボルの宣言部だけを見て判断する
よりも適切なロケーションを決められる。
【0039】
【実施例】以下、本発明の一実施例を図面を用いて説明
する。
する。
【0040】図3に、本実施例に係る計算機システムの
構成を示す。
構成を示す。
【0041】図示するように、計算機システムは、CPU
301、主記憶装置302、外部記憶装置303、ディ
スプレイ装置304、およびキーボード305より構成
されている。外部記憶装置303には、ユーザにより記
述されたソースプログラム306と、コンパイラ311
が生成するオブジェクトプログラム307が格納され
る。主記憶装置302には、コンパイラ311、コンパ
イル処理過程で必要となる中間コード308、シンボル
テーブル309、および部分集合表310が保持され
る。
301、主記憶装置302、外部記憶装置303、ディ
スプレイ装置304、およびキーボード305より構成
されている。外部記憶装置303には、ユーザにより記
述されたソースプログラム306と、コンパイラ311
が生成するオブジェクトプログラム307が格納され
る。主記憶装置302には、コンパイラ311、コンパ
イル処理過程で必要となる中間コード308、シンボル
テーブル309、および部分集合表310が保持され
る。
【0042】コンパイラ311は、ソースプログラム3
06およびキーボード305からのユーザコマンドを入
力とし、機械語またはアセンブリ言語で記述されたオブ
ジェクトプログラム307を生成(出力)する。コンパ
イル処理は、CPU301がコンパイラプログラム311
を実行することにより行われる。
06およびキーボード305からのユーザコマンドを入
力とし、機械語またはアセンブリ言語で記述されたオブ
ジェクトプログラム307を生成(出力)する。コンパ
イル処理は、CPU301がコンパイラプログラム311
を実行することにより行われる。
【0043】図4に、本実施例に係るコンパイラの処理
の流れを示す。
の流れを示す。
【0044】コンパイラの処理は、構文解析401、メ
モリ割り付け402、コード生成403の順で行う。構
文解析401では、ソースプログラム306を読み込
み、コンパイラ内部で処理可能なように中間コード30
8およびシンボルテーブル309を作成する。構文解析
処理401については、たとえば「エイホ、セシィ、ウ
ルマン著:コンパイラ1(サイエンス社、1990年)
第30〜74頁」に記載されているので、説明は省略す
る。
モリ割り付け402、コード生成403の順で行う。構
文解析401では、ソースプログラム306を読み込
み、コンパイラ内部で処理可能なように中間コード30
8およびシンボルテーブル309を作成する。構文解析
処理401については、たとえば「エイホ、セシィ、ウ
ルマン著:コンパイラ1(サイエンス社、1990年)
第30〜74頁」に記載されているので、説明は省略す
る。
【0045】メモリ割り付け処理402では、プログラ
ムで参照するデータに対して、メモリ領域中のロケーシ
ョンを割り当てる。本処理については、図1〜図19を
用いて詳しく説明する。コード生成403では、中間コ
ード308およびシンボルテーブル309を基に、機械
語またはアセンブリ言語で記述されたプログラムを生成
する。コード生成処理403については、たとえば「エ
イホ、セシィ、ウルマン著:コンパイラ (サイエンス
社、1990年)第624〜707頁」に記載されてい
るので、説明は省略する。
ムで参照するデータに対して、メモリ領域中のロケーシ
ョンを割り当てる。本処理については、図1〜図19を
用いて詳しく説明する。コード生成403では、中間コ
ード308およびシンボルテーブル309を基に、機械
語またはアセンブリ言語で記述されたプログラムを生成
する。コード生成処理403については、たとえば「エ
イホ、セシィ、ウルマン著:コンパイラ (サイエンス
社、1990年)第624〜707頁」に記載されてい
るので、説明は省略する。
【0046】図5は、本実施例におけるコンパイラの中
間語の例である。中間語は構文解析401の処理により
作成される。なお、これは図2のプログラムに対応する
中間コードである。図5の中間コードは、基本ブロック
をエッジで結んだグラフで表現されている。このような
グラフは制御フローグラフと呼ばれている。
間語の例である。中間語は構文解析401の処理により
作成される。なお、これは図2のプログラムに対応する
中間コードである。図5の中間コードは、基本ブロック
をエッジで結んだグラフで表現されている。このような
グラフは制御フローグラフと呼ばれている。
【0047】図5において、501から508は基本ブ
ロックである。基本ブロックは、途中で分岐や飛び込み
のない、一連のコード列を表している。エッジは、基本
ブロック間の遷移を表している。たとえば基本ブロック
504から基本ブロック503にエッジが張られている
ので、基本ブロック504が終わった後で、基本ブロッ
ク503へ制御が移ることを示している。501および
508は、それぞれ、開始ブロックおよび終了ブロック
と呼ばれる特別な基本ブロックで、それぞれプログラム
の開始と終了を表す。なお、基本ブロックの解析方法な
どについては「エイホ、セシィ、ウルマン著:コンパイ
ラ2(サイエンス社、1990年)第642〜648
頁」に記載がある。
ロックである。基本ブロックは、途中で分岐や飛び込み
のない、一連のコード列を表している。エッジは、基本
ブロック間の遷移を表している。たとえば基本ブロック
504から基本ブロック503にエッジが張られている
ので、基本ブロック504が終わった後で、基本ブロッ
ク503へ制御が移ることを示している。501および
508は、それぞれ、開始ブロックおよび終了ブロック
と呼ばれる特別な基本ブロックで、それぞれプログラム
の開始と終了を表す。なお、基本ブロックの解析方法な
どについては「エイホ、セシィ、ウルマン著:コンパイ
ラ2(サイエンス社、1990年)第642〜648
頁」に記載がある。
【0048】図6は、基本ブロック504の中身をより
詳細に示したものである。
詳細に示したものである。
【0049】図5の基本ブロック504は604から6
08の5個の文から成り、また各文は文番号601、処
理の内容を表す文602、および文で参照されるシンボ
ル(のリスト)603の3つの要素から成る。文番号6
01は、プログラム全体で各文に一意に付けられた番号
である。文602は、処理の内容を3番地コードで表し
たものである。3番地コードについては、「エイホ、セ
シィ、ウルマン著:コンパイラ2(サイエンス社、19
90年)第567〜568頁」に記載がある。たとえ
ば、文604は、配列要素「B(I)」を一時変数t1に代入
する(「:=」で示される)処理を表す。一時変数は、コ
ンパイラが処理の都合のために内部で新たに生成した変
数のことである。603のフィールドは、文で参照され
るシンボル(のリスト)を表している。たとえば、文6
04では「B(I)」でBとIが参照されているので、この2
つのシンボルが登録されている。本実施例の中間コード
では、コンパイラが生成した一時変数についてはこのフ
ィールドに登録しないことにしている。
08の5個の文から成り、また各文は文番号601、処
理の内容を表す文602、および文で参照されるシンボ
ル(のリスト)603の3つの要素から成る。文番号6
01は、プログラム全体で各文に一意に付けられた番号
である。文602は、処理の内容を3番地コードで表し
たものである。3番地コードについては、「エイホ、セ
シィ、ウルマン著:コンパイラ2(サイエンス社、19
90年)第567〜568頁」に記載がある。たとえ
ば、文604は、配列要素「B(I)」を一時変数t1に代入
する(「:=」で示される)処理を表す。一時変数は、コ
ンパイラが処理の都合のために内部で新たに生成した変
数のことである。603のフィールドは、文で参照され
るシンボル(のリスト)を表している。たとえば、文6
04では「B(I)」でBとIが参照されているので、この2
つのシンボルが登録されている。本実施例の中間コード
では、コンパイラが生成した一時変数についてはこのフ
ィールドに登録しないことにしている。
【0050】図7は、コンパイラのシンボルテーブル3
09の例である。シンボルテーブル309には、プログ
ラム中に出現するすべてのシンボル(識別子)に関する
情報を保持する。図7は、図2のプログラムに対応する
シンボルテーブルで、図4におけるメモリ割り付け処理
402を行う前の状態を示している。
09の例である。シンボルテーブル309には、プログ
ラム中に出現するすべてのシンボル(識別子)に関する
情報を保持する。図7は、図2のプログラムに対応する
シンボルテーブルで、図4におけるメモリ割り付け処理
402を行う前の状態を示している。
【0051】図示するように、シンボルテーブル309
に登録されている情報は、名称701、型702、記憶
領域703、サイズ704、ロケーション705、およ
び参照ループ706である。
に登録されている情報は、名称701、型702、記憶
領域703、サイズ704、ロケーション705、およ
び参照ループ706である。
【0052】名称701は、シンボルの名称を記憶す
る。型702は、変数の型を表し、たとえば「array (r
eal*8, 1:4096)」は、「要素の型が8バイトreal(浮動
小数点型)で、添字の範囲が1から4096までの配
列」という型を表す。なお、「1:4906」の1を(配列添
字の)下限値、4096を上限値と呼ぶ。
る。型702は、変数の型を表し、たとえば「array (r
eal*8, 1:4096)」は、「要素の型が8バイトreal(浮動
小数点型)で、添字の範囲が1から4096までの配
列」という型を表す。なお、「1:4906」の1を(配列添
字の)下限値、4096を上限値と呼ぶ。
【0053】記憶領域703は、このデータを割り付け
るべき記憶領域を表している。COMMONというのは、コモ
ン領域と呼ばれる静的な記憶領域である。STACKという
のは、プログラム実行時に動的に確保されるスタック領
域を表す。データをどの記憶領域に割り付けるかは、ソ
ースプログラムの言語仕様からほぼ自動的に決定され
る。図2のプログラムでは、変数A,B,C,D,EはCOMMONと
指定されているのでコモン領域に、I,Jは特に指定がな
いのでスタック領域に割り付けられる。
るべき記憶領域を表している。COMMONというのは、コモ
ン領域と呼ばれる静的な記憶領域である。STACKという
のは、プログラム実行時に動的に確保されるスタック領
域を表す。データをどの記憶領域に割り付けるかは、ソ
ースプログラムの言語仕様からほぼ自動的に決定され
る。図2のプログラムでは、変数A,B,C,D,EはCOMMONと
指定されているのでコモン領域に、I,Jは特に指定がな
いのでスタック領域に割り付けられる。
【0054】サイズ704は、データのサイズをバイト
数で表したものである。ロケーション705は、データ
が割り付けられる記憶領域内での、そのデータのアドレ
スを表す。各記憶領域での先頭を0とする。ロケーショ
ンは、メモリ割り付け処理402により決定される。図
7は、まだメモリ割り付けをしていない時点でのシンボ
ルテーブルを示したものであるので、ロケーション情報
はまだ空である。参照ループ706は、本シンボルを参
照しているループ集合(ループ番号のリスト)を保持す
る。本フィールドもメモリ割り付け処理402により設
定される。
数で表したものである。ロケーション705は、データ
が割り付けられる記憶領域内での、そのデータのアドレ
スを表す。各記憶領域での先頭を0とする。ロケーショ
ンは、メモリ割り付け処理402により決定される。図
7は、まだメモリ割り付けをしていない時点でのシンボ
ルテーブルを示したものであるので、ロケーション情報
はまだ空である。参照ループ706は、本シンボルを参
照しているループ集合(ループ番号のリスト)を保持す
る。本フィールドもメモリ割り付け処理402により設
定される。
【0055】次に、図4のメモリ割り付け処理402の
処理を詳しく説明する。
処理を詳しく説明する。
【0056】図8は、メモリ割り付け処理402を詳し
く示したフローチャートである。
く示したフローチャートである。
【0057】まずステップ801で、シンボルテーブル
(図7)中のシンボルに対して、そのシンボルが出現す
るループのループ番号を登録する。プログラムが図5の
ような制御フローグラフで表現されているとき、プログ
ラムに含まれるループを解析する方法については「エイ
ホ、セシィ、ウルマン著:コンパイラ2(サイエンス
社、1990年)第734〜741頁」に記載がある。
それによれば、与えられた基本ブロックがどのループに
属するかを判定することができる。したがって、シンボ
ルがどの基本ブロックに出現しているかがわかれば、ど
のループに出現しているかも容易に判定できる。シンボ
ルがどの基本ブロックに出現しているかは、各基本ブロ
ック(たとえば図6)中のフィールド603を調べれば
よい。
(図7)中のシンボルに対して、そのシンボルが出現す
るループのループ番号を登録する。プログラムが図5の
ような制御フローグラフで表現されているとき、プログ
ラムに含まれるループを解析する方法については「エイ
ホ、セシィ、ウルマン著:コンパイラ2(サイエンス
社、1990年)第734〜741頁」に記載がある。
それによれば、与えられた基本ブロックがどのループに
属するかを判定することができる。したがって、シンボ
ルがどの基本ブロックに出現しているかがわかれば、ど
のループに出現しているかも容易に判定できる。シンボ
ルがどの基本ブロックに出現しているかは、各基本ブロ
ック(たとえば図6)中のフィールド603を調べれば
よい。
【0058】図2のプログラムでは基本ブロック50
3、504で構成されるループ(ループ番号を1とす
る)と、基本ブロック506、507で構成されるルー
プ(ループ番号を2とする)の2つのループがある。前
者のループではシンボルI,A,B,Cが参照され、後者のル
ープではシンボルJ,D,Eが参照される。したがって、図
7のシンボルテーブルでは、シンボルI,A,B,Cの参照ル
ープ706にループ1を登録し、シンボルJ,D,Eの参照
ループ706にはループ2を登録する。
3、504で構成されるループ(ループ番号を1とす
る)と、基本ブロック506、507で構成されるルー
プ(ループ番号を2とする)の2つのループがある。前
者のループではシンボルI,A,B,Cが参照され、後者のル
ープではシンボルJ,D,Eが参照される。したがって、図
7のシンボルテーブルでは、シンボルI,A,B,Cの参照ル
ープ706にループ1を登録し、シンボルJ,D,Eの参照
ループ706にはループ2を登録する。
【0059】次に、ステップ802で、まだロケーショ
ンを割り付けていない記憶領域があるかどうかを調べ
る。ある場合はステップ803で、その記憶領域に対し
てメモリ割り付け(ロケーション決定)処理を行う。そ
して、ステップ802へ戻る。未割り付けの記憶領域が
残っていない場合は、そこでメモリ割り付け処理を終了
する。
ンを割り付けていない記憶領域があるかどうかを調べ
る。ある場合はステップ803で、その記憶領域に対し
てメモリ割り付け(ロケーション決定)処理を行う。そ
して、ステップ802へ戻る。未割り付けの記憶領域が
残っていない場合は、そこでメモリ割り付け処理を終了
する。
【0060】ステップ803の処理については、図1で
さらに詳しく説明する。図2のプログラムの場合は図7
のシンボルテーブルを見ればわかるように、「COMMON」
と「STACK」の2つの記憶領域があるので、この2つの
記憶領域に対してステップ803のメモリ割り付けを行
うことになる。
さらに詳しく説明する。図2のプログラムの場合は図7
のシンボルテーブルを見ればわかるように、「COMMON」
と「STACK」の2つの記憶領域があるので、この2つの
記憶領域に対してステップ803のメモリ割り付けを行
うことになる。
【0061】次に、記憶領域に対するメモリ割り付け処
理803の処理を図1を用いて詳しく説明する。
理803の処理を図1を用いて詳しく説明する。
【0062】図1は、ステップ803の処理を詳しく示
したフローチャートである。
したフローチャートである。
【0063】まず、ステップ101で、本メモリ領域に
含まれる変数シンボル(の集合)に対して、ロケーショ
ンの割り付け順序を決める。割り付け順序が早いほど、
割り付けられるロケーション(記憶領域内のアドレス)
の値は小さいものとする。ロケーション割り付け順序
は、たとえばシンボルテーブルの中でシンボルが現れる
順序に合わせればよい。たとえば図7のシンボルテーブ
ルではCOMMON領域に対する割り付け順序は「A,B,C,D,
E」の順とする。
含まれる変数シンボル(の集合)に対して、ロケーショ
ンの割り付け順序を決める。割り付け順序が早いほど、
割り付けられるロケーション(記憶領域内のアドレス)
の値は小さいものとする。ロケーション割り付け順序
は、たとえばシンボルテーブルの中でシンボルが現れる
順序に合わせればよい。たとえば図7のシンボルテーブ
ルではCOMMON領域に対する割り付け順序は「A,B,C,D,
E」の順とする。
【0064】次にステップ102で、本メモリ領域に含
まれる変数シンボル(の集合)を、変数シンボルの部分
集合に分類する。どのような基準をもとに分類するか
は、図9を用いて後でさらに詳しく説明するが、簡単に
言うと、1つの部分集合に属するシンボル同士はキャッ
シュ競合が起きないような割り付けを行うように分類す
る。図2のプログラム例の場合は、COMMON領域に{A,B,
C,D,E}の5つの変数シンボルが含まれるが、それが{A,
B,C}と{D,E}の2つの部分集合に分類される。
まれる変数シンボル(の集合)を、変数シンボルの部分
集合に分類する。どのような基準をもとに分類するか
は、図9を用いて後でさらに詳しく説明するが、簡単に
言うと、1つの部分集合に属するシンボル同士はキャッ
シュ競合が起きないような割り付けを行うように分類す
る。図2のプログラム例の場合は、COMMON領域に{A,B,
C,D,E}の5つの変数シンボルが含まれるが、それが{A,
B,C}と{D,E}の2つの部分集合に分類される。
【0065】次にステップ103で、本メモリ領域に属
する変数シンボルを1つ取り出す。取り出す順番は、ス
テップ101で定めた割り付け順序に従う。取り出した
シンボルをaとする。次にステップ104で、aが、本
メモリ領域で最初に取り出したシンボルかどうかを調べ
る。最初のシンボルならばステップ105に進み、aの
ロケーションL←0として、ステップ908に進む。
する変数シンボルを1つ取り出す。取り出す順番は、ス
テップ101で定めた割り付け順序に従う。取り出した
シンボルをaとする。次にステップ104で、aが、本
メモリ領域で最初に取り出したシンボルかどうかを調べ
る。最初のシンボルならばステップ105に進み、aの
ロケーションL←0として、ステップ908に進む。
【0066】aが最初のシンボルでなければ、ステップ
106で、aの仮のロケーションL'を求める。L'は「直
前に割り付けた変数シンボルのロケーション+直前に割
り付けた変数シンボルのサイズ」とする。たとえば、直
前に割り付けた変数のロケーションが20で、そのサイズ
が10ならば、L'は30(=20+10)となる。次に、ステッ
プ107で、仮のロケーションL'を基に、キャッシュ競
合回避のためのロケーションLを求める。この処理につ
いては、図12を用いて後で詳しく説明する。ステップ
107の後、ステップ108に進む。
106で、aの仮のロケーションL'を求める。L'は「直
前に割り付けた変数シンボルのロケーション+直前に割
り付けた変数シンボルのサイズ」とする。たとえば、直
前に割り付けた変数のロケーションが20で、そのサイズ
が10ならば、L'は30(=20+10)となる。次に、ステッ
プ107で、仮のロケーションL'を基に、キャッシュ競
合回避のためのロケーションLを求める。この処理につ
いては、図12を用いて後で詳しく説明する。ステップ
107の後、ステップ108に進む。
【0067】ステップ108では、求められたロケーシ
ョンLをシンボルテーブルのシンボルaのロケーション
705の欄に設定する。そしてステップ109で、本記
憶領域に、まだロケーションを決めていない変数シンボ
ルが残っているかを調べ、残っていればステップ103
に戻る。残っていなければ終了する。
ョンLをシンボルテーブルのシンボルaのロケーション
705の欄に設定する。そしてステップ109で、本記
憶領域に、まだロケーションを決めていない変数シンボ
ルが残っているかを調べ、残っていればステップ103
に戻る。残っていなければ終了する。
【0068】次に、シンボル集合を部分集合に分類する
処理102について、図10と図9を用いて詳しく説明
する。
処理102について、図10と図9を用いて詳しく説明
する。
【0069】図10は、部分集合表310の一例を示し
た図である。
た図である。
【0070】部分集合表310は、1つの記憶領域に属
する変数の集合を、キャッシュ競合を回避したい変数シ
ンボルの部分集合に分類するときの、各部分集合の情報
を保持する表である。1001は部分集合番号(部分集
合を特定する番号)を表す。1002はその部分集合に
属する要素(シンボル)の数である。1003はその部
分集合に属する要素(シンボル)のリストである。各リ
ストのノードは、リストの次の要素を指すポインタ10
04と、そのシンボルに対応するシンボルテーブルのエ
ントリを指すポインタ1005から成る。なお、図10
では、シンボルテーブルへのポインタの代わりにシンボ
ル名称を書いている。図10では、部分集合1に{A,B,
C}の3つのシンボルが、部分集合2に{D,E}の2つのシ
ンボルが、それぞれ含まれる。部分集合表310は、ス
テップ102の処理を行うことにより作成される。
する変数の集合を、キャッシュ競合を回避したい変数シ
ンボルの部分集合に分類するときの、各部分集合の情報
を保持する表である。1001は部分集合番号(部分集
合を特定する番号)を表す。1002はその部分集合に
属する要素(シンボル)の数である。1003はその部
分集合に属する要素(シンボル)のリストである。各リ
ストのノードは、リストの次の要素を指すポインタ10
04と、そのシンボルに対応するシンボルテーブルのエ
ントリを指すポインタ1005から成る。なお、図10
では、シンボルテーブルへのポインタの代わりにシンボ
ル名称を書いている。図10では、部分集合1に{A,B,
C}の3つのシンボルが、部分集合2に{D,E}の2つのシ
ンボルが、それぞれ含まれる。部分集合表310は、ス
テップ102の処理を行うことにより作成される。
【0071】図9は、ステップ102の処理を詳しく示
したフローチャートである。この処理では、2つのシン
ボルの間のキャッシュ競合を回避すべきか判断し、回避
すべきと判断されたとき、その2つのシンボルが同じ部
分集合に含まれるように部分集合表310を作成してい
く。
したフローチャートである。この処理では、2つのシン
ボルの間のキャッシュ競合を回避すべきか判断し、回避
すべきと判断されたとき、その2つのシンボルが同じ部
分集合に含まれるように部分集合表310を作成してい
く。
【0072】まずステップ901で、変数シンボルを1
つ取り出す。取り出す順番は、ステップ101で定めた
割り付け順序に従う。このシンボルをaとする。次にス
テップ902で、部分集合表310に部分集合が既に1
つ以上登録されているか否かを調べる。登録されていれ
なければステップ903に進み、新たな部分集合エント
リを部分集合表310に追加作成し、その部分集合に属
するシンボルとしてaを登録する(すなわち、aのみか
ら成るリストを作成する)。
つ取り出す。取り出す順番は、ステップ101で定めた
割り付け順序に従う。このシンボルをaとする。次にス
テップ902で、部分集合表310に部分集合が既に1
つ以上登録されているか否かを調べる。登録されていれ
なければステップ903に進み、新たな部分集合エント
リを部分集合表310に追加作成し、その部分集合に属
するシンボルとしてaを登録する(すなわち、aのみか
ら成るリストを作成する)。
【0073】部分集合表310に部分集合が既に1つ以
上登録されていれば、ステップ902からステップ90
4に進み、部分集合を1つ取り出す。この部分集合をX
とする。次にステップ905で、Xに属する変数シンボ
ルを1つ(始めは、リストの最初のシンボル)を取り出
す。このシンボルをbとする。次にステップ906で、
シンボルaとシンボルbとのキャッシュ競合を回避すべ
きかどうかを調べる。この処理は後で図11を用いてさ
らに詳しく説明する。
上登録されていれば、ステップ902からステップ90
4に進み、部分集合を1つ取り出す。この部分集合をX
とする。次にステップ905で、Xに属する変数シンボ
ルを1つ(始めは、リストの最初のシンボル)を取り出
す。このシンボルをbとする。次にステップ906で、
シンボルaとシンボルbとのキャッシュ競合を回避すべ
きかどうかを調べる。この処理は後で図11を用いてさ
らに詳しく説明する。
【0074】ステップ906でシンボルaとシンボルb
とのキャッシュ競合を回避すべきだと判定された場合
は、ステップ907に進み、シンボルaを部分集合Xに
加える(リストの最後に追加する)。ステップ906で
競合を回避すべきだと判定されなかった場合は、ステッ
プ908へ進み、Xに含まれる次のシンボル(リスト中
のbの次のシンボル)があるか否かを調べ、あればステ
ップ909でその要素を新たにbとし、ステップ906
から繰り返す。なければステップ902から次の部分集
合に対して上記の処理を繰り返す。
とのキャッシュ競合を回避すべきだと判定された場合
は、ステップ907に進み、シンボルaを部分集合Xに
加える(リストの最後に追加する)。ステップ906で
競合を回避すべきだと判定されなかった場合は、ステッ
プ908へ進み、Xに含まれる次のシンボル(リスト中
のbの次のシンボル)があるか否かを調べ、あればステ
ップ909でその要素を新たにbとし、ステップ906
から繰り返す。なければステップ902から次の部分集
合に対して上記の処理を繰り返す。
【0075】ステップ903またはステップ907が終
わると、シンボルaについての分類の処理が終わったこ
とになる。その後はステップ910に進み、処理すべき
次の変数シンボルが存在するか否かを調べ、存在すれば
ステップ901から繰り返す。存在しなければ終了す
る。以上の処理により、すべてのシンボルがいずれかの
部分集合に属するように分類される。
わると、シンボルaについての分類の処理が終わったこ
とになる。その後はステップ910に進み、処理すべき
次の変数シンボルが存在するか否かを調べ、存在すれば
ステップ901から繰り返す。存在しなければ終了す
る。以上の処理により、すべてのシンボルがいずれかの
部分集合に属するように分類される。
【0076】次にステップ906の処理、すなわち2つ
のシンボルの間のキャッシュ競合を回避すべきかどうか
を判定する処理を詳しく説明する。
のシンボルの間のキャッシュ競合を回避すべきかどうか
を判定する処理を詳しく説明する。
【0077】図11は、ステップ906の処理をより詳
しく示したフローチャートである。この処理では、2つ
の変数シンボルaとbが与えられたとき、この2つのシ
ンボルの間で生じる可能性のあるキャッシュ競合を回避
すべきかどうかを判定し、肯定的ならば真を、否定的な
らば偽を、返却値として返す。
しく示したフローチャートである。この処理では、2つ
の変数シンボルaとbが与えられたとき、この2つのシ
ンボルの間で生じる可能性のあるキャッシュ競合を回避
すべきかどうかを判定し、肯定的ならば真を、否定的な
らば偽を、返却値として返す。
【0078】まずステップ1101で、2つのシンボル
がともに配列型かどうかを調べる。これは、シンボルテ
ーブル309を参照して、シンボルaとbの型702を
調べることによって判定できる。2つのシンボルがとも
に配列型である場合はステップ1102に進み、そうで
ない場合(少なくともいずれか一方が配列型でない場
合)はステップ1105に進み、偽を返す。
がともに配列型かどうかを調べる。これは、シンボルテ
ーブル309を参照して、シンボルaとbの型702を
調べることによって判定できる。2つのシンボルがとも
に配列型である場合はステップ1102に進み、そうで
ない場合(少なくともいずれか一方が配列型でない場
合)はステップ1105に進み、偽を返す。
【0079】ステップ1102では、2つの配列の形
(shape)が等しいか否かを調べる。ここで配列の形が
等しいとは、配列の次元数と、各次元での上下限値がす
べて等しいことである。これも、シンボルaとbのシン
ボルテーブルの型702を調べることにより判定でき
る。2つの配列の形が等しいときは、ステップ1103
に進む。そうでない場合は、ステップ1105に進み、
偽を返す。
(shape)が等しいか否かを調べる。ここで配列の形が
等しいとは、配列の次元数と、各次元での上下限値がす
べて等しいことである。これも、シンボルaとbのシン
ボルテーブルの型702を調べることにより判定でき
る。2つの配列の形が等しいときは、ステップ1103
に進む。そうでない場合は、ステップ1105に進み、
偽を返す。
【0080】ステップ1103では、2つの変数シンボ
ルをともに参照しているループが存在するか否かを調べ
る。これは、シンボルテーブルエントリの参照ループ7
06を調べることにより行う。すなわち、aの参照ルー
プに含まれ、かつbの参照ループにも含まれるループが
存在するかどうかを調べる。2つの変数シンボルをとも
に参照しているループが存在する場合は、ステップ11
04に進み真を返す。存在しない場合は、ステップ11
05に進み偽を返す。
ルをともに参照しているループが存在するか否かを調べ
る。これは、シンボルテーブルエントリの参照ループ7
06を調べることにより行う。すなわち、aの参照ルー
プに含まれ、かつbの参照ループにも含まれるループが
存在するかどうかを調べる。2つの変数シンボルをとも
に参照しているループが存在する場合は、ステップ11
04に進み真を返す。存在しない場合は、ステップ11
05に進み偽を返す。
【0081】図10の部分配列表は、実は図2のプログ
ラムに対するものである。ここではシンボルA,B,Cが1
つの部分集合に、またシンボルD,Eが1つの部分集合に
属する。シンボルAとBは、ともに配列型で、配列の形も
等しく、また参照されるループも等しい(ともにループ
1)。したがって同じ部分集合に含まれる。AとCも同様
である。一方、AとDは、ともに配列型で配列の形も等し
いが、参照されるループが異なるので、同じ部分集合に
は分類されない。DとEは同じ部分集合に分類される。
ラムに対するものである。ここではシンボルA,B,Cが1
つの部分集合に、またシンボルD,Eが1つの部分集合に
属する。シンボルAとBは、ともに配列型で、配列の形も
等しく、また参照されるループも等しい(ともにループ
1)。したがって同じ部分集合に含まれる。AとCも同様
である。一方、AとDは、ともに配列型で配列の形も等し
いが、参照されるループが異なるので、同じ部分集合に
は分類されない。DとEは同じ部分集合に分類される。
【0082】次に、図1のステップ107の処理を、図
12のフローチャートを用いてより詳しく説明する。こ
の処理では、シンボルaの仮のロケーションL'をもと
に、競合回避のためのロケーションLを求める。
12のフローチャートを用いてより詳しく説明する。こ
の処理では、シンボルaの仮のロケーションL'をもと
に、競合回避のためのロケーションLを求める。
【0083】まずステップ1201で、部分集合表31
0(図10)を走査し、シンボルaをリストに含む部分
集合を求める。なお、図9の処理からわかるように、任
意のシンボルは必ずいずれかの1つの部分集合に属す
る。ステップ1201で求めた部分集合をXとする。次
にステップ1202で、部分集合Xの要素リスト中の最
初の要素を取出し、bとする。
0(図10)を走査し、シンボルaをリストに含む部分
集合を求める。なお、図9の処理からわかるように、任
意のシンボルは必ずいずれかの1つの部分集合に属す
る。ステップ1201で求めた部分集合をXとする。次
にステップ1202で、部分集合Xの要素リスト中の最
初の要素を取出し、bとする。
【0084】次にステップ1203で、シンボルaとb
が同じシンボルか否かを調べる。同じシンボルであれ
ば、ステップ1208へ進み、L←L'とし、終了する。
同じシンボルでなければ、ステップ1204で、シンボ
ルbのロケーションをシンボルテーブルから求めそれを
Mとする。なお、bはaより先にロケーションが割り付
けられているので、この時点でbのロケーションは定ま
っている。次にステップ1205で、ロケーションL'の
キャッシュアドレスとロケーションMのキャッシュアド
レスの差が、ある値より小さいか、すなわちロケーショ
ンL'とMとがキャッシュ競合を起こすかどうかを調べ
る。この判定処理については、図13を用いてより詳し
く説明する。
が同じシンボルか否かを調べる。同じシンボルであれ
ば、ステップ1208へ進み、L←L'とし、終了する。
同じシンボルでなければ、ステップ1204で、シンボ
ルbのロケーションをシンボルテーブルから求めそれを
Mとする。なお、bはaより先にロケーションが割り付
けられているので、この時点でbのロケーションは定ま
っている。次にステップ1205で、ロケーションL'の
キャッシュアドレスとロケーションMのキャッシュアド
レスの差が、ある値より小さいか、すなわちロケーショ
ンL'とMとがキャッシュ競合を起こすかどうかを調べ
る。この判定処理については、図13を用いてより詳し
く説明する。
【0085】ステップ1205でキャッシュ競合を起こ
す場合は、ステップ1206に進み、L'←L'+eとし、ス
テップ1205から繰り返す。ここで、eは配列aの要
素サイズである(たとえば図2のプログラムのAの場合
は8)。キャッシュ競合を起こさない場合は、ステップ
1207に進み、Xの要素リスト中でbの次のシンボル
を求め、それを新たにbとし、ステップ1203から繰
り返す。
す場合は、ステップ1206に進み、L'←L'+eとし、ス
テップ1205から繰り返す。ここで、eは配列aの要
素サイズである(たとえば図2のプログラムのAの場合
は8)。キャッシュ競合を起こさない場合は、ステップ
1207に進み、Xの要素リスト中でbの次のシンボル
を求め、それを新たにbとし、ステップ1203から繰
り返す。
【0086】次に、図13を用いてステップ1205の
判定処理をさらに詳しく説明する。この判定処理は、2
つのロケーションL'とMとがキャッシュ競合を起こすか
否か調べ、起こせば真を、起こさなければ偽を返す。な
お、ここではキャッシュはダイレクトマップ方式とし、
キャッシュアドレスは、メモリアドレスの下位ビット
(具体的には、メモリアドレス(32ビット)の上位か
ら数えて18ビット目から27ビット目)で決まるもの
とする。
判定処理をさらに詳しく説明する。この判定処理は、2
つのロケーションL'とMとがキャッシュ競合を起こすか
否か調べ、起こせば真を、起こさなければ偽を返す。な
お、ここではキャッシュはダイレクトマップ方式とし、
キャッシュアドレスは、メモリアドレスの下位ビット
(具体的には、メモリアドレス(32ビット)の上位か
ら数えて18ビット目から27ビット目)で決まるもの
とする。
【0087】まずステップ1301で、m ← (L'-M) ^
mod Cとする。ここでCはキャッシュサイズで,「^mod」
は、 u ^mod v = u mod v (u mod v < v/2の場合) v - (u mod v) (そうでない場合) で定義される演算である。前に割り付けたシンボルbの
ロケーションがMで、いまそのシンボルbの後に新たに
シンボルaを割り付けようとしている。そのシンボルa
の仮のロケーションがL'である。m ← (L'-M) ^mod C
は、要するに、ロケーションL'とMとの差をキャッシュ
サイズCで割った余りが、C/2以上であるときはその余り
の値をmとし、C/2以上でないときはCからその余りを引
いた値をmとするということである。
mod Cとする。ここでCはキャッシュサイズで,「^mod」
は、 u ^mod v = u mod v (u mod v < v/2の場合) v - (u mod v) (そうでない場合) で定義される演算である。前に割り付けたシンボルbの
ロケーションがMで、いまそのシンボルbの後に新たに
シンボルaを割り付けようとしている。そのシンボルa
の仮のロケーションがL'である。m ← (L'-M) ^mod C
は、要するに、ロケーションL'とMとの差をキャッシュ
サイズCで割った余りが、C/2以上であるときはその余り
の値をmとし、C/2以上でないときはCからその余りを引
いた値をmとするということである。
【0088】次にステップ1303で、m<s+e-1かどう
かを調べる。ここで、sはキャッシュラインサイズ、eは
配列要素サイズである。m<s+e-1ならば、ステップ13
04に進みx←0とする。そうでなければ、ステップ13
05に進みx←m-(s+e+1)とする。いずれの場合も次にス
テップ1306に進み、xが予め定められたしきい値Tよ
りも小さいか否かを調べる。m=0ならシンボルaとbと
はキャッシュ上で全く同位置に割り付けられていること
になる。m<s+e-1のときは、シンボルaとbとがキャッ
シュライン上の両端付近に割り付けられていてキャッシ
ュ競合を起こす可能性があることになる。そこで、m<s+
e-1のときは、しきい値Tと比較するxに最小値である0を
セットするようにしている。
かを調べる。ここで、sはキャッシュラインサイズ、eは
配列要素サイズである。m<s+e-1ならば、ステップ13
04に進みx←0とする。そうでなければ、ステップ13
05に進みx←m-(s+e+1)とする。いずれの場合も次にス
テップ1306に進み、xが予め定められたしきい値Tよ
りも小さいか否かを調べる。m=0ならシンボルaとbと
はキャッシュ上で全く同位置に割り付けられていること
になる。m<s+e-1のときは、シンボルaとbとがキャッ
シュライン上の両端付近に割り付けられていてキャッシ
ュ競合を起こす可能性があることになる。そこで、m<s+
e-1のときは、しきい値Tと比較するxに最小値である0を
セットするようにしている。
【0089】Tは、コンパイラによりチューニング可能
な数で、値が大きいほど広い範囲のキャッシュ競合を回
避する。たとえば、A(i)とB(i)(iは任意の値)の間の
キャッシュ競合を回避したければTの値は0でよいが、
さらにA(i)とB(i+1)の間のキャッシュ競合も回避したけ
ればTの値は8とする(配列要素サイズが8の場合)。x
<Tならば、ステップ1307へ進み真を返す。そうでな
ければ、ステップ1308へ進み偽を返す。
な数で、値が大きいほど広い範囲のキャッシュ競合を回
避する。たとえば、A(i)とB(i)(iは任意の値)の間の
キャッシュ競合を回避したければTの値は0でよいが、
さらにA(i)とB(i+1)の間のキャッシュ競合も回避したけ
ればTの値は8とする(配列要素サイズが8の場合)。x
<Tならば、ステップ1307へ進み真を返す。そうでな
ければ、ステップ1308へ進み偽を返す。
【0090】たとえば、C=32*1024(32キロバイト)、s
=32、e=8、T=16のとき、L'=0とM=32768がキャッシュ競
合を起こすかどうかを図13のフローチャートに従って
調べると、まずステップ1301でm←0(=32768 ^mod
(32*1024))となる。よってステップ1303でx←0と
なり、ステップ1305でx<16となり結局真、すなわち
キャッシュ競合ありと判定される。
=32、e=8、T=16のとき、L'=0とM=32768がキャッシュ競
合を起こすかどうかを図13のフローチャートに従って
調べると、まずステップ1301でm←0(=32768 ^mod
(32*1024))となる。よってステップ1303でx←0と
なり、ステップ1305でx<16となり結局真、すなわち
キャッシュ競合ありと判定される。
【0091】しきい値Tの決め方についてさらに説明す
る。しきい値Tは、競合を回避したい配列要素のロケー
ションの差から、配列先頭のロケーションの差を引いた
ものとすればよい。たとえば2次元配列A(1:N, 1:M)とB
(1:N, 1:M)を考える。配列要素A(i,j)とB(i,j)との間だ
けの競合を回避したければTの値は0でよい。なぜな
ら、要素A(i,j)とB(i,j)との間のロケーション差が、配
列Aの先頭ロケーションと配列Bの先頭ロケーションの差
に等しいからである。
る。しきい値Tは、競合を回避したい配列要素のロケー
ションの差から、配列先頭のロケーションの差を引いた
ものとすればよい。たとえば2次元配列A(1:N, 1:M)とB
(1:N, 1:M)を考える。配列要素A(i,j)とB(i,j)との間だ
けの競合を回避したければTの値は0でよい。なぜな
ら、要素A(i,j)とB(i,j)との間のロケーション差が、配
列Aの先頭ロケーションと配列Bの先頭ロケーションの差
に等しいからである。
【0092】もし配列要素A(i,j)とB(i,j+1)との間のキ
ャッシュ競合も回避したければT=8とする。配列要素間
のロケーションの差は1要素(8バイト)分増えるから
である。さらに、A(i,j)とB(i+1,j)の間のキャッシュ競
合も回避したければT=8*Mとする。配列要素間のロケー
ションの差は配列の1列分(8*Mバイト)増えるからで
ある。しきい値Tの値は定数である必要はなく、コンパ
イルするプログラムの特性に応じて変えてもよい。たと
えばプログラム中の配列参照パターンを調べてTの値を
決定することもできる。
ャッシュ競合も回避したければT=8とする。配列要素間
のロケーションの差は1要素(8バイト)分増えるから
である。さらに、A(i,j)とB(i+1,j)の間のキャッシュ競
合も回避したければT=8*Mとする。配列要素間のロケー
ションの差は配列の1列分(8*Mバイト)増えるからで
ある。しきい値Tの値は定数である必要はなく、コンパ
イルするプログラムの特性に応じて変えてもよい。たと
えばプログラム中の配列参照パターンを調べてTの値を
決定することもできる。
【0093】図14は、図2のプログラムに対し、以上
説明したメモリ割り付け方法にしたがってメモリ割り付
けした場合の、割り付け後のシンボルテーブルを示した
ものである。メモリ割り付け後であるので、ロケーショ
ン705のフィールドが設定されている。なお、ここで
はキャッシュサイズを32キロバイト、キャッシュライ
ンサイズを32バイト、しきい値Tの値を16としてい
る。
説明したメモリ割り付け方法にしたがってメモリ割り付
けした場合の、割り付け後のシンボルテーブルを示した
ものである。メモリ割り付け後であるので、ロケーショ
ン705のフィールドが設定されている。なお、ここで
はキャッシュサイズを32キロバイト、キャッシュライ
ンサイズを32バイト、しきい値Tの値を16としてい
る。
【0094】図15は、図14の割り付け結果に従った
ときの、図2のプログラムで使用されるデータのメモリ
1501中の配置を示したものである。1502はロケ
ーション、1503はそのロケーションに格納される配
列要素を示している。斜線で示される部分は、配列要素
が格納されない部分(パディング)を表している。図1
6の、従来のメモリ割り付け方式の場合のメモリ配置に
比べて、パディング部分が存在することがわかる。
ときの、図2のプログラムで使用されるデータのメモリ
1501中の配置を示したものである。1502はロケ
ーション、1503はそのロケーションに格納される配
列要素を示している。斜線で示される部分は、配列要素
が格納されない部分(パディング)を表している。図1
6の、従来のメモリ割り付け方式の場合のメモリ配置に
比べて、パディング部分が存在することがわかる。
【0095】図18は、上述の本実施例によるメモリ割
り付けを行った場合、図2のプログラムでどの配列参照
に対してキャッシュミスが生じるかを示したものであ
る。最初の3回の参照ではミスが起こっているが、それ
以降はキャッシュラインを有効利用しているためミスは
起こっていない。これは、B(1)とC(1),C(1)とA(1)など
がキャッシュライン競合を起こさなくなったためであ
る。たとえば、B(1)のロケーションは32824、C(1)のロ
ケーションは65648であり、その差は32824である。これ
をキャッシュサイズ32768(=32*1024)で割った余りは56
であり、キャッシュラインが1ライン以上(1ラインは
32バイト)ずれている、すなわちキャッシュラインは
競合していない。図18では、キャッシュミスは4回の
参照につき1回の割合で発生している。
り付けを行った場合、図2のプログラムでどの配列参照
に対してキャッシュミスが生じるかを示したものであ
る。最初の3回の参照ではミスが起こっているが、それ
以降はキャッシュラインを有効利用しているためミスは
起こっていない。これは、B(1)とC(1),C(1)とA(1)など
がキャッシュライン競合を起こさなくなったためであ
る。たとえば、B(1)のロケーションは32824、C(1)のロ
ケーションは65648であり、その差は32824である。これ
をキャッシュサイズ32768(=32*1024)で割った余りは56
であり、キャッシュラインが1ライン以上(1ラインは
32バイト)ずれている、すなわちキャッシュラインは
競合していない。図18では、キャッシュミスは4回の
参照につき1回の割合で発生している。
【0096】これに対し、図17に示したように、従来
の割り付け方式ではキャッシュミスが毎回発生していた
ので、本実施例によれば、図2のプログラムの場合、キ
ャッシュミスが1/4に減少することがわかる。
の割り付け方式ではキャッシュミスが毎回発生していた
ので、本実施例によれば、図2のプログラムの場合、キ
ャッシュミスが1/4に減少することがわかる。
【0097】以上、本発明の一実施例を説明した。
【0098】以上の実施例の説明では、ステップ107
の処理で、図12のフローチャートに示される方法で、
キャッシュ競合を避けるようなロケーションLを求めて
いた。この方法では、仮のロケーションL'とLの差が、
なるべく小さくなるように(すなわち、パディングがな
るべく小さくなるように)Lを求めていた。しかし、本
発明はこの方法に限定されるものではなく、別の方法で
Lを求めることもできる。たとえば、1つの部分集合に
属するシンボルのロケーションが、キャッシュ上に等間
隔に並ぶように(すなわち、1つの部分集合に属するシ
ンボル同士のキャッシュアドレスが最大限離れるよう
に)ロケーションを定める方法をとることもできる。こ
れを図19を用いて説明する。
の処理で、図12のフローチャートに示される方法で、
キャッシュ競合を避けるようなロケーションLを求めて
いた。この方法では、仮のロケーションL'とLの差が、
なるべく小さくなるように(すなわち、パディングがな
るべく小さくなるように)Lを求めていた。しかし、本
発明はこの方法に限定されるものではなく、別の方法で
Lを求めることもできる。たとえば、1つの部分集合に
属するシンボルのロケーションが、キャッシュ上に等間
隔に並ぶように(すなわち、1つの部分集合に属するシ
ンボル同士のキャッシュアドレスが最大限離れるよう
に)ロケーションを定める方法をとることもできる。こ
れを図19を用いて説明する。
【0099】図19は、図1のステップ107の処理
を、図12で示される方法とは別の方法を使って行う場
合のフローチャートである。なお、この方法を使う場合
には、部分集合表310の各部分集合に対し、その部分
集合に属するシンボルの数をnとしたとき、n個の要素か
らなる配列U[1:n]を用意しておく(この配列は、部分集
合表の各部分集合エントリの中に領域を用意するものと
する)。また、配列の各要素は0で初期化しておく。す
なわち、U[1]←0, U[2]←0, ..., U[n]←0としておく。
以下、図19の処理を説明する。
を、図12で示される方法とは別の方法を使って行う場
合のフローチャートである。なお、この方法を使う場合
には、部分集合表310の各部分集合に対し、その部分
集合に属するシンボルの数をnとしたとき、n個の要素か
らなる配列U[1:n]を用意しておく(この配列は、部分集
合表の各部分集合エントリの中に領域を用意するものと
する)。また、配列の各要素は0で初期化しておく。す
なわち、U[1]←0, U[2]←0, ..., U[n]←0としておく。
以下、図19の処理を説明する。
【0100】まずステップ1901で、部分集合表31
0(図10)を走査し、シンボルaをリストに含む部分
集合を求める。この部分集合をXとする。次にステップ
1902で、シンボルaが、部分集合Xの要素リスト中
の最初のシンボルであるか否かを調べる。最初のシンボ
ルであれば、ステップ1903でU[1]←1とし、ステッ
プ1904でL←L'とし、終了する。
0(図10)を走査し、シンボルaをリストに含む部分
集合を求める。この部分集合をXとする。次にステップ
1902で、シンボルaが、部分集合Xの要素リスト中
の最初のシンボルであるか否かを調べる。最初のシンボ
ルであれば、ステップ1903でU[1]←1とし、ステッ
プ1904でL←L'とし、終了する。
【0101】シンボルaが部分集合Xの最初のシンボル
でなければ、ステップ1905に進み、i←1とする。次
にステップ1906でi≦nかどうかを調べる(nはXに属
するシンボルの数)。i≦nであれば、ステップ1907
でU[i]=1かどうかを調べる。U[i]=1であれば、ステップ
1911へ進みi←i+1とし、ステップ1906から繰り
返す。ステップ1907でU[i]=1でない場合は、ステッ
プ1908で(L' modC)≦(C/n)*iであるか否かを調べ
る。ここで、Cはキャッシュサイズ(単位はバイト)で
ある。(L' mod C)≦(C/n)*iであれば、ステップ190
9でU[i]←1、ステップ1910でL←(C/n)*iとし、終
了する。
でなければ、ステップ1905に進み、i←1とする。次
にステップ1906でi≦nかどうかを調べる(nはXに属
するシンボルの数)。i≦nであれば、ステップ1907
でU[i]=1かどうかを調べる。U[i]=1であれば、ステップ
1911へ進みi←i+1とし、ステップ1906から繰り
返す。ステップ1907でU[i]=1でない場合は、ステッ
プ1908で(L' modC)≦(C/n)*iであるか否かを調べ
る。ここで、Cはキャッシュサイズ(単位はバイト)で
ある。(L' mod C)≦(C/n)*iであれば、ステップ190
9でU[i]←1、ステップ1910でL←(C/n)*iとし、終
了する。
【0102】ステップ1906でi≦nでなければ、ステ
ップ1912で再びi←1とし、ステップ1913でU[i]
=1か否かを調べ、そうならばステップ1914でi←i+1
とし、ステップ1913から繰り返す。U[i]=1でない場
合は、ステップ1909へ進む。
ップ1912で再びi←1とし、ステップ1913でU[i]
=1か否かを調べ、そうならばステップ1914でi←i+1
とし、ステップ1913から繰り返す。U[i]=1でない場
合は、ステップ1909へ進む。
【0103】要するに図19の処理は、キャッシュサイ
ズCをシンボル数nで割ってi=1,2,3,…,nをかけた位置
(すなわち、(C/n)*i)に各シンボルを割り付けるよう
にし、特にL'をCで割った余り(L' mod C)を越える(C/n)
*iの位置にそのシンボルを割り付けるようにしたもので
ある。以上で、図19の説明を終わる。
ズCをシンボル数nで割ってi=1,2,3,…,nをかけた位置
(すなわち、(C/n)*i)に各シンボルを割り付けるよう
にし、特にL'をCで割った余り(L' mod C)を越える(C/n)
*iの位置にそのシンボルを割り付けるようにしたもので
ある。以上で、図19の説明を終わる。
【0104】図19に示すようなロケーション決定方法
を使うと、キャッシュアドレスの差が最大限に広がるよ
うにロケーションが定まるので、図12で示した方法よ
りキャッシュ競合の可能性がより低減される(そのかわ
りプログラムが必要とするメモリ量は増大する)。
を使うと、キャッシュアドレスの差が最大限に広がるよ
うにロケーションが定まるので、図12で示した方法よ
りキャッシュ競合の可能性がより低減される(そのかわ
りプログラムが必要とするメモリ量は増大する)。
【0105】さらに、上記実施例の図9ステップ906
の処理では、2つのシンボルaとbが与えられたとき、
この2つのシンボル間で生じる可能性のあるキャッシュ
競合を回避すべきかどうかを判定しており、その判定基
準では、図11ステップ1103に示すように、2つの
変数シンボルをともに参照しているループが存在するか
を調べている。しかし、本発明はこれに限定されるもの
ではない。2つの変数シンボルをともに参照しているル
ープではなく、2つの変数シンボルをともに参照してい
る手続き(サブルーチン)またはコンパイル単位(ファ
イル)が存在するかどうかを調べてもよい。また、ステ
ップ1102では2つの配列の形(shape)が等しいか
どうかを調べているが、この処理を省略することもでき
る。
の処理では、2つのシンボルaとbが与えられたとき、
この2つのシンボル間で生じる可能性のあるキャッシュ
競合を回避すべきかどうかを判定しており、その判定基
準では、図11ステップ1103に示すように、2つの
変数シンボルをともに参照しているループが存在するか
を調べている。しかし、本発明はこれに限定されるもの
ではない。2つの変数シンボルをともに参照しているル
ープではなく、2つの変数シンボルをともに参照してい
る手続き(サブルーチン)またはコンパイル単位(ファ
イル)が存在するかどうかを調べてもよい。また、ステ
ップ1102では2つの配列の形(shape)が等しいか
どうかを調べているが、この処理を省略することもでき
る。
【0106】本実施例のメモリ割り付け方法による効果
について定量的に評価してみる。現在市場に出ているコ
ンピュータでは、通常1命令当たり1サイクルで実行を
終えるが、キャッシュミスを起こすと10〜数十サイク
ル程度の時間がかかるので、仮にキャッシュミスサイク
ルを20サイクルとして計算する。図2のプログラムを
例にとると、中間コードの1文が1命令で実行できると
すると、本実施例の方法を実施しない場合は、命令サイ
クルが約45000(≒4096*6+4096*5)サイクル、キャッシ
ュミスサイクルが約409600(≒4096*3*20+4096*2*20)
サイクル、合わせて約454600サイクルかかる。本実施例
の方法を実施すると、命令サイクルは変わらず、キャッ
シュミスサイクルが約102400(≒409600/4)、合わせて
約147400サイクルになり、約3倍高速化される。
について定量的に評価してみる。現在市場に出ているコ
ンピュータでは、通常1命令当たり1サイクルで実行を
終えるが、キャッシュミスを起こすと10〜数十サイク
ル程度の時間がかかるので、仮にキャッシュミスサイク
ルを20サイクルとして計算する。図2のプログラムを
例にとると、中間コードの1文が1命令で実行できると
すると、本実施例の方法を実施しない場合は、命令サイ
クルが約45000(≒4096*6+4096*5)サイクル、キャッシ
ュミスサイクルが約409600(≒4096*3*20+4096*2*20)
サイクル、合わせて約454600サイクルかかる。本実施例
の方法を実施すると、命令サイクルは変わらず、キャッ
シュミスサイクルが約102400(≒409600/4)、合わせて
約147400サイクルになり、約3倍高速化される。
【0107】
【発明の効果】以上説明したように、本発明によれば、
特にダイレクトマップ方式のキャッシュにおいて生じる
キャッシュ競合により大幅な性能低下を引き起こすプロ
グラムに対して、キャッシュ競合の発生を削減し、その
実行を高速化することができる。これは、セットアソシ
アティブ方式においても同様の効果を奏する。
特にダイレクトマップ方式のキャッシュにおいて生じる
キャッシュ競合により大幅な性能低下を引き起こすプロ
グラムに対して、キャッシュ競合の発生を削減し、その
実行を高速化することができる。これは、セットアソシ
アティブ方式においても同様の効果を奏する。
【0108】また、本発明の方法では、キャッシュ装置
そのものを変更する必要はなく、ユーザは、プログラム
で使用する配列の要素数やソースプログラムに入れるパ
ディングについて意識する必要がなくなる。
そのものを変更する必要はなく、ユーザは、プログラム
で使用する配列の要素数やソースプログラムに入れるパ
ディングについて意識する必要がなくなる。
【図1】記憶領域に対するメモリ割り付け処理の流れ
図。
図。
【図2】キャッシュ競合が発生するプログラム例を示す
図。
図。
【図3】本発明に係る計算機システムの構成図。
【図4】コンパイル処理の流れ図。
【図5】中間コードの例を示す図。
【図6】基本ブロックの例を示す図。
【図7】シンボルテーブルの例を示す図。
【図8】メモリ割り付け処理の流れ図。
【図9】部分集合への分類処理の流れ図。
【図10】部分集合表の例を示す図。
【図11】2つのシンボルの競合を回避すべきかの判定
処理の流れ図。
処理の流れ図。
【図12】競合回避のためのロケーションを求める処理
の流れ図。
の流れ図。
【図13】2つのロケーションが競合するかの判定処理
の流れ図。
の流れ図。
【図14】メモリ割り付け後のシンボルテーブルを示す
図。
図。
【図15】本発明のメモリ割り付け方法によるメモリ配
置図。
置図。
【図16】従来のメモリ割り付け方法によるメモリ配置
図。
図。
【図17】従来のメモリ割り付けでのキャッシュミス状
況を示す図。
況を示す図。
【図18】本発明のメモリ割り付け方法でのキャッシュ
ミス状況を示す図。
ミス状況を示す図。
【図19】競合回避のためのロケーションを求める処理
(別の方法)の流れ図。
(別の方法)の流れ図。
101…割り付け順序決定ステップ、102…部分集合
への分類ステップ、103…シンボル取り出しステッ
プ、104…最初のシンボルかどうかの判定ステップ、
106…仮のロケーションを求めるステップ、107…
競合回避のためのロケーションを求めるステップ、10
8…シンボルテーブルへのロケーション登録ステップ、
306…ソースプログラム、307…オブジェクトプロ
グラム、308…中間コード、309…シンボルテーブ
ル、310…部分集合表。311…コンパイラ、401
…構文解析ステップ、402…メモリ割り付けステッ
プ、403…コード生成ステップ。
への分類ステップ、103…シンボル取り出しステッ
プ、104…最初のシンボルかどうかの判定ステップ、
106…仮のロケーションを求めるステップ、107…
競合回避のためのロケーションを求めるステップ、10
8…シンボルテーブルへのロケーション登録ステップ、
306…ソースプログラム、307…オブジェクトプロ
グラム、308…中間コード、309…シンボルテーブ
ル、310…部分集合表。311…コンパイラ、401
…構文解析ステップ、402…メモリ割り付けステッ
プ、403…コード生成ステップ。
Claims (11)
- 【請求項1】ソースプログラムをコンパイルしてオブジ
ェクトプログラムを生成するコンパイラにおけるメモリ
割り付け方法であって、 プログラムで参照されているシンボルを、その属性とと
もに、所定のテーブルに登録するステップ(a)と、 登録されたシンボルの集合を、互いにキャッシュ競合を
避けるべきシンボルからなる部分集合に分類するステッ
プ(b)と、 上記各シンボルに対して、同じ部分集合に属するシンボ
ル同士でキャッシュ競合が発生しないように、メモリ上
のロケーションを決定するステップ(c)とを備えたこと
を特徴とするメモリ割り付け方法。 - 【請求項2】前記ロケーションを決定するステップ(c)
は、同じ部分集合に属するシンボル同士のキャッシュア
ドレスの差が所定値より小さくならないように各シンボ
ルのロケーションを決定することを特徴とする請求項1
に記載のメモリ割り付け方法。 - 【請求項3】前記シンボルを登録するステップ(a)は、
前記登録するシンボルの属性として、そのシンボルが参
照されるループ情報を含むことを特徴とする請求項1に
記載のメモリ割り付け方法。 - 【請求項4】前記部分集合に分類するステップ(b)は、
前記ループ情報を参照することにより、同じループ内で
参照されるシンボル同士を同じ部分集合に分類すること
を特徴とする請求項3に記載のメモリ割り付け方法。 - 【請求項5】前記シンボルを登録するステップ(a)は、
前記登録するシンボルとして、プログラムで参照されて
いる配列を含むことを特徴とする請求項1に記載のメモ
リ割り付け方法。 - 【請求項6】前記部分集合に分類するステップ(b)は、
前記登録するシンボルが配列である場合、該配列の形、
すなわち配列の次元数、下限値、および上限値が、それ
ぞれ等しい配列同士を同じ部分集合に分類することを特
徴とする請求項5に記載のメモリ割り付け方法。 - 【請求項7】前記ロケーションを決定するステップ(c)
は、前記配列の先頭要素同士のキャッシュアドレスの差
が所定値より小さくならないように各配列のロケーショ
ンを決定することを特徴とする請求項5に記載のメモリ
割り付け方法。 - 【請求項8】前記ロケーションを決定するステップ(c)
は、前記配列の先頭要素同士のキャッシュアドレスの差
が所定のしきい値Tより小さくならないように各配列の
ロケーションを決定し、かつそのとき該しきい値Tの値
はプログラム中でのその配列の参照状況に基づいて決定
することを特徴とする請求項7に記載のメモリ割り付け
方法。 - 【請求項9】前記ロケーションを決定するステップ(c)
は、同じ部分集合に属するシンボル同士でキャッシュ競
合が発生しないようにロケーションを決定するために、
同じ部分集合に属するシンボルのキャッシュアドレス
が、互いに一定間隔をおいて並ぶように各シンボルのロ
ケーションを決定することを特徴とする請求項1に記載
のメモリ割り付け方法。 - 【請求項10】請求項1から9に記載のメモリ割り付け
方法を用いることを特徴とするコンパイル方法。 - 【請求項11】請求項1から9に記載のメモリ割り付け
方法を用いることを特徴とするコンパイラ。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP7043465A JPH08212081A (ja) | 1995-02-08 | 1995-02-08 | メモリ割り付け方法、並びにコンパイル方法およびコンパイラ |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP7043465A JPH08212081A (ja) | 1995-02-08 | 1995-02-08 | メモリ割り付け方法、並びにコンパイル方法およびコンパイラ |
Publications (1)
Publication Number | Publication Date |
---|---|
JPH08212081A true JPH08212081A (ja) | 1996-08-20 |
Family
ID=12664473
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP7043465A Pending JPH08212081A (ja) | 1995-02-08 | 1995-02-08 | メモリ割り付け方法、並びにコンパイル方法およびコンパイラ |
Country Status (1)
Country | Link |
---|---|
JP (1) | JPH08212081A (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2004066146A1 (ja) * | 2003-01-20 | 2004-08-05 | Fujitsu Limited | リスト管理プログラムおよびリスト管理装置 |
JP2007200240A (ja) * | 2006-01-30 | 2007-08-09 | Kyocera Corp | 情報処理装置及び情報処理方法 |
CN100365578C (zh) * | 2003-10-16 | 2008-01-30 | 松下电器产业株式会社 | 编译装置及连接装置 |
US9552197B2 (en) | 2014-10-10 | 2017-01-24 | Fujitsu Limited | Computer-readable recording medium storing information processing program, information processing apparatus, and information processing method |
-
1995
- 1995-02-08 JP JP7043465A patent/JPH08212081A/ja active Pending
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2004066146A1 (ja) * | 2003-01-20 | 2004-08-05 | Fujitsu Limited | リスト管理プログラムおよびリスト管理装置 |
CN100365578C (zh) * | 2003-10-16 | 2008-01-30 | 松下电器产业株式会社 | 编译装置及连接装置 |
JP2007200240A (ja) * | 2006-01-30 | 2007-08-09 | Kyocera Corp | 情報処理装置及び情報処理方法 |
US9552197B2 (en) | 2014-10-10 | 2017-01-24 | Fujitsu Limited | Computer-readable recording medium storing information processing program, information processing apparatus, and information processing method |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3417984B2 (ja) | キャッシュ競合削減コンパイル方法 | |
JP3110040B2 (ja) | 手順間レジスタ割付けを伴うコンピュータプログラムのコンパイル方法及び装置 | |
US7725883B1 (en) | Program interpreter | |
US5689712A (en) | Profile-based optimizing postprocessors for data references | |
US7500077B2 (en) | Use of region-oriented memory profiling to detect heap fragmentation and sparse memory utilization | |
US7934204B2 (en) | Partitioning code in program code conversion | |
US6434743B1 (en) | Method and apparatus for allocating stack slots | |
JPH10301835A (ja) | 混合されたポインタ変数と非ポインタ変数とを有するオブジェクトの厳密なガーベジ収集を最適化する方法および装置 | |
JPH10301837A (ja) | カード・ヒープ中のアレイ・ノードの正確なガーベッジ収集を最適化する方法および装置 | |
JPH10124325A (ja) | 変数の最適配置方法、変数の最適配置装置及び変数の最適配置プログラムを格納したコンピュータ読み取り可能な記録媒体 | |
JP2000035893A (ja) | デ―タ処理システムの配列の静的初期化方法、デ―タ処理方法、並びにデ―タ処理システム及びその制御手順をコンピュ―タに実行させるプログラムを記憶したコンピュ―タ読み取り可能な記憶媒体 | |
US20080222198A1 (en) | Data processing apparatus, method and computer program product for reducing memory usage of an object oriented program | |
US20190079805A1 (en) | Execution node selection method and information processing apparatus | |
US5940621A (en) | Language independent optimal size-based storage allocation | |
US20040128661A1 (en) | Automatic data locality optimization for non-type-safe languages | |
JP2000242551A (ja) | メモリ管理のための方法および装置 | |
US7403961B1 (en) | Dangling reference detection and garbage collection during hardware simulation | |
EP0947922B1 (en) | Compiler | |
US20030079210A1 (en) | Integrated register allocator in a compiler | |
US6421824B1 (en) | Method and apparatus for producing a sparse interference graph | |
US7185326B2 (en) | Automatically reordering variables as a part of compiling and linking source code | |
JPH08212081A (ja) | メモリ割り付け方法、並びにコンパイル方法およびコンパイラ | |
CN116360788A (zh) | 结构化文本编程语言的编译方法、编译器及电子设备 | |
US7185324B2 (en) | Compiler apparatus and method for determining locations for data in memory area | |
JPH10187460A (ja) | バイナリ・プログラム変換装置および方法 |