MPI_Probe使用MPI_ANY_TAG,始终返回status.MPI_TAG = 0

时间:2013-07-09 14:07:35

标签: mpi

我正在尝试创建一个消息处理程序,阻止探测具有任何标记的消息:

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));
}
}

其中Messagestruct持有MPI_Requestbool可用(以便我可以重新使用MPI_Request s) 。在此示例中,仅节点0发送,并且仅节点1将查找消息。使用MPICH 3.0.4。

感谢您的帮助。

0 个答案:

没有答案