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
© Copyright 2025 ExpyDoc