質問はそれをすべて言います。3人のコミュニケーターがいます(グループも利用できます)。ここで、1 つの通信サブセットに対してのみ a 関数を呼び出したいと思います。つまり、他のサブセットの機能をマスクします。これは可能ですか、それとも明示的にループを正し、グループ内の現在のプロセスの存在を確認してから関数を呼び出す必要がありますか?
ありがとう、
3 つのコミュニケーターが作成されているコードを変更できますか? my_group
その場合、プログラムの残りの実行時間のためにグループランクを保存する変数を追加することをお勧めします(つまり、Hristoが提案したように)。したがって、グループ (またはコミュニケーター) 固有の関数を呼び出す必要があるときはいつでも、 をチェックするだけgroup_rank
です。
理論的根拠
ほとんどの MPI プログラムは何らかのグローバルmy_rank
変数 (プロセスのランクを格納する) を持つ傾向があるため、a を追加するmy_group
ことはこのプログラミング戦略に沿っています。
でユーザー定義のリダクション演算子を悪用する以外に、サブコミュニケーターのすべてのメンバーに対して関数を呼び出す方法はありませんMPI_Allreduce()
。最もクリーンなことは次のとおりです。
int group_rank;
// Test if current process belongs to "group"
MPI_Group_rank(group, &group_rank);
if (group_rank != MPI_UNDEFINED)
call_the_function();