是否可以忽略/丢弃MPI_Allgather中的接收数据?

时间:2012-03-28 20:23:15

标签: c++ c mpi parallel-processing

在MPI中,是否可以立即丢弃接收的数据而无需分配缓冲区来保存它?我正在使用MPI_Allgather从多个进程收集数据,但在某些时候,一个或多个进程没有有用的数据要发送。

我最初的解决方案是让无用的流程完成。但是,如果任务在没有调用MPI_Allgather的情况下终止,则其余任务最终会陷入死锁,因为MPI_Allgather会阻塞。为了克服这个问题,我将所有过程保持到最后,但发送从未使用过的垃圾数据。

有用的进程保留了一些收到的数据,但无用的进程没有。我尝试传递recbuf的空指针,如下所示:

MPI_Allgather(&sendbuf, 1, MPI_INT, 0, 1, MPI_INT, MPI_COMM_WORLD);

但它不起作用。我能做些什么来避免接收,或者至少存储无用的数据?

2 个答案:

答案 0 :(得分:2)

您可以为有用的流程创建一个新组,并收集该组而不是MPI_COMM_WORLD

答案 1 :(得分:1)

根据定义,集体是集体的,这意味着沟通者中的每个过程都必须调用它们。如果您需要对通信器的子集执行集体呼叫,则必须按照已建议的方式创建新的通信器。

您还可以查看MPI_Allgatherv,看看它是否适合您的应用。使用此集合,您可以指定每个进程将发送多少数据。但是,通信器中的每个进程仍然必须调用MPI_Allgatherv,即使那些不发送数据的进程也是如此。除了这个要求之外,所有流程都必须知道每个流程贡献了多少数据。

最后,MPI 3很可能包括稀疏的集体操作,这些操作完全符合您的要求。但是现在一个新的沟通者可能是最好的方法。