27
PLDIr#4 (PLDI 2000) 2009-12-02 酒井 政裕

“Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Embed Size (px)

DESCRIPTION

PLDIr#4 (2009-12-02) での紹介。

Citation preview

Page 1: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

PLDIr#4 (PLDI 2000)

2009-12-02

酒井政裕

Page 2: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Symbolic bounds analysis of

pointers, array indices, and

accessed memory regions

Radu Rugina, Martin Rinard

Laboratory for Computer Science

Massachusetts Institute of Technology

Citation Count: 34

Page 3: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

概要

� プログラムがアクセスするメモリの範囲を解析するアルゴリズム

� 用途� 競合の検出 ・ 自動並列化

� 範囲外アクセスの検出 ・ 範囲チェックの省略

� ターゲットのプログラム

� 制御に再帰を用いるような分割統治型のプログラム

� メモリの動的確保とポインタ演算を含む

Page 4: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

特徴

� シンボリックな解析(具体的な値ではなく式の形で範囲を求める)

� 範囲の包含に関する不動点計算は用いない

� 有限回で収束しない場合がある

� 線形計画問題に還元して解く

� 上限と下限を多項式で表現

� 線形計画問題に変換

� 線形計画問題の解から、ポインタや配列の添え字の上限・下限が求まる

Page 5: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

ターゲットのプログラムの例 (Cilk)

1: #define CUTOFF 16

2:

3: void baseInc(int *q, int m) {

4: int i;

5: i = 0;

6: while(i <= m-1) {

7: *(q+i) += 1;

8: i = i+1;

9: }

10: }

11: void dcInc(int *p, int n) {

12: if (n <= CUTOFF) {

13: baseInc(p, n);

14: } else {

15: spawn dcInc(p, n/2);

16: spawn dcInc(p+n/2, n-n/2);

17: sync;

18: }

19: }

20: void main(int argc, char *argv[]) {

21: int size, *A;

22: scanf("%d", &size);

23: if (size > 0) {

24: A = malloc(size * sizeof(int));

25: /* code that initializes A */

26: dcInc(A, size);

27: /* code that uses A */

28: }

29: }

並列呼び出しで競合が発生するか?

Page 6: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

基本的な概念

� allocation blocks

� 確保されたメモリブロック

� メモリ確保位置(変数宣言, mallocの呼び出し等)に対

して一個� (同じ場所が複数回実行される場合でも、確保される複数のメモリブロックを区別しない)

� symbolic regions

� あるblock中の連続した領域

� 有理数係数の多項式による上限と下限で表わされる

Page 7: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

流れ どの allocation block がどこで読み書きされうるかをinterprocedual に解析

Page 8: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Symbolic Bounds at the Start of Basic

Blocks

� まず、各基本ブロックの入り口での各変数の上下限を表す変数を導入(右図)

� 次に記号実行で上下限を伝播� ただし多項式で表現できない場合には、-∞, ∞にす

Page 9: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

基本ブロック内で記号実行

記号実行

Page 10: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

制約の生成

� 「基本ブロックの出口での値の範囲⊆続く基本

ブロックの入り口での範囲」という制約を生成

� 例:

� l i,2 ≤ 0

� 0 ≤ u i,2

Page 11: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

得られた制約←引数の上下限は

その引数の初期値。

他の変数は[-∞,∞]

←記号実行結果か

ら得られた制約

←出来るだけ範囲

を小さくしたい

Page 12: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

線形計画問題への変換

� 上下限の変数を、引数の初期値を変数とする多項式で表現されると仮定して、置き換える� 例) li,2 = c1q0 + c2m0 + c3 , li,3 = c7q0 + c8m0 + c9

� 制約条件は係数の不等式に変換� li,2 ≤ li,3 + 1 ならば、 c1 ≤ c7 、 c2 ≤ c8 、 c3 ≤ c9 + 1

� 目的関数も全係数が最小という条件に変換� 注: これらの変換には q0, m0が正である必要がある

簡単な解析で引数の初期値の符号を別途推論

Page 13: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

得られた線形計画問題と解←得られた問題

これを解いて、各ciの

値が求まる

それらから、各変数の各点での上下限の多項式が得られる

例:

li,3 = 0, ui,3 = m0 - 1

Page 14: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Intraprocedural Region Analysis

� ポインタ/配列アクセス時点での各変数の上下限から、アクセスする範囲がわかる� *(q+i) += 1 の実行前の q の範囲が [q0,q0],

i の範囲が [0, m0 - 1] なら、この文は[q0,q0 + m0 – 1] の範囲に,アクセス

