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



Similar documents
Microsoft PowerPoint - S1-ref-F.ppt [互換モード]

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

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

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

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

Microsoft PowerPoint - MPIprog-F [互換モード]

課題 S1 解説 Fortran 編 中島研吾 東京大学情報基盤センター

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

Microsoft PowerPoint - MPIprog-C [互換モード]

Fundamental MPI 1 概要 MPI とは MPI の基礎 :Hello World 全体データと局所データタ グループ通信 (Collective Communication) 1 対 1 通信 (Point-to-Point Communication)

MPI 超 入門 (FORTRAN 編 ) 東京大学情報基盤センター C 言語編は以下 /ohshima/seminars/t2k201111/ (MPI による並列アプリケーション開発入門 2)

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

コードのチューニング

Fundamental MPI 1 概要 MPI とは MPI の基礎 :Hello World 全体データと局所データ グループ通信 (Collective Communication) 1 対 1 通信 (Point-to-Point Communication)

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

Microsoft PowerPoint - KHPCSS pptx

Fundamental MPI 1 概要 MPI とは MPI の基礎 :Hello World 全体データと局所データタ グループ通信 (Collective Communication) 1 対 1 通信 (Point-to-Point Communication)

演習準備

課題 S1 解説 C 言語編 中島研吾 東京大学情報基盤センター

NUMAの構成

MPI によるプログラミング概要 Fortran 編 中島研吾 東京大学情報基盤センター

Microsoft PowerPoint _MPI-01.pptx

untitled

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

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

MPI usage

スライド 1

MPI によるプログラミング概要 C 言語編 中島研吾 東京大学情報基盤センター

Microsoft PowerPoint - 講義1:離散化と並列化.pptx

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

コードのチューニング

para02-2.dvi

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

PowerPoint プレゼンテーション

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

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

様式(補助金)

Ⅰ 調 査 の 概 要 1 目 的 義 務 教 育 の 機 会 均 等 その 水 準 の 維 持 向 上 の 観 点 から 的 な 児 童 生 徒 の 学 力 や 学 習 状 況 を 把 握 分 析 し 教 育 施 策 の 成 果 課 題 を 検 証 し その 改 善 を 図 るもに 学 校 におけ

Microsoft PowerPoint - 報告書(概要).ppt

する ( 評 定 の 時 期 ) 第 条 成 績 評 定 の 時 期 は 第 3 次 評 定 者 にあっては 完 成 検 査 及 び 部 分 引 渡 しに 伴 う 検 査 の 時 とし 第 次 評 定 者 及 び 第 次 評 定 者 にあっては 工 事 の 完 成 の 時 とする ( 成 績 評 定

SXF 仕 様 実 装 規 約 版 ( 幾 何 検 定 編 ) 新 旧 対 照 表 2013/3/26 文 言 変 更 p.12(1. 基 本 事 項 ) (5)SXF 入 出 力 バージョン Ver.2 形 式 と Ver.3.0 形 式 および Ver.3.1 形 式 の 入 出 力 機 能 を

った 場 合 など 監 事 の 任 務 懈 怠 の 場 合 は その 程 度 に 応 じて 業 績 勘 案 率 を 減 算 する (8) 役 員 の 法 人 に 対 する 特 段 の 貢 献 が 認 められる 場 合 は その 程 度 に 応 じて 業 績 勘 案 率 を 加 算 することができる

一般競争入札について

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

(4) 給 与 制 度 の 総 合 的 見 直 しの 実 施 状 況 について 概 要 国 の 給 与 制 度 の 総 合 的 見 直 しにおいては 俸 給 表 の 水 準 の 平 均 2の 引 下 げ 及 び 地 域 手 当 の 支 給 割 合 の 見 直 し 等 に 取 り 組 むとされている.

<4D F736F F D D3188C091538AC7979D8B4B92F F292B98CF092CA81698A94816A2E646F63>

86


Microsoft Word - 佐野市生活排水処理構想(案).doc

1 書 誌 作 成 機 能 (NACSIS-CAT)の 軽 量 化 合 理 化 電 子 情 報 資 源 への 適 切 な 対 応 のための 資 源 ( 人 的 資 源,システム 資 源, 経 費 を 含 む) の 確 保 のために, 書 誌 作 成 と 書 誌 管 理 作 業 の 軽 量 化 を 図

養 老 保 険 の 減 額 払 済 保 険 への 変 更 1. 設 例 会 社 が 役 員 を 被 保 険 者 とし 死 亡 保 険 金 及 び 満 期 保 険 金 のいずれも 会 社 を 受 取 人 とする 養 老 保 険 に 加 入 してい る 場 合 を 解 説 します 資 金 繰 りの 都

<4D F736F F D208E52979C8CA78E598BC68F5790CF91A390698F9590AC8BE08CF D6A2E646F6378>

OKIKAE-KAIRYOU-V3.xdw

Microsoft Word - 不正アクセス行為の禁止等に関する法律等に基づく公安

KINGSOFT Office 2016 動 作 環 境 対 応 日 本 語 版 版 共 通 利 用 上 記 動 作 以 上 以 上 空 容 量 以 上 他 接 続 環 境 推 奨 必 要 2

m07 北見工業大学 様式①

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

1 林 地 台 帳 整 備 マニュアル( 案 )について 林 地 台 帳 整 備 マニュアル( 案 )の 構 成 構 成 記 載 内 容 第 1 章 はじめに 本 マニュアルの 目 的 記 載 内 容 について 説 明 しています 第 2 章 第 3 章 第 4 章 第 5 章 第 6 章 林 地

<4D F736F F D2095CA8E A90DA91B18C9F93A289F1939A8F D8288B3816A5F E646F63>

学校教育法等の一部を改正する法律の施行に伴う文部科学省関係省令の整備に関する省令等について(通知)

Microsoft Word - A04◆/P doc

続 に 基 づく 一 般 競 争 ( 指 名 競 争 ) 参 加 資 格 の 再 認 定 を 受 けていること ) c) 会 社 更 生 法 に 基 づき 更 生 手 続 開 始 の 申 立 てがなされている 者 又 は 民 事 再 生 法 に 基 づき 再 生 手 続 開 始 の 申 立 てがなさ

4 教 科 に 関 する 調 査 結 果 の 概 況 校 種 学 年 小 学 校 2 年 生 3 年 生 4 年 生 5 年 生 6 年 生 教 科 平 均 到 達 度 目 標 値 差 達 成 率 国 語 77.8% 68.9% 8.9% 79.3% 算 数 92.0% 76.7% 15.3% 94

スライド 1

PowerPoint Presentation

第1回

< DB8CAF97BF97A6955C2E786C73>

