山口屋~活動日誌~

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

リダクション演算 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

最新の画像もっと見る

コメントを投稿