� 手続き中で読む範囲と書く範囲を、各 allocation block ごとにまとめる� どの allocation block にアクセスする可能性があるかは、Pointer and Read-Write Sets Analysis で解析できているはず

Page 15: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Interprocedural Region Analysis

� 基本的には、Call graph の SCC 単位で、情報

を伝播しつつやる

Page 16: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Interprocedural Region Analysis

� Symbolic Unmapping

� 呼ばれた関数の仮引数を変数とする多項式で範囲が得られるが、呼び出し側の変数で表現された範囲が欲しい

� 再帰がある場合の取扱いが肝だけど、説明が面倒なので省略� 同様に線形計画問題に還元してDD

Page 17: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

解析の例

1: #define CUTOFF 16

2:

3: void baseInc(int *q, int m) {

4: int i;

5: i = 0;

6: while(i <= m-1) {

7: *(q+i) += 1;

8: i = i+1;

9: }

10: }

11: void dcInc(int *p, int n) {

12: if (n <= CUTOFF) {

13: baseInc(p, n);

14: } else {

15: spawn dcInc(p, n/2);

16: spawn dcInc(p+n/2, n-n/2);

17: sync;

18: }

19: }

20: void main(int argc, char *argv[]) {

21: int size, *A;

22: scanf("%d", &size);

23: if (size > 0) {

24: A = malloc(size * sizeof(int));

25: /* code that initializes A */

26: dcInc(A, size);

27: /* code that uses A */

28: }

29: }

read/write

[q0, q0+m0-1] in a

read/write

[p0, p0+n0-1] in a

read/write

[p, p+n/2-1] in a

read/write

[p+n/2, p+n-1] in a

read/write

[A, A+size-1] in a

Page 18: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

アルゴリズムの拡張

� Correlation Analysis

� Integer Division

� Constraint System Decomposition

� 同じく省略

Page 19: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

実験

� SUIF compiler infrastructure を使って実装

� Cプログラムを自動並列化

� Cilkプログラムがrace-freeかを検査

� C/Cilkプログラムが配列の範囲エラーを起こしうるかを検査

� 対象プログラム� Fibonacci, QuickSort, MergeSort, Heat(メッシュでの熱拡散),

Knapsack, BlockMul (行列の積、スタック上に一時配列を確保), NoTempMul(同上、ただし一時配列不使用), LU

� 逐次版(C)と並列版(Cilk)

� 相互再帰、ポインタ演算、キャストを含む

Page 20: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

実験結果

� Race-freeの検査

� Knapsack以外のプログラムがRace-freeであることを確認できた (Knapsackのraceは意図的なもの)

� Cの自動並列化

� Cilk版と同じ並列性を検出できた

� 配列の範囲エラーを起こしうるかの検査

� すべてのプログラムが範囲エラーを起こさないことを確認できた

Page 21: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

並列化によるスピードアップ

Page 22: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

ビット幅の解析

� このアルゴリズムは変数の値の範囲を求めているので、ビット幅の解析に応用可能

� アルゴリズムを修正して実験したら、結構ビット幅を減らせた

Page 23: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Translation Validation for an

Optimizing Compiler

George C. Necula

University of California, Berkeley

Citation Count: 51

Page 24: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Translation Validation Infrastructure

� TVI (Translation Validation Infrastructure)

� コンパイラの最適化の各フェーズで変換前と変換後で意味が等しいことを検証するインフラストラクチャ

� トランスレータそのものを検証するのは大変なので、個々の翻訳自体を検証

Page 25: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

Simulation relation

� correct な“simulation relation” Σが存在すれ

ば等価

� Σは三つ組 (PCS, PCT, E) の集合

� PCS, PCT,は変換前と変換後のプログラムポイント

� Eは変数やレジスタの対応を表す論理式

� 各 (PCS, PCT, E) ∈ΣがPCS, PCT,から実行

をはじめたときに、同じ関数呼び出しの系列と返り値になるときに、correct

Page 26: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

� 最適化器が simulation relation を出力すれば

検査可能

� しかし、多くの最適化については simulation

relation を推論可能

� Symbolic evaluation を使って推論?

� 完全ではないので、simulation relation を発見できずfalse alarm が出る可能性あり

Page 27: “Symbolic bounds analysis of pointers, array indices, and accessed memory regions”他の紹介@PLDIr#4

� コンパイラの1パスを実装する程度の労力で実

装できた

� gccでgccそのものやLinuxカーネルをコンパイル

した場合を対象に実験� 結構検証出来た?

� コンパイラのテスト・メンテナンスに有効