MPI_Gather 可以用于从使用 MPI_Send 的线程接收数据吗?

Can MPI_Gather be used to receive data from threads that use MPI_Send?

我有一个主进程和多个从进程。我希望每个从进程向主进程发回一个整数,所以我想我应该使用 MPI_Gather 来收集它们。但不知何故它不起作用,我开始认为 MPI_Gather 与 MPI_Send.

不兼容

相关代码行如下所示:

MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &process_id);
MPI_Comm_size(MPI_COMM_WORLD, &process_count);

int full_word_count = 0;
int* receiving_buffer = (int*)malloc(sizeof(int) * 100);

if (process_id == 0)
{
    // Some Master code here ...

    MPI_Gather(full_word_count, 1, MPI_INT, receiving_buffer, 1, MPI_INT, 0, MPI_COMM_WORLD);

    // ...
}
else
{
    // Some Slave code here ...

    MPI_Send(full_word_count, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);

    //...
}

MPI_Finalize();

我也知道我对MPI_Gather使用了“1”,因为我尝试只对两个进程运行,所以进程1会发送,进程0会收集;当然,对于更多流程,我应该使用等级对其进行修改。但我的主要问题是,对于这种情况,我可以使用(如果可以,如何使用)MPI_Gather 和 MPI_Send。

MPI_Gather()是一个集体操作,因此必须由所有级别的通信者调用。他们还必须提供匹配的签名(数据类型和计数)并且都使用相同的 root 值。

注意 root 等级的发送缓冲区也被收集到接收缓冲区中,所以如果发送计数是 1,你真的应该分配你的接收缓冲区

int* receiving_buffer = (int*)malloc(sizeof(int) * process_count)

并且由于所有级别都发送 1 * MPI_INT,因此正确的接收签名也是 1 * MPI_INT

另请注意,"threads" 在此上下文中是不正确的。 MPI 任务或 MPI 进程是正确的术语。

请记住,该标准并未指定应如何实施集体行动。在 MPI_Gather() 的情况下,一个天真的实现会让所有 MPI 任务将它们的缓冲区发送到根级。但是可以使用一些更复杂的算法,例如基于树的收集,在这种情况下,并非所有任务都会将其缓冲区发送到根级。