並行計算に基づく 並列プログラミング言語のための...

29
並並並並並並並並 並並並並並並並並 並並並並並並並並並並並並並並並 並並並並並並並並並並並並並並並 並並並並並並並並並並並並 並並並並並並並並並並並並 並並並並 並並並並 並並並並並並並 並並並並並並 並並並並並並並 並並並並並並 並並並並並並 並並並並並 並並並並並並 並並並並並

Upload: colby-moon

Post on 03-Jan-2016

20 views

Category:

Documents


0 download

DESCRIPTION

並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組. 大山恵弘 東京大学大学院 理学系研究科 情報科学専攻 米澤研究室. 記述が楽. 実行が速い. かつ. 言語がほしい. 今日の並列プログラミング. ポピュラーな方法. C, Fortran,. 並列拡張ライブラリ. +. プログラマ の責任. メモリ管理. 同期、通信. スレッド(プロセス)の生成と終了. なぜポピュラーか?. C で書けば速いよ!. しかし、、、 多くの 開発時間、人員、能力. 細粒度スレッドをサポートする言語 (1/2). 例 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

並行計算に基づく並行計算に基づく並列プログラミング言語のための並列プログラミング言語のための

効率的なコンパイルの枠組効率的なコンパイルの枠組

大山恵弘大山恵弘

東京大学大学院 理学系研究科東京大学大学院 理学系研究科情報科学専攻 米澤研究室情報科学専攻 米澤研究室

Page 2: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

今日の並列プログラミング今日の並列プログラミング

並列拡張ライブラリ並列拡張ライブラリ++

ポピュラーな方法ポピュラーな方法

C, Fortran, ...C, Fortran, ...

しかし、、、しかし、、、多くの多くの開発時間、人員、能力開発時間、人員、能力

メモリ管理メモリ管理スレッド(プロセス)の生成と終了スレッド(プロセス)の生成と終了

同期、通信同期、通信 プログラマプログラマの責任の責任

なぜポピュラーか?なぜポピュラーか?

CC で書けば速いよ!で書けば速いよ!

記述が楽 実行が速いかつかつ 言語がほしい言語がほしい

Page 3: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

細粒度スレッドをサポートする細粒度スレッドをサポートする言語言語

(( 1/21/2 ) ) 例例

– 並列オブジェクト指向言語並列オブジェクト指向言語– 並行論理型言語並行論理型言語– 関数型言語+並列拡張関数型言語+並列拡張

特徴特徴– 動的スレッド生成で並列性抽出動的スレッド生成で並列性抽出 (( FibFib の例の例 : 2: 2 つの子をスレッド生成して計算)つの子をスレッド生成して計算)– 多数のスレッドを生成可能(何十万、何百万)多数のスレッドを生成可能(何十万、何百万)

Page 4: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

細粒度スレッドをサポートする細粒度スレッドをサポートする言語言語

(( 2/22/2 )) 利点利点

– 均等な負荷分散均等な負荷分散– プロセッサ効率の向上プロセッサ効率の向上– アルゴリズムの自然な記述アルゴリズムの自然な記述

実装上の問題実装上の問題– 動的スレッド生成オーバヘッド動的スレッド生成オーバヘッド– 同期、通信オーバヘッド同期、通信オーバヘッド

Page 5: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

細粒度スレッドをサポートする細粒度スレッドをサポートする言語言語

(( 2/22/2 ))

細粒度スレッド技術細粒度スレッド技術9797 年度輸出状況(推定)年度輸出状況(推定)

AntarcticAntarctic

LondonLondonMoscowMoscow

Cape TownCape Town

DakarDakarSingaporeSingapore

SydneySydney

Hong KongHong Kong

New YorkNew YorkLos AngelesLos Angeles

SalvadorSalvador

Page 6: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

細粒度マルチスレッドが有効な例 細粒度マルチスレッドが有効な例 (( 1/21/2 ))

•例題1例題1 : : 枝刈りつき並列木探索(枝刈りつき並列木探索( RNARNA ))

特徴特徴 : : 部分木の計算量予測困難部分木の計算量予測困難

6464 台台 CPUCPU 使用時に使用時に 6565 個の個のスレッドができたら困るスレッドができたら困る

負荷の不均衡負荷の不均衡

仕事の単位を仕事の単位を細かく分ける必要細かく分ける必要

細粒度マルチスレッド言語細粒度マルチスレッド言語 ::言語言語が細かい仕事を管理が細かい仕事を管理

Page 7: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

特徴特徴 : : 同期待ち時間同期待ち時間 予測困難予測困難

•例題例題 2: 2: 並列文法解析(並列文法解析( CKYCKY ))

CC による単純な記述による単純な記述 ::スピンロックで待つスピンロックで待つ

細粒度マルチスレッド言語細粒度マルチスレッド言語 ::CPUCPU を無駄にせずを無駄にせず別の仕事を実行別の仕事を実行

細粒度マルチスレッドが有効な例 細粒度マルチスレッドが有効な例 (( 2/22/2 ))

長時間無駄仕事する可能性長時間無駄仕事する可能性

Page 8: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

貢献貢献 細粒度スレッドの効率的なコンパイルの枠組み細粒度スレッドの効率的なコンパイルの枠組み

– 並行計算を利用並行計算を利用– スレッドスケジューリングの回数を減らす技法スレッドスケジューリングの回数を減らす技法– スレッド間通信をレジスタで行う技法スレッド間通信をレジスタで行う技法

並列オブジェクト指向言語並列オブジェクト指向言語 SchematicSchematic の実装の実装– 単一プロセッサ単一プロセッサ WS & SMPWS & SMP– Lazy Task Creation Lazy Task Creation 方式による動的負荷分散を実装方式による動的負荷分散を実装

現実的なアプリケーションで性能評価現実的なアプリケーションで性能評価– CC と比較と比較

Page 9: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

以降の発表の流れ以降の発表の流れ

我々の使用する言語我々の使用する言語 ナイーブなコンパイル技法ナイーブなコンパイル技法 提案するコンパイル技法提案するコンパイル技法

– コンパイル時スケジューリングコンパイル時スケジューリング– Unboxed Unboxed チャネルチャネル

動的負荷分散動的負荷分散 性能評価性能評価 関連研究関連研究

Page 10: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

我々の言語の概要我々の言語の概要 表層言語表層言語 : : Schematic [Schematic [ 田浦ら 田浦ら 96]96]

– Scheme Scheme ++非同期呼び出し拡張非同期呼び出し拡張– 高効率なスレッド生成高効率なスレッド生成

• 呼び出しコスト呼び出しコスト : : 同期呼び出し ≒ 非同期呼び出し同期呼び出し ≒ 非同期呼び出し

– 11st-class st-class の通信媒体(チャネル)の通信媒体(チャネル)

中間言語中間言語 : : 並行計算並行計算 HACL [HACL [小林ら 小林ら 95]95]– プロセスがチャネル通信によって計算プロセスがチャネル通信によって計算– ごく少数の本質的なプリミティブごく少数の本質的なプリミティブ– 単純で解析や最適化の 単純で解析や最適化の platform platform に適するに適する

Page 11: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

細粒度マルチスレッド言語の細粒度マルチスレッド言語のナイーブな実行方式ナイーブな実行方式

スレッド生成 = タスクキューへのエンキュースレッド生成 = タスクキューへのエンキュー

タスクキュー内の各仕事はメモリで通信タスクキュー内の各仕事はメモリで通信

受信成功受信成功 :: を実行可能な仕事としてを実行可能な仕事として

タスクキューにエンキュータスクキューにエンキュー

受信失敗受信失敗 :: を待ちキューにエンキューしを待ちキューにエンキューしタスクキューから仕事を取り出して実行タスクキューから仕事を取り出して実行

Page 12: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

提案するコンパイル技法提案するコンパイル技法[[ 大山ら 大山ら Euro-Par 97]Euro-Par 97]

最適化最適化 1: 1: コンパイル時スケジューリンコンパイル時スケジューリンググ– 複数のスレッドのコードを並べて生成複数のスレッドのコードを並べて生成– タスクキュー操作の回数を削減タスクキュー操作の回数を削減

最適化最適化 2: 2: unboxed unboxed チャネルチャネル– レジスタにチャネルの内容と状態を持たせレジスタにチャネルの内容と状態を持たせ

るる– メモリを使用しないスレッド間通信メモリを使用しないスレッド間通信

Page 13: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

変換規則による変換規則によるコンパイルアルゴリズムの記コンパイルアルゴリズムの記

述述Receive

