JP6974722B2 - コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置 - Google Patents
コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置 Download PDFInfo
- Publication number
- JP6974722B2 JP6974722B2 JP2018009576A JP2018009576A JP6974722B2 JP 6974722 B2 JP6974722 B2 JP 6974722B2 JP 2018009576 A JP2018009576 A JP 2018009576A JP 2018009576 A JP2018009576 A JP 2018009576A JP 6974722 B2 JP6974722 B2 JP 6974722B2
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- prefetch
- loop
- size
- stride
- 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.)
- Active
Links
Images
Description
前記ストライドアクセス命令から前記ループの所定繰り返し回数後のストライドアクセス命令のアクセス先データを前記メモリにアクセスしてキャッシュメモリに格納するプリフェッチ命令を、前記ループ内に追加し、
前記キャッシュメモリのキャッシュラインサイズ(C)、前記ストライドアクセス間要素長(m)、前記配列の一要素のサイズ(Type_Size)、前記プリフェッチ命令のプリフェッチアドレス(x)の場合、前記プリフェッチアドレス(x)を前記キャッシュラインサイズ(C)で除算したときの余り(x%C)が、前記ストライドアクセス間要素長(m)に一要素サイズ(Type_Size)を乗算したストライドアクセス間アドレス長(S)より小さい場合((x%C)<S)、前記プリフェッチ命令を実行する条件文を、前記ループ内に追加し、
前記ループ内の前記ストライドアクセス命令と前記条件文及び前記プリフェッチ命令を、複数、並列に実行するベクトル命令に変換するベクトル化、
する処理をコンピュータに実行させるコンパイラプログラムである。
以下、ループ内のメモリアクセスにプリフェッチ命令を追加する処理について、ソースコード例を示して説明する。
&a[(P+i)*m]<last_prefetch, またはlast_prefetch+C<=&a[(P+i)*m] 条件1
ここで、C=4である。
次に、コンパイラの別の最適化処理であるベクトル化についてソースコードを例にして説明する。ベクトル化とは、前述のとおり、ソースプログラムを、SIMD命令またはベクトル命令を含むプログラムに変換する処理である。また、ベクトル化では、配列へのアクセス命令を繰り返すループについて、アクセス命令を複数、並列実行するベクトル命令に変換する。コンパイルされたプログラムが、SIMD演算器を有する情報処理装置により実行されると、1命令で複数のデータを演算するベクトル命令が、SIMD演算器内の複数の演算器で並列に実行される。そのため、プログラムの実行効率が向上する。
a[i] = a[i] * a[i-1]
a[i+1] = a[i+1] * a[i]
a[1] = a[1] * a[0] = 3 * 2 = 6
a[2] = a[2] * a[1] = 4 * 6 = 24
a[1] = a[1] * a[0] = 3 * 2 = 6, a[2] = a[2] * a[1] = 4 * 3 = 12
この演算結果a[2] = 12は、a[1]が更新される前の初期値a[1] = 3に基づいて算出されるので正しい値「24」と一致しない。このように、イタレーション間で依存のある命令をベクトル化することは不適切である。
a[i*m:(i+1)*m] = 0
次に、本実施の形態におけるストライドアクセスを繰り返すループでのプリフェッチ命令追加処理と、ベクトル化処理について説明する。前述のとおり、コンパイラでの最適化処理において、ストライドアクセスを繰り返す(反復、イタレート)するループに、プリフェッチ命令を追加するとともにベクトル化することが望ましい。
if(abs(m*type_size) > &a[(P+i)*m]%C) {
prefetch(&a[(P+i)*m])
}
if(abs(S) > &a[(P+i)*m]%C) {
prefetch(&a[(P+i)*m])
}
ここで、S=m*type_size(S:イタレーション間のアドレス間隔、m:イタレーション間の要素間隔、type_size:要素のサイズ)である。つまり、図10のソースコードSC_8の行83−85の追加コードに対応する。
C-1 = 10000000-1 = 01111111
C-1 = 01111111
x = 10101000
x・(C-1) = 00101000
a[i*m:k*m]=0
このベクトル命令は、配列aの要素番号i*m〜k*mのV個の要素に「0」を並列に書き込む命令である。
L2 CACHE:キャッシュメモリ
MAC:メモリアクセスコントローラ
M_MEM:メインメモリ
22:コンパイラ
23:アセンブラ
24:ソースプログラム
26:アセンブリコード
27:オブジェクトコード
a[i*m]:配置aに対するストライドアクセス命令
for():ループ
a:配列
S:ストライドアクセス間アドレス長(隣接するストライドアクセス間のアドレス間隔)
m:ストライドアクセス間要素長(隣接するストライドアクセス間の要素間隔)
Type_Size:配列の一要素サイズ(S=m * Type_Size)
x:プリフェッチアドレス
C:キャッシュラインのサイズ
Prefetch:プリフェッチ命令
Last_prefetched:直前のプリフェッチアドレス
Claims (6)
- ソースプログラム内のメモリ内の配列の複数の要素をストライドアクセス間要素長の間隔でアクセスするストライドアクセス命令を複数回繰り返すループを検出し、
前記ストライドアクセス命令から前記ループの所定繰り返し回数後のストライドアクセス命令のアクセス先データを前記メモリにアクセスしてキャッシュメモリに格納するプリフェッチ命令を、前記ループ内に追加し、
前記キャッシュメモリのキャッシュラインサイズ(C)、前記ストライドアクセス間要素長(m)、前記配列の一要素のサイズ(Type_Size)、前記プリフェッチ命令のプリフェッチアドレス(x)の場合、前記プリフェッチアドレス(x)を前記キャッシュラインサイズ(C)で除算したときの余り(x%C)が、前記ストライドアクセス間要素長(m)に一要素サイズ(Type_Size)を乗算したストライドアクセス間アドレス長(S)より小さい場合((x%C)<S)、前記プリフェッチ命令を実行する条件文を、前記ループ内に追加し、
前記ループ内の前記ストライドアクセス命令と前記条件文及び前記プリフェッチ命令を、複数、並列に実行するベクトル命令に変換するベクトル化、
する処理をコンピュータに実行させるコンパイラプログラム。 - 前記ベクトル命令は、前記ストライドアクセス命令を複数並列に実行する第1のベクトル命令と、前記第1のベクトル命令に対応して前記条件文が真の場合に前記プリフェッチ命令を実行することを複数並列に実行する第2のベクトル命令とを有する、請求項1に記載のコンパイラプログラム。
- 前記第2のベクトル命令は、
前記第1のベクトル命令に対応して前記条件文が真か否かをマスク配列の各要素に格納する第3のベクトル命令と、前記第1のベクトル命令に対応して前記マスク配列の要素が真の場合に前記プリフェッチ命令を実行する第4のベクトル命令とを有する、請求項2に記載のコンパイラプログラム。 - さらに、
前記条件文を前記ループ内に追加する処理は、
前記プリフェッチアドレス(x)を前記キャッシュラインサイズ(C)で除算したときの余りを、前記キャッシュラインサイズ(C)から1を減じた2進数と、前記プリフェッチアドレス(x)の2進数の各ビット間の論理積を演算して求める演算命令を生成することを含む、請求項1に記載のコンパイラプログラム。 - ソースプログラム内のメモリ内の配列の複数の要素をストライドアクセス間要素長の間隔でアクセスするストライドアクセス命令を複数回繰り返すループを検出し、
前記ストライドアクセス命令から前記ループの所定繰り返し回数後のストライドアクセス命令のアクセス先データを前記メモリにアクセスしてキャッシュメモリに格納するプリフェッチ命令を、前記ループ内に追加し、
前記キャッシュメモリのキャッシュラインサイズ(C)、前記ストライドアクセス間要素長(m)、前記配列の一要素のサイズ(Type_Size)、前記プリフェッチ命令のプリフェッチアドレス(x)の場合、前記プリフェッチアドレス(x)を前記キャッシュラインサイズ(C)で除算したときの余り(x%C)が、前記ストライドアクセス間要素長(m)に一要素サイズ(Type_Size)を乗算したストライドアクセス間アドレス長(S)より小さい場合((x%C)<S)、前記プリフェッチ命令を実行する条件文を、前記ループ内に追加し、
前記ループ内の前記ストライドアクセス命令と前記条件文及び前記プリフェッチ命令を、複数、並列に実行するベクトル命令に変換するベクトル化、
する処理をコンピュータに実行させるコンパイル方法。 - メモリと、
前記メモリにアクセス可能なプロセッサとを有し、
前記プロセッサは、
ソースプログラム内のメモリ内の配列の複数の要素をストライドアクセス間要素長の間隔でアクセスするストライドアクセス命令を複数回繰り返すループを検出し、
前記ストライドアクセス命令から前記ループの所定繰り返し回数後のストライドアクセス命令のアクセス先データを前記メモリにアクセスしてキャッシュメモリに格納するプリフェッチ命令を、前記ループ内に追加し、
前記キャッシュメモリのキャッシュラインサイズ(C)、前記ストライドアクセス間要素長(m)、前記配列の一要素のサイズ(Type_Size)、前記プリフェッチ命令のプリフェッチアドレス(x)の場合、前記プリフェッチアドレス(x)を前記キャッシュラインサイズ(C)で除算したときの余り(x%C)が、前記ストライドアクセス間要素長(m)に一要素サイズ(Type_Size)を乗算したストライドアクセス間アドレス長(S)より小さい場合((x%C)<S)、前記プリフェッチ命令を実行する条件文を、前記ループ内に追加し、
前記ループ内の前記ストライドアクセス命令と前記条件文及び前記プリフェッチ命令を、複数、並列に実行するベクトル命令に変換するベクトル化、
する処理を実行するコンパイルする情報処理装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2018009576A JP6974722B2 (ja) | 2018-01-24 | 2018-01-24 | コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2018009576A JP6974722B2 (ja) | 2018-01-24 | 2018-01-24 | コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2019128760A JP2019128760A (ja) | 2019-08-01 |
JP6974722B2 true JP6974722B2 (ja) | 2021-12-01 |
Family
ID=67472266
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2018009576A Active JP6974722B2 (ja) | 2018-01-24 | 2018-01-24 | コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP6974722B2 (ja) |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3218932B2 (ja) * | 1995-07-06 | 2001-10-15 | 株式会社日立製作所 | データプリフェッチコード生成方法 |
US6567975B1 (en) * | 1999-11-08 | 2003-05-20 | Sun Microsystems, Inc. | Method and apparatus for inserting data prefetch operations using data flow analysis |
JP2001166989A (ja) * | 1999-12-07 | 2001-06-22 | Hitachi Ltd | プリフェッチ機構を有するメモリシステム及びその動作方法 |
JP2008071128A (ja) * | 2006-09-14 | 2008-03-27 | Hitachi Ltd | プリフェッチ制御方法及びコンパイル装置 |
US9501276B2 (en) * | 2012-12-31 | 2016-11-22 | Intel Corporation | Instructions and logic to vectorize conditional loops |
JP6265041B2 (ja) * | 2014-05-15 | 2018-01-24 | 富士通株式会社 | コンパイルプログラム、コンパイル方法およびコンパイル装置 |
-
2018
- 2018-01-24 JP JP2018009576A patent/JP6974722B2/ja active Active
Also Published As
Publication number | Publication date |
---|---|
JP2019128760A (ja) | 2019-08-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102413832B1 (ko) | 벡터 곱셈 덧셈 명령 | |
JP6927962B2 (ja) | ベクトルデータ転送命令 | |
JP6488711B2 (ja) | 演算処理装置および演算処理装置の制御方法 | |
US5537620A (en) | Redundant load elimination on optimizing compilers | |
US5247696A (en) | Method for compiling loops having recursive equations by detecting and correcting recurring data points before storing the result to memory | |
US8583898B2 (en) | System and method for managing processor-in-memory (PIM) operations | |
JP6913693B2 (ja) | ベクトル演算を実行する際にアドレス衝突を管理するための装置及び方法 | |
US20050044538A1 (en) | Interprocedural computing code optimization method and system | |
US5361354A (en) | Optimization of alternate loop exits | |
US9483244B2 (en) | Compiling method and compiling device | |
JP6245031B2 (ja) | コンパイルプログラム、コンパイル方法およびコンパイル装置 | |
JP6908601B2 (ja) | ベクトルロード命令 | |
US8458685B2 (en) | Vector atomic memory operation vector update system and method | |
JP2015201119A (ja) | コンパイルプログラム、コンパイル方法およびコンパイル装置 | |
Krishnaiyer et al. | An advanced optimizer for the IA-64 architecture | |
US6059841A (en) | Updating data dependencies for loop strip mining | |
JP6974722B2 (ja) | コンパイラプログラム、コンパイル方法及びコンパイルする情報処理装置 | |
JP5227646B2 (ja) | コンパイラ及びそのコード生成方法 | |
JP2018124877A (ja) | コード生成装置、コード生成方法、およびコード生成プログラム | |
EP0180077B1 (en) | A data processing machine for compiling computer programs | |
JP7006097B2 (ja) | コード生成装置、コード生成方法及びコード生成プログラム | |
US7676799B1 (en) | Address simplification by binary transformation | |
JP6555005B2 (ja) | 最適化装置、方法およびプログラム | |
JP2019185486A (ja) | コード変換装置、コード変換方法、及びコード変換プログラム | |
JP2001325111A (ja) | 投機機構向けコンパイル方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20201008 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20210906 |
|
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: 20211005 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20211018 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 6974722 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |