gpt4 book ai didi

c - MPI 中是否有一种方法类似于 MPI_Bcast 但针对单个进程,而不是对整个通信器进行操作?

转载 作者:太空宇宙 更新时间:2023-11-04 08:49:45 26 4
gpt4 key购买 nike

本质上,我在这里寻找的是一个简单的 MPI_SendRecv() 例程,它允许我通过指定源处理器和目标处理器来同步同一缓冲区。

在我看来,对 Ideal_MPI_SendRecv() 函数的函数调用看起来与 MPI_Bcast() 完全一样,但会包含目标进程而不是通信器。

可以这样调用:

Ideal_MPI_SendRecv(&somebuffer, bufferlength, datatype, source_proc, destination_proc);

如果不是,有什么原因吗?这种方法似乎是在两个进程之间同步变量值的完美方法。

最佳答案

不,MPI 中没有这样的调用,因为使用点对点通信实现它很简单。当然你可以写一个,例如(对错误处理有一些基本的支持):

// Just a random tag that is unlikely to be used by the rest of the program
#define TAG_IDEAL_SNDRCV 11223

int Ideal_MPI_SendRecv(void *buf, int count, MPI_Datatype datatype,
int source, int dest, MPI_Comm comm)
{
int rank;
int err;

if (source == dest)
return MPI_SUCCESS;
err = MPI_Comm_rank(comm, &rank);
if (err != MPI_SUCCESS)
return err;
if (rank == source)
err = MPI_Send(buf, count, datatype, dest, TAG_IDEAL_SNDRCV, comm);
else if (rank == dest)
err = MPI_Recv(buf, count, datatype, source, TAG_IDEAL_SNDRCV, comm,
MPI_STATUS_IGNORE);
return err;
}

// Example: transfer 'int buf[10]' from rank 0 to rank 2
Ideal_MPI_SendRecv(buf, 10, MPI_INT, 0, 2, MPI_COMM_WORLD);

您还可以添加另一个类型为 MPI_Status * 的输出参数,并将 MPI_Recv 的状态存储在那里。如果两个进程具有不同的缓冲区大小,这可能会有用。

另一种选择是,如果您必须在一组固定的等级中多次这样做,例如总是从 0 级到 2 级,你可以简单地创建一个新的通信器并在其中广播:

int rank;
MPI_Comm buddycomm;

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_split(MPI_COMM_WORLD, (!rank || rank == 2) ? 0 : MPI_UNDEFINED, rank,
&buddycomm);

// Transfer 'int buf[10]' from rank 0 to rank 2
MPI_Bcast(buf, 10, MPI_INT, 0, buddycomm);

当然,这是一种矫枉过正,因为广播比 MPI_SendMPI_Recv 的简单组合更昂贵。

关于c - MPI 中是否有一种方法类似于 MPI_Bcast 但针对单个进程,而不是对整个通信器进行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20087528/

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