その 他 事 業 推 進 体 制 平 成 20 年 3 月 26 日 に 石 垣 島 国 営 土 地 改 良 事 業 推 進 協 議 会 を 設 立 し 事 業 を 推 進 ( 構 成 : 石 垣 市 石 垣 市 議 会 石 垣 島 土 地 改 良 区 石 垣 市 農 業 委 員 会 沖 縄 県 農

1 総 合 設 計 一 定 規 模 以 上 の 敷 地 面 積 及 び 一 定 割 合 以 上 の 空 地 を 有 する 建 築 計 画 について 特 定 行 政 庁 の 許 可 により 容 積 率 斜 線 制 限 などの 制 限 を 緩 和 する 制 度 である 建 築 敷 地 の 共 同 化 や

鳥 取 国 民 年 金 事 案 177 第 1 委 員 会 の 結 論 申 立 人 の 昭 和 37 年 6 月 から 38 年 3 月 までの 国 民 年 金 保 険 料 については 納 付 していたものと 認 められることから 納 付 記 録 を 訂 正 することが 必 要 である 第 2 申

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

第4回税制調査会 総4-1

2 出 願 資 格 審 査 前 記 1の 出 願 資 格 (5) 又 は(6) により 出 願 を 希 望 する 者 には, 出 願 に 先 立 ち 出 願 資 格 審 査 を 行 いますので, 次 の 書 類 を 以 下 の 期 間 に 岡 山 大 学 大 学 院 自 然 科 学 研 究 科 等

(4) ラスパイレス 指 数 の 状 況 ( 各 年 4 月 1 日 現 在 ) ( 例 ) ( 例 ) 15 (H2) (H2) (H24) (H24) (H25.4.1) (H25.4.1) (H24) (H24)

untitled

Microsoft PowerPoint - 経営事項審査.ppt

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

安 芸 太 田 町 学 校 適 正 配 置 基 本 方 針 の 一 部 修 正 について 1 議 会 学 校 適 正 配 置 調 査 特 別 委 員 会 調 査 報 告 書 について 安 芸 太 田 町 教 育 委 員 会 が 平 成 25 年 10 月 30 日 に 決 定 した 安 芸 太 田

Microsoft Word - 構造振動特論-08回-2012.doc

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

Microsoft Word - 建築基準法第42条第2項道路後退整備のあらまし

Microsoft Word - tb01.doc

(5) 給 与 改 定 の 状 況 事 委 員 会 の 設 置 なし 1 月 例 給 事 委 員 会 の 勧 告 民 間 給 与 公 務 員 給 与 較 差 勧 告 A B A-B ( 改 定 率 ) 給 与 改 定 率 ( 参 考 ) 国 の 改 定 率 24 年 度 円 円 円 円 ( ) 改

MetaMoJi ClassRoom/ゼミナール 授業実施ガイド

定款  変更

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

目 次 第 1. 土 区 画 整 理 事 業 の 名 称 等 1 (1) 土 区 画 整 理 事 業 の 名 称 1 (2) 施 行 者 の 名 称 1 第 2. 施 行 区 1 (1) 施 行 区 の 位 置 1 (2) 施 行 区 位 置 図 1 (3) 施 行 区 の 区 域 1 (4) 施

(4) ラスパイレス 指 数 の 状 況 H H H5.4.1 ( 参 考 値 ) 97.1 H H H H5.4.1 H H5.4.1 ( 参 考

Taro-事務処理要綱250820

目 次 1. Web メールのご 利 用 について Web メール 画 面 のフロー 図 Web メールへのアクセス ログイン 画 面 ログイン 後 (メール 一 覧 画 面 ) 画 面 共 通 項 目


<4D F736F F F696E74202D D382E982B382C68AF1958D8BE090A C98AD682B782E B83678C8B89CA81698CF6955C A2E >

Taro-H19退職金(修正版).jtd

(2)大学・学部・研究科等の理念・目的が、大学構成員(教職員および学生)に周知され、社会に公表されているか

TIPS - 棚 割 りを 開 始 するまで Liteを 起 動 し 企 業 情 報 の 追 加 を 行 い 棚 割 を 行 う 企 業 の 追 加 をして 下 さい 企 業 情 報 の 追 加 時 に エラーメッセージが 表 示 された 場 合 別 途 TIPS トラブルが 発 生 した 場 合

< CF6955C976C8EAE DE82C28E73816A2E786C73>

<4D F736F F D F93878CA797708F4390B3816A819A95CA8B4C976C8EAE91E682538B4C8DDA97E12E646F6378>

預 金 を 確 保 しつつ 資 金 調 達 手 段 も 確 保 する 収 益 性 を 示 す 指 標 として 営 業 利 益 率 を 採 用 し 営 業 利 益 率 の 目 安 となる 数 値 を 公 表 する 株 主 の 皆 様 への 還 元 については 持 続 的 な 成 長 による 配 当 可

Box-Jenkinsの方法

<8BB388F58F5A91EE82A082E895FB8AEE967B95FB906A>

Transcription:

MPIによるプログラミング 概 要 (その1) Fortran 言 語 編 RIKEN AICS HPC Summer School 2014 中 島 研 吾 ( 東 大 情 報 基 盤 センター) 横 川 三 津 夫 ( 神 戸 大 計 算 科 学 教 育 センター)

1 本 schoolの 目 的 並 列 計 算 機 の 使 用 によって,より 大 規 模 で 詳 細 なシミュレー ションを 高 速 に 実 施 することが 可 能 になり, 新 しい 科 学 の 開 拓 が 期 待 される 並 列 計 算 の 目 的 高 速 大 規 模 大 規 模 の 方 が 新 しい 科 学 という 観 点 からのウェイトとしては 高 い.しかし, 高 速 ももちろん 重 要 である. + 複 雑 理 想 :Scalable N 倍 の 規 模 の 計 算 をN 倍 のCPUを 使 って, 同 じ 時 間 で 解 く

2 概 要 MPIとは MPIの 基 礎 : Hello Worldを 並 列 で 出 力 する 全 体 データと 局 所 データ グループ 通 信 (Collective Communication) 1 対 1 通 信 (Peer-to-Peer Communication)

3 概 要 MPIとは MPIの 基 礎 : Hello Worldを 並 列 で 出 力 する 全 体 データと 局 所 データ グループ 通 信 (Collective Communication) 1 対 1 通 信 (Peer-to-Peer Communication)

4 MPIとは (1/2) Message Passing Interface 分 散 メモリ 間 のメッセージ 通 信 APIの 規 格 プログラム,ライブラリ,そのものではない http://phase.hpcc.jp/phase/mpi-j/ml/mpi-j-html/contents.html 歴 史 1992 MPIフォーラム 1994 MPI-1 規 格 1997 MPI-2 規 格 :MPI I/O 他 2012 MPI-3 規 格 : 実 装 (こっちはライブラリ) mpich アルゴンヌ 国 立 研 究 所 OpenMP, MVAPICH 他 各 ベンダーのMPIライブラリ C/C++,Fortran,Java ; Unix,Linux,Windows,Mac OS

5 MPIとは (2/2) 現 状 では,mpich(フリー)が 広 く 使 用 されている. 部 分 的 に MPI-2 規 格 をサポート 2005 年 11 月 から MPICH2 に 移 行 http://www-unix.mcs.anl.gov/mpi/ MPIが 普 及 した 理 由 MPIフォーラムによる 規 格 統 一 どんな 計 算 機 でも 動 く Fortran,Cからサブルーチンとして 呼 び 出 すことが 可 能 mpichの 存 在 フリー,あらゆるアーキテクチュアをサポート 同 様 の 試 みとしてPVM(Parallel Virtual Machine)があっ たが,それほど 普 及 せず.

6 参 考 文 献 P.Pacheco MPI 並 列 プログラミング, 培 風 館,2001( 原 著 1997) W.Gropp 他 Using MPI second edition,mit Press, 1999. M.J.Quinn Parallel Programming in C with MPI and OpenMP, McGrawhill, 2003. W.Gropp 他 MPI:The Complete Reference Vol.I, II,MIT Press, 1998. http://www-unix.mcs.anl.gov/mpi/www/ API(Application Interface)の 説 明

7 MPIを 学 ぶにあたって(1/2) 文 法 MPI-1 の 基 本 的 な 機 能 (10 程 度 )について 習 熟 する. MPI-2では 色 々と 便 利 な 機 能 があるが あとは 自 分 に 必 要 な 機 能 について 調 べる,あるいは 知 っている 人, 知 っていそうな 人 に 尋 ねる. 実 習 の 重 要 性 プログラミング その 前 にまず 実 行 してみること SPMD/SIMDのオペレーションに 慣 れること つかむ こと Single Program/Instruction Multiple Data 基 本 的 に 各 プロセスは 同 じことをやる が データが 違 う 大 規 模 なデータを 分 割 し, 各 部 分 について 各 プロセス(プロセッサ)が 計 算 する 全 体 データと 局 所 データ, 全 体 番 号 と 局 所 番 号

PE: Processing Element プロセッサ, 領 域,プロセス SPMD mpirun -np M <Program> この 絵 が 理 解 できればMPIは 9 割 方, 理 解 できたことになる. コンピュータサイエンスの 学 科 でもこれを 上 手 に 教 えるの は 難 しいらしい. 8 PE #0 PE #1 PE #2 PE #M-1 Program Program Program Program Data #0 Data #1 Data #2 Data #M-1 各 プロセスでは 同 じプログラムが 動 く が データが 違 う 大 規 模 なデータを 分 割 し, 各 部 分 について 各 プロセス(プロセッサ)が 計 算 する 通 信 以 外 は, 単 体 CPUのときと 同 じ,というのが 理 想

用 語 プロセッサ,コア ハードウェアとしての 各 演 算 装 置.シングルコアではプロセッサ=コア プロセス MPI 計 算 のための 実 行 単 位,ハードウェア 的 な コア とほぼ 同 義. しかし1つの プロセッサ コア で 複 数 の プロセス を 起 動 する 場 合 も ある( 効 率 的 ではないが). PE(Processing Element) 本 来, プロセッサ の 意 味 なのであるが, 本 講 義 では プロセス の 意 味 で 使 う 場 合 も 多 い. 次 項 の 領 域 とほぼ 同 義 でも 使 用. マルチコアの 場 合 は: コア=PE という 意 味 で 使 うことが 多 い. 領 域 プロセス とほぼ 同 じ 意 味 であるが,SPMDの MD のそれぞれ 一 つ, 各 データ の 意 味 合 いが 強 い.しばしば PE と 同 義 で 使 用. MPIのプロセス 番 号 (PE 番 号, 領 域 番 号 )は0から 開 始 したがって8プロセス(PE, 領 域 )ある 場 合 は 番 号 は0~7 9

PE: Processing Element プロセッサ, 領 域,プロセス SPMD mpirun -np M <Program> 10 この 絵 が 理 解 できればMPIは 9 割 方, 理 解 できたことになる. コンピュータサイエンスの 学 科 でもこれを 上 手 に 教 えるの は 難 しいらしい. PE #0 PE #1 PE #2 PE #M-1 Program Program Program Program Data #0 Data #1 Data #2 Data #M-1 各 プロセスでは 同 じプログラムが 動 く が データが 違 う 大 規 模 なデータを 分 割 し, 各 部 分 について 各 プロセス(プロセッサ)が 計 算 する 通 信 以 外 は, 単 体 CPUのときと 同 じ,というのが 理 想

11 MPIを 学 ぶにあたって(2/2) 繰 り 返 すが, 決 して 難 しいものではない. 以 上 のようなこともあって, 文 法 を 教 える 授 業 は2~3 回 程 度 で 充 分 と 考 えている. とにかくSPMDの 考 え 方 を 掴 むこと!

12 講 義, 課 題 の 予 定 MPIサブルーチン 機 能 環 境 管 理 グループ 通 信 1 対 1 通 信 8 月 5 日 ( 火 ) 環 境 管 理,グループ 通 信 (Collective Communication) 課 題 S1 8 月 6 日 ( 水 ) 1 対 1 通 信 (Point-to-Point Communication) 課 題 S2: 一 次 元 熱 伝 導 解 析 コードの 並 列 化 ここまでできればあとはある 程 度 自 分 で 解 決 できます.

13 概 要 MPIとは MPIの 基 礎 :Hello Worldを 並 列 で 出 力 する 全 体 データと 局 所 データ グループ 通 信 (Collective Communication) 1 対 1 通 信 (Peer-to-Peer Communication)

2014/05/01 14 schoolで 利 用 する コンピュータ LAN -computer 上 のジョブ 実 行 はバッチジョブ 各 自 のPC ログインサーバ Fujitsu Primergy RX300 S6 CPU:Intel Xeon E5645@2.4GHz, 6コア x2sockets メモリ 94GB -computer Fujitsu PRIMEHPC FX10 96ノード,ノードあたり CPU:SPARC64 IXfx@1.65GHz, 16コア,211.2GFLOPS メモリ: 32GB/ノード 神 戸 大 学 統 合 研 究 拠 点 (ポートアイランド)

15 ログイン,ディレクトリ 作 成 on コンピュータ ssh xxxxxxx@pi.ircpi.kobe-u.ac.jp ディレクトリ 作 成 >$ cd >$ mkdir 2014summer ( 好 きな 名 前 でよい) >$ cd 2014summer このディレクトリを 本 講 義 では <$P-TOP> と 呼 ぶ 基 本 的 にファイル 類 はこのディレクトリにコピー, 解 凍 する

16 ファイルコピー Fortranユーザー >$ cd <$P-TOP> >$ cp /tmp/2014summer/f/s1-f.tar. >$ tar xvf s1-f.tar Cユーザー >$ cd <$P-TOP> >$ cp /tmp/2014summer/c/s1-c.tar. >$ tar xvf s1-c.tar ディレクトリ 確 認 >$ ls mpi >$ cd mpi/s1 このディレクトリを 本 講 義 では <$P-S1> と 呼 ぶ. <$P-S1> = <$P-TOP>/mpi/S1

17 まずはプログラムの 例 hello.f implicit REAL*8 (A H,O Z) include 'mpif.h' integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end hello.c #include "mpi.h" #include <stdio.h> int main(int argc, char **argv) { int n, myid, numprocs, i; } MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); printf ("Hello World %d n", myid); MPI_Finalize();

hello.f/c をコンパイルしてみよう! >$ mpifrtpx Kfast hello.f >$ mpifccpx Kfast hello.c Fortran $> mpifrtpx Kfast hello.f mpifrtpx : Fortran90+MPIによってプログラムをコンパイルする 際 に 必 要 なコンパイラ,ライブラリ 等 がバインドされているコマンド C 言 語 $> mpifccpx Kfast hello.c mpifccpx : C+MPIによってプログラムをコンパイルする 際 に 必 要 な,コンパイラ,ライブラリ 等 がバインドされているコマンド 18

ジョブ 実 行 実 行 方 法 基 本 的 にバッチジョブのみ 会 話 型 の 実 行 は 基 本 的 に できません 実 行 手 順 ジョブスクリプトを 書 きます ジョブを 投 入 します ジョブの 状 態 を 確 認 します 結 果 を 確 認 します その 他 実 行 時 には1ノード(16コア)が 占 有 されます 他 のユーザーのジョブに 使 われることはありません 19

<$P-S1>/hello.sh ジョブスクリプト スケジューラへの 指 令 + シェルスクリプト #!/bin/sh #PJM -L node=1 #PJM -L elapse=00:00:30 #PJM -L rscgrp=school #PJM -j #PJM -o hello.lst #PJM --mpi proc=4 ノード 数 実 行 時 間 実 行 キュー 名 標 準 出 力 ファイル 名 MPIプロセス 数 mpiexec./a.out 実 行 ファイル 名 8プロセス node=1 proc=8 16プロセス node=1 proc=16 32プロセス node=2 proc=32 64プロセス node=4 proc=64 192プロセス node=12 proc=192 20

ジョブ 投 入 >$ pjsub hello.sh >$ cat hello.lst Hello World Fortran 0 4 Hello World Fortran 2 4 Hello World Fortran 3 4 Hello World Fortran 1 4 21

ジョブ 投 入, 確 認 等 ジョブの 投 入 pjsub スクリプト 名 ジョブの 確 認 pjstat ジョブの 取 り 消 し 強 制 終 了 pjdel ジョブID キューの 状 態 の 確 認 pjstat --rsc 同 時 実 行 投 入 可 能 数 pjstat --limit [pi:~/2014summer/mpi/s1]$ pjstat ACCEPT QUEUED STGIN READY RUNING RUNOUT STGOUT HOLD ERROR TOTAL 0 0 0 0 1 0 0 0 0 1 s 0 0 0 0 1 0 0 0 0 1 JOB_ID JOB_NAME MD ST USER START_DATE ELAPSE_LIM NODE_REQUIRE 73804 hello.sh NM RUN yokokawa 07/15 17:12:26 0000:00:10 1 22

23 環 境 管 理 ルーチン+ 必 須 項 目 implicit REAL*8 (A-H,O-Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end #include "mpi.h" #include <stdio.h> int main(int argc, char **argv) { int n, myid, numprocs, i; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); mpif.h, mpi.h 環 境 変 数 デフォルト 値 Fortran90ではuse mpi 可 MPI_Init 初 期 化 MPI_Comm_size プロセス 数 取 得 mpirun -np XX <prog> MPI_Comm_rank プロセスID 取 得 自 分 のプロセス 番 号 (0から 開 始 ) MPI_Finalize MPIプロセス 終 了 } printf ("Hello World %d n", myid); MPI_Finalize();

24 Fortran/Cの 違 い 基 本 的 にインタフェースはほとんど 同 じ Cの 場 合, MPI_Comm_size のように MPI は 大 文 字, MPI_ の あとの 最 初 の 文 字 は 大 文 字, 以 下 小 文 字 Fortranはエラーコード(ierr)の 戻 り 値 を 引 数 の 最 後 に 指 定 す る 必 要 がある. Cは 変 数 の 特 殊 な 型 がある. MPI_Comm, MPI_Datatype, MPI_Op etc. 最 初 に 呼 ぶ MPI_Init だけは 違 う call MPI_INIT (ierr) MPI_Init (int *argc, char ***argv)

25 何 をやっているのか? implicit REAL*8 (A H,O Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i5)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end mpiexec により4つのプロセスが 立 ち 上 がる ( 今 の 場 合 は proc=4 ). 同 じプログラムが4つ 流 れる. データの 値 (my_rank)を 書 き 出 す. 4つのプロセスは 同 じことをやっているが,データ として 取 得 したプロセスID(my_rank)は 異 なる. 結 果 として 各 プロセスは 異 なった 出 力 をやってい ることになる. まさにSPMD

26 mpi.h,mpif.h implicit REAL*8 (A-H,O-Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end #include "mpi.h" #include <stdio.h> int main(int argc, char **argv) { int n, myid, numprocs, i; } MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); MPI_Comm_rank(MPI_COMM_WORLD,&myid); printf ("Hello World %d n", myid); MPI_Finalize(); MPIに 関 連 した 様 々なパラメータおよ び 初 期 値 を 記 述. 変 数 名 は MPI_ で 始 まっている. ここで 定 められている 変 数 は,MPIサ ブルーチンの 引 数 として 使 用 する 以 外 は 陽 に 値 を 変 更 してはいけない. ユーザーは MPI_ で 始 まる 変 数 を 独 自 に 設 定 しないのが 無 難.

MPI_INIT Fortran 27 MPIを 起 動 する. 他 のMPIサブルーチンより 前 にコールする 必 要 がある( 必 須 ) 全 実 行 文 の 前 に 置 くことを 勧 める. call MPI_INIT (ierr) ierr 整 数 O 完 了 コード implicit REAL*8 (A-H,O-Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end

MPI_FINALIZE Fortran 28 MPIを 終 了 する. 他 の 全 てのMPIサブルーチンより 後 にコールする 必 要 がある ( 必 須 ). 全 実 行 文 の 後 に 置 くことを 勧 める これを 忘 れると 大 変 なことになる. 終 わったはずなのに 終 わっていない call MPI_FINALIZE (ierr) ierr 整 数 O 完 了 コード implicit REAL*8 (A-H,O-Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end

MPI_COMM_SIZE Fortran 29 コミュニケーター comm で 指 定 されたグループに 含 まれるプロセス 数 の 合 計 が size に 返 ってくる. 必 須 では 無 いが, 利 用 することが 多 い. call MPI_COMM_SIZE (comm, size, ierr) comm 整 数 I コミュニケータを 指 定 する size 整 数 O comm.で 指 定 されたグループ 内 に 含 まれるプロセス 数 の 合 計 ierr 整 数 O 完 了 コード implicit REAL*8 (A-H,O-Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) stop end

30 コミュニケータとは? MPI_Comm_Size (MPI_COMM_WORLD, PETOT) 通 信 を 実 施 するためのプロセスのグループを 示 す. MPIにおいて, 通 信 を 実 施 する 単 位 として 必 ず 指 定 する 必 要 がある. mpiexecで 起 動 した 全 プロセスは,デフォルトで MPI_COMM_WORLD というコミュニケータで 表 されるグ ループに 属 する. 複 数 のコミュニケータを 使 用 し, 異 なったプロセス 数 を 割 り 当 てることによって, 複 雑 な 処 理 を 実 施 することも 可 能. 例 えば 計 算 用 グループ, 可 視 化 用 グループ この 授 業 では MPI_COMM_WORLD のみでOK.

31 コミュニケータの 概 念 あるプロセスが 複 数 のコミュニケータグループに 属 しても 良 い MPI_COMM_WORLD COMM_MANTLE COMM_CRUST COMM_VIS

複 数 のコミュニケータを 使 った 例 : 地 盤 石 油 タンク 連 成 シミュレーション 32

33 対 象 とするアプリケーション 地 盤 石 油 タンク 振 動 地 盤 タンクへの 一 方 向 連 成 地 盤 表 層 の 変 位 タンク 底 面 の 強 制 変 位 として 与 える このアプリケーションに 対 して, 連 成 シミュレーションのため のフレームワークを 開 発, 実 装 1タンク=1PE:シリアル 計 算 Deformation of surface will be given as boundary conditions at bottom of tanks.

34 2003 年 十 勝 沖 地 震 長 周 期 地 震 波 動 ( 表 面 波 )のために 苫 小 牧 の 石 油 タンクがスロッシングを 起 こし 火 災 発 生

35 地 盤 石 油 タンク 振 動 連 成 シミュレーション

36 地 盤,タンクモデル 地 盤 モデル( 市 村 )Fortran 並 列 FEM, 三 次 元 弾 性 動 解 析 前 進 オイラー 陽 解 法,EBE 各 要 素 は 一 辺 2mの 立 方 体 240m 240m 100m タンクモデル( 長 嶋 )C シリアルFEM(EP), 三 次 元 弾 性 動 解 析 後 退 オイラー 陰 解 法,スカイライン 法 シェル 要 素 +ポテンシャル 流 ( 非 粘 性 ) 直 径 :42.7m, 高 さ:24.9m, 厚 さ:20mm, 液 面 :12.45m,スロッシング 周 期 :7.6sec. 周 方 向 80 分 割, 高 さ 方 向 :0.6m 幅 60m 間 隔 で4 4に 配 置 合 計 自 由 度 数 :2,918,169

3 種 類 のコミュニケータの 生 成 meshglobal%mpi_comm basement #2 basement #3 tank #6 tank #7 tank #8 tank #3 tank #4 tank #5 basememt #0 basement #1 tank #0 tank #1 tank #2 meshbase%mpi_comm meshglobal%my_rank= 0~3 meshbase%my_rank = 0~3 meshtank%mpi_comm meshglobal%my_rank= 4~12 meshtank%my_rank = 0~ 8 meshtank%my_rank = -1 meshbase%my_rank = -1 37

MPI_COMM_RANK MPI Programming Fortran コミュニケータ comm で 指 定 されたグループ 内 におけるプロセスIDが rank にも どる. 必 須 では 無 いが, 利 用 することが 多 い. プロセスIDのことを rank(ランク) と 呼 ぶことも 多 い. MPI_COMM_RANK (comm, rank, ierr) comm 整 数 I コミュニケータを 指 定 する rank 整 数 O comm.で 指 定 されたグループにおけるプロセスID 0から 始 まる( 最 大 はPETOT-1) ierr 整 数 O 完 了 コード implicit REAL*8 (A-H,O-Z) include 'mpif.h integer :: PETOT, my_rank, ierr call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) write (*,'(a,2i8)') 'Hello World Fortran', my_rank, PETOT call MPI_FINALIZE (ierr) 38 stop end

MPI_ABORT Fortran 39 MPIプロセスを 異 常 終 了 する. call MPI_ABORT (comm, errcode, ierr) comm 整 数 I コミュニケータを 指 定 する errcode 整 数 O エラーコード ierr 整 数 O 完 了 コード 39

MPI_WTIME Fortran 40 時 間 計 測 用 の 関 数 : 精 度 はいまいち 良 くない( 短 い 時 間 を 計 測 する 場 合 ) time= MPI_WTIME () time R8 O 過 去 のある 時 間 からの 経 過 時 間 ( 秒 数 ): 倍 精 度 変 数 real(kind=8):: Stime, Etime Stime= MPI_WTIME () do i= 1, 100000000 a= 1.d0 enddo Etime= MPI_WTIME () write (*,'(i5,1pe16.6)') my_rank, Etime-Stime 40

41 MPI_Wtime の 例 $> mpifccpx O1 time.c $> mpifrtpx O1 time.f $> pjsub go4.sh $> cat test.lst 2 3.399327E-06 1 3.499910E-06 0 3.499910E-06 3 3.399327E-06 プロセス 番 号 計 算 時 間

42 MPI_Wtick MPI_Wtimeでの 時 間 計 測 精 度 を 確 認 する. ハードウェア,コンパイラによって 異 なる time= MPI_Wtick () time R8 O 時 間 計 測 精 度 ( 単 位 : 秒 ) implicit REAL*8 (A-H,O-Z) include 'mpif.h' TM= MPI_WTICK () write (*,*) TM double Time; Time = MPI_Wtick(); printf("%5d%16.6e n", MyRank, Time);

43 MPI_Wtick の 例 $> mpifccpx O1 wtick.c $> mpifrtpx O1 wtick.f $> pjsub go1.sh $> cat test.lst 1.000000000000000E-07 $>

MPI_BARRIER Fortran 44 コミュニケーター comm で 指 定 されたグループに 含 まれるプロセスの 同 期 をと る.コミュニケータ comm 内 の 全 てのプロセスがこのサブルーチンを 通 らない 限 り, 次 のステップには 進 まない. 主 としてデバッグ 用 に 使 う.オーバーヘッドが 大 きいので, 実 用 計 算 には 使 わない 方 が 無 難. call MPI_BARRIER (comm, ierr) comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード

45 概 要 MPIとは MPIの 基 礎 :Hello World 全 体 データと 局 所 データ グループ 通 信 (Collective Communication) 1 対 1 通 信 (Peer-to-Peer Communication)

データ 構 造 とアルゴリズム コンピュータ 上 で 計 算 を 行 うプログラムはデータ 構 造 とアル ゴリズムから 構 成 される. 両 者 は 非 常 に 密 接 な 関 係 にあり,あるアルゴリズムを 実 現 するためには,それに 適 したデータ 構 造 が 必 要 である. 極 論 を 言 えば データ 構 造 =アルゴリズム と 言 っても 良 い. もちろん そうではない と 主 張 する 人 もいるが, 科 学 技 術 計 算 に 関 する 限 り, 中 島 の 経 験 では データ 構 造 =アルゴリズム と 言 える. 並 列 計 算 を 始 めるにあたって, 基 本 的 なアルゴリズムに 適 し たデータ 構 造 を 定 める 必 要 がある. 46

47 SPMD:Single Program Multiple Data 一 言 で 並 列 計 算 と 言 っても 色 々なものがあり, 基 本 的 なア ルゴリズムも 様 々. 共 通 して 言 えることは,SPMD(Single Program Multiple Data) なるべく 単 体 CPUのときと 同 じようにできることが 理 想 通 信 が 必 要 な 部 分 とそうでない 部 分 を 明 確 にする 必 要 があり.

48 SPMDに 適 したデータ 構 造 とは? PE #0 PE #1 PE #2 PE #3 Program Program Program Program Data #0 Data #1 Data #2 Data #3

49 SPMDに 適 したデータ 構 造 (1/2) 大 規 模 なデータ 領 域 を 分 割 して, 各 プロセッサ,プロセス で 計 算 するのがSPMDの 基 本 的 な 考 え 方 例 えば, 長 さNG(=20)のベクトルVGに 対 して, 各 要 素 を2 倍 する 計 算 を 考 えてみよう. integer, parameter :: NG= 20 real(kind=8), dimension(20) :: VG do i= 1, NG VG(i)= 2.0 * VG(i) enddo これを4つのプロセッサで 分 担 して 計 算 する 場 合 には, 各 プロセッサが20/4=5 ずつデータを 持 ち,それぞれが 処 理 すればよい.

50 SPMDに 適 したデータ 構 造 (2/2) すなわち,こんな 感 じ: integer, parameter :: NL= 5 real(kind=8), dimension(5) :: VL do i= 1, NL VL(i)= 2.0 * VL(i) enddo このようにすれば 一 種 類 の プログラム(Single Program) で 並 列 計 算 を 実 施 できる. ただし, 各 プロセスにおいて, VL の 中 身 が 違 う:Multiple Data 可 能 な 限 り 計 算 を VL のみで 実 施 することが, 並 列 性 能 の 高 い 計 算 へつながる. プログラムの 形 は, 単 体 CPUの 場 合 とほとんど 変 わらない.

51 全 体 データと 局 所 データ VG VL 領 域 全 体 1 番 から20 番 までの 全 体 番 号 を 持 つ 全 体 データ(Global Data) 各 プロセス(PE,プロセッサ, 領 域 ) 1 番 から5 番 までの 局 所 番 号 を 持 つ 局 所 データ(Local Data) できるだけ 局 所 データを 有 効 に 利 用 することで, 高 い 並 列 性 能 が 得 られる.

52 局 所 データの 考 え 方 Fortran 全 体 データ VGの 1~5 番 成 分 がPE#0 6~10 番 成 分 がPE#1 11~15 番 成 分 がPE#2 16~20 番 成 分 がPE#3 のそれぞれ, 局 所 データ VLの1 番 ~5 番 成 分 となる ( 局 所 番 号 が1 番 ~5 番 とな る). VG( 1) VG( 2) VG( 3) VG( 4) VG( 5) VG( 6) VG( 7) VG( 8) VG( 9) VG(10) VG(11) VG(12) VG(13) VG(14) VG(15) VG(16) VG(17) VG(18) VG(19) VG(20) PE#0 PE#1 PE#2 PE#3 VL(1) VL(2) VL(3) VL(4) VL(5) VL(1) VL(2) VL(3) VL(4) VL(5) VL(1) VL(2) VL(3) VL(4) VL(5) VL(1) VL(2) VL(3) VL(4) VL(5)

VG VL 全 体 データと 局 所 データ 領 域 全 体 1 番 から20 番 までの 全 体 番 号 を 持 つ 全 体 データ(Global Data) 各 プロセッサ 1 番 から5 番 までの 局 所 番 号 を 持 つ 局 所 データ(Local Data) この 講 義 で 常 に 注 意 してほしいこと VG( 全 体 データ)からVL( 局 所 データ)をどのように 生 成 するか. VGからVL,VLからVGへデータの 中 身 をどのようにマッピングするか. VLがプロセスごとに 独 立 して 計 算 できない 場 合 はどうするか. できる 限 り 局 所 性 を 高 めた 処 理 を 実 施 する 高 い 並 列 性 能 そのための データ 構 造, アルゴリズム を 考 える. 53

54 MPIとは MPIの 基 礎 :Hello World 全 体 データと 局 所 データ グループ 通 信 (Collective Communication) 1 対 1 通 信 (Peer-to-Peer Communication)

55 グループ 通 信 とは コミュニケータで 指 定 されるグループ 全 体 に 関 わる 通 信. 例 制 御 データの 送 信 最 大 値, 最 小 値 の 判 定 総 和 の 計 算 ベクトルの 内 積 の 計 算 密 行 列 の 転 置

56 グループ 通 信 の 例 (1/4) P#0 A0 B0 C0 D0 P#1 P#2 P#3 Broadcast P#0 A0 B0 C0 D0 P#1 A0 B0 C0 D0 P#2 A0 B0 C0 D0 P#3 A0 B0 C0 D0 P#0 A0 B0 C0 D0 P#1 Scatter P#0 P#1 A0 B0 P#2 P#3 Gather P#2 P#3 C0 D0

57 グループ 通 信 の 例 (2/4) P#0 P#1 A0 B0 All gather P#0 A0 B0 C0 D0 P#1 A0 B0 C0 D0 P#2 C0 P#2 A0 B0 C0 D0 P#3 D0 P#3 A0 B0 C0 D0 P#0 A0 A1 A2 A3 P#1 B0 B1 B2 B3 P#2 C0 C1 C2 C3 P#3 D0 D1 D2 D3 All-to-All P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 P#2 A2 B2 C2 D2 P#3 A3 B3 C3 D3

58 グループ 通 信 の 例 (3/4) P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 Reduce P#0 P#1 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 P#2 A2 B2 C2 D2 P#2 P#3 A3 B3 C3 D3 P#3 P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 All reduce P#0 P#1 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 P#2 A2 B2 C2 D2 P#2 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 P#3 A3 B3 C3 D3 P#3 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3

59 グループ 通 信 の 例 (4/4) P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 Reduce scatter P#0 P#1 op.a0-a3 op.b0-b3 P#2 A2 B2 C2 D2 P#2 op.c0-c3 P#3 A3 B3 C3 D3 P#3 op.d0-d3

60 グループ 通 信 による 計 算 例 ベクトルの 内 積 Scatter/Gather 分 散 ファイルの 読 み 込 み

61 全 体 データと 局 所 データ 大 規 模 な 全 体 データ(global data)を 局 所 データ(local data)に 分 割 して,SPMDによる 並 列 計 算 を 実 施 する 場 合 のデータ 構 造 について 考 える.

62 領 域 分 割 1GB 程 度 のPC 10 6 メッシュが 限 界 :FEM 1000km 1000km 100kmの 領 域 ( 西 南 日 本 )を1kmメッシュで 切 ると10 8 メッシュになる 大 規 模 データ 領 域 分 割, 局 所 データ 並 列 処 理 全 体 系 計 算 領 域 間 の 通 信 が 必 要 大 規 模 データ PCのメモリに 入 りきらない 領 域 分 割 局 所 データ 局 所 データ 局 所 データ 局 所 データ 局 所 データ 局 所 データ 局 所 データ 通 信 局 所 データ MPI Programming

63 局 所 データ 構 造 対 象 とする 計 算 (のアルゴリズム)に 適 した 局 所 データ 構 造 を 定 めることが 重 要 アルゴリズム=データ 構 造 この 講 義 の 主 たる 目 的 の 一 つと 言 ってよい. MPI Programming

64 全 体 データと 局 所 データ 大 規 模 な 全 体 データ(global data)を 局 所 データ(local data)に 分 割 して,SPMDによる 並 列 計 算 を 実 施 する 場 合 のデータ 構 造 について 考 える. 下 記 のような 長 さ20のベクトル,VECpとVECsの 内 積 計 算 を4つのプロセッサ,プロセスで 並 列 に 実 施 することを 考 える. VECp( 1)= 2 ( 2)= 2 ( 3)= 2 (18)= 2 (19)= 2 (20)= 2 VECs( 1)= 3 ( 2)= 3 ( 3)= 3 (18)= 3 (19)= 3 (20)= 3 VECp[ 0]= 2 [ 1]= 2 [ 2]= 2 [17]= 2 [18]= 2 [19]= 2 VECs[ 0]= 3 [ 1]= 3 [ 2]= 3 [17]= 3 [18]= 3 [19]= 3 Fortran C

65 <$P-S1>/dot.f, dot.c implicit REAL*8 (A-H,O-Z) real(kind=8),dimension(20):: & VECp, VECs do i= 1, 20 VECp(i)= 2.0d0 VECs(i)= 3.0d0 enddo sum= 0.d0 do ii= 1, 20 sum= sum + VECp(ii)*VECs(ii) enddo stop end #include <stdio.h> int main(){ int i; double VECp[20], VECs[20] double sum; } for(i=0;i<20;i++){ VECp[i]= 2.0; VECs[i]= 3.0; } sum = 0.0; for(i=0;i<20;i++){ sum += VECp[i] * VECs[i]; } return 0;

66 <$P-S1>/dot.f, dot.cの 逐 次 実 行 >$ cd <$P-S1> >$ cc -O3 dot.c >$ f95 O3 dot.f >$./a.out 1 2.00 3.00 2 2.00 3.00 3 2.00 3.00 18 2.00 3.00 19 2.00 3.00 20 2.00 3.00 dot product 120.00

67 MPI_REDUCE P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 P#2 A2 B2 C2 D2 P#3 A3 B3 C3 D3 コミュニケータ comm 内 の, 各 プロセスの 送 信 バッファ sendbuf について, 演 算 op を 実 施 し,その 結 果 を1つの 受 信 プロセス root の 受 信 バッファ recbuf に 格 納 する. 総 和, 積, 最 大, 最 小 他 call MPI_REDUCE (sendbuf,recvbuf,count,datatype,op,root,comm,ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, タイプは datatype により 決 定 count 整 数 I メッセージのサイズ datatype 整 数 I メッセージのデータタイプ Fortran MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_CHARACTER etc. C MPI_INT, MPI_FLOAT, MPI_DOUBLE, MPI_CHAR etc Reduce P#0 P#1 P#2 P#3 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 op 整 数 I 計 算 の 種 類 MPI_MAX, MPI_MIN, MPI_SUM, MPI_PROD, MPI_LAND, MPI_BAND etc ユーザーによる 定 義 も 可 能 : MPI_OP_CREATE root 整 数 I 受 信 元 プロセスのID(ランク) comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

68 送 信 バッファと 受 信 バッファ MPIでは 送 信 バッファ, 受 信 バッファ という 変 数 がしば しば 登 場 する. 送 信 バッファと 受 信 バッファは 必 ずしも 異 なった 名 称 の 配 列 である 必 要 はないが, 必 ずアドレスが 異 なっていなけれ ばならない.

MPI_REDUCEの 例 (1/2) Fortran 69 call MPI_REDUCE (sendbuf,recvbuf,count,datatype,op,root,comm,ierr) real(kind=8):: X0, X1 call MPI_REDUCE (X0, X1, 1, MPI_DOUBLE_PRECISION, MPI_MAX, 0, <comm>, ierr) real(kind=8):: X0(4), XMAX(4) call MPI_REDUCE (X0, XMAX, 4, MPI_DOUBLE_PRECISION, MPI_MAX, 0, <comm>, ierr) 各 プロセスにおける,X0(i)の 最 大 値 が0 番 プロセスのXMAX(i)に 入 る(i=1~4)

MPI_REDUCEの 例 (2/2) Fortran 70 call MPI_REDUCE (sendbuf,recvbuf,count,datatype,op,root,comm,ierr) real(kind=8):: X0, XSUM call MPI_REDUCE (X0, XSUM, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, <comm>, ierr) 各 プロセスにおける,X0の 総 和 が0 番 PEのXSUMに 入 る. real(kind=8):: X0(4) call MPI_REDUCE (X0(1), X0(3), 2, MPI_DOUBLE_PRECISION, MPI_SUM, 0, <comm>, ierr) 各 プロセスにおける, X0(1)の 総 和 が0 番 プロセスのX0(3)に 入 る. X0(2)の 総 和 が0 番 プロセスのX0(4)に 入 る.

71 MPI_BCAST P#0 A0 B0 C0 D0 P#1 Broadcast P#0 A0 B0 C0 D0 P#1 A0 B0 C0 D0 P#2 P#2 A0 B0 C0 D0 P#3 P#3 A0 B0 C0 D0 コミュニケーター comm 内 の 一 つの 送 信 元 プロセス root のバッファ buffer から,その 他 全 てのプロセスのバッファ buffer にメッセージを 送 信. call MPI_BCAST (buffer,count,datatype,root,comm,ierr) buffer 任 意 I/O バッファの 先 頭 アドレス, タイプは datatype により 決 定 count 整 数 I メッセージのサイズ datatype 整 数 I メッセージのデータタイプ Fortran MPI_INTEGER, MPI_REAL, MPI_DOUBLE_PRECISION, MPI_CHARACTER etc. C MPI_INT, MPI_FLOAT, MPI_DOUBLE, MPI_CHAR etc. root 整 数 I 送 信 元 プロセスのID(ランク) comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

72 MPI_ALLREDUCE P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 P#2 A2 B2 C2 D2 All reduce P#0 P#1 P#2 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 P#3 A3 B3 C3 D3 P#3 op.a0-a3 op.b0-b3 op.c0-c3 op.d0-d3 MPI_REDUCE + MPI_BCAST 総 和, 最 大 値 を 計 算 したら, 各 プロセスで 利 用 したい 場 合 が 多 い call MPI_ALLREDUCE (sendbuf,recvbuf,count,datatype,op, comm,ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, タイプは datatype により 決 定 count 整 数 I メッセージのサイズ datatype 整 数 I メッセージのデータタイプ op 整 数 I 計 算 の 種 類 comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

MPI_Reduce/Allreduceの op Fortran 73 call MPI_REDUCE (sendbuf,recvbuf,count,datatype,op,root,comm,ierr) MPI_MAX,MPI_MIN 最 大 値, 最 小 値 MPI_SUM,MPI_PROD 総 和, 積 MPI_LAND 論 理 AND MPI Programming

74 局 所 データの 考 え 方 (1/2) Fortran 長 さ20のベクトルを,4つに 分 割 する 各 プロセスで 長 さ5のベクトル(1~5) VECp( 1)= 2 ( 2)= 2 ( 3)= 2 (18)= 2 (19)= 2 (20)= 2 VECs( 1)= 3 ( 2)= 3 ( 3)= 3 (18)= 3 (19)= 3 (20)= 3

局 所 データの 考 え 方 (2/2) Fortran 75 もとのベクトルの1~5 番 成 分 が0 番 PE,6~10 番 成 分 が1 番 PE,11~15 番 が2 番 PE,16~20 番 が3 番 PEのそれぞれ1 番 ~5 番 成 分 となる( 局 所 番 号 が1 番 ~5 番 となる). VECp( 1)~VECp( 5) VECs( 1)~VECs( 5) PE#0 VECp(1)= 2 (2)= 2 (3)= 2 (4)= 2 (5)= 2 VECs(1)= 3 (2)= 3 (3)= 3 (4)= 3 (5)= 3 VECp( 6)~VECp(10) VECs( 6)~VECs(10) PE#1 VECp(1)= 2 (2)= 2 (3)= 2 (4)= 2 (5)= 2 VECs(1)= 3 (2)= 3 (3)= 3 (4)= 3 (5)= 3 VECp(11)~VECp(15) VECs(11)~VECs(15) PE#2 VECp(1)= 2 (2)= 2 (3)= 2 (4)= 2 (5)= 2 VECs(1)= 3 (2)= 3 (3)= 3 (4)= 3 (5)= 3 VECp(16)~VECp(20) VECs(16)~VECs(20) PE#3 VECp(1)= 2 (2)= 2 (3)= 2 (4)= 2 (5)= 2 VECs(1)= 3 (2)= 3 (3)= 3 (4)= 3 (5)= 3

76 とは 言 え 全 体 を 分 割 して,1から 番 号 をふり 直 すだけ とい うのはいかにも 簡 単 である. もちろんこれだけでは 済 ま ない. 済 まない 例 について は 後 半 に 紹 介 する. VG( 1) VG( 2) VG( 3) VG( 4) VG( 5) VG( 6) VG( 7) VG( 8) VG( 9) VG(10) VG(11) VG(12) VG(13) VG(14) VG(15) VG(16) VG(17) VG(18) VG(19) VG(20) PE#0 PE#1 PE#2 PE#3 VL(1) VL(2) VL(3) VL(4) VL(5) VL(1) VL(2) VL(3) VL(4) VL(5) VL(1) VL(2) VL(3) VL(4) VL(5) VL(1) VL(2) VL(3) VL(4) VL(5) MPI Programming

77 内 積 の 並 列 計 算 例 (1/3) <$P-S1>/allreduce.f implicit REAL*8 (A-H,O-Z) include 'mpif.h' integer :: PETOT, my_rank, ierr real(kind=8), dimension(5) :: VECp, VECs call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) suma= 0.d0 sumr= 0.d0 do i= 1, 5 VECp(i)= 2.d0 VECs(i)= 3.d0 enddo 各 ベクトルを 各 プロセスで 独 立 に 生 成 する sum0= 0.d0 do i= 1, 5 sum0= sum0 + VECp(i) * VECs(i) enddo if (my_rank == 0) then write (*,'(a)') '(my_rank, sumallreduce, sumreduce) endif

78 内 積 の 並 列 計 算 例 (2/3) <$P-S1>/allreduce.f!C!C-- REDUCE call MPI_REDUCE (sum0, sumr, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, & MPI_COMM_WORLD, ierr)!c!c-- ALL-REDUCE call MPI_allREDUCE (sum0, suma, 1, MPI_DOUBLE_PRECISION, MPI_SUM, & MPI_COMM_WORLD, ierr) write (*,'(a,i5, 2(1pe16.6))') 'before BCAST', my_rank, suma, sumr 内 積 の 計 算 各 プロセスで 計 算 した 結 果 sum0 の 総 和 をとる sumr には,PE#0だけに 計 算 結 果 が 入 る. PE#1~PE#3は 何 も 変 わらない. suma には,MPI_ALLREDUCEによって 全 プロセスに 計 算 結 果 が 入 る.

79 <$P-S1>/allreduce.f 内 積 の 並 列 計 算 例 (3/3)!C!C-- BCAST call MPI_BCAST (sumr, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, & ierr) write (*,'(a,i5, 2(1pe16.6))') 'after BCAST', my_rank, suma, sumr call MPI_FINALIZE (ierr) stop end MPI_BCASTによって,PE#0 以 外 の 場 合 にも sumr に 計 算 結 果 が 入 る.

80 <$P-S1>/allreduce.f/c の 実 行 例 $> mpifccpx O3 allreduce.c $> mpifrtpx O3 allreduce.f $> pjsub go4.sh 出 力 先 のファイル 名 を 適 当 に 変 更 してもよい (my_rank, sumallreduce, sumreduce) before BCAST 0 1.200000E+02 1.200000E+02 after BCAST 0 1.200000E+02 1.200000E+02 before BCAST 1 1.200000E+02 0.000000E+00 after BCAST 1 1.200000E+02 1.200000E+02 before BCAST 3 1.200000E+02 0.000000E+00 after BCAST 3 1.200000E+02 1.200000E+02 before BCAST 2 1.200000E+02 0.000000E+00 after BCAST 2 1.200000E+02 1.200000E+02

81 グループ 通 信 による 計 算 例 ベクトルの 内 積 Scatter/Gather 分 散 ファイルの 読 み 込 み

82 全 体 データと 局 所 データ(1/3) ある 実 数 ベクトルVECgの 各 成 分 に 実 数 を 加 えるという, 以 下 のような 簡 単 な 計 算 を, 並 列 化 することを 考 えてみよう: do i= 1, NG VECg(i)= VECg(i) + ALPHA enddo for (i=0; i<ng; i++{ VECg[i]= VECg[i] + ALPHA }

83 簡 単 のために, 全 体 データと 局 所 データ(2/3) NG=32 ALPHA=1000.0 MPIプロセス 数 =4 ベクトルVECgとして 以 下 のような32 個 の 成 分 を 持 つベクト ルを 仮 定 する(<$P-S1>/a1x.all): (101.0, 103.0, 105.0, 106.0, 109.0, 111.0, 121.0, 151.0, 201.0, 203.0, 205.0, 206.0, 209.0, 211.0, 221.0, 251.0, 301.0, 303.0, 305.0, 306.0, 309.0, 311.0, 321.0, 351.0, 401.0, 403.0, 405.0, 406.0, 409.0, 411.0, 421.0, 451.0)

84 全 体 データと 局 所 データ(3/3) 並 列 計 算 の 方 針 1 長 さ32のベクトルVECgをあるプロセス( 例 えば0 番 )で 読 み 込 む. 全 体 データ 2 4つのプロセスへ 均 等 に( 長 さ8ずつ) 割 り 振 る. 局 所 データ, 局 所 番 号 3 各 プロセスでベクトル( 長 さ8)の 各 成 分 にALPHAを 加 える. 4 各 プロセスの 結 果 を 再 び 長 さ32のベクトルにまとめる. もちろんこの 程 度 の 規 模 であれば1プロセッサで 計 算 できるのである が

85 Scatter/Gatherの 計 算 (1/8) 長 さ32のベクトルVECgをあるプロセス( 例 えば0 番 )で 読 み 込 む. プロセス0 番 から 全 体 データ を 読 み 込 む include 'mpif.h' integer, parameter :: NG= 32 real(kind=8), dimension(ng):: VECg call MPI_INIT (ierr) call MPI_COMM_SIZE (<comm>, PETOT, ierr) call MPI_COMM_RANK (<comm>, my_rank, ierr) if (my_rank.eq.0) then open (21, file= 'a1x.all', status= 'unknown') do i= 1, NG read (21,*) VECg(i) enddo close (21) endif #include <mpi.h> #include <stdio.h> #include <math.h> #include <assert.h> int main(int argc, char **argv){ int i, NG=32; int PeTot, MyRank, MPI_Comm; double VECg[32]; char filename[80]; FILE *fp; MPI_Init(&argc, &argv); MPI_Comm_size(<comm>, &PeTot); MPI_Comm_rank(<comm>, &MyRank); fp = fopen("a1x.all", "r"); if(!myrank) for(i=0;i<ng;i++){ fscanf(fp, "%lf", &VECg[i]); }

86 Scatter/Gatherの 計 算 (2/8) 4つのプロセスへ 均 等 に( 長 さ8ずつ) 割 り 振 る. MPI_Scatter の 利 用

87 MPI_SCATTER P#0 A0 B0 C0 D0 P#1 P#2 P#3 Scatter Gather P#0 P#1 P#2 P#3 A0 B0 C0 D0 コミュニケータ comm 内 の 一 つの 送 信 元 プロセス root の 送 信 バッファ sendbuf から 各 プロセスに 先 頭 から scount ずつのサイズのメッセージを 送 信 し,その 他 全 てのプロセスの 受 信 バッファ recvbuf に,サイズ rcount のメッ セージを 格 納. call MPI_SCATTER (sendbuf, scount, sendtype, recvbuf, rcount, recvtype, root, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, scount 整 数 I 送 信 メッセージのサイズ sendtype 整 数 I 送 信 メッセージのデータタイプ recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcount 整 数 I 受 信 メッセージのサイズ recvtype 整 数 I 受 信 メッセージのデータタイプ root 整 数 I 送 信 プロセスのID(ランク) comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

88 MPI_SCATTER P#0 A0 B0 C0 D0 P#1 Scatter P#0 P#1 A0 B0 ( 続 き) P#2 P#3 Gather P#2 P#3 C0 D0 call MPI_SCATTER (sendbuf, scount, sendtype, recvbuf, rcount, recvtype, root, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, scount 整 数 I 送 信 メッセージのサイズ sendtype 整 数 I 送 信 メッセージのデータタイプ recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcount 整 数 I 受 信 メッセージのサイズ recvtype 整 数 I 受 信 メッセージのデータタイプ root 整 数 I 送 信 プロセスのID(ランク) comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード 通 常 は scount = rcount sendtype= recvtype この 関 数 によって,プロセスroot 番 のsendbuf( 送 信 バッファ)の 先 頭 アドレスから scount 個 ずつの 成 分 が,commで 表 されるコミュニケータを 持 つ 各 プロセスに 送 信 され,recvbuf( 受 信 バッファ)のrcount 個 の 成 分 として 受 信 される. Fortran

89 Scatter/Gatherの 計 算 (3/8) 4つのプロセスへ 均 等 に( 長 さ8ずつ) 割 り 振 る. 各 プロセスにおいて 長 さ8の 受 信 バッファ VEC (= 局 所 データ)を 定 義 しておく. プロセス0 番 から 送 信 される 送 信 バッファ VECg の8 個 ずつの 成 分 が, 4つの 各 プロセスにおいて 受 信 バッファ VEC の1 番 目 から8 番 目 の 成 分 として 受 信 される N=8 として 引 数 は 下 記 のようになる: integer, parameter :: N = 8 real(kind=8), dimension(n ) :: VEC... call MPI_Scatter & (VECg, N, MPI_DOUBLE_PRECISION, & VEC, N, MPI_DOUBLE_PRECISION, & 0, <comm>, ierr) int N=8; double VEC [8];... MPI_Scatter (&VECg, N, MPI_DOUBLE, &VEC, N, MPI_DOUBLE, 0, <comm>); call MPI_SCATTER (sendbuf, scount, sendtype, recvbuf, rcount, recvtype, root, comm, ierr)

90 Scatter/Gatherの 計 算 (4/8) 4つのプロセスへ 均 等 に( 長 さ8ずつ) 割 り 振 る. rootプロセス(0 番 )から 各 プロセスへ8 個 ずつの 成 分 がscatterされる. VECgの1 番 目 から8 番 目 の 成 分 が0 番 プロセスにおけるVECの1 番 目 か ら8 番 目,9 番 目 から16 番 目 の 成 分 が1 番 プロセスにおけるVECの1 番 目 から8 番 目 という 具 合 に 格 納 される. VECg: 全 体 データ,VEC: 局 所 データ VEC recvbuf 8 PE#0 8 PE#1 8 PE#2 8 PE#3 局 所 データ local data VECg sendbuf 8 8 8 8 root 全 体 データ global data

91 Scatter/Gatherの 計 算 (5/8) 4つのプロセスへ 均 等 に( 長 さ8ずつ) 割 り 振 る. 全 体 データ(global data)としてはvecgの1 番 から32 番 までの 要 素 番 号 を 持 っていた 各 成 分 が,それぞれのプロセスにおける 局 所 データ(local data)としては,vecの1 番 から8 番 までの 局 所 番 号 を 持 った 成 分 として 格 納 される.VECの 成 分 を 各 プロセスごとに 書 き 出 してみると: do i= 1, N write (*,'(a, 2i8,f10.0)') 'before', my_rank, i, VEC(i) enddo for(i=0;i<n;i++){ printf("before %5d %5d %10.0F\n", MyRank, i+1, VEC[i]);}

92 Scatter/Gatherの 計 算 (5/8) 4つのプロセスへ 均 等 に( 長 さ8ずつ) 割 り 振 る. 全 体 データ(global data)としてはvecgの1 番 から32 番 までの 要 素 番 号 を 持 っていた 各 成 分 が,それぞれのプロセスにおける 局 所 データ(local data)としては,vecの1 番 から8 番 までの 局 所 番 号 を 持 った 成 分 として 格 納 される.VECの 成 分 を 各 プロセスごとに 書 き 出 してみると: PE#0 before 0 1 101. before 0 2 103. before 0 3 105. before 0 4 106. before 0 5 109. before 0 6 111. before 0 7 121. before 0 8 151. PE#1 before 1 1 201. before 1 2 203. before 1 3 205. before 1 4 206. before 1 5 209. before 1 6 211. before 1 7 221. before 1 8 251. PE#2 before 2 1 301. before 2 2 303. before 2 3 305. before 2 4 306. before 2 5 309. before 2 6 311. before 2 7 321. before 2 8 351. PE#3 before 3 1 401. before 3 2 403. before 3 3 405. before 3 4 406. before 3 5 409. before 3 6 411. before 3 7 421. before 3 8 451.

93 Scatter/Gatherの 計 算 (6/8) 各 プロセスでベクトル( 長 さ8)の 各 成 分 にALPHAを 加 える 各 プロセスでの 計 算 は, 以 下 のようになる: real(kind=8), parameter :: ALPHA= 1000. do i= 1, N VEC(i)= VEC(i) + ALPHA enddo double ALPHA=1000.;... for(i=0;i<n;i++){ VEC[i]= VEC[i] + ALPHA;} 計 算 結 果 は 以 下 のようになる: PE#0 after 0 1 1101. after 0 2 1103. after 0 3 1105. after 0 4 1106. after 0 5 1109. after 0 6 1111. after 0 7 1121. after 0 8 1151. PE#1 after 1 1 1201. after 1 2 1203. after 1 3 1205. after 1 4 1206. after 1 5 1209. after 1 6 1211. after 1 7 1221. after 1 8 1251. PE#2 after 2 1 1301. after 2 2 1303. after 2 3 1305. after 2 4 1306. after 2 5 1309. after 2 6 1311. after 2 7 1321. after 2 8 1351. PE#3 after 3 1 1401. after 3 2 1403. after 3 3 1405. after 3 4 1406. after 3 5 1409. after 3 6 1411. after 3 7 1421. after 3 8 1451.

94 Scatter/Gatherの 計 算 (7/8) 各 プロセスの 結 果 を 再 び 長 さ32のベクトルにまとめる これには,MPI_Scatter と 丁 度 逆 の MPI_Gather という 関 数 が 用 意 されている.

95 MPI_GATHER P#0 A0 B0 C0 D0 P#1 P#2 P#3 Scatter Gather P#0 P#1 P#2 P#3 A0 B0 C0 D0 MPI_SCATTERの 逆 call MPI_GATHER (sendbuf, scount, sendtype, recvbuf, rcount, recvtype, root, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, scount 整 数 I 送 信 メッセージのサイズ sendtype 整 数 I 送 信 メッセージのデータタイプ recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcount 整 数 I 受 信 メッセージのサイズ recvtype 整 数 I 受 信 メッセージのデータタイプ root 整 数 I 受 信 プロセスのID(ランク) comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード ここで, 受 信 バッファ recvbuf の 値 はroot 番 のプロセスに 集 められる. Fortran

96 Scatter/Gatherの 計 算 (8/8) 各 プロセスの 結 果 を 再 び 長 さ32のベクトルにまとめる 本 例 題 の 場 合,root=0として, 各 プロセスから 送 信 されるVECの 成 分 を0 番 プロセスにおいてVECgとして 受 信 するものとすると 以 下 のようになる: call MPI_Gather & (VEC, N, MPI_DOUBLE_PRECISION, & VECg, N, MPI_DOUBLE_PRECISION, & 0, <comm>, ierr) MPI_Gather (&VEC, N, MPI_DOUBLE, &VECg, N, MPI_DOUBLE, 0, <comm>); 各 プロセスから8 個 ずつの 成 分 がrootプロセスへgatherされる 8 8 8 8 VEC sendbuf PE#0 PE#1 PE#2 PE#3 局 所 データ local data VECg recvbuf 8 8 8 8 root 全 体 データ global data

<$P-S1>/scatter-gather.f/c 97 実 行 例 $> mpifccpx Kfast scatter-gather.c $> mpifrtpx Kfast scatter-gather.f $> pjsub go4.sh 出 力 先 のファイル 名 を 適 当 に 変 更 してもよい PE#0 before 0 1 101. before 0 2 103. before 0 3 105. before 0 4 106. before 0 5 109. before 0 6 111. before 0 7 121. before 0 8 151. PE#1 before 1 1 201. before 1 2 203. before 1 3 205. before 1 4 206. before 1 5 209. before 1 6 211. before 1 7 221. before 1 8 251. PE#2 before 2 1 301. before 2 2 303. before 2 3 305. before 2 4 306. before 2 5 309. before 2 6 311. before 2 7 321. before 2 8 351. PE#3 before 3 1 401. before 3 2 403. before 3 3 405. before 3 4 406. before 3 5 409. before 3 6 411. before 3 7 421. before 3 8 451. PE#0 after 0 1 1101. after 0 2 1103. after 0 3 1105. after 0 4 1106. after 0 5 1109. after 0 6 1111. after 0 7 1121. after 0 8 1151. PE#1 after 1 1 1201. after 1 2 1203. after 1 3 1205. after 1 4 1206. after 1 5 1209. after 1 6 1211. after 1 7 1221. after 1 8 1251. PE#2 after 2 1 1301. after 2 2 1303. after 2 3 1305. after 2 4 1306. after 2 5 1309. after 2 6 1311. after 2 7 1321. after 2 8 1351. PE#3 after 3 1 1401. after 3 2 1403. after 3 3 1405. after 3 4 1406. after 3 5 1409. after 3 6 1411. after 3 7 1421. after 3 8 1451.

98 MPI_REDUCE_SCATTER P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 Reduce scatter P#0 P#1 op.a0-a3 op.b0-b3 P#2 A2 B2 C2 D2 P#2 op.c0-c3 P#3 A3 B3 C3 D3 P#3 op.d0-d3 MPI_REDUCE + MPI_SCATTER call MPI_REDUCE_SCATTER (sendbuf, recvbuf, rcount, datatype, op, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcount 整 数 I 受 信 メッセージのサイズ( 配 列 :サイズ=プロセス 数 ) datatype 整 数 I メッセージのデータタイプ op 整 数 I 計 算 の 種 類 comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

99 MPI_ALLGATHER P#0 P#1 P#2 A0 B0 C0 All gather P#0 A0 B0 C0 D0 P#1 A0 B0 C0 D0 P#2 A0 B0 C0 D0 P#3 D0 P#3 A0 B0 C0 D0 MPI_GATHER+MPI_BCAST Gatherしたものを, 全 てのPEにBCASTする( 各 プロセスで 同 じデータを 持 つ) call MPI_ALLGATHER (sendbuf, scount, sendtype, recvbuf, rcount, recvtype, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, scount 整 数 I 送 信 メッセージのサイズ sendtype 整 数 I 送 信 メッセージのデータタイプ recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcount 整 数 I 受 信 メッセージのサイズ recvtype 整 数 I 受 信 メッセージのデータタイプ comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

100 MPI_ALLTOALL P#0 A0 A1 A2 A3 P#1 B0 B1 B2 B3 All-to-All P#0 A0 B0 C0 D0 P#1 A1 B1 C1 D1 P#2 C0 C1 C2 C3 P#2 A2 B2 C2 D2 P#3 D0 D1 D2 D3 P#3 A3 B3 C3 D3 MPI_ALLGATHERの 更 なる 拡 張 : 転 置 call MPI_ALLTOALL (sendbuf, scount, sendtype, recvbuf, rcount, recvrype, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, scount 整 数 I 送 信 メッセージのサイズ sendtype 整 数 I 送 信 メッセージのデータタイプ recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcount 整 数 I 受 信 メッセージのサイズ recvtype 整 数 I 受 信 メッセージのデータタイプ comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード Fortran

101 グループ 通 信 による 計 算 例 ベクトルの 内 積 Scatter/Gather 分 散 ファイルの 読 み 込 み

102 分 散 ファイルを 使 用 したオペレーション Scatter/Gatherの 例 では,PE#0から 全 体 データを 読 み 込 み, それを 全 体 にScatterして 並 列 計 算 を 実 施 した. 問 題 規 模 が 非 常 に 大 きい 場 合,1つのプロセッサで 全 ての データを 読 み 込 むことは 不 可 能 な 場 合 がある. 最 初 から 分 割 しておいて, 局 所 データ を 各 プロセッサで 独 立 に 読 み 込 む. あるベクトルに 対 して, 全 体 操 作 が 必 要 になった 場 合 は, 状 況 に 応 じてMPI_Gatherなどを 使 用 する

103 分 散 ファイル 読 み 込 み: 等 データ 長 (1/2) >$ cd <$P-S1> >$ ls a1.* a1.0 a1.1 a1.2 a1.3 a1x.all を4つに 分 割 したもの >$ mpifccpx Kfast file.c >$ mpifrtpx Kfast file.f >$ pjsub go4.sh

104 分 散 ファイルの 操 作 a1.0~a1.3 は 全 体 ベクトル a1x.all を 領 域 に 分 割 し たもの,と 考 えることができる. a1x.all a1.0 a1.1 a1.2 a1.3

105 分 散 ファイル 読 み 込 み: 等 データ 長 (2/2) <$P-S1>/file.f implicit REAL*8 (A-H,O-Z) include 'mpif.h' integer :: PETOT, my_rank, ierr real(kind=8), dimension(8) :: VEC character(len=80) :: filename Hello とそんなに 変 わらない call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) if (my_rank.eq.0) filename= 'a1.0' if (my_rank.eq.1) filename= 'a1.1' if (my_rank.eq.2) filename= 'a1.2' if (my_rank.eq.3) filename= 'a1.3' open (21, file= filename, status= 'unknown') do i= 1, 8 read (21,*) VEC(i) enddo close (21) 局 所 番 号 (1~8) で 読 み 込 む call MPI_FINALIZE (ierr) stop end

106 SPMDの 典 型 例 PE #0 PE #1 PE #2 PE #3 a.out a.out a.out a.out a1.0 a1.1 a1.2 a1.3 mpiexec -np 4 a.out

107 分 散 ファイル 読 み 込 み: 可 変 長 (1/2) ファイル 内 のデータ 数 が 均 等 でない 場 合 はどうするか? >$ cd <$P-S1> >$ ls a2.* a2.0 a2.1 a2.2 a2.3 >$ cat a2.1 5 各 PEにおける 成 分 数 201.0 成 分 の 並 び 203.0 205.0 206.0 209.0 >$ mpifccpx Kfast file2.c >$ mpifrtpx Kfast file2.f >$ pjsub go4.sh

108 分 散 ファイルの 読 み 込 み: 可 変 長 (2/2) <$P-S1>/file2.f implicit REAL*8 (A-H,O-Z) include 'mpif.h' integer :: PETOT, my_rank, ierr real(kind=8), dimension(:), allocatable :: VEC character(len=80) :: filename call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) if (my_rank.eq.0) filename= 'a2.0' if (my_rank.eq.1) filename= 'a2.1' if (my_rank.eq.2) filename= 'a2.2' if (my_rank.eq.3) filename= 'a2.3' open (21, file= filename, status= 'unknown') read (21,*) N allocate (VEC(N)) do i= 1, N read (21,*) VEC(i) enddo close(21) call MPI_FINALIZE (ierr) stop end Nが 各 データ(プロセッサ)で 異 なる

109 局 所 データの 作 成 法 全 体 データ(N=NG)を 入 力 Scatterして 各 プロセスに 分 割 各 プロセスで 演 算 必 要 に 応 じて 局 所 データをGather(またはAllgather)して 全 体 デー タを 生 成 局 所 データ(N=NL)を 生 成,あるいは(あらかじめ 分 割 生 成 して) 入 力 各 プロセスで 局 所 データを 生 成,あるいは 入 力 各 プロセスで 演 算 必 要 に 応 じて 局 所 データをGather(またはAllgather)して 全 体 デー タを 生 成 将 来 的 には 後 者 が 中 心 となるが, 全 体 的 なデータの 動 きを 理 解 するために,しばらくは 前 者 についても 併 用

110 グループ 通 信 による 計 算 例 ベクトルの 内 積 Scatter/Gather 分 散 ファイルの 読 み 込 み MPI_Allgatherv

111 MPI_GATHERV,MPI_SCATTERV これまで 紹 介 してきた,MPI_GATHETR, MPI_SCATTERなどは, 各 プロセッサからの 送 信, 受 信 メッセージが 均 等 な 場 合. 末 尾 に V が 付 くと, 各 ベクトルが 可 変 長 さの 場 合 となる. MPI_GATHERV MPI_SCATTERV MPI_ALLGATHERV MPI_ALLTOALLV

MPI_ALLGATHERV Fortran 112 MPI_ALLGATHER の 可 変 長 さベクトル 版 局 所 データ から 全 体 データ を 生 成 する call MPI_ALLGATHERV (sendbuf, scount, sendtype, recvbuf, rcounts, displs, recvtype, comm, ierr) sendbuf 任 意 I 送 信 バッファの 先 頭 アドレス, scount 整 数 I 送 信 メッセージのサイズ sendtype 整 数 I 送 信 メッセージのデータタイプ recvbuf 任 意 O 受 信 バッファの 先 頭 アドレス, rcounts 整 数 I 受 信 メッセージのサイズ( 配 列 :サイズ=PETOT) displs 整 数 I 受 信 メッセージのインデックス( 配 列 :サイズ=PETOT+1) recvtype 整 数 I 受 信 メッセージのデータタイプ comm 整 数 I コミュニケータを 指 定 する ierr 整 数 O 完 了 コード

MPI_ALLGATHERV( 続 き) Fortran 113 call MPI_ALLGATHERV (sendbuf, scount, sendtype, recvbuf, rcounts, displs, recvtype, comm, ierr) rcounts 整 数 I 受 信 メッセージのサイズ( 配 列 :サイズ=PETOT) displs 整 数 I 受 信 メッセージのインデックス( 配 列 :サイズ=PETOT+1) この2つの 配 列 は, 最 終 的 に 生 成 される 全 体 データ のサイズに 関 する 配 列 であるため, 各 プ ロセスで 配 列 の 全 ての 値 が 必 要 になる: もちろん 各 プロセスで 共 通 の 値 を 持 つ 必 要 がある. 通 常 はstride(i)=rcounts(i) PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1) stride(1) stride(2) stride(3) stride(m-1) stride(m) rcounts(1) rcounts(2) rcounts(3) rcounts(m-1) rcounts(m) displs(1)=0 displs(2)= displs(1) + stride(1) size(recvbuf)= displs(petot+1)= sum(stride) displs(m+1)= displs(m) + stride(m)

MPI_ALLGATHERV でやっていること 局 所 データから 全 体 データを 生 成 する PE#0 PE#1 PE#2 N N N rcounts(1) rcounts(2) rcounts(3) displs(1) stride(1) displs(2) stride(2) displs(3) stride(3) 114 displs(4) PE#3 N rcounts (4) stride(4) 局 所 データ:sendbuf displs(5) 全 体 データ:recvbuf

115 MPI_ALLGATHERV でやっていること 局 所 データから 全 体 データを 生 成 する PE#0 N PE#1 N PE#2 N PE#3 N 局 所 データ:sendbuf rcounts(1) rcounts(2) rcounts(3) rcounts (4) displs(1) stride(1) = rcounts(1) displs(2) stride(2) = rcounts(2) displs(3) stride(3) = rcounts(3) displs(4) stride(4) = rcounts(4) displs(5) 全 体 データ:recvbuf

MPI_ALLGATHERV 詳 細 (1/2) Fortran 116 call MPI_ALLGATHERV (sendbuf, scount, sendtype, recvbuf, rcounts, displs, recvtype, comm, ierr) rcounts 整 数 I 受 信 メッセージのサイズ( 配 列 :サイズ=PETOT) displs 整 数 I 受 信 メッセージのインデックス( 配 列 :サイズ=PETOT+1) rcounts 各 PEにおけるメッセージサイズ: 局 所 データのサイズ displs 各 局 所 データの 全 体 データにおけるインデックス displs(petot+1)が 全 体 データのサイズ PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1) stride(1) stride(2) stride(3) stride(m-1) stride(m) rcounts(1) rcounts(2) rcounts(3) rcounts(m-1) rcounts(m) displs(1)=0 displs(2)= displs(1) + stride(1) size(recvbuf)= displs(petot+1)= sum(stride) displs(m+1)= displs(m) + stride(m)

MPI_ALLGATHERV 詳 細 (2/2) Fortran 117 rcountsとdisplsは 各 プロセスで 共 通 の 値 が 必 要 各 プロセスのベクトルの 大 きさ N をallgatherして,rcounts に 相 当 するベクトルを 作 る. rcountsから 各 プロセスにおいてdisplsを 作 る( 同 じものがで きる). stride(i)= rcounts(i) とする rcountsの 和 にしたがってrecvbufの 記 憶 領 域 を 確 保 する. PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1) stride(1) stride(2) stride(3) stride(m-1) stride(m) rcounts(1) rcounts(2) rcounts(3) rcounts(m-1) rcounts(m) displs(1)=0 displs(2)= displs(1) + stride(1) size(recvbuf)= displs(petot+1)= sum(stride) displs(m+1)= displs(m) + stride(m)

118 MPI_ALLGATHERV 使 用 準 備 例 題 :<$P-S1>/agv.f,<$P-S1>/agv.c a2.0 ~ a2.3 から, 全 体 ベクトルを 生 成 する. 各 ファイルのベクトルのサイズが,8,5,7,3であるから, 長 さ23(=8+5+7+3)のベクトルができることになる.

119 a2.0~a2.3 PE#0 PE#1 PE#2 PE#3 8 101.0 103.0 105.0 106.0 109.0 111.0 121.0 151.0 5 201.0 203.0 205.0 206.0 209.0 7 301.0 303.0 305.0 306.0 311.0 321.0 351.0 3 401.0 403.0 405.0

120 MPI_ALLGATHERV 使 用 準 備 (1/4) <$P-S1>/agv.f implicit REAL*8 (A-H,O-Z) include 'mpif.h' integer :: PETOT, my_rank, SOLVER_COMM, ierr real(kind=8), dimension(:), allocatable :: VEC real(kind=8), dimension(:), allocatable :: VEC2 real(kind=8), dimension(:), allocatable :: VECg integer(kind=4), dimension(:), allocatable :: rcounts integer(kind=4), dimension(:), allocatable :: displs character(len=80) :: filename call MPI_INIT (ierr) call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT, ierr ) call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank, ierr ) if (my_rank.eq.0) filename= 'a2.0' if (my_rank.eq.1) filename= 'a2.1' if (my_rank.eq.2) filename= 'a2.2' if (my_rank.eq.3) filename= 'a2.3' open (21, file= filename, status= 'unknown') read (21,*) N allocate (VEC(N)) do i= 1, N read (21,*) VEC(i) enddo N(NL)の 値 が 各 PEで 異 なることに 注 意

121 MPI_ALLGATHERV 使 用 準 備 (2/4) <$P-S1>/agv.f allocate (rcounts(petot), displs(petot+1)) rcounts= 0 write (*, (a,10i8) ) before, my_rank, N, rcounts call MPI_allGATHER ( N, 1, MPI_INTEGER, & & rcounts, 1, MPI_INTEGER, & & MPI_COMM_WORLD, ierr) write (*,'(a,10i8)') "after ", my_rank, N, rcounts displs(1)= 0 各 PEにrcountsを 生 成 PE#0 N=8 PE#1 N=5 PE#2 N=7 PE#3 N=3 MPI_Allgather rcounts(1:4)= {8, 5, 7, 3} rcounts(1:4)= {8, 5, 7, 3} rcounts(1:4)= {8, 5, 7, 3} rcounts(1:4)= {8, 5, 7, 3}

122 MPI_ALLGATHERV 使 用 準 備 (2/4) <$P-S1>/agv.f allocate (rcounts(petot), displs(petot+1)) rcounts= 0 write (*, (a,10i8) ) before, my_rank, N, rcounts call MPI_allGATHER ( N, 1, MPI_INTEGER, & & rcounts, 1, MPI_INTEGER, & & MPI_COMM_WORLD, ierr) write (*,'(a,10i8)') "after ", my_rank, N, rcounts displs(1)= 0 各 PEにrcountsを 生 成 do ip= 1, PETOT displs(ip+1)= displs(ip) + rcounts(ip) enddo 各 PEでdisplsを 生 成 write (*,'(a,10i8)') "displs", my_rank, displs call MPI_FINALIZE (ierr) stop end

