This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( www.kmonos.net ), under my own understanding of.

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
Generic programming と STL
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
C言語 配列 2016年 吉田研究室.
第11回 整列 ~ シェルソート,クイックソート ~
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング論 I 行列の演算
基礎プログラミングおよび演習 第9回
from KDD 2012 speaker: Kazuhiro Inaba
問題提起その 1 一文字ずつ文字(数字)を読み込み、それぞれの文字が何回入力されたかを数えて出力するプログラム。
基礎プログラミングおよび演習 第8回.
C言語 配列 2016年 吉田研究室.
An Analysis of Social Network-Based Sybil Defenses
Paper from PVLDB vol.7 (To appear in VLDB 2014)
IT入門B2 ー 連立一次方程式 ー.
アルゴリズムとデータ構造 2011年6月13日
第6章 2重ループ&配列 2重ループと配列をやります.
データ構造とアルゴリズム論 第2章 配列(構造)を使った処理
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
Licensing information
Solving Shape-Analysis Problems in Languages with Destructive Updating
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
CGと形状モデリング 授業資料 長井 超慧(東京大学)
C 言語について 補足資料 資料および授業の情報は :
並列計算システム特論演習 SCS特別講義 平成13年10月15日.
プログラミング応用 printfと変数.
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
精密工学科プログラミング基礎 第10回資料 (12/18実施)
“Separating Regular Languages with First-Order Logic”
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
前回の練習問題.
第6回:ラケットを動かそう! (キーボードによる物体の操作)
連続領域におけるファジィ制約充足問題の 反復改善アルゴリズムによる解法 Solving by heuristic repair Algorithm of the Fuzzy Constraint Satisfaction Problems with Continuous Domains 北海道大学.
アルゴリズムとデータ構造 2010年6月21日
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
アルゴリズムとプログラミング (Algorithms and Programming)
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
アルゴリズムとデータ構造 2012年6月11日
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
アルゴリズムとプログラミング (Algorithms and Programming)
第6回:得点を表示しよう! (文字の表示、乱数)
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
プログラミング入門2 第5回 配列 変数宣言、初期化について
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
情報処理Ⅱ 小テスト 2005年2月1日(火).
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
printf・scanf・変数・四則演算
プログラミング演習I 補講用課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( www.kmonos.net ), under my own understanding of the papers published at PLDI So, it may include many mistakes etc For your correct understanding, please consult the original paper and/or the authors’ presentation slide!

pldir #2 2009/9/30 k.inaba (稲葉 一浩) http://www.kmonos.net/ Reading “The Implementation and Evaluation of Fusion and Contraction in Array Languages” [E. C. Lewis, C. Lin, and L. Snyder] Citation Count (ACM) 17 pldir #2 2009/9/30 k.inaba (稲葉 一浩) http://www.kmonos.net/

Background 配列演算できる言語がある 例 Fortran 90 High Performance Fortran ZPL A(1:n, 1:m) = B(1:n, 1:m) + C(1:n, 2:m+1) * D(0:n-1,1:m) // for( i=1; i≦n; ++i ) // for( j=1; j≦m; ++j ) // A[i][j] = B[i][j] + C[i][j+1] * D[i-1][j];

Background ナイーブに実装すると効率が悪い 既存のコンパイラは という方式で、効率を取り戻そうとしている ナイーブに実装して 配列演算をスカラー化(ループに直す)した後 普通のスカラーコンパイラのループ最適化 という方式で、効率を取り戻そうとしている

A(1:n, 1:m) = B(1:n, 1:m) + C(1:n, 2:m+1) * D(0:n-1,1:m) // for( i=1; i≦n; ++i ) // for( j=1; j≦m; ++j ) // A[i][j] = B[i][j] + C[i][j+1] * D[i-1][j]; 単純な式に直す tmp(1:n,1:m) = C(1:n, 2:m+1) * D(0:n-1,1:m) A(1:n,1:m) = B(1:n, 1:m) + tmp(1:n, 1:m) スカラー化 for( i=1; i≦n; ++i ) for( j=1; j≦n; ++j ) tmp[i][j] = C[i][j+1] * D[i-1][j]; A[i][j] = B[i][j] + tmp[i][j]; ループ融合 for( i=1; i≦n; ++i ) for( j=1; j≦n; ++j ) tmp[i][j] = C[i][j+1] * D[i-1][j]; A[i][j] = B[i][j] + tmp[i][j];

