山口屋~活動日誌~

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

MPI 構造体 データ 送受信 派生データ型

2023-12-03 15:36:06 | ソフトウェア開発
MPI(Message Passing Interface)で構造体を送受信したいときは、MPI_Type_struct関数、MPI_Type_commit関数でMPIデータ型を定義してから送受信する。終了時にはMPI_Type_free関数でMPIデータ型をメモリ解放する。

int MPI_Type_struct(int count, const int *array_of_blocklengths, const MPI_Aint *array_of_displacements, const MPI_Datatype *array_of_types, MPI_Datatype *newtype)
count:メンバの個数
array_of_blocklength:各メンバの要素数を示す配列へのポインタ
array_of_displacements:各メンバのメモリオフセットを示す配列へのポインタ
array_of_types:各メンバのMPIデータ型を示す配列へのポインタ
new_type:MPIデータ型を表す変数へのポインタ

int MPI_Type_commit(MPI_Datatype *datatype)
datatype:MPIデータ型を表す変数へのポインタ

送受信する構造体メンバのメモリオフセットを知るためにはoffsetofマクロを使う。
#include <stddef.h>
#ifndef offsetof
#define offsetof(type, member) ((size_t)&((type*)0)->member)
#endif

int MPI_Type_free(MPI_Datatype *datatype)
datatype:MPIデータ型を表す変数へのポインタ

<参考>
・理化学研究所:MPIコミュニケータとデータタイプ
・理化学研究所:並列プログラミング入門 MPI版
・同志社大学工学部知的システムデザイン研究室:並列処理の導入2 MPIプログラムのチューニング
・C言語入門講座:構造体メンバーの位置を取得する
・noocyte のプログラミング研究室:4.構造体に関するマクロ
・標準Cライブラリの実装:stddef.h
・MSDN:データ型の範囲
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

リダクション演算 C/C++ OpenMP MPI Gather/Scatter ブロードキャスト マルチキャスト

2023-12-03 14:44:22 | ソフトウェア開発
OpenMPのリダクション演算は、C/C++ では Fortran と対応機能が異なるので注意。最大値と最小値には対応していない。(参考文献のpp.17)
<参考文献>
南里豪志、渡部善隆:OpenMP入門(2)、九州大学情報基盤センター広報、Vol.2, No.1, pp.1-40(2002.03)

MPIでデータ集約をする際、reduction 演算をせずに単に集めるなら MPI_Allgather と MPI_Gather が使える。MPI_Allgather は MPI_Gather を全プロセスで呼出した結果と同じになるが、バタフライのアルゴリズムで通信することで高速になるように工夫されている。(東京工業大学 廣瀬研究室:MPIリファレンス 3. 集団通信)MPI_Gather も MPI_Allgather もデータの個数は1プロセスのデータ集約前を指定する。データの個数が各プロセスで異なる場合は MPI_Gatherv と MPI_Allgatherv を使う。基本的にMPIの場合、送信バッファと受信バッファは必ずアドレスが異なっていなければならない。

MPIでデータ集約をする際、reduction 演算をするならば MPI_Allreduce と MPI_reduce が使える。位置を含めて最大値(MPI_MAXLOC)や最小値(MPI_MINLOC)を求める場合はデータ型にMPI_DOUBLE_INTを使う。(MPI_UNSIGNEDはあるがMPI_DOUBLE_UNSIGNEDはないようである。)ユーザー定義の reduction 演算をするならば、演算に使うデータ型(構造体)を MPI_Type_struct で定義、演算内容を MPI_Op_create で登録、といったことが必要である。
<参考URL>
理化学研究所 情報基盤センター 青山幸也:並列プログラミング入門 MPI版 2012年6月1日版(pp.34-39)

MPI_Gather とは逆の MPI_Scatter の各プロセッサの受信側バッファには先頭から詰めて値が書き込まれる。

プロセス総数と自己プロセスは MPI_Comm_size と MPI_Comm_rank で取得される。
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPIでブロードキャストでなくマルチキャストを使いたい場合には、MPI_Comm_split で、MPI_COMM_WORLD(全体)のコミュケータを color 値で分けられたコミュケータ群に分割する。MPI_COMM_WORLD(全体)のコミュケータが消滅するわけではない。MPI_Comm_group 等のコミュケータから作られるグループの操作をする関数もあるらしい。
<参考URL>
辻田祐一:コミュニケータとデータタイプ(→PDF
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする