Windows HPC 講習会 2009/9/25 Windows HPC コンソーシアム 1 - MS-MPIプログラミング演習 - 同志社大学生命医科学部 廣安 知之 同志社大学工学研究科 中尾 昌広.

Slides:



Advertisements
Similar presentations
主専攻実験 第1回 ガイダンス資料 TA : 野坂 龍佑 (M2), 高林大輔 (M1)
Advertisements

InstallShieldLecture InstallShield でインストーラを作成する方法 ( 初級編 ) ソニーエンジニアリング 設計 3 部 1 課 齋藤佑輔.
11 January 17, Sample answer of the last week's report. (1) 2 #include #include "mpi.h" int main(int argc, char *argv[]) { int i,r, myid, procs,*result;
MPIを用いたグラフの並列計算 情報論理工学研究室 藤本 涼一.
Windows HPC Server を使ってみる
7-1.WEKOコンテンツ 一括登録 マニュアル Version2.5
ご使用の前に 使用可能なPC環境 Windows XP SP2 以上
初年次セミナー 第8回 データの入力.
クラスタの構成技術と クラスタによる並列処理
JXTA Shell (3) P2P特論 (ソフトウェア特論) 第6回 /
Parallel Programming in MPI part 2
東京工科大学 コンピュータサイエンス学部 亀田弘之
Win32APIとMFC H107102 古田雅基 H107048 佐藤一樹 H107126 山下洋平.
計算技術研究会 C言語講座 第3回 Loops (for文 while文).
2007 Microsoft Office system クイックガイド
クラスタコンピューティングの 並列環境と性能
C#によるWindowsFormApplication入門
キャンパスクラウドによる 実験環境の構築 情報ネットワーク特論 講義資料.
OSI7層の各層の1)名称 2)機能の簡単な説明 3)各階層に関連のあ る機器、規格などを5つ以上書いて下さい。
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
初年次セミナー 第2回 文字の出力.
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
TA 高田正法 B10 CPUを作る 2日目 SPIMのコンパイル TA 高田正法
.NET テクノロジー を利用した SAP ソリューションの拡張 (3階層化) (評価環境構築ガイド)
データベース設計 第9回 Webインタフェースの作成(1)
MPIによる行列積計算 情報論理工学研究室 渡邉伊織 情報論理工学研究室 渡邉伊織です。
Occam言語による マルチプリエンプティブシステムの 実装と検証
第2回 Microsoft Visual Studio C++ を使ってみよう
Windows-XPにソフトをインストールしたい
MPIによるプログラミング概要(その2) 【Fortran言語編】
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
Microsoft Visual Studio 2005 の使い方
Parallel Programming in MPI part 3
≅ ≰ ≳ ≗ ≲ ≩ ≴ ≥ ver manual Tanaka.
C言語講習 第0章 Hello, world!.
マルチスレッド処理 マルチプロセス処理について
EclipseでWekaのAPIを呼び出す
オープンソフトウェア利用促進事業 第3回OSSモデルカリキュラム導入実証
.NET Framework 3.0 概要 (旧称 : WinFX)
キャンパスクラウドによる 実験環境の構築 情報ネットワーク特論 講義資料.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
湘南工科大学 2013年10月8日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
Windows XP  ウィルスバスターインストール方法.
MPIを使った加算  齋藤グループ 小林直樹
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
2013年度 プログラミングⅡ ~ はじめてのプログラミング ~.
2017年度 プログラミングⅡ ~ はじめてのプログラミング ~.
≅ ≰ ≳ ≗ ≲ ≩ ≴ ≥ ver manual Tanaka.
2014年度 プログラミングⅡ ~ はじめてのプログラミング ~.
SQL Server 2008 および 更新プログラムの一括セットアップ
岩澤全規 理化学研究所 計算科学研究機構 粒子系シミュレータ研究チーム 2015年7月22日 AICS/FOCUS共催 FDPS講習会
C言語 はじめに 2016年 吉田研究室.
~目次~ Ⅰ.動作環境 Ⅱ.ファイルのダウンロード Ⅲ.システムのインストール Ⅳ.初期設定 Ⅴ.アンインストール
高度プログラミング演習 (01).
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
「マイグレーションを支援する分散集合オブジェクト」
Parallel Programming in MPI part 2
理工学部情報学科 情報論理工学研究室 延山 周平
vc-1. Visual Studio C++ の基本操作 (Visual Studio C++ の実用知識を学ぶシリーズ)
MPIを用いた並列処理計算 情報論理工学研究室 金久 英之
標準入出力、変数、演算子、エスケープシーケンス
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
printf・scanf・変数・四則演算
C言語講座 四則演算  if ,  switch 制御文.
プログラミング演習I 補講用課題
Presentation transcript:

