並行計算に基づく 並列プログラミング言語のための...
DESCRIPTION
並行計算に基づく 並列プログラミング言語のための 効率的なコンパイルの枠組. 大山恵弘 東京大学大学院 理学系研究科 情報科学専攻 米澤研究室. 記述が楽. 実行が速い. かつ. 言語がほしい. 今日の並列プログラミング. ポピュラーな方法. C, Fortran,. 並列拡張ライブラリ. +. プログラマ の責任. メモリ管理. 同期、通信. スレッド(プロセス)の生成と終了. なぜポピュラーか?. C で書けば速いよ!. しかし、、、 多くの 開発時間、人員、能力. 細粒度スレッドをサポートする言語 (1/2). 例 - PowerPoint PPT PresentationTRANSCRIPT
並行計算に基づく並行計算に基づく並列プログラミング言語のための並列プログラミング言語のための
効率的なコンパイルの枠組効率的なコンパイルの枠組
大山恵弘大山恵弘
東京大学大学院 理学系研究科東京大学大学院 理学系研究科情報科学専攻 米澤研究室情報科学専攻 米澤研究室
今日の並列プログラミング今日の並列プログラミング
並列拡張ライブラリ並列拡張ライブラリ++
ポピュラーな方法ポピュラーな方法
C, Fortran, ...C, Fortran, ...
しかし、、、しかし、、、多くの多くの開発時間、人員、能力開発時間、人員、能力
メモリ管理メモリ管理スレッド(プロセス)の生成と終了スレッド(プロセス)の生成と終了
同期、通信同期、通信 プログラマプログラマの責任の責任
なぜポピュラーか?なぜポピュラーか?
CC で書けば速いよ!で書けば速いよ!
記述が楽 実行が速いかつかつ 言語がほしい言語がほしい
細粒度スレッドをサポートする細粒度スレッドをサポートする言語言語
(( 1/21/2 ) ) 例例
– 並列オブジェクト指向言語並列オブジェクト指向言語– 並行論理型言語並行論理型言語– 関数型言語+並列拡張関数型言語+並列拡張
特徴特徴– 動的スレッド生成で並列性抽出動的スレッド生成で並列性抽出 (( FibFib の例の例 : 2: 2 つの子をスレッド生成して計算)つの子をスレッド生成して計算)– 多数のスレッドを生成可能(何十万、何百万)多数のスレッドを生成可能(何十万、何百万)
細粒度スレッドをサポートする細粒度スレッドをサポートする言語言語
(( 2/22/2 )) 利点利点
– 均等な負荷分散均等な負荷分散– プロセッサ効率の向上プロセッサ効率の向上– アルゴリズムの自然な記述アルゴリズムの自然な記述
実装上の問題実装上の問題– 動的スレッド生成オーバヘッド動的スレッド生成オーバヘッド– 同期、通信オーバヘッド同期、通信オーバヘッド
細粒度スレッドをサポートする細粒度スレッドをサポートする言語言語
(( 2/22/2 ))
細粒度スレッド技術細粒度スレッド技術9797 年度輸出状況(推定)年度輸出状況(推定)
AntarcticAntarctic
LondonLondonMoscowMoscow
Cape TownCape Town
DakarDakarSingaporeSingapore
SydneySydney
Hong KongHong Kong
New YorkNew YorkLos AngelesLos Angeles
SalvadorSalvador
細粒度マルチスレッドが有効な例 細粒度マルチスレッドが有効な例 (( 1/21/2 ))
•例題1例題1 : : 枝刈りつき並列木探索(枝刈りつき並列木探索( RNARNA ))
特徴特徴 : : 部分木の計算量予測困難部分木の計算量予測困難
6464 台台 CPUCPU 使用時に使用時に 6565 個の個のスレッドができたら困るスレッドができたら困る
負荷の不均衡負荷の不均衡
仕事の単位を仕事の単位を細かく分ける必要細かく分ける必要
細粒度マルチスレッド言語細粒度マルチスレッド言語 ::言語言語が細かい仕事を管理が細かい仕事を管理
特徴特徴 : : 同期待ち時間同期待ち時間 予測困難予測困難
•例題例題 2: 2: 並列文法解析(並列文法解析( CKYCKY ))
CC による単純な記述による単純な記述 ::スピンロックで待つスピンロックで待つ
細粒度マルチスレッド言語細粒度マルチスレッド言語 ::CPUCPU を無駄にせずを無駄にせず別の仕事を実行別の仕事を実行
細粒度マルチスレッドが有効な例 細粒度マルチスレッドが有効な例 (( 2/22/2 ))
長時間無駄仕事する可能性長時間無駄仕事する可能性
貢献貢献 細粒度スレッドの効率的なコンパイルの枠組み細粒度スレッドの効率的なコンパイルの枠組み
– 並行計算を利用並行計算を利用– スレッドスケジューリングの回数を減らす技法スレッドスケジューリングの回数を減らす技法– スレッド間通信をレジスタで行う技法スレッド間通信をレジスタで行う技法
並列オブジェクト指向言語並列オブジェクト指向言語 SchematicSchematic の実装の実装– 単一プロセッサ単一プロセッサ WS & SMPWS & SMP– Lazy Task Creation Lazy Task Creation 方式による動的負荷分散を実装方式による動的負荷分散を実装
現実的なアプリケーションで性能評価現実的なアプリケーションで性能評価– CC と比較と比較
以降の発表の流れ以降の発表の流れ
我々の使用する言語我々の使用する言語 ナイーブなコンパイル技法ナイーブなコンパイル技法 提案するコンパイル技法提案するコンパイル技法
– コンパイル時スケジューリングコンパイル時スケジューリング– Unboxed Unboxed チャネルチャネル
動的負荷分散動的負荷分散 性能評価性能評価 関連研究関連研究
我々の言語の概要我々の言語の概要 表層言語表層言語 : : Schematic [Schematic [ 田浦ら 田浦ら 96]96]
– Scheme Scheme ++非同期呼び出し拡張非同期呼び出し拡張– 高効率なスレッド生成高効率なスレッド生成
• 呼び出しコスト呼び出しコスト : : 同期呼び出し ≒ 非同期呼び出し同期呼び出し ≒ 非同期呼び出し
– 11st-class st-class の通信媒体(チャネル)の通信媒体(チャネル)
中間言語中間言語 : : 並行計算並行計算 HACL [HACL [小林ら 小林ら 95]95]– プロセスがチャネル通信によって計算プロセスがチャネル通信によって計算– ごく少数の本質的なプリミティブごく少数の本質的なプリミティブ– 単純で解析や最適化の 単純で解析や最適化の platform platform に適するに適する
細粒度マルチスレッド言語の細粒度マルチスレッド言語のナイーブな実行方式ナイーブな実行方式
スレッド生成 = タスクキューへのエンキュースレッド生成 = タスクキューへのエンキュー
タスクキュー内の各仕事はメモリで通信タスクキュー内の各仕事はメモリで通信
受信成功受信成功 :: を実行可能な仕事としてを実行可能な仕事として
タスクキューにエンキュータスクキューにエンキュー
受信失敗受信失敗 :: を待ちキューにエンキューしを待ちキューにエンキューしタスクキューから仕事を取り出して実行タスクキューから仕事を取り出して実行
提案するコンパイル技法提案するコンパイル技法[[ 大山ら 大山ら Euro-Par 97]Euro-Par 97]
最適化最適化 1: 1: コンパイル時スケジューリンコンパイル時スケジューリンググ– 複数のスレッドのコードを並べて生成複数のスレッドのコードを並べて生成– タスクキュー操作の回数を削減タスクキュー操作の回数を削減
最適化最適化 2: 2: unboxed unboxed チャネルチャネル– レジスタにチャネルの内容と状態を持たせレジスタにチャネルの内容と状態を持たせ
るる– メモリを使用しないスレッド間通信メモリを使用しないスレッド間通信
変換規則による変換規則によるコンパイルアルゴリズムの記コンパイルアルゴリズムの記
述述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
.....
コンパイル時スケジューリング コンパイル時スケジューリング (( 1/21/2 ))
受信受信 if ( 受 信 成功 ) then
else
noを待ちキューに格納スレッドスレッド
コンパイル時スケジューリングコンパイル時スケジューリング (( 2/22/2 ))
f (r,1,2) f (r,1,2) の 本 体 へ 飛 ぶ
noをスタックにプッシュ
スタックスタック : : 実行可能なクロージャの集合を保持実行可能なクロージャの集合を保持
unknownunknown な関数な関数
タスクキューが不要なわけではないタスクキューが不要なわけではない
コード複製戦略コード複製戦略 if ( 受 信 成功 ) then
else
複製を行わずコード生成複製を行わずコード生成
全く複製しないコードサイズ全く複製しないコードサイズ××
プログラマが与えた定数プログラマが与えた定数
≦≦
生成されるコードサイズ生成されるコードサイズ
Unboxed Unboxed チャネルチャネル
unboxedunboxedチャネルチャネル
unboxedunboxedチャネルチャネル
レジスタ上で値通信レジスタ上で値通信
スタックスタック
• [[ 田浦ら田浦ら 94]94] で最初に提案で最初に提案• レジスタ上にチャネルの状態と内容を保持レジスタ上にチャネルの状態と内容を保持• 必要に応じメモリにチャネルを作成必要に応じメモリにチャネルを作成
動的負荷分散動的負荷分散 Lazy Task CreationLazy Task Creation [ [Mohr et al. 91Mohr et al. 91] ] に基づくに基づく
レジスタ上レジスタ上通信通信
仕事を盗む仕事を盗む
メモリ上通信メモリ上通信
性能測定性能測定
同じアルゴリズムの同じアルゴリズムの CC プログラムと比較プログラムと比較 逐次版逐次版 : : SS20 (HyperSparc 150MHz)SS20 (HyperSparc 150MHz) 並列版並列版 : : Sun Enterprise 10000Sun Enterprise 10000
(UltraSparc 250 MHz (UltraSparc 250 MHz × 64)× 64) SchematicSchematic の動的型チェックは除いているの動的型チェックは除いている 並列版並列版 SchematicSchematic のの GCGC 時間は除いている時間は除いている
逐次版性能測定結果逐次版性能測定結果(各最適化の効果)(各最適化の効果)
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 )コンパイル時スケジューリングなし チャネルなし
逐次版性能逐次版性能測定測定結果結果(( 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)
並列版性能測定結果並列版性能測定結果(単純な並列性を持つ問題)(単純な並列性を持つ問題)
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
並列版性能測定結果 (並列版性能測定結果 ( 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
並列版性能測定結果 (並列版性能測定結果 ( CKYCKY ))Scalability
0
10
20
30
40
50
0 10 20 30 40 50 60Number of PEs
Spe
edUp
C Schemati c
関連研究 (関連研究 ( 1/31/3 ))
IdId [[Schauser et al. 95Schauser et al. 95]], , FlengFleng [[荒木ら 荒木ら 9797]]
– 依存関係解析によるスレッドの静的融合依存関係解析によるスレッドの静的融合– 我々は同様の効果をコード複製によって実現我々は同様の効果をコード複製によって実現
PictPict [[TurnerTurner 9696]]
– 我々と同じく並行計算のコンパイルを扱う我々と同じく並行計算のコンパイルを扱う– すべてのチャネル操作にメモリ操作が必要すべてのチャネル操作にメモリ操作が必要– 受信前と後の実行を同一スレッド内で行えな受信前と後の実行を同一スレッド内で行えな
いい
関連研究 (関連研究 ( 2/32/3 )) StackThreadsStackThreads [[ 田浦ら 田浦ら 94, 9794, 97]]
– Unboxed Unboxed チャネルを最初に提案チャネルを最初に提案– 我々は 我々は unboxed unboxed チャネルを、一般的なチャネルを、一般的な 並行計算のコンパイルの枠組みの中に導入並行計算のコンパイルの枠組みの中に導入
リニアチャネル リニアチャネル [[小林ら 小林ら 96,96, 五十嵐ら 五十嵐ら 9797]]
– リニアチャネル = 一回だけ使われるチャネルリニアチャネル = 一回だけ使われるチャネル– リニアチャネルによる通信を静的に除去リニアチャネルによる通信を静的に除去– Unboxed Unboxed チャネルとは直交した方法で、共存可能チャネルとは直交した方法で、共存可能
関連研究 (関連研究 ( 3/33/3 )) CPSCPS [[Appel 92Appel 92]]
– 逐次言語のためのコンパイルの枠組み逐次言語のためのコンパイルの枠組み– Unboxed Unboxed チャネルの定式化にチャネルの定式化に 彼らの 彼らの callee-save callee-save レジスタの技術を使用レジスタの技術を使用
CilkCilk [ [Blumofe et al. 95Blumofe et al. 95]]– CC を非同期関数呼び出し拡張を非同期関数呼び出し拡張– 我々と同じく細粒度スレッドを効率よく実行我々と同じく細粒度スレッドを効率よく実行– 我々の言語よりも同期構造が制限されている我々の言語よりも同期構造が制限されている
• 親が子の終了を待つ以外の同期ができない親が子の終了を待つ以外の同期ができない
結論結論 並行計算を効率的にコンパイルする枠組み並行計算を効率的にコンパイルする枠組み
– コンパイル時スケジューリング コンパイル時スケジューリング (( スレッドの融スレッドの融合合 ))
– Unboxed Unboxed チャネル チャネル (( レジスタ上スレッド間通信レジスタ上スレッド間通信 ))
並列オブジェクト指向言語並列オブジェクト指向言語 SchematicSchematic の実装の実装– 逐次版逐次版 : : 平均して平均して CC の の 2.52.5 倍倍– 並列版並列版 : : 高い台数効果高い台数効果
((5050 台で台で Fib:Fib:4747 倍倍 , , RNA:RNA:2424 倍倍 , , CKY:CKY:1515 倍倍 ))
今後の研究今後の研究 RNA, CKYRNA, CKY の台数効果をさらに向上の台数効果をさらに向上
– RNA:RNA: ビジー時間が伸びる原因の究明ビジー時間が伸びる原因の究明– CKY:CKY: アイドル時間を減らす手法の提案アイドル時間を減らす手法の提案
DSMDSM マシン上高性能実装技術の提案マシン上高性能実装技術の提案– 外山(四年)の手によってすでに移植は完了外山(四年)の手によってすでに移植は完了
コード複製戦略の改良コード複製戦略の改良– 頻繁に実行される部分を優先的に複製頻繁に実行される部分を優先的に複製
マルチスレッド拡張マルチスレッド拡張 CC の実装の実装