gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:44:06 27 4
gpt4 key购买 nike

我有一个主进程和更多从进程。我希望每个从进程向主进程发送一个整数,所以我想我应该使用 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

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

请记住,该标准没有指定如何实现集体操作。对于MPI_Gather(),简单的实现会让所有 MPI 任务将其缓冲区发送到根队列。但是可以使用一些更复杂的算法,例如基于树的收集,在这种情况下,并非所有任务都会将其缓冲区发送到根等级。

关于MPI_Gather 可以用于从使用 MPI_Send 的线程接收数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59078035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com