Background その他の、最適化したい例 依存のない、同時に回せるループ プログラマが入れたテンポラリ 再代入

この研究の内容 このような最適化 を、スカラレベルの ループ最適化に任せるのではなく、 配列レベルでおこなうべき / おこなった Fusion : 一緒に回せるループは一緒に回す Contraction : 不要なテンポラリを消す を、スカラレベルの ループ最適化に任せるのではなく、 配列レベルでおこなうべき / おこなった というお話 Typically 20%~ Max 400% の高速化

ながれ ZPL Normalized Array Statement Array Statement Dependence Graph Fusion 最適化しやすい形式の配列演算文 Array Statement Dependence Graph 配列演算文どうしの依存関係をグラフにしたもの Fusion Partition 同じループで回して問題ない配列演算をまとめる Scalarization 適切なループ方向や添え字順を選ぶ

Normalized Array Statement この論文で最適化する対象言語 “[添字の動く範囲] 演算文” 配列に @(整数, 整数) の形式でオフセット指定 書けない: for(i,j) A[i][j] = B[j][i] 書けない: for(i) A[i] = B[2*i] 書けない: for(i) A[i] = B[n-i] 一つの文で入出力両方にあらわれる配列はない 書けない: for(i) A[i] = A[i+1] // こんな形式の文の列のみ扱える [1..n,1..m] A@(0,0) := B@(0,-1) [1..n,1..m] A@(0,0) := B@(1,2) + C@(-1,0) テンポラリ変数を 入れれば、 この形は 消せる。 あとで最適化でテンポラリも消す

ASDG (Array Statement Dependence Graph) 配列演算文どうしの依存関係 Flow Dependence Anti Dependence Output Dependence [1..n] A@(0) := B@(0) // こっちが先! [1..n] C@(0) := A@(0) [1..n] B@(0) := A@(0) [1..n] A@(0) := C@(0) // こっちが後! [1..n] A@(0) := B@(0) [1..n] A@(0) := C@(0) // こっちが後!

ASDG (Array Statement Dependence Graph) [A, (-1,0), flow] これが ASDGの持つ 依存関係情報 ASDG (Array Statement Dependence Graph) Flow/Anti/Output 依存があっても まだ同じループに入らないとは限らない Iteration Space 間の依存関係 [1..n,1..m] A@(0,0) := B@(0,0) [1..n,1..m] C@(0,0) := A@(1,0) for(i=n; i≧1; --i) // こっち向きで回れば行ける for(j=1; j≦m; ++j) A[i][j] = B[i][j] C[i][j] = A[i+1][j]

ASDG (Array Statement Dependence Graph) ノード = 配列演算文1個 エッジ = 依存関係情報 [ 依存原因の変数, ループ添字オフセットを引き算したベクトル, flow|anti|output ] からなるグラフ

ASDG (Array Statement Dependence Graph) 例

Fusion Partition いっしょに回せる配列演算文を できるだけクラスタリング Fusion for Contraction Fusion for Locality 同じ配列に対するループをできるだけまとめて メモリ局所性を得るためのFusion Fusion for 適当にGreedyにできそうならやってみる

2: (大雑把に 言うと)出現回数の多い変数を 先に考える 1: とりあえず 全部 別のクラスタ 2: (大雑把に 言うと)出現回数の多い変数を 先に考える Fusion 4 Clustering いっしょに回せる配列演算文を できるだけクラスタリング 3: 変数xiを含む クラスタ 全部 4: それに挟まれてるクラスタも全部入れる

Fusion 4 Clustering いっしょに回せる配列演算文を できるだけクラスタリング 6: ひとつの クラスタへと 5: ひとつに 潰せそうなら 6: ひとつの クラスタへと Fusion! Fusion 4 Clustering いっしょに回せる配列演算文を できるだけクラスタリング

