44
全全全全全全 (12/15) 全全全全

全体ミーティング (12/15)

  • Upload
    sela

  • View
    37

  • Download
    0

Embed Size (px)

DESCRIPTION

全体ミーティング (12/15). 村田雅之. 今日の内容. A Type and Effect System for Deterministic Parallel Java R. L. Bocchino Jr ., V. S. Adve , D. Dig, S. V. Adve, S. Heumann, R. Komuravelli, J. Overbey, P. Simmons, H. Sung and M. Vakilian OOPSLA 2009. 背景. マルチコアが普及してきた 並列プログラムは実行順が非決定的 難解なバグを生み出す - PowerPoint PPT Presentation

Citation preview

Page 1: 全体ミーティング  (12/15)

全体ミーティング (12/15)

村田雅之

Page 2: 全体ミーティング  (12/15)

今日の内容• A Type and Effect System for Deterministic

Parallel Java– R. L. Bocchino Jr., V. S. Adve, D. Dig, S. V. Adve,

S. Heumann, R. Komuravelli, J. Overbey,P. Simmons, H. Sung and M. Vakilian

– OOPSLA 2009

Page 3: 全体ミーティング  (12/15)

背景• マルチコアが普及してきた• 並列プログラムは実行順が非決定的– 難解なバグを生み出す

• しかし多くの場合で結果は決定的になる– ソート、暗号化など

Page 4: 全体ミーティング  (12/15)

やりたいこと• 実行結果が決定的であることを保証した

い• 対象はオブジェクト指向の命令型言語– Java, C++, C# など

Page 5: 全体ミーティング  (12/15)

Type and effect system

• 型と同じようにヒープへのアクセスを記述– ヒープ領域の一部分に名前を付けて区別– ヒープへのアクセスをプログラム中に付記– 単に ” effect system” とも

Page 6: 全体ミーティング  (12/15)

方針• effect system を使って、実行結果が決定的

であることを保証しよう• コンパイル時に問題がないかチェックす

る– 並列実行する命令のヒープへのアクセスが

互いに違う領域に行われていることを保証→ 実行順序が入れ替わっても結果に影響しない

• Java を対象に実装– C++ 版も作っているらしい

Page 7: 全体ミーティング  (12/15)

region

• ヒープ領域の一部をここでは region と呼ぶ

• Region には名前をつける• 異なる名前の region は別のヒープ領域

Page 8: 全体ミーティング  (12/15)

effect の記述• Region を宣言する– Line 2

• Class のパラメータとして region を渡せる– Line 1, 4, 5

• 各フィールドにデータが存在する regionを指定する– Line 4, 5

• Region はフィールドのひとつのように扱う

Page 9: 全体ミーティング  (12/15)

effect summary

• メソッド内で発生する effect の summaryを書く– Read と write– Writes は reads を含む– Line 6, 7

Page 10: 全体ミーティング  (12/15)

並列実行• cobegin{…}– 中の文をすべて並列実行する– Line 8-13 では、 2 つの命令を並列に実行する

• foreach(int i in 0,N){…}– 配列のすべての要素を並列にアクセスするよ

うなときに使える

Page 11: 全体ミーティング  (12/15)

コンパイラのチェック• メソッドに書かれている summary が正し

いか– ローカル変数、 final なフィールドは無視する– コンストラクタは調べない• 返るまでは通常そのオブジェクトにアクセスされ

ない• 並列実行するブロック内の命令文の effect

が違う領域に及ぶこと– read だけであれば問題ない

Page 12: 全体ミーティング  (12/15)

Region Path List (RPL)

• Region を階層構造で表現できる– : でつながれた region 名のリスト– Root から始まる ( 省略可 )– 異なる RPL はそれぞれ異なるヒープ領域と対

Page 13: 全体ミーティング  (12/15)

partially specified RPL

• ワイルドカードとして * を使うことができる

• * が入った RPL は region の集合を表す• Figure 5 の例では任意の深さの木に対応

できるようになっている

Page 14: 全体ミーティング  (12/15)

