我有一个程序正在尝试使用 MPI 进行并行处理。在这个程序中,我在每个进程上都有一个向量的副本。单个进程可以编辑向量中的任何项目,但根据设计,不会在多个进程上编辑任何项目。然后,我需要一种方法来跨进程更新向量,以便每个进程再次包含一个副本,其中向量包含每个进程的更新值。
我可以想到一些可能的方法来做到这一点,包括使用额外的布尔向量来改变或不改变,收集然后比较然后广播,但我最喜欢的是使用带有自定义 MPI_Op 的 allreduce 调用来比较值并更改为唯一价值。不幸的是,似乎 MPI_op 被定义为只有两个向量被传递给阻止我找到唯一值。
我想这种类型的问题并不少见,所以请随时指出我可能错过的另一种方法。谢谢。
这就是我正在尝试的,但正如你所知道的那样,这失败了,因为它可能会错误地更新唯一值而不是正确的值。
void assignDifferent(double *in, double * inout, int *len, MPI_Datatype *dptr){
int i;
double newValue;
for (i = 0; i<*len ; i++){
*inout = in[i]==*inout? *in:*inout;
in++,inout++;
}
}