「ひとつに潰せそうなら」 詳しくは論文にて熟知すべし 同じループ範囲を回っている Contract対象の変数のdep vecが(0,..,0) … 等々 詳しくは論文にて熟知すべし

スカラー化(ループに落とす) 考えなきゃいけないポイント Dependence Vectorを見ればわかる for(i) for(k) …, or for(k)for(i) … ? それぞれ、昇順ループにするか降順ループにするか Dependence Vectorを見ればわかる

「昇順がいいか降順がいいか」が揃ってる次元から順にループ 全ての制約で 「昇順がいいか降順がいいか」が揃ってる次元から順にループ もう考え なくていい 制約

評価・まとめ 論文の図など見ながら

エイリアス解析したい この論文の主張: 既存の方法は エイリアス解析=「二つのメモリ参照式が同じメモリを指してる可能性があるやなしや?」 (軽く読んだ方のメモ) “Type-Based Alias Analysis” 1/5 [A. Diwan, K.S. McKinley, and J.E.B. Moss] Citation Count (ACM) 35 エイリアス解析したい エイリアス解析=「二つのメモリ参照式が同じメモリを指してる可能性があるやなしや?」 この論文の主張: 既存の方法は マジメにやりすぎてて重い。使えない 評価方法が「どれだけaliasの可能性を正しく判定できたかの割合」なのが気にくわない エイリアス解析結果によって「得られる最適化の機会の割合」でも評価すべき

この論文の出す対案: 型でやる LV1 [TypeDecl] (軽く読んだ方のメモ) “Type-Based Alias Analysis” 2/5 [A. Diwan, K.S. McKinley, and J.E.B. Moss] Citation Count (ACM) 35 この論文の出す対案: 型でやる ややこしい新規な型システムとかではなく、 ホントに今そこらの言語にあるような型でやる 主として対象は Modula-3 (Cと違って型安全) LV1 [TypeDecl] 型が違うメモリ参照は同じ所を決して指さない mayAlias(e1,e2) = subtypes(type(e1))∩subtypes(type(e2))≠Φ

LV2 [FieldTypeDecl] LV3 [SMTypeRefs] 違うフィールドへのアクセスは違うメモリ参照 (軽く読んだ方のメモ) “Type-Based Alias Analysis” 3/5 [A. Diwan, K.S. McKinley, and J.E.B. Moss] Citation Count (ACM) 35 LV2 [FieldTypeDecl] 違うフィールドへのアクセスは違うメモリ参照 mayAlias(e1.field1,e2.field2) = [TypeDecl] & field1==field2 LV3 [SMTypeRefs] LV1は変数の宣言型を使ってたが一般的すぎ e1 := e2 という代入がプログラムにあったら type(e1)とtype(e2)を同値類に突っ込む mayAlias = (subtypes∩eqclass)(type(e1))∩同(e2)≠Φ

LV1 だと LV3 だと ArrayList 型の変数と List 型の変数は、 常に、エイリアスの可能性ありと判定される (軽く読んだ方のメモ) “Type-Based Alias Analysis” 4/5 [A. Diwan, K.S. McKinley, and J.E.B. Moss] Citation Count (ACM) 35 LV1 だと ArrayList 型の変数と List 型の変数は、 常に、エイリアスの可能性ありと判定される LV3 だと プログラム中に ArrayList 型と List 型の間の代入がなければ(i.e., プログラマがArrayListは常にArrayList型で使い、Listには入れないでいれば) エイリアスの可能性なしと判定 いずれにせよ、ぴったり同じ型の変数は依然として常にエイリアスの可能性ありと判定

RLE (Redundant Load Elimination)という最適化に対する有効度で評価 (軽く読んだ方のメモ) “Type-Based Alias Analysis” 5/5 [A. Diwan, K.S. McKinley, and J.E.B. Moss] Citation Count (ACM) 35 すっごいシンプル。速い プログラムサイズの線形時間に近い(と思う) でもこんなんで精度出るの? RLE (Redundant Load Elimination)という最適化に対する有効度で評価 わるくない これだけでも、8個中6個のベンチマークで RLの95%以上を検出できた