A profiling tool for visualizing implicit behavior

PGAS 言語X10 の暗黙的な挙動を可視
化するプロファイリングツールの開発
板橋 晟星
佐藤 芳樹
千葉 滋
千葉研究室, M2
千葉研究室 板橋晟星
1
HPCにおける分散並列技術
• 分散並列プログラム
– 並列スレッドの同期が難しい
– 分散ノード上のメモリアクセスが難しい
• 主な分散並列技術
– MPI (OpenMPI, MPICH)
• メッセージパッシングスタイル
• 明示的にデータの送受信(send/receive) コードを記述
– PGAS言語 (X10, UPC, CAF, Chapelなど)
• 分散配列、遠隔参照など
千葉研究室 板橋晟星
2
X10とは?
• PGAS型のメモリ(Partitioned Global Address Space)
– メモリ空間がプレースと呼ばれる単位で区切られている
アクティビティ
(≒スレッド)
• ハイパフォーマンス
– 区切られたメモリ空間を意識して、データ局所性を高められる
• 高い生産性
– 高度に抽象化された構文を提供
• データ送受信を明示的にコードに書く必要がない(暗黙的な送受信)
• アクティビティ(≒スレッド)生成や同期制御が容易
千葉研究室 板橋晟星
3
X10の提供する抽象化構文
• async: アクティビティ(≒スレッド)を生成
• at: 別のプレース(≒メモリ空間)に移動
• finish: バリア同期
• 分散配列: 計算に使用する資源(配列)をあら
かじめ、各プレースに均等に分散しておく
千葉研究室 板橋晟星
4
動機と目的:暗黙的な挙動を可視化
X10をはじめ、プログラミング言語では
ローレベルな処理を抽象化する方向に向かっている
挙動が暗黙的となり、より一層見えなくなっている
チューニングや性能デバッグが困難
千葉研究室 板橋晟星
6
1. 暗黙的なデータ送受信
 変数aはどのタイミングでプレース2に送信されるのか?
 どのくらいの量のデータが送信されるのか?
 変数aはどのルートで送信されるのか?
