山口屋~活動日誌~

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

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でシェアする

C++/CLI ラッパー C言語 配列 Visual Studio 複数 exe

2023-12-01 05:37:49 | ソフトウェア開発
C++/CLIを使ってラッパーを作成する際、C言語の引数が配列(ポインタ)だった場合にどうすればよいか、検討中。C++/CLI内でpin_ptrを使ってアドレスを固定してやることがポイントらしく、下記の記述となる。(C++/CLIは、アンマネージド型のポインタ:"*"、マネージド型のポインタ:"^"、両方使える。)

C++/CLIのラッパー関数は、マネージド型のポインタ(array<アンマネージド型>^ 変数名)を仮引数に持つ。
最初に pin_ptr<アンマネージド型> の変数に、マネージド型のポインタを格納する記述をして初期化。
C言語の関数のポインタ引数には pin_ptr<アンマネージド型> の変数を渡す。
最後に pin_ptr<アンマネージド型> の変数に、マネージド型の空ポインタ(nullptr)を代入する記述をして解放。

C++/CLIのクラスは名前空間に属する、C++/CLIのスコープ解決演算子(::)はC#ではドット演算子(.)に代わる、などソースコード記述の際に書き間違えないように注意。

<参考>
Programming: WAKU-TAKE-A PROGRAM -- プログラミングの記事(C++、C#):(02)C#から、C++の関数の実行(簡単な例)
so-zou.jp:C++、C++/CLI、C# 言語比較 | ポインタの違い
tocsworld:C++/CLIで覚えておくべきこと

多次元配列(ジャグ配列)では、下記の英語サイトの「Natively accessing a jagged array」が参考になるかもしれない。
CodeProject:Arrays in C++/CLI
○マネージド配列でC++/CLIに入力されたものはpin_ptrに入れる
○そうでないものはC++/CLIでネイティブポインタに入れる
いろいろ試してみた結果、
○pin_ptrのポインタはNG
○pin_ptrの固定長配列はOK
○pin_ptrのマネージド配列はOK
なので、要素数が可変の2次元配列(ジャグ配列)であれば、pin_ptrのマネージド配列を用意してマネージド配列(添字1つ目)の要素毎にマネージド配列(添字2つ目)のポインタを固定し、新たに用意したネイティブ配列(添字1つ目)にpin_ptrのマネージド配列の要素毎にコピーすればいい?

C++/CLIを使ってラッパーを作成する手順は下記の通り。(プロジェクト名を引用して自動生成される識別子でアンダーバーが認識されないようなので命名に注意。)
●C/C++
○スタティックライブラリとして作成(プリコンパイル済みヘッダーのチェックを外す。)
●C++/CLI
○ダイナミックライブラリとして作成。
(CLR→空のプロジェクトで作成、構成プロパティ→全般→構成の種類→ダイナミックリンクライブラリで指定)
○C/C++のスタティックライブラリ(プロジェクト)を参照先として指定。
(参照先として設定すれば、プロジェクトの依存関係は自動設定される。)
○C/C++のヘッダファイルをソースコードでインクルード。
○C/C++のクラスはアンマネージド型のポインタ変数としてメンバにする。
●C#
○C++/CLIのダイナミックライブラリ(プロジェクト)を参照先として指定。
(参照先として設定すれば、プロジェクトの依存関係は自動設定される。)
(プロジェクトのプロパティで「32ビットを優先」のチェックを外す。そうしないと AnyCPU を選択しても32bit構成になってしまうことがある。)

@IT:Vista到来。既存C/C++資産の.NET化を始めよう!(2/4)

デバッグ向けにC#とC/C++の両側でスタートアップできる(複数のexeを作成する)ようにしたいとも考えている。
いちろぐ:Visual Studioでソリューション内の複数のプロジェクトをデバッグ実行する

「プロジェクトはこのソリューション構成に対してビルドするように選択されていません。」というエラーが出るようであれば、メニューバーの[ビルド]→[構成マネージャー]でビルドにチェックが入っているか確認をする。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする