Upload
masahiro-sakai
View
864
Download
4
Embed Size (px)
DESCRIPTION
PLDIr#4 (2009-12-02) での紹介。
Citation preview
PLDIr#4 (PLDI 2000)
2009-12-02
酒井政裕
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
概要
� プログラムがアクセスするメモリの範囲を解析するアルゴリズム
� 用途� 競合の検出 ・ 自動並列化
� 範囲外アクセスの検出 ・ 範囲チェックの省略
� ターゲットのプログラム
� 制御に再帰を用いるような分割統治型のプログラム
� メモリの動的確保とポインタ演算を含む
特徴
� シンボリックな解析(具体的な値ではなく式の形で範囲を求める)
� 範囲の包含に関する不動点計算は用いない
� 有限回で収束しない場合がある
� 線形計画問題に還元して解く
� 上限と下限を多項式で表現
� 線形計画問題に変換
� 線形計画問題の解から、ポインタや配列の添え字の上限・下限が求まる
ターゲットのプログラムの例 (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: }
並列呼び出しで競合が発生するか?
基本的な概念
� allocation blocks
� 確保されたメモリブロック
� メモリ確保位置(変数宣言, mallocの呼び出し等)に対
して一個� (同じ場所が複数回実行される場合でも、確保される複数のメモリブロックを区別しない)
� symbolic regions
� あるblock中の連続した領域
� 有理数係数の多項式による上限と下限で表わされる
流れ どの allocation block がどこで読み書きされうるかをinterprocedual に解析
Symbolic Bounds at the Start of Basic
Blocks
� まず、各基本ブロックの入り口での各変数の上下限を表す変数を導入(右図)
� 次に記号実行で上下限を伝播� ただし多項式で表現できない場合には、-∞, ∞にす
る
基本ブロック内で記号実行
記号実行
制約の生成
� 「基本ブロックの出口での値の範囲⊆続く基本
ブロックの入り口での範囲」という制約を生成
� 例:
� l i,2 ≤ 0
� 0 ≤ u i,2
得られた制約←引数の上下限は
その引数の初期値。
他の変数は[-∞,∞]
←記号実行結果か
ら得られた制約
←出来るだけ範囲
を小さくしたい
線形計画問題への変換
� 上下限の変数を、引数の初期値を変数とする多項式で表現されると仮定して、置き換える� 例) li,2 = c1q0 + c2m0 + c3 , li,3 = c7q0 + c8m0 + c9
� 制約条件は係数の不等式に変換� li,2 ≤ li,3 + 1 ならば、 c1 ≤ c7 、 c2 ≤ c8 、 c3 ≤ c9 + 1
� 目的関数も全係数が最小という条件に変換� 注: これらの変換には q0, m0が正である必要がある
簡単な解析で引数の初期値の符号を別途推論
得られた線形計画問題と解←得られた問題
これを解いて、各ciの
値が求まる
それらから、各変数の各点での上下限の多項式が得られる
例:
li,3 = 0, ui,3 = m0 - 1
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 で解析できているはず
Interprocedural Region Analysis
� 基本的には、Call graph の SCC 単位で、情報
を伝播しつつやる
Interprocedural Region Analysis
� Symbolic Unmapping
� 呼ばれた関数の仮引数を変数とする多項式で範囲が得られるが、呼び出し側の変数で表現された範囲が欲しい
� 再帰がある場合の取扱いが肝だけど、説明が面倒なので省略� 同様に線形計画問題に還元してDD
解析の例
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
アルゴリズムの拡張
� Correlation Analysis
� Integer Division
� Constraint System Decomposition
� 同じく省略
実験
� SUIF compiler infrastructure を使って実装
� Cプログラムを自動並列化
� Cilkプログラムがrace-freeかを検査
� C/Cilkプログラムが配列の範囲エラーを起こしうるかを検査
� 対象プログラム� Fibonacci, QuickSort, MergeSort, Heat(メッシュでの熱拡散),
Knapsack, BlockMul (行列の積、スタック上に一時配列を確保), NoTempMul(同上、ただし一時配列不使用), LU
� 逐次版(C)と並列版(Cilk)
� 相互再帰、ポインタ演算、キャストを含む
実験結果
� Race-freeの検査
� Knapsack以外のプログラムがRace-freeであることを確認できた (Knapsackのraceは意図的なもの)
� Cの自動並列化
� Cilk版と同じ並列性を検出できた
� 配列の範囲エラーを起こしうるかの検査
� すべてのプログラムが範囲エラーを起こさないことを確認できた
並列化によるスピードアップ
ビット幅の解析
� このアルゴリズムは変数の値の範囲を求めているので、ビット幅の解析に応用可能
� アルゴリズムを修正して実験したら、結構ビット幅を減らせた
Translation Validation for an
Optimizing Compiler
George C. Necula
University of California, Berkeley
Citation Count: 51
Translation Validation Infrastructure
� TVI (Translation Validation Infrastructure)
� コンパイラの最適化の各フェーズで変換前と変換後で意味が等しいことを検証するインフラストラクチャ
� トランスレータそのものを検証するのは大変なので、個々の翻訳自体を検証
Simulation relation
� correct な“simulation relation” Σが存在すれ
ば等価
� Σは三つ組 (PCS, PCT, E) の集合
� PCS, PCT,は変換前と変換後のプログラムポイント
� Eは変数やレジスタの対応を表す論理式
� 各 (PCS, PCT, E) ∈ΣがPCS, PCT,から実行
をはじめたときに、同じ関数呼び出しの系列と返り値になるときに、correct
� 最適化器が simulation relation を出力すれば
検査可能
� しかし、多くの最適化については simulation
relation を推論可能
� Symbolic evaluation を使って推論?
� 完全ではないので、simulation relation を発見できずfalse alarm が出る可能性あり
� コンパイラの1パスを実装する程度の労力で実
装できた
� gccでgccそのものやLinuxカーネルをコンパイル
した場合を対象に実験� 結構検証出来た?
� コンパイラのテスト・メンテナンスに有効