Send

Parallel

Process instantiationConditional

F (P1 | P2) U k = F (P1::(P2::U)) k

F (r(v)=>P) U k = if (r has a value) then let val v = get_value(r) in F (P::U) k end else let fun s(l, v) = F [P] l in put_process(r, s); F U k end

F (r<=v) U k = if (r has a process) then let val p = get_value(r) fun s(k) = p(k, v) in F U (s::k) end else put_value(r, s); F U k

F (if x then P1 else P2) U k = if x then F (P1::U) k else F (P2::U) k

F ( f(x1, ..., xn)) U k = let fun s(k) = F U k in f((s::k), x1, ..., xn) end

.....

Page 14: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

コンパイル時スケジューリング コンパイル時スケジューリング (( 1/21/2 ))

受信受信 if ( 受 信 成功 ) then

else

noを待ちキューに格納スレッドスレッド

Page 15: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

コンパイル時スケジューリングコンパイル時スケジューリング (( 2/22/2 ))

f (r,1,2) f (r,1,2) の 本 体 へ 飛 ぶ

noをスタックにプッシュ

スタックスタック : : 実行可能なクロージャの集合を保持実行可能なクロージャの集合を保持

unknownunknown な関数な関数

タスクキューが不要なわけではないタスクキューが不要なわけではない

Page 16: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

コード複製戦略コード複製戦略 if ( 受 信 成功 ) then

else

複製を行わずコード生成複製を行わずコード生成

全く複製しないコードサイズ全く複製しないコードサイズ××

プログラマが与えた定数プログラマが与えた定数

≦≦

生成されるコードサイズ生成されるコードサイズ

Page 17: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

Unboxed Unboxed チャネルチャネル

unboxedunboxedチャネルチャネル

unboxedunboxedチャネルチャネル

レジスタ上で値通信レジスタ上で値通信

スタックスタック

• [[ 田浦ら田浦ら 94]94] で最初に提案で最初に提案• レジスタ上にチャネルの状態と内容を保持レジスタ上にチャネルの状態と内容を保持• 必要に応じメモリにチャネルを作成必要に応じメモリにチャネルを作成

Page 18: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

動的負荷分散動的負荷分散 Lazy Task CreationLazy Task Creation [ [Mohr et al. 91Mohr et al. 91] ] に基づくに基づく

レジスタ上レジスタ上通信通信

仕事を盗む仕事を盗む

メモリ上通信メモリ上通信

Page 19: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

性能測定性能測定

同じアルゴリズムの同じアルゴリズムの CC プログラムと比較プログラムと比較 逐次版逐次版 : : SS20 (HyperSparc 150MHz)SS20 (HyperSparc 150MHz) 並列版並列版 : : Sun Enterprise 10000Sun Enterprise 10000

(UltraSparc 250 MHz (UltraSparc 250 MHz × 64)× 64) SchematicSchematic の動的型チェックは除いているの動的型チェックは除いている 並列版並列版 SchematicSchematic のの GCGC 時間は除いている時間は除いている

Page 20: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

逐次版性能測定結果逐次版性能測定結果(各最適化の効果)(各最適化の効果)

0.01.02.03.04.05.06.07.08.09.0

10.0

Nor

mal

ized

Ela

psed

Tim

e

Schematic ( unboxed )コンパイル時スケジューリングあり チャネルありSchematic ( unboxed )コンパイル時スケジューリングなし チャネルありSchematic ( unboxed )コンパイル時スケジューリングあり チャネルなしSchematic ( unboxed )コンパイル時スケジューリングなし チャネルなし

Page 21: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

逐次版性能逐次版性能測定測定結果結果(( CC との比較)との比較)

0.0

1.0

2.0

3.0

4.0

5.0

Nor

mal

ized

Ela

psed

Tim

e

C Schematic (with both optimizations)

Page 22: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

並列版性能測定結果並列版性能測定結果(単純な並列性を持つ問題)(単純な並列性を持つ問題)

Schematic's Scalability

0

10

20

30

40

50

60

0 10 20 30 40 50 60Number of PEs

Spe

edUp

Linear Fib Tak Nqueen QAP

Page 23: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

並列版性能測定結果 (並列版性能測定結果 ( RNARNA ))Scalability

0

10

20

30

40

50

0 10 20 30 40 50 60Number of PEs