Windows HPC 講習会 2009/9/25 Windows HPC コンソーシアム 1 - MS-MPIプログラミング演習 - 同志社大学生命医科学部 廣安 知之 同志社大学工学研究科 中尾 昌広

目的とスライドの流れ Windows HPC コンソーシアム 2  目的  MS-MPIの利用方法を習得して頂くこと  スライドの流れ  MPI(Message Passing Interface)とは  MS-MPI(Microsoft-MPI)とMPI.NET  MS-MPIを利用した並列計算の概要  MS-MPIを用いた並列アプリケーションの作り方  MS-MPIのプログラミング演習

MPI(Message Passing Interface)とは Windows HPC コンソーシアム 3  分散メモリプログラミングに必要なデータ通信の ための標準仕様  MPIの仕様に準じた実装が数多く存在する  MPI実装を用いることで複数の計算機の協調動作が可能  MPI-1とMPI-2があり、MPI-2の方が新しく機能も豊富 実装名 MS-MPIMPI.NETMPICHMPICH2LAM/MPI 対応 Ver 対応言語 C 、 C++ 、 Fortan.NET 言語 ( C# な ど) C 、 C++ 、 Fortan

MS-MPI(Microsoft-MPI)とは Windows HPC コンソーシアム 4  Microsoft社が提供するMPI-2の実装  C ,C++,Fortranなどで利用可能  Windows HPC Server 2008で並列計算を行うための 通信ライブラリ集  MS-MPIはMPICH2と互換性を出来る限り保持した設計  MPICH2のプログラムソースがあると、少しの変更で  Windowsクラスタのジョブスケジューラの機能  Microsoft社のInfinibandドライバを通した並列計算  NetworkDirectを用いた通信 などを利用する事ができる。

MPI.NETとは Windows HPC コンソーシアム 5 .NET Framework上で動作する並列計算用ライブラリ  ノード間の通信を簡易に行えるAPIを提供 .NETで用いられている言語の全て(特にC#)をサポート  C#とは,Microsoft社が開発したプログラミング言語  javaに似たオブジェクト指向型言語であり、プロセッサに 依存しない実行ファイルを生成可能

MS-MPIとMPI.NET Windows HPC コンソーシアム 6  MPI.NETの通信関数の方が,簡易に記述できる(後述)  MS-MPIの方が,一般に実行は高速

MPIプログラムの概要 Windows HPC コンソーシアム 7  複数の計算機で動作させたい実行ファイルは1つのみ  実行ファイルはすべての計算機が参照できる場所に保存する  if else文などを用いて、各計算機の処理を実行する If ( rank == 0 ) { // ランク 0 にさせたい内容 } else if (rank == 1) { // ランク 1 にさせたい内容 } ・ If ( rank == 0 ) { // ランク 0 にさせたい内容 } else if (rank == 1) { // ランク 1 にさせたい内容 } ・

通信関数(1対1通信) Windows HPC コンソーシアム 8 送信関数受信関数 同期通信 MPI_Send()MPI_Recv() 非同期通信 MPI_Isend()MPI_Irecv() 送信関数と受信関数は 組で用いる rank0 rank1 送信 受信 data 受信完了

MPI_Send関数(MS-MPI) Windows HPC コンソーシアム 9 int MPI_Send(void *buf, int count, MPI Datatype datatype, int dest, int tag, MPI Comm comm) void *buf :送信バッファの開始アドレス int count :データの要素数 MPI Datatype datatype :データタイプ int dest :送信先(ランクを指定) int tag :データ識別用のタグ MPI Comm comm :コミュニケータ 送信バッファのデータを特定の受信先に送信する。

Send関数(MPI.NET) Windows HPC コンソーシアム 10 public void Send (value, dest, tag) value :送信したい値 int dest :送信先(ランクを指定) int tag :データ識別用のタグ 送信バッファのデータを特定の受信先に送信する。

MPI_Recv関数(MS-MPI) Windows HPC コンソーシアム 11 int MPI_Recv(void *buf, int count, MPI Datatype datatype, int source, int tag, MPI Comm comm, MPI Status *status) void *buf :受信バッファの開始アドレス (受け取ったデータの格納場所) int source :送信元 ( MPI ANY SOURCE で送信元を特定しない) int tag :データ識別用のタグ ( MPI ANY TAG でメッセージ・タグを特定しない) MPI Status *status :ステータス 要求されたデータを受信バッファから取り出す。

Recv関数(MPI.NET) Windows HPC コンソーシアム 12 public T Receive (source, tag) int source :送信元(ランクを指定) int tag :データ識別用のタグ 返り値が受信したデータになる 要求されたデータを受信バッファから取り出す。

MPI_Isend関数とMPI_Irecv関数 Windows HPC コンソーシアム 13 int MPI_Isend(void* buf, int count, MPI Datatype datatype, int dest, MPI Comm comm, MPI Request *request) MPI Request : 非同期通信における送信,もしくは受信を 要求したメッセージに付けられる識別子. 通信の状況を調べるために用いる int MPI_Irecv(void *buf, int count, MPI Datatype type, int source, int tag, MPI Comm comm, MPI request *request) (以下,すべてMS-MPI)

集合通信 Windows HPC コンソーシアム 14  集合通信は2台以上のプロセス間のデータの通信を行う  すべてのプロセスが同じ関数を呼び出すことで、 協調動作を行える

集合通信の例:one to all Windows HPC コンソーシアム 15 int MPI_Bcast(void *buf, int count, MPI Datatype datatype, int root, MPI Comm comm) 1 つのランク(引数のrootで指定)から全てのランクに メッセージを一斉に送信する。 rank0 rank1 受信 data rank2rank3 受信 送信

集合通信の例:all to one Windows HPC コンソーシアム 16 Int MPI_Gather(void *sendbuf, int count, MPI Datatype datatype, void *recvbuf, MPI Datatype datatype, MPI Comm comm) 各ランクが持っている値を1つのランクに集める。 rank0 rank1 受信 rank2rank3 送信

集合通信の例:all to one Windows HPC コンソーシアム 17 int MPI_Reduce ( void *sendbuf, void *recvbuf, int count, MPI Datatype datatype, MPI op op, int dest, MPI Comm comm ) 全てのランクのデータをある1つのランクに集める。 同時に各データを足し合わせるなどの演算を行う。 rank0 rank1 受信 data0+ data1+ data2+data3 rank2rank3 送信

MS-MPIプログラミングの準備 Windows HPC コンソーシアム 18  MS-MPIはHPC Pack 2008に同梱されている。 そのため、HPC Pack 2008をインストールするのみで MS-MPIを利用できる  今回は開発環境として、Visual C Express Edition(無償)を用いる  MS-MPIのアプリケーション開発はWindows Vista、 XPでも可能である  ただし、ノードを跨いだMS-MPIのアプリケーション 実行には、Windows Serverが必要である  すべてのマシンから見ることができる共有フォルダを 準備する

共有フォルダの作成 Windows HPC コンソーシアム 19  デスクトップに適当な名前のフォルダを作成する  右クリックし, 「共有とセキュリティ」を選択

共有フォルダの作成 Windows HPC コンソーシアム 20  適用な共有名を作成する(shareとして下さい)

共有フォルダの作成 Windows HPC コンソーシアム 21  アクセス許可で「フルコントロール」にチェック

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 22  Visual C++を起動し、「ファイル」→「新規作成」 →「プロジェクト」を選択。 「 Win32 コンソールアプリケーション」を選択し、 プロジェクト名に適当な名前を入力する。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 23  次へを選択

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 24  追加のオプションで「空のオブジェクト」を選択。 「完了」をクリックする。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 25  C++ファイルをプロジェクトに追加。 「ソリューションエクスプローラー」の作成した プロジェクトの「ソースファイル」を右クイックし、 「追加」→「新しい項目」を選択。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 26  テンプレートの「C++ファイル(.cpp)」を選択し、 適当なファイル名をつけて作成する。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 27  インクルードパスの設定 「ソリューション エクスプローラー」の作成した プロジェクトの 「プロパティ」を選択。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 28  「構成プロパティ」→「C/C++」→「全般」→「追加のイン クルードディレクトリ」にMS-MPIのインクルードパスを入力 する。 今回は「 C:\Program Files\Microsoft HPC Pack 2008 SDK\Include 」と入力した。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 29  「構成プロパティ」→「C/C++」→「コード生成 」→ 「ランタイム ライブラリ」→「マルチスレッド(/MT)」

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 30  リンカの設定 「構成プロパティ」→「リンカ」→「全般」→「追加のライ ブラリディレクトリ」にリンクパスを追加する。 今回は「C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\i386」と入力した。

MS-MPIプログラムの作成方法 Windows HPC コンソーシアム 31  「リンカ」→「入力」→「追加の依存ファイル」に 「msmpi.lib」と入力する。

MS-MPIプログラム例 Windows HPC コンソーシアム 32  次の3種類のMS-MPIアプリケーションを作成する  通信を行わない並列アプリケーション  1対1通信の並列アプリケーション  集合通信を用いた並列アプリケーション

通信を行わない並列アプリケーション Windows HPC コンソーシアム 33  自分自身のランクとマシン名を出力する

通信を行わない並列アプリケーション Windows HPC コンソーシアム 34 #include #include “mpi.h” // mpi 用のヘッダファイルをインクルード int main(int argc,char **argv){ int rank, namelen; char hostname[MPI_MAX_PROCESSOR_NAME]; MPI_Init(&argc, &argv); // 初期化 MPI_Comm_rank(MPI_COMM_WORLD, &rank); // ランクを取得 MPI_Get_processor_name(hostname,&namelen); // マシン名を取得 printf("%d\t%s\n", rank, hostname); MPI_Finalize(); // 終了処理 return 0; }

通信を行わない並列アプリケーション Windows HPC コンソーシアム 35  ビルドが終了し、エラーがなければ、作成した 並列アプリケーションの実行ファイルを共有フォルダに コピーする。  実行ファイルはC:\Documents and Settings\(アカウント 名)\My Documents\Visual Studio 2008\Projects\(プロ ジェクト名)\Debug\(プロジェクト名).exeにある。  Powershellを起動する。

通信を行わない並列アプリケーション Windows HPC コンソーシアム 36 job submit /scheduler:( ジョブスケジューラ ) /numcores:( 計算に 用いるコア数 ) /workdir:( 実行ファイルのフォルダ ) /stdout: (出力ファイル) mpiexec (プロジェクト名).exe 下記のようなコマンドを入力し、並列アプリケーションを 実行する。 job submit /scheduler: /numcores:4 /workdir:\\ \share /stdout:out.txt mpiexec test.exe 具体的な数値を入れた例は下記の通りである。

通信を行わない並列アプリケーション Windows HPC コンソーシアム 37 1 machine1.doshisha.ac.jp 3 machine3.doshisha.ac.jp 2 machine2.doshisha.ac.jp 0 machine0.doshisha.ac.jp  実行結果の例(出力ファイルに結果が入力される) 必ずしもランクの順に出力されないのは、 各プロセスが個別に実行されているからである。

1対1通信の並列アプリケーション Windows HPC コンソーシアム 38  2台の計算機で実行する  ランク0のデータをランク1に渡し、その値を出力する rank0rank1 送信 受信 data 受信完了 data=15 出力printf

1対1通信の並列アプリケーション Windows HPC コンソーシアム 39 #include #include “mpi.h” // mpi 用のヘッダファイルをインクルード int main(int argc,char **argv){ int rank, tag = 999, data = 0; MPI_Status stat; MPI_Init(&argc, &argv); // 初期化 MPI_Comm_rank(MPI_COMM_WORLD, &rank); // ランクを取得 if( rank == 0 ){ // ランク 0 にだけ、 data の値を変える data = 15; } printf(“Before : %d\t%d\n”, rank, data); // 送信前のデータを出力

1対1通信の並列アプリケーション Windows HPC コンソーシアム 40 if( rank == 0 ){ // ランク 0 のデータをランク 1 に送信 MPI_Send(&data, 1, MPI_INT, 1, tag, MPI_COMM_WORLD); } else if( rank == 1 ){ MPI_Recv(&data, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &stat); } printf(“After : %d\t%d\n”, rank, data); // 送信後のデータを出力 MPI_Finalize(); // 終了処理 return 0; }

1対1通信の並列アプリケーション Windows HPC コンソーシアム 41 Before : 015 Before : 10 After : 015 After : 115  実行結果の例

集合通信の並列アプリケーション Windows HPC コンソーシアム 42  3台の計算機で実行する  ランク1と2のデータをランク0に渡し、 ランク0はすべてのデータの値を合計して出力する rank0 rank1 受信 data0+ data1+data2 rank2 送信

集合通信の並列アプリケーション Windows HPC コンソーシアム 43 #include #include “mpi.h” // mpi 用のヘッダファイルをインクルード int main(int argc,char **argv){ int rank, data = 0, sum = 0; MPI_Init(&argc, &argv); // 初期化 MPI_Comm_rank(MPI_COMM_WORLD, &rank); // ランクを取得 if( rank == 0 ){ // 各ランクに data の値を設定 data = 5; } else if (rank == 1){ data = 3; } else if (rank == 2){ data = 2; }

集合通信の並列アプリケーション Windows HPC コンソーシアム 44 printf(“Before : %d\t%d\n”, rank, data); // 送信前のデータを出力 // ランク 0 にデータを送信する。その際に値を合計する MPI_Reduce(&data, &sum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if(rank == 0){ printf(“SUM : %d\n”, sum); // 合計を出力 } MPI_Finalize(); // 終了処理 return 0; }

集合通信の並列アプリケーション Windows HPC コンソーシアム 45 Before : 03 Before : 12 Before : 25 SUM : 10  実行結果の例(出力ファイルに結果が保存される)

まとめ Windows HPC コンソーシアム 46  MS-MPIの概要説明  Windows HPC Server上でのMS-MPIアプリケーションの 作成方法の説明

参考URL Windows HPC コンソーシアム 47  過去のWindowsHPC講習会の資料(MPI.NETなど)   MPI.NETの本家   MS-MPIについて  jp/library/cc aspx