我是并行处理的初学者,我想将一个值从属于通信器 A 的进程发送到通信器 B 中的所有进程,我尝试使用MPI_Bcast()
, process_sender 应该属于 Communicator B 但它不
MPI_Bcast(&value ,value_size ,MPI_INT ,process_sender_rank, CommunicatorB);
如何在两个分开的通信器之间进行通信,请帮助我
我是并行处理的初学者,我想将一个值从属于通信器 A 的进程发送到通信器 B 中的所有进程,我尝试使用MPI_Bcast()
, process_sender 应该属于 Communicator B 但它不
MPI_Bcast(&value ,value_size ,MPI_INT ,process_sender_rank, CommunicatorB);
如何在两个分开的通信器之间进行通信,请帮助我
在 MPI 中,进程只能在其通信器内的进程之间进行通信。从来源:
在内部,MPI 必须跟上(除其他外)通信器的两个主要部分,即区分一个通信器与另一个通信器的上下文(或 ID)以及通信器包含的一组进程。上下文是阻止一个通信器上的操作与另一个通信器上的类似操作匹配的原因。MPI 在内部为每个通信器保留一个 ID 以防止混淆。
在您的情况下,您可以由进程 A 和属于通信器 B 的进程组成一个新的通信器。让我们称之为 CommunicatorC,然后您可以再次调用例程,但这次使用新的通信器:
MPI_Bcast(&value ,value_size ,MPI_INT ,process_sender_rank, CommunicatorC);
我想出了一个解决方案,它给出了预期的结果,但我认为它不是最好的,首先我使用点对点通信(和)将数据从process_A(属于communicator_A)发送到process_B(属于communicator_B ),因为它们都是属于传播者:MPI_Send()
MPI_Recv()
MPI_COMM_WORLD
/*to get rank of my process in MPI_COMM_WORLD*/
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
/*point to point communication*/
if (world_rank == process_A_rank_in_comm_world_communicator)
MPI_Send( &data ,size_of_data, MPI_INT, process_B_rank, tag ,MPI_COMM_WORLD);
if (world_rank == process_B_rank_in_comm_world_communicator)
MPI_Recv( &data ,size_of_data, MPI_INT, process_A_rank, tag ,MPI_COMM_WORLD, &lStatus);
然后我让process_B将接收到的数据广播到其通信器中的所有进程,即communicator_B。
/*broadCasting*/
MPI_Bcast(&data, size_of_data, MPI_INT, process_B_rank_in_communicator_B, communicator_B) ;