PowerPoint プレゼンテーション

Similar documents
Microsoft PowerPoint - 演習1:並列化と評価.pptx

Microsoft PowerPoint - 第10回講義(2015年12月22日)-1 .pptx

NUMAの構成

スライド 1

Microsoft PowerPoint - KHPCSS pptx

目 目 用方 用 用 方

コードのチューニング

Microsoft PowerPoint _MPI-03.pptx


86

Microsoft PowerPoint - 講義:片方向通信.pptx

C/C++ FORTRAN FORTRAN MPI MPI MPI UNIX Windows (SIMD Single Instruction Multipule Data) SMP(Symmetric Multi Processor) MPI (thread) OpenMP[5]

演習 II 2 つの講義の演習 奇数回 : 連続系アルゴリズム 部分 偶数回 : 計算量理論 部分 連続系アルゴリズム部分は全 8 回を予定 前半 2 回 高性能計算 後半 6 回 数値計算 4 回以上の課題提出 ( プログラム + 考察レポート ) で単位

Microsoft PowerPoint - 講義:コミュニケータ.pptx

スライド 1

MPI コミュニケータ操作

chap2.ppt

2 T 1 N n T n α = T 1 nt n (1) α = 1 100% OpenMP MPI OpenMP OpenMP MPI (Message Passing Interface) MPI MPICH OpenMPI 1 OpenMP MPI MPI (trivial p

120802_MPI.ppt

±é½¬£²¡§£Í£Ð£É½éÊâ

Microsoft PowerPoint MPI.v...O...~...O.e.L.X.g(...Q..)

Microsoft PowerPoint - 演習2:MPI初歩.pptx

para02-2.dvi

スライド 1

WinHPC ppt

MPI MPI MPI.NET C# MPI Version2

untitled

HPCセミナー

演習準備 2014 年 3 月 5 日神戸大学大学院システム情報学研究科森下浩二 1 RIKEN AICS HPC Spring School /3/5

HPCセミナー

MPI 通信ライブラリ規格化最前線 東京大学石川裕 目次 MPI 通信ライブラリとは? MPI 通信ライブラリ規格化の歴史 MPI 通信ライブラリ規格化の最近の動き 2008/12/11 2

Microsoft PowerPoint _MPI-01.pptx

コードのチューニング

Prog1_10th

Microsoft PowerPoint - MPIprog-C2.ppt [互換モード]

Notesアプリが iPadで動くDomino Mobile Apps ご紹介

PowerPoint プレゼンテーション

Windows 10の注意点

名称 : 日本 GPU コンピューティングパートナーシップ (G-DEP) 所在 : 東京都文京区本郷 7 丁目 3 番 1 号東京大学アントレプレナープラザ, 他工場 URL アライアンスパートナー コアテクノロジーパートナー NVIDIA JAPAN ソリュ

MPI

Microsoft PowerPoint 並列アルゴリズム04.ppt

プログラミングI第10回

第8回講義(2016年12月6日)

2007年度 計算機システム演習 第3回

44 6 MPI 4 : #LIB=-lmpich -lm 5 : LIB=-lmpi -lm 7 : mpi1: mpi1.c 8 : $(CC) -o mpi1 mpi1.c $(LIB) 9 : 10 : clean: 11 : -$(DEL) mpi1 make mpi1 1 % mpiru

05-opt-system.ppt

スライド 1

Microsoft PowerPoint - MPIprog-F2.ppt [互換モード]

Gfarm/MPI-IOの 概要と使い方

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

並列計算導入.pptx

Microsoft PowerPoint - 09.pptx

untitled

コンパイラ演習第 11 回 2006/1/19 大山恵弘 佐藤秀明 今回の内容 バリアント / レコード 表現方法 型付け パターンマッチ 型付け switch 文への変換 簡単な最適化 マッチング漏れ 以降のフェーズでの処理 発展 exhaustivenessinformation の利用 パター

Prog1_12th

gengo1-11

プログラミング実習I

(Microsoft PowerPoint \211\211\217K3_4\201i\216R\226{_\211\272\215\342\201j.ppt [\214\335\212\267\203\202\201[\203h])

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

講義の流れ 並列プログラムの概要 通常のプログラムと並列プログラムの違い 並列プログラム作成手段と並列計算機の構造 OpenMP による並列プログラム作成 処理を複数コアに分割して並列実行する方法 MPI による並列プログラム作成 ( 午後 ) プロセス間通信による並列処理 処理の分割 + データの

Microsoft PowerPoint - kougi11.ppt

プログラミング基礎

Intel MPI Library Linux

演習準備

<4D F736F F F696E74202D C097F B A E B93C782DD8EE682E890EA97705D>

MPI () MPIMessage Passing Interface MPI MPI OpenMP 7 ( ) 1

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

スライド 1

04-process_thread_2.ppt

使用する前に

2006年10月5日(木)実施

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

AppsWF ワークフロー設定ガイド Ver.1.1 株式会社オプロ

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

(C) 2011 amenbo the 3rd New MQL4(Build 600 以降 ); 基礎 ( その 2)OnTimer() を使う アメンボです New_MQL4 の特徴とはなんでしょう? 極論を言うと MQL5 から受け継いだ OOP つまり On***() 関

Fujitsu Standard Tool

CLEFIA_ISEC発表

情報処理演習 II

Taro-リストⅢ(公開版).jtd

MMUなしプロセッサ用Linuxの共有ライブラリ機構

LINE WORKS 管理者トレーニング 4. セキュリティ管理 Ver 年 6 月版

POWER EGG2.0 Ver2.8 スタートアップガイド ~Webデータベース 応用編~

スライド 1

Fujitsu Standard Tool

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

アプリケーション インスペクションの特別なアクション(インスペクション ポリシー マップ)

GNU開発ツール

Microsoft PowerPoint - 高速化WS富山.pptx

クイックスタートマニュアル目次 スマホサイトビルダーモビークとは? モビークの特徴 ドラッグ& ドロップで簡単編集 スタイリッシュなデザイン部品 PC サイトと自動連動 最高のSEO 対策導入までの流れ STEP1 初期デザイン設定 STEP2 ページの登録 STEP3 スマホページの編集 STEP

<4D F736F F D20B6BCB5D7B2CCDED7D8CFC6ADB1D9315F43532E444F43>

中継サーバを用いたセキュアな遠隔支援システム

ヤマハDante機器と他社AES67機器の接続ガイド

81 /******************************************************************************/ 82 /* スレーブアドレスの設定 */ 83 /*****************************************

デザインパターン第一章「生成《

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Microsoft Office Visioによる 施設管理について

Microsoft Word - Training10_プリプロセッサ.docx

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

Insert your Title here

< 動作マトリクス > 停止 REQ 固定位置 REQ 往復 REQ 停止 () 現在位置と同じなら無視異なれば停止パルス中へ 停止パルス中へ 停止 ( 固定位置 ) 現在位置と同じなら無視異なれば停止パルス中へ 停止パルス中へ 停止パルス中 ( 停止パルス終了後 ) ( 停止パルス終了後動作 )

Transcription:

AICS 公開ソフトウェア講習会 15 回 表題通信ライブラリと I/O ライブラリ 場所 AICS R104-2 時間 2016/03/23 ( 水 ) 13:30-17:00 13:30-13:40 全体説明 13:40-14:10 PRDMA 14:10-14:40 MPICH 14:40-15:10 PVAS 15:10-15:30 休憩 15:30-16:00 Carp 16:00-16:30 MPI-IO 16:30-17:00 Darshan 1

AICS 公開ソフトウェア講習会 PRDMA 畑中正行 2016/03/23 2

PRDMA とは? (1) PRDMA; Persistent Remote Direct Memory Access PRDMA (libprdma) は RDMA 転送が利用可能なインターコネクト上で 通信レイテンシや計算と通信のオーバーラップを改善するための MPI 永続通信 (MPI Persistent Communication) プリミティブの実装 現在 京コンピュータの Tofu インターコネクトをサポート 3

PRDMA とは? (2) やりたいこと 広く使われる isend / irecv MPI 通信の通信レイテンシを改善したい 方法 インターコネクトの RDMA-Write/Read を使って 直接ユーザバッファに転送する 生のハードウェアに近い性能を出せる可能性があります そのために 既存の MPI_Isend / MPI_Irecv / MPI_Waitall のコードを 永続通信に書き換えてください 意外と簡単だし 今後きっといいことがあるでしょう 4

PRDMA とは? (3) MPI Isend / Irecv における性能問題 内部プロトコルのオーバヘッド Rendezvous プロトコルにおけるハンドシェイク Eager プロトコルにおけるデータ コピーとフロー制御 上記のオーバヘッドを削減するため : isend/irecv 呼出しを直接下位の RDMA 操作に写像 しかし isend/irecv セマンティックスが複雑すぎる Tag Matching, Message Order Preservation,...» isend/irecv から離れれば RMA や隣接集団 (MPI-3) 可 実害のなさそうな範囲でセマンティックスを制限して 移植性を保持しつつ 永続通信の利点を活かし高速化を狙う 5

永続通信とは MPI 永続通信 (Persistent Communication) ほとんどの MPI 実装で利用可能 MPI 1.1 仕様以来の MPI 標準 MPI-1.0 (1994), MPI-2.0 (1997), MPI-3.0 (2012) 京の MPI 実装は MPI-2.2 版 ( 富士通 MPI) MPI 通信タイプからの分類 基本 MPI 通信機能 双方向 (1 対 1) 通信 一方向 ( 片側 ) 通信 集団通信 双方向 (1 対 1) 通信 ブロッキング通信 MPI_Send, MPI_Recv,... 非ブロッキング通信» 非永続通信 MPI_Isend, MPI_Irecv,...» 永続通信 MPI_Send_init, MPI_Recv_init,... 6

永続通信への書き換え MPI 1 対 1 (point-to-point) 通信 int MPI_Isend( const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Irecv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Waitall( int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[] ); MPI_Isend の変型に MPI_Ibsend, MPI_Issend, MPI_Irsend がある MPI 永続 (persistent) 通信 int MPI_Send_init( const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Recv_init( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Startall( int count, MPI_Request array_of_requests[] ); MPI_Send_init の変型に MPI_Bsend_init, MPI_Ssend_init, MPI_Rsend_init がある 7

書き換え方 例 等価な書き換え例 ( 1 対 1 通信 ; NB 永続通信 ; PC ) Non-Blocking send/recv (NB) MPI_Request req[2]; do { MPI_Irecv(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Isend(sb, cnt, dt, dst, tag, comm, &req[1]); /* computation */ MPI_Waitall(2, req); } while ( ); Persistent Communication (PC) MPI_Request req[2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { MPI_Startall(2, req); /* computation */ MPI_Waitall(2, req); } while ( ); 初期化時に作り置き Startall に置換え 8

書き換え方 呼出し方法 書き換え方は簡単 int MPI_Send_init( const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Recv_init( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request ); MPI_Send_init の変型に MPI_Bsend_init, MPI_Ssend_init, MPI_Rsend_init がある MPI_Isend と MPI_Send_init の呼出し形式は同じ MPI_Irecv と MPI_Recv_init の呼出し形式も同じ 違い 初期化と通信開始が分離 MPI_Request のセットでの通信開始 (MPI_Startall) 9

書き換え方 呼出し方法 (2) 書き換え方は簡単 int MPI_Startall( int count, MPI_Request array_of_requests[] ); int MPI_Waitall( int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[] ); MPI_Startall の変型に MPI_Start MPI_Waitall の変型に MPI_Wait がある 元々あった MPI_Isend/Irecv を MPI_Startall で置換 元々あった MPI_Waitall はそのまま isend/irecv と違って MPI_Request は再利用可 ( 永続 ) MPI_Request を無効にするには MPI_Request_free() 10

書き換え方 まとめ isend/irecvと等価な永続通信コードへの置換え方を概説 プログラムの初期化時に MPI_Send_init/Recv_init MPI_Startall で通信開始 MPI_Waitall 後も何度も MPI_Startall 可 ここからは PRDMA を使用する上での追加の制約を説明 対にせよ 組にせよ 11

書き換え方 注意 (1) 対にせよ (1) 永続通信の通信相手は 永続通信に! は MPI 仕様上許されているが PRDMA では禁止 MPI_Request req[2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { MPI_Startall(2, req); /* computation */ MPI_Waitall(2, req); } while ( ); MPI_Request req[2]; MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { MPI_Irecv(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Startall(2, req); /* computation */ MPI_Waitall(2, req); } while ( ); 12

書き換え方 注意 (2) 対にせよ (2) 通信相手の MPI_Send_init または MPI_Recv_init の引数 cnt と dt は一致すること 不一致は MPI 仕様上 許されているが PRDMA では禁止 MPI_Request req[2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { MPI_Startall(2, req); /* computation */ MPI_Waitall(2, req); } while ( ); 特殊な値の扱い MPI_Recv_init 可能 cnt = 0 不可 dt = 不連続なデータ型可能 src = MPI_PROC_NULL 不可 src = MPI_ANY_SOURCE 不可 tag = MPI_ANY_TAG MPI_Send_init 可能 cnt = 0 不可 dt = 不連続なデータ型可能 src = MPI_PROC_NULL 13

書き換え方 注意 (3) 対にせよ (3) 動的に対 (MPI_Request) の一方を変更しない req[x] は一意に通信相手の req[y] を指す ( <{src dst},tag,comm>) MPI 仕様上許されているが PRDMA では禁止 MPI_Request req[2], alt[2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); MPI_Recv_init(rb2, cnt, dt, src, tag, comm, &alt[0]); alt[1] = req[1]; do { if ((iteration == 10) (myrank == 0)) { MPI_Startall(2, req); } else { MPI_Startall(2, alt); } /* computation */ MPI_Waitall(2, req); } while ( ); 14

書き換え方 注意 (4) 組にせよ (1) 永続通信に対する MPI_Startall と 対応する MPI_Waitall の引数 count と array_of_requests は一致すること 主に 性能上の理由から PRDMA では必須 MPI_Request req[2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { MPI_Startall(2, req); /* computation */ MPI_Waitall(2, req); } while ( ); PRDMA 内部では 未知 ( 最初 ) の count 及び array_of_requests の組に対し 通信パターンを分析し 可能なら最適化を行う その組を管理し 以降の Startall/Waitall 呼出しで 多くのチェックを回避可能 MPI_Startall(2, req); MPI_Waitall(1, &req[0]); MPI_Waitall(1, &req[1]); ばらさない 15

書き換え方 注意 (5) 組にせよ (2) 永続通信に対する MPI_Startall の array_of_requests に isend / irecv の request を混ぜ込まない 主に 性能上の理由から PRDMA では必須 MPI_Request req[2+2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { MPI_Irecv(..., &req[2] ); MPI_Isend(..., &req[3] ); MPI_Startall(2+2, req); /* computation */ MPI_Waitall(2+2, req); } while ( ); PRDMA 内部では 未知 ( 最初 ) の count 及び array_of_requests の組に対し 通信パターンを分析し 可能なら最適化を行う 最適化がうまく働かない可能性がある MPI_Startall を永続通信用とそうでないものの 2 つに分けることを推奨 16

書き換え方 注意 (5) 組にせよ (3) 永続通信に対する MPI_Startall 及び MPI_Waitall の array_of_requests の配列の要素の順序を入れ替えない 主に 性能上の理由から PRDMA では必須 MPI_Request req[2]; MPI_Recv_init(rb, cnt, dt, src, tag, comm, &req[0]); MPI_Send_init(sb, cnt, dt, dst, tag, comm, &req[1]); do { { MPI_Request tmp = req[0]; req[0] = req[1]; req[1] = tmp; } MPI_Startall(2, req); /* computation */ MPI_Waitall(2, req); } while ( ); PRDMA 内部では MPI_Startall において未知 ( 最初 ) の count 及び array_of_requests の組を管理し 以降の Startall/Waitall 呼出しで 多くのチェックを回避可能 未知の組か 既知の組かを判断するために 一意の並びにするため req[] の要素をソートした後で 全要素の比較が必要になる 17

書き換え方 まとめ isend / irecv を RDMA 転送に直接マップする際の問題 MPI point-to-point (1 対 1 通信 ) int MPI_Isend( const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request ); int MPI_Irecv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request *request ); PRDMA で課した制約 RDMA 転送で通信相手の送信 or 受信バッファアドレスが不明 さらに 送信と受信とで count/datatype が異なる可能性 さらにさらに buf/count/datatype が呼出し毎に変わる可能性 MPI_Send_init / MPI_Recv_init で RDMA バッファアドレス交換 その後は 制約 により 送受両側の MPI_Request の一意の関係を維持 isend/irecv 毎の同期の管理 理想 : ユーザ定義の通信パターン全体で 1 回の同期 (request) MPI_Startall / MPI_Waitall で全体同期 tag マッチング要 さらに ワイルドカード MPI_ANY_SOURCE / MPI_ANY_TAG の存在 (source / tag) さらにさらに isend の発行順序と到着順序との暗黙の順序制約あり mpi_probe もあり MPI_Startall + 制約 により Message Order Preservation を緩和 MPI_ANY_SOURCE, MPI_ANY_TAG, mpi_probe は性能重視とは思えないので PRDMA の対象外 18

PRDMA の使い方 libprdma は 京 で提供される Open MPI ベースの富士通製 MPI 実装と組合せで使用 オリジナル MPI 永続通信関連関数を置換え MPI アプリケーションの起動 (mpiexec) 時 LD_PRELOAD 環境変数を指定することによって libprdma.so ライブラリを動的にリンク PRDMA_PATH=/opt/aics/prdma/current/lib64/libprdma.so mpiexec x LD_PRELOAD=${PRDMA_PATH}/libprdma.so./a.out... 19

libprdma 情報 ジョブスクリプトサンプル /opt/aics/prdma/templates/run-templ-01.sh 京でのインストール場所 ( 計算ノード ) /opt/aics/prdma/current/lib64/libprdma.so ログインノードにも 同パスにバイナリが配置されている 20

使用上の注意 libprdma では RDMA-Write/Read に 富士通の拡張 API である FJMPI_Rdma_* を使用 RDMA メモリ登録ができても 削除できないので 登録数が超過して失敗することがあります 登録数を減らすため Halo 通信などでは 袖ごとに MPI_Send_init/MPI_Recv_init する前に 行列全体を MPI_Send_init/MPI_Recv_init してください MPI_Startall しなければ実害はありません 21

まとめ PRDMA 永続通信化 + 実害の少ない制約 高速化が可能 コード改変は容易 + コード移植性も問題なし PRDMA なしでも 改変後のコードはほとんどの MPI 実装で Isend/Irecv と遜色ない性能 ( 性能ポータビリティ ) バイナリはそのままで LD_PRELOAD するだけで PRDMA 有効に 改変後のコードは MPI-3 隣接集団通信 (Neighborhood Collective) や 標準化作業中の候補機能 MPI-4 永続集団通信 (Persistent Collective) と相性がよい 22

Backup Slides 23