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 任务将它们的缓冲区发送到根级。但是可以使用一些更复杂的算法,例如基于树的收集,在这种情况下,并非所有任务都会将其缓冲区发送到根级。
我有一个主进程和多个从进程。我希望每个从进程向主进程发回一个整数,所以我想我应该使用 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 任务将它们的缓冲区发送到根级。但是可以使用一些更复杂的算法,例如基于树的收集,在这种情况下,并非所有任务都会将其缓冲区发送到根级。