123 MPI_ALLGATHERV 使 用 準 備 (3/4) > mpifrtpx Kfast agv.f > mpifccpx Kfast agv.c > pjsub go4.sh before 0 8 0 0 0 0 after 0 8 8 5 7 3 displs 0 0 8 13 20 23 before 1 5 0 0 0 0 after 1 5 8 5 7 3 displs 1 0 8 13 20 23 before 3 3 0 0 0 0 after 3 3 8 5 7 3 displs 3 0 8 13 20 23 before 2 7 0 0 0 0 after 2 7 8 5 7 3 displs 2 0 8 13 20 23 write (*, (a,10i8) ) before, my_rank, N, rcounts write (*,'(a,10i8)') "after ", my_rank, N, rcounts write (*,'(a,i8,8x,10i8)') "displs", my_rank, displs

124 MPI_ALLGATHERV 使 用 準 備 (4/4) 引 数 で 定 義 されていないのは recvbuf だけ. サイズは displs(petot+1) 各 PEで, allocate (recvbuf(displs(petot+1)) の ようにして 記 憶 領 域 を 確 保 する call MPI_allGATHERv ( VEC, N, MPI_DOUBLE_PRECISION, recvbuf, rcounts, displs, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD, ierr)

125 課 題 S1 (1/2) <$P-S1>/a1.0~a1.3, <$P-S1>/a2.0~a2.3 から 局 所 ベクトル 情 報 を 読 み 込 み, 全 体 ベクトルのノルム ( x )を 求 めるプログラムを 作 成 する(S1-1). ノルム x は, 各 要 素 の2 乗 の 和 の 平 方 根 である. <$P-S1>file.f,<$T-S1>file2.fをそれぞれ 参 考 にする. <$P-S1>/a2.0~a2.3 から 局 所 ベクトル 情 報 を 読 み 込 み, 全 体 ベクトル 情 報 を 各 プロセッサに 生 成 するプログラム を 作 成 する.MPI_Allgathervを 使 用 する(S1-2).

126 課 題 S1 (2/2) 下 記 の 数 値 積 分 を 台 形 公 式 によって 求 めるプログラムを 作 成 する.MPI_Reduce,MPI_Bcast 等 を 使 用 して 並 列 化 を 実 施 し,プロセッサ 数 を 変 化 させた 場 合 の 計 算 時 間 を 測 定 する (S1-3). 1 4 1 x 0 2 dx 1 2 x f N 1 2 f N 1 f i i 2