RPL の比較• ふたつの RPL が互いに素 (disjoint) とは– 左から n 個目まで同じで n+1 個目が異なる– 右から n 個目まで同じで n+1 個目が異なる– それぞれ、 n+1 個目までの間に * を含まない• A:B:C:* と A:B:D:* は disjoint• A:B:C:* と A:B:* は disjoint ではない

• disjoint な領域へのアクセスは実行順序が結果に影響を及ぼさない– 必ず別のヒープ領域へのアクセスになる

Page 15: 全体ミーティング  (12/15)

A:*

RPL の性質• R1 ≤ R2

– R1 は R2 の下にある (R1 is under R2)

– R2 が R1 の prefix になっているとき• R1 ≤ R2 ならば R1 R⊆ 2:*– R1 R⊆ 2 ではない

A A:B

A:B ≤ A

Page 16: 全体ミーティング  (12/15)

subtyping での利用• region をパラメータにとるクラスの

subtyping を考えることができる

• C<R1> ≤ C<R2>– R1 R⊆ 2 のとき

Page 17: 全体ミーティング  (12/15)

配列の計算• 2 つの方法を用意– index-parameterized array– subarray

• 用途に応じて使い分ける

Page 18: 全体ミーティング  (12/15)

index-parameterized array

• 配列のすべての要素について計算する場合• foreach 構文が使える• 各ループでそれぞれ異なる領域にアクセス

していることを示せばよい• しかし、その配列が参照している先が同

じか判定するのは難しい

Page 19: 全体ミーティング  (12/15)

アクセスできるオブジェクトを制限する

• 対応するインデックスのついた領域にしかアクセスできないという制限を設ける– インデックスが異なれば disjoint な領域への

アクセスになる

Page 20: 全体ミーティング  (12/15)

配列の region

• 配列の i 番目の要素がある region は [i]– 実行時には i が異なるので違う領域になる– このインデックスをクラスの region の引数と

して与えることができる

Page 21: 全体ミーティング  (12/15)

配列の型• T[] <R>#i– T : 型– R : region のパラメータ– #i : index に使う変数を指定– これを index-parameterized array と呼ぶ

• e 番目の要素は、 [i e]R↦ の領域に置かれる

• 型は [i e]T↦ となる

Page 22: 全体ミーティング  (12/15)

例: Figure 7

• C<[_]> [] <[_]> は C<[i]>[]<[i]>#i の略記• bodies[i] は [i] にある• bodies[i].mass は [i]:M にある– パラメータとして [i] が渡される– i が異なれば別々の region に存在する

Page 23: 全体ミーティング  (12/15)

index-parameterized array の制限• 配列内で要素の移動ができない– a[i] = a[j] など

• いったん C<[i]>[]<[i]>#i 型の配列から C<*>[] 型の配列にコピーして順番を入れ替えたのちC<[j]>[]<[j]>#j 型にコピーすれば入れ替えは可能– コピーによるオーバーヘッド

Page 24: 全体ミーティング  (12/15)

subarray

• 配列を分割する方法– 分割統治型のアルゴリズムに使える– Figure 9

Page 25: 全体ミーティング  (12/15)

DPJArray

• DPJArray 型を導入– 開始点 S と長さ L を持つ– Array の分割を簡単にする– Java の Array のラッパー

• 部分配列 (subarray) を表すことができる

Page 26: 全体ミーティング  (12/15)

DPJPartition

• 配列を subarray に分割するクラス• コンストラクタに DPJArray を渡すと、分割

した結果が返ってくる• いくつかの分割方法を指定できる

Page 27: 全体ミーティング  (12/15)

RPL の拡張• ひとつの配列を複数の方法で分割するかも• final のついたローカル変数 z を RPL に書く– this を含む– 分割方法を区別できる

• z が指すオブジェクトがある region を表す– 実行時に決定される

• 分割した配列を表すことができる– disjoint な region どうし

Page 28: 全体ミーティング  (12/15)

重複する領域• 複数の分割があった場合、重複領域があ

るかもしれない–長さ 10 の配列 a を z1 が 0-5,6-9 に、 z2 が 0-

4,5-9 に分割したとき z1:[0] と z2:[1] は disjoint な領域を表すはずなのに重複した領域 (a[5]) を持つ

