PLDIr#4 (PLDI 2000)


   2009-12-02
   酒井 政裕
Citation Count: 34



Symbolic bounds analysis of
pointers, array indices, and
accessed memory regions
    Radu Rugina, Ma...
概要

プログラムがアクセスするメモリの範囲を解析す
るアルゴリズム
用途
 競合の検出 ・ 自動並列化
 範囲外アクセスの検出 ・ 範囲チェックの省略
ターゲットのプログラム
 制御に再帰を用いるような分割統治型のプログラム
 メモリの動的確...
特徴

シンボリックな解析
(具体的な値ではなく式の形で範囲を求める)
範囲の包含に関する不動点計算は用いない
 有限回で収束しない場合がある
線形計画問題に還元して解く
 上限と下限を多項式で表現
 線形計画問題に変換
 線形計画問題の解から...
ターゲットのプログラムの例 (Cilk)
 1: #define CUTOFF 16                  20: void main(int argc, char *argv[]) {
 2:                   ...
基本的な概念

allocation blocks
 確保されたメモリブロック
 メモリ確保位置(変数宣言, mallocの呼び出し等)に対
 して一個
    (同じ場所が複数回実行される場合でも、確保される複数の
    メモリブロックを区...
流れ   どの allocation block がどこで
        読み書きされうるかを
       interprocedual に解析
Symbolic Bounds at the Start of Basic
Blocks
 まず、各基本ブロックの
 入り口での各変数の上
 下限を表す変数を導入
 (右図)

 次に記号実行で上下限
 を伝播
   ただし多項式で表現できな
...
基本ブロック内で記号実行
       記
       号
       実
       行
制約の生成

        「基本ブロックの出口で
        の値の範囲 ⊆ 続く基本
        ブロックの入り口での範
        囲」という制約を生成
        例:
         l i,2 ≤ 0
     ...
得られた制約
         ← 引数の上下限は
         その引数の初期値。
         他の変数は[-∞,∞]

         ← 記号実行結果か
         ら得られた制約




         ← 出来るだ...
線形計画問題への変換

上下限の変数を、引数の初期値を変数とする
多項式で表現されると仮定して、置き換える
 例) li,2 = c1q0 + c2m0 + c3 , li,3 = c7q0 + c8m0 + c9
制約条件は係数の不等式に変換...
得られた線形計画問題と解
          ←得られた問題
          これを解いて、各ciの
          値が求まる
          それらから、各変数
          の各点での上下限
          の多項式...
Intraprocedural Region Analysis

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

 基本的には、Call graph の SCC 単位で、情報
 を伝播しつつやる
Interprocedural Region Analysis

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


 再帰がある...
解析の例                                 read/write
                                 [q0, q0+m0-1] in a
 1: #define CUTOFF 16 ...
アルゴリズムの拡張

Correlation Analysis
Integer Division
Constraint System Decomposition

同じく省略
実験

SUIF compiler infrastructure を使って実装
 Cプログラムを自動並列化
 Cilkプログラムがrace-freeかを検査
 C/Cilkプログラムが配列の範囲エラーを起こしうるかを検査
対象プログラム
 Fi...
実験結果

Race-freeの検査
 Knapsack以外のプログラムがRace-freeであること
 を確認できた (Knapsackのraceは意図的なもの)
Cの自動並列化
 Cilk版と同じ並列性を検出できた
配列の範囲エラーを起こし...
並列化によるスピードアップ
ビット幅の解析

このアルゴリズムは変数の値の範囲を求めてい
るので、ビット幅の解析に応用可能
アルゴリズムを修正して実験したら、結構ビット
幅を減らせた
Citation Count: 51



Translation Validation for an
Optimizing Compiler

    George C. Necula
    University of California...
Translation Validation Infrastructure

 TVI (Translation Validation Infrastructure)
 コンパイラの最適化の各フェーズで変換前と
 変換後で意味が等しいことを検証...
Simulation relation

 correct な“simulation relation” Σが存在すれ
 ば等価
 Σは三つ組 (PCS, PCT, E) の集合
   PCS, PCT,は変換前と変換後のプログラムポイント
 ...
最適化器が simulation relation を出力すれば
検査可能
しかし、多くの最適化については simulation
relation を推論可能
 Symbolic evaluation を使って推論?
 完全ではないので、sim...
コンパイラの1パスを実装する程度の労力で実
装できた
gccでgccそのものやLinuxカーネルをコンパイル
した場合を対象に実験
 結構検証出来た?
コンパイラのテスト・メンテナンスに有効
Upcoming SlideShare
Loading in …5
×

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

1,237 views

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,237
On SlideShare
0
From Embeds
0
Number of Embeds
62
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

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

×