←10要素の配列を1で初期化
←プレース1へ移動
←プレース2へ移動
atはプレース(メモリ空間)
←最初の要素のみ参照
を移動する構文
• パフォーマンスチューニングのために、これらの情
報を容易に知りたい
•  しかし、これらの情報をすぐに得るのは非常に難しい
– コードが複雑になればさらに難しくなる
千葉研究室 板橋晟星
8
2. 同期制御でのCPU資源浪費
バリア同期開始
バリア同期
finish {
async { S1; }
async { S2; }
async { S3; }
}
Activity A
B
S1
C
S2
S3
ブロッキング(同期待ち)時間が
CPU資源を浪費している可能性
アクティビティ(スレッド)生成構文
バリア同期終了
• 同期制御やアクティビティ生成が容易
– finish構文、async構文で容易に記述可
– 無駄な同期や無駄な同期待ちが発生しやすい
千葉研究室 板橋晟星
9
3. 同期制御内のコードが散在する場合
• どの async がどの finish (同期制御)に参加するか
– async (アクティビティ生成)の実行回数は変数
num と taskSetの値に依存
いくつのアクティビティが参加
アクティビティの数は変数num と taskSetの値に依存
→ num と taskSet を追跡する必要性
千葉研究室 板橋晟星
10
Moreover…
逐次実行(全てのタスクを1アクティビティで)
完全な並列実行(1アクティビティ1タスク)
適度な並列実行(変数numの値によって1アクティビティあたりに実行するタスク数が決まる)
千葉研究室 板橋晟星
11
X-Eye:X10用のプロファイラ
とビジュアライザ (1/2)
• atやfinishなどの並列分散構文によるX10固有の
イベントの情報をruntimeに取得するプロファイラ
– X10のソースコード変換で実装
– 実行時システムは変更しない
• C++, Javaバックエンド両方に対応可能
追跡コードを挿入してコンパイル
X10 source
code
X10 Compiler with Profiling
Extending Impl. of X10 compiler
ログを解析
Visualizer
Based on JavaFX
Log
data
X10 binary
code
実行して、
ログを生成
千葉研究室 板橋晟星
12
X-Eye:X10用のプロファイラ
とビジュアライザ (2/2)
• イベントを可視化し、専用DSLで対話的に可視化範
囲を絞り込めるビジュアライザ
• Java 8のStream APIライクな記述方式
• 条件をラムダ式で記述
• 途中結果を見ながら対話的にフィルタリング可能
記述例: eventStream = eventStream.filter(e -> e.execPlace == 0);
プレース0で起きたイベントのみ表示
実行
千葉研究室 板橋晟星
13
デモンストレーション
千葉研究室 板橋晟星
14
X-Eyeで取得する情報(1/2)
• X10固有のイベントの実行時情報
– at, async, finish等
• X10 runtimeによる暗黙的なデータ送受信量
– コンパイル中にプロファイラが、送受信される変数
を静的に決定し、それぞれの送受信サイズを推定
• X10 runtimeの実装を解析してサイズを推定
• 推定されたサイズや変数名は追跡コード中に埋め込む
– 実行時に、追跡コードが各変数名とサイズを記録
千葉研究室 板橋晟星
15
X-Eyeで取得する情報(2/2)
• アクティビティ識別子
– アクティビティ(X10のスレッド)に番号をつけることで、
区別する機能を実装
– 追跡コードはアクティビティ識別子を取得する
• イベントを実行したアクティビティを特定
• 同期制御の中で生成されるアクティビティを特定
– X-Eyeはユーザー定義メソッドを拡張し、新しい引数を
一つ追加し、識別子を渡せるようにする
• メソッドがどのアクティビティで実行されているのかを把握で
きるようになる
千葉研究室 板橋晟星
16
X-Eyeの実装
• プロファイラ
AST:構文解析木
– X10コンパイラを拡張しASTに追跡コードを挿入
• Polyglot用のVisitorプログラムを開発
• ビジュアライザ
– GUIはJavaFXアプリケーションで実装
– フィルタリングDSLはJavaコード片であるため、オンメ
モリでコンパイル、クラスファイル生成、ロード実行
千葉研究室 板橋晟星
17
プロファイラの
挿入する
追跡コードの例
• X10コンパイラを
拡張してプロファ
イラを開発
追跡コードを
挿入
千葉研究室 板橋晟星
18
JSON形式の実行時イベント情報の例
千葉研究室 板橋晟星
19
チューニングに向けて、
X-Eyeで分かったこと
• KMeansDist.x10
– 現在のプレースと同じプレースへの移動が発生し
ているアクティビティがある
– アクティビティ0-0(メインアクティビティ)はすべての
プレースに移動して、新しいアクティビティを生成し
ている
• 並列化できる可能性がある
• NQueensPar.x10
– 同期制御でオーバーヘッドの原因となっているアク
ティビティがある
千葉研究室 板橋晟星
20
Source Place(移動元プレース)と
Target Place(移動先プレース)が同じ
拡大
同じプレースへのD(データ送受信を伴う移動)
が複数個確認できる
変数pの送受信経路でも同じプレースに何度も送受信されたことが確認できる
千葉研究室 板橋晟星
21
各プレースをまわって子アクティビティを生成
並列化すれば速度が上がる可能性
千葉研究室 板橋晟星
22
チューニングに向けて、
X-Eyeで分かったこと
• KMeansDist.x10
– 現在のプレースと同じプレースへの移動が発生し
ているアクティビティがある
– アクティビティ0-0(メインアクティビティ)はすべての
プレースに移動して、新しいアクティビティを生成し
ている
• 並列化できる可能性がある
• NQueensPar.x10
– 同期制御でオーバーヘッドの原因となっているアク
ティビティがある
千葉研究室 板橋晟星
23
同期マーク(F)
アクティビティ0-2が同期待ちを長くさせている
千葉研究室 板橋晟星
25
プロファイラのオーバーヘッド実験
(追跡コード自体の実行時間)
–
–
–
–
CPU: Intel Xeon E5-2687W 3.10GHz 8 cores x 2, RAM: 64GB (単一マシン)
OS: CentOS release 6.2
X10 コンパイラ及び処理系のバージョン: 2.4.0
1000回ウォームアップした後に10万回連続実行した結果を載せた
追跡コードの実行時間(マイクロ秒)
async
at
finish
atomic
3.5
11.81
0.58
0.6
• atの追跡コードの実行時間が長い
 at実行時に追跡コードの一部も送受信されるため
 追跡コードの挿入量が他の2倍