Page 29: 全体ミーティング  (12/15)

重複する領域• 分割した配列がある region は、 z:[i]:* とす

• z は実行時に決定するものなので単純には比較しない

• 右は * があるので disjoint とはいえない

Page 30: 全体ミーティング  (12/15)

簡略化の annotation

• m commuteswith m’– メソッド m と m’ の実行順序が入れ替わってもよ

い– 実際に入れ替わってもよいかは保証されない

• 他の方法で検証する必要がある• invokes m’ with e– effect の一種– メソッド中で m を呼び出すことを意味する– commuteswith と組み合わせれば交換可能な組み合わせが広がる

Page 31: 全体ミーティング  (12/15)

形式的な定義• ここではシンプルな言語を考える– 制御構文がない–継承がない– region 名は global とする

Page 32: 全体ミーティング  (12/15)

Syntax

• Figure 11 を参照• プログラムは region 定義と class 定義と実

行部• RPL の syntax が定められる– * は先頭には来ない、など

Page 33: 全体ミーティング  (12/15)

static semantics (1)

• region パラメータの包含関係によるsubtyping– Figure 18, (SUBTYPE-CLASS)

• Effect の包含関係などが定義される– Figure 19

Page 34: 全体ミーティング  (12/15)

static semantics (2)Typing Rules

• field や配列へのアクセスで effect が発生• メソッド呼び出しで、 invokes の effect が

発生• メソッドの引数をチェックするときには、仮にregion パラメータを与えている– 実引数のパラメータに含まれるような region

Page 35: 全体ミーティング  (12/15)

dynamic semantics

• 実行文、実行前の環境、ヒープ状態から、

返り値のオブジェクト、実行後のヒープ状態、発生した effect を求める– (e, dΓ, H) → (o, H’, dE)– d は dynamic の意味–環境は変数の値と、 region パラメータの環境

Page 36: 全体ミーティング  (12/15)

evaluation rules

• Figure 21.• Rf は * を含まない形の RPL• クラスの引数に region を渡す時に末尾の *

は削除される– DYN-NEW-CLASS, DYN-NEW-ARRAY– 実行時に region が完全に表現される

Page 37: 全体ミーティング  (12/15)

soundness

• Preservation–静的な型と effect は動的なものと一致する– type check の結果を評価時に利用してもよい

• Noninteference– disjoint な RPL, Effect を定義する– disjoint な effect は実行順序が入れ替わっても

実行後のヒープ状態は変わらない→実行結果が決定的である

Page 38: 全体ミーティング  (12/15)

並列実行構文• cobegin– 中の文を同時に実行して、暗黙の join を行う– それぞれの式が disjoint な effect を持てばよい

• foreach– 各 i を代入して同時実行– disjoint であることは保証されている

Page 39: 全体ミーティング  (12/15)

実装• Deterministic Parallel Java (DPJ)– javac, java を改造

• 並列化は ForkJoinTask を採用– Java7 で追加される– work stealing を行う

• DPJ のソースコードを fork/join を用いたJava のソースコードに変換する

Page 40: 全体ミーティング  (12/15)

実験• 以下のプログラムを書き換えて使用– 並列マージソート–モンテカルロ法 (株価予測 )– IDEA 暗号化• 上 2 つはベンチマークから。作者が書き換えた

– Barnes-Hut の n 体問題シミュレーション– k-means クラスタリング–衝突判定アルゴリズム• ゲームエンジン JMonkey

Page 41: 全体ミーティング  (12/15)

実行時間• 実行環境: 6-core Xeon×4, 48GB• 逐次実行に比べての速度

Page 42: 全体ミーティング  (12/15)

実行時間

Page 43: 全体ミーティング  (12/15)

書き換えた量• デバッグするよりは書き換えたほうが楽?

• 書き換えを補助するツールがある ( らしい )

Page 44: 全体ミーティング  (12/15)

まとめ• 結果が決定的な並列プログラムの結果が

決定的になることを保証することができた– type and effect system を利用– RPL, Array などを追加して拡張– soundness を証明– 表現力もあり、性能もよい