MPI标签集

时间:2016-05-06 04:26:17

标签: c mpi

是否可以为MPI_Recv函数指定一组标签?

我的情景:

我正在使用一个具有多个线程同时执行MPI_Recv函数的应用程序。我打算使用mpi标签来控制哪个线程将接收消息。但我还需要控制消息是 data_message 还是 stop_message

那么,是否可以为MPI_Recv定义一组标签? 在语义上,将类似于“接收带有标签0或1的消息”或“接收带有标签10或11的消息”等。它必须是多个值。

使用此方法可以将 thread_id * 2 标记用作 data_message thread_id * 2 + 1 作为 stop_message

2 个答案:

答案 0 :(得分:1)

没有直接的功能来匹配一组特定的标签(因为MPI_TAG_ANY由于非特异性而在这里不合适),但是有一种方法可以实现相同的目标。在每个帖子中发布两个MPI_Irecv个请求,每个请求对应一个标记。然后使用MPI_waitanyMPI_Testany查看内容。

答案 1 :(得分:1)

我宁愿使用空消息(MPI_Send(count = 0))来表示您案件中的停止条件。只需等待与MPI_Probe(tag = thread_id)匹配的消息,然后在返回的状态对象上使用MPI_Get_count来确定消息大小。如果它恰好为零,则打破处理循环。

另一个选择是让每个线程在一个单独的通信器中进行通信。使用MPI_Comm_dup创建MPI_COMM_WORLD的重复数组,然后让线程 i comms[i]中进行通信。然后,您可以使用MPI_Recv(tag = MPI_ANY_TAG, comm = comms[i])将消息与任何标记匹配,这将是特定于线程的。在发件人方面,使用MPI_Send(rank = dest, comm = comms[i])来解决排名 dest i 帖子。