山口屋~活動日誌~

私生活で主な出来事をピックアップ

MPI Visual Studio C++ 2017 Express MS-MPI

2023-12-02 22:52:28 | ソフトウェア開発
Microsoft Visual Studio(Express 2017 for Windows Desktop のオンラインインストーラー)で、MPI(Message Passing Interface)を利用するにはライブラリをインストールする必要がある。

●手順1.MS-MPI(Release Notes)のインストール
○msmpisdk.msi(include files, lib files)、msmpisetup.exe(mpiexec)の両方をインストール。

●手順2.Visual Studio の設定
○[プロジェクトのプロパティ]→[構成プロパティ]→[C/C++]→[追加のインクルード ディレクトリ]→$(MSMPI_INC)を追加
○[プロジェクトのプロパティ]→[構成プロパティ]→[リンカー]→[追加のライブラリ ディレクトリ]→$(MSMPI_LIB64)または$(MSMPI_LIB32)を追加

●手順3.ソースファイル内で記述
#include <mpi.h> //#define MPI_INCLUDED
#pragma comment(lib, "msmpi.lib")

<参考>
●Atsushi M. Ito's page:Visual Studio 2013におけるMS-MPI v6の利用
●Atsushi M. Ito's page:Visual Studio 2015におけるMS-MPIのデバッグ実行
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MPI ファイル 入出力

2023-12-02 19:42:53 | ソフトウェア開発
継続調査中。

MPI_File_set_view()は可搬性を高めるために利用が望ましい。

●MPI_File_open( MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh )

コミュニケータに属するプロセスで同じ関数を呼び出す。

MPI_Comm comm
:コミュニケータ

char *filename


int amode
:アクセスモード
- MPI_MODE_RDONLY 読込のみ可能
- MPI_MODE_RDWR 読込みと書き込みの両方可能
- MPI_MODE_WRONLY 書込みのみ可能
- MPI_MODE_CREATE ファイルが無い場合、新規作成
- MPI_MODE_EXCL 既にファイルがある場合にエラーを返す
- MPI_MODE_DELETE_ON_CLOSE ファイルを閉じる際に消去
- MPI_MODE_UNIQUE_OPEN 同時にファイルをオープンしない
- MPI_MODE_SEQUENTIAL 逐次的なファイルのオープン
- MPI_MODE_APPEND 全てのファイルポインタをファイル終端にセット

MPI_Info info
:MPI-IOに関するヒント

MPI_File *fh
:ファイルハンドル

●MPI_File_set_view( MPI_File fh, MPI_Offset disp, MPI_Datatype etype, MPI_Datatype ftype, char *datarep, MPI_Info info )

全プロセスで呼び出しする。

MPI_File fh
:当該ファイルのファイルハンドル

MPI_Offset disp
:オフセット値

MPI_Datatype etype
:ファイルビューを表すftypeを生成する基になるデータ型

MPI_Datatype ftype
:ファイルビューを表すデータ型

char *datarep
:以下の3種類の内のどれかを指定
– native: メモリ中のバイナリデータ表現と同じ表現(同一計算機内での利用を想定したデータ表現)
– internal: 同一システム内で互換するデータ表現
– external32: 異なるシステム間でも互換性のあるデータ表現

MPI_Info info
:MPI_Infoオブジェクト(key,valueペアで指定されたパラメタ群)。特に設定するものが無い場合、MPI_INFO_NULLを引数に与える。

<参考>

東京大学情報基盤センター:「MPI基礎:並列プログラミング入門」ファイル入出力(pp.30)
理研AICS 辻田祐一:MPI-IO(pp.7-11)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MPI コミュニケータ ホスト ノード 分割 関数

2023-12-02 19:42:36 | ソフトウェア開発
MPIのプロセスのグループはコミュニケータと呼ばれるが、全プロセスを指す MPI_COMM_WORLD というコミュニケータしか紹介していないものが多い。
(MPI_COMM_WORLDは、初期化で用意されるコミュニケータのようである。)
そんな中、ようやくコミュニケータの分割に関する解説が載っている資料を見つけることができた。

●コミュニケータを分割して確保する関数

○C言語
int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *new_comm)

○Fortran
call mpi_comm_split(comm, color, key, newcomm, ierr)

comm
:元のコミュニケータ
color
:サブグループを決めるための変数で、同じ値なら同じサブグループになる。MPI_UNDEFINEDを指定した場合は元のコミュニケータのまま。(非負整数)
key
:サブグループにおける自プロセスのランクを決めるための変数で、昇順で新しいランクが決まる。同じ値の場合は元のランクの昇順で決まる。
new_comm
:サブグループのコミュニケータ(=分割後のコミュニケータ)。colorがMPI_UNDEFINEDの場合はMPI_COMM_NULL。
ierr
:エラーコード(出力)

●コミュニケータを解放する関数

MPI_Comm_split()で新しく割り当てたコミュニケータはMPI_Comm_freeで開放する必要があるらしい。
MPI_Comm_split()の内部で分割後のコミュニケータとランクのメモリを新たに確保している?

○C言語
MPI_Comm_free(MPI_Comm* comm)

○Fortran
MPI_COMM_FREE( comm, ierr )

●コミュニケータを複製して確保する関数

よくわからない。

○C言語
MPI_Comm_dup(MPI_Comm comm, MPI_Comm *newcomm)

○Fortran
MPI_COMM_DUP( comm, new, ierr )

<参考>
・RIKEN AICS Summer School:演習3・4 「MPIによる並列計算」
・Qiita - プログラマの技術情報共有サービス:MPI_Comm_split のテスト
・計算科学演習:MPI発展
・理化学研究所 AICS システムソフトウェア研究チーム 堀敦史:並列プログラミングの基本(MPI)改訂版

●ランクを取得

int MPI_Comm_size(MPI_Comm comm, int* psize)
int MPI_Comm_rank(MPI_Comm comm, int* prank)
comm
:所属するコミュニケータ
psize
:プロセス数(ランクの総数)
prank
:ランク

●ホスト名を取得する関数

使用例が少ないため、現在も調査中。
nameをMPI_Comm_split()のcolor値に対応させれば、ホスト毎にコミュニケータを分けることが可能。

int MPI_Get_processor_name(char* name, int *resultlen)
name
:MPI_MAX_PROCESSOR_NAMEマクロの要素数が最低限必要。

<参考>
@IT:並列処理を体感してみよう
Qiita:MPI_Comm_split のテスト
Yasuaki Ito:MPI覚え書き
理化学研究所 情報基盤センター 青山幸也:並列プログラミング入門 MPI版 2012年6月1日版(pp.65)
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする