我正在尝试创建一个消息处理程序,阻止探测具有任何标记的消息:
MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &probe_status);
然后根据标签采取相应行动:
int tag = probe_status.MPI_TAG;
if (tag == 0){
// The message is of type a
}
else if (tag == 1){
// The message is of type b
}
但是,probe_status.MPI_TAG
总是评估为0,即使我已经隔离了发件人,并且只有一个MPI_Isend
使用标记1.
编辑: 事实上,甚至
MPI_Probe(0, 1, MPI_COMM_WORLD, &probe_status);
cout << rank << ": a message has been found with the probe, with tag "
<< probe_status.MPI_TAG << ", source " << probe_status.MPI_SOURCE << "
and size " << probe_status.count << endl;
给出:标记0,源12和大小0.只有2个节点在运行,如果发送者被删除,则探测阻塞,因此它正在查找从节点0发送的“正确”消息。
EDIT2: 发件人是这样的:
unsigned int rank = MPI::COMM_WORLD.Get_rank();
unsigned int nodes = MPI::COMM_WORLD.Get_size();
for(unsigned int i=0; i<nodes; i++){
// Send the release to all nodes except the current
if(i != rank){
int taskid[5];
convert_task_to_id(task_name,taskid);
Message* message = get_available_message();
memcpy(message->taskobject_id,taskid, sizeof(taskid));
message->available = false;
MPI_Isend(&(message->taskobject_id), 3, MPI_INT, i, 1, MPI_COMM_WORLD, &(message->request));
}
}
其中Message
是struct
持有MPI_Request
和bool
可用(以便我可以重新使用MPI_Request
s) 。在此示例中,仅节点0发送,并且仅节点1将查找消息。使用MPICH 3.0.4。
感谢您的帮助。