Spe

edUp

Solaris thread C task queue C Schemati c

Page 24: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

並列版性能測定結果 (並列版性能測定結果 ( CKYCKY ))Scalability

0

10

20

30

40

50

0 10 20 30 40 50 60Number of PEs

Spe

edUp

C Schemati c

Page 25: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

関連研究 (関連研究 ( 1/31/3 ))

IdId [[Schauser et al. 95Schauser et al. 95]], , FlengFleng [[荒木ら 荒木ら 9797]]

– 依存関係解析によるスレッドの静的融合依存関係解析によるスレッドの静的融合– 我々は同様の効果をコード複製によって実現我々は同様の効果をコード複製によって実現

PictPict [[TurnerTurner 9696]]

– 我々と同じく並行計算のコンパイルを扱う我々と同じく並行計算のコンパイルを扱う– すべてのチャネル操作にメモリ操作が必要すべてのチャネル操作にメモリ操作が必要– 受信前と後の実行を同一スレッド内で行えな受信前と後の実行を同一スレッド内で行えな

いい

Page 26: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

関連研究 (関連研究 ( 2/32/3 )) StackThreadsStackThreads [[ 田浦ら 田浦ら 94, 9794, 97]]

– Unboxed Unboxed チャネルを最初に提案チャネルを最初に提案– 我々は 我々は unboxed unboxed チャネルを、一般的なチャネルを、一般的な 並行計算のコンパイルの枠組みの中に導入並行計算のコンパイルの枠組みの中に導入

リニアチャネル リニアチャネル [[小林ら 小林ら 96,96, 五十嵐ら 五十嵐ら 9797]]

– リニアチャネル = 一回だけ使われるチャネルリニアチャネル = 一回だけ使われるチャネル– リニアチャネルによる通信を静的に除去リニアチャネルによる通信を静的に除去– Unboxed Unboxed チャネルとは直交した方法で、共存可能チャネルとは直交した方法で、共存可能

Page 27: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

関連研究 (関連研究 ( 3/33/3 )) CPSCPS [[Appel 92Appel 92]]

– 逐次言語のためのコンパイルの枠組み逐次言語のためのコンパイルの枠組み– Unboxed Unboxed チャネルの定式化にチャネルの定式化に 彼らの 彼らの callee-save callee-save レジスタの技術を使用レジスタの技術を使用

CilkCilk [ [Blumofe et al. 95Blumofe et al. 95]]– CC を非同期関数呼び出し拡張を非同期関数呼び出し拡張– 我々と同じく細粒度スレッドを効率よく実行我々と同じく細粒度スレッドを効率よく実行– 我々の言語よりも同期構造が制限されている我々の言語よりも同期構造が制限されている

• 親が子の終了を待つ以外の同期ができない親が子の終了を待つ以外の同期ができない

Page 28: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

結論結論 並行計算を効率的にコンパイルする枠組み並行計算を効率的にコンパイルする枠組み

– コンパイル時スケジューリング コンパイル時スケジューリング (( スレッドの融スレッドの融合合 ))

– Unboxed Unboxed チャネル チャネル (( レジスタ上スレッド間通信レジスタ上スレッド間通信 ))

並列オブジェクト指向言語並列オブジェクト指向言語 SchematicSchematic の実装の実装– 逐次版逐次版 : : 平均して平均して CC の の 2.52.5 倍倍– 並列版並列版 : : 高い台数効果高い台数効果

((5050 台で台で Fib:Fib:4747 倍倍 , , RNA:RNA:2424 倍倍 , , CKY:CKY:1515 倍倍 ))

Page 29: 並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組

今後の研究今後の研究 RNA, CKYRNA, CKY の台数効果をさらに向上の台数効果をさらに向上

– RNA:RNA: ビジー時間が伸びる原因の究明ビジー時間が伸びる原因の究明– CKY:CKY: アイドル時間を減らす手法の提案アイドル時間を減らす手法の提案

DSMDSM マシン上高性能実装技術の提案マシン上高性能実装技術の提案– 外山(四年)の手によってすでに移植は完了外山(四年)の手によってすでに移植は完了

コード複製戦略の改良コード複製戦略の改良– 頻繁に実行される部分を優先的に複製頻繁に実行される部分を優先的に複製

マルチスレッド拡張マルチスレッド拡張 CC の実装の実装