这个问题说明了一切。我有三个沟通者(团体也可用)。现在我想为一个通信子集调用一个函数。这掩盖了其他子集的功能。这是可能的还是我应该明确地确定循环并检查组中当前进程是否存在然后调用该函数。
谢谢,
答案 0 :(得分:1)
除了在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();
答案 1 :(得分:1)
您是否可以修改创建三个通信器的代码?在这种情况下,我建议您添加一个变量(即Hristo建议的my_group
),以保存程序运行时其余部分的组级别。因此,每当您需要调用组(或通信器)特定功能时,只需检查group_rank
。
<强>原理强>
大多数MPI程序往往会有某种全局my_rank
变量(存储进程的排名),因此添加my_group
将符合此编程策略。