• asyncの追跡コードの実行時間が次に長い
 アクティビティ情報を管理するオブジェクトを生成するため
千葉研究室 板橋晟星
26
KMeansDist.x10とNQueensDist.x10
–
–
–
–
–
CPU: Intel Xeon E5-2687W 3.10GHz 8 cores x 2, RAM: 64GB
OS: CentOS release 6.2
X10 コンパイラ及び処理系のバージョン: 2.4.0
NQueensDist.x10は各プレースにおいて各Nの値で実行したうちの最大値を載せた
10回ウォームアップした後に50回連続実行した結果を載せた
KMeansDist.x10とNQueensDist.x10
におけるオーバーヘッド
70
60
パ
ー
セ
ン
ト
50
40
KMeansDist.
x10
NQueensDist
.x10
30
20
10
0
1
4
8
12
プレース数
16
20
千葉研究室 板橋晟星
27
KMeansDist.x10におけるイベント発生数の変化
50000
45000
40000
35000
30000
個 25000
数
20000
async(生成)
15000
finish(同期)
at(移動)
atomic(排他計算)
10000
5000
0
1
4
8
12
プレース数
千葉研究室 板橋晟星
16
20
28
NQueensDist.x10におけるイベント発生数の変化
2500000
2000000
1500000
async
個
数
at
1000000
finish
atomic
500000
0
12
13
14
15
NクイーンにおけるNの値
千葉研究室 板橋晟星
29
NQueensPar.x10におけるオーバーヘッド
パ
ー
セ
ン
ト
3
2.5
2
1.5
1
0.5
0
10
11
12
NクイーンにおけるNの値
13
14
NQueensPar.x10におけるイベント数の変化
1200000
1000000
800000
async
個 600000
数
400000
at
finish
200000
atomic
0
10
11
12
13
NクイーンにおけるNの値
14
千葉研究室 板橋晟星
30
関連研究
• Guiding to X10 Programmers to Improve Runtime
Performance, Paudel Jeeva, Olivier Tardieu, and Jose Nelson Ama-ral. 7th
International Conference on PGAS Pro-gramming Models, 2013.
– XAnalyzerというツール
– 事前に用意した8つの悪いコードパターンを検出
– 事前に用意したより良いパターンを提示する
• Data-centric Performance Analysis of PGAS Applications,
Nathan Tallent and Darren Kerbyson. 2nd Int'l Work-shop on High-performance
Infrastructure for ScalableTools (WHIST 2012), 2012.
– グローバルデータオブジェクトの read と write を検出
– Global ArraysというPGAS言語が対象
• Automatic Communications Performance Debugging in
PGAS Languages, Jimmy Su and Katherine A. Yelick. LCPC, LNCS 5234, pages
232{245. Springer, 2007.
– ti-trend-profというツール
– Remote read and writのパフォーマンデバッグ
– TitaniumというPGAS言語が対象
千葉研究室 板橋晟星
31
まとめ
• X10の抽象化構文による暗黙的な挙動を可視化
するプロファイリングツールX-Eyeを開発
– 暗黙的なデータ送受信が見える
– 同期制御内でのアクティビティの挙動が見える
– フィルタリングDSLによって可視化範囲を制限できる
– ベンチマークを使った実験でオーバーヘッドを測定
千葉研究室 板橋晟星
32
今後の展望
• atとasyncの追跡コードの実行時間を削減
• スコーピング機能の拡張
– 可視化した後、コンテキスト情報に基づいて選択的
に再プロファイリングできるようにする
1. 実行コンテキストに基づく対話的フィルタリングが可能
2. 追跡コード削減でプロファイル時のオーバーヘッドも改善
• 分散配列の追跡をできるようにする
– 配列を各プレースに分散させる実行コードに対して
追跡コードを挿入
千葉研究室 板橋晟星
33