Ignore:
Timestamp:
06/04/18 19:25:08 (6 years ago)
Author:
yushan
Message:

save dev. TO DO : test with xios

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_openmp/extern/src_ep_dev/ep_recv.cpp

    r1374 r1520  
    1919namespace ep_lib  
    2020{ 
    21    
    2221 
    2322  int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) 
    2423  { 
    2524 
    26     if(!comm.is_ep) 
    27     { 
    28       ::MPI_Status mpi_status; 
    29       ::MPI_Recv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm.mpi_comm), &mpi_status); 
    30  
    31       status->ep_src = src; 
    32       status->ep_tag = tag; 
    33       status->ep_datatype = datatype; 
    34  
    35       return 0;   
    36     } 
    37  
    38     Message_Check(comm); 
     25    if(!comm->is_ep) return MPI_Recv_mpi(buf, count, datatype, src, tag, comm, status); 
     26     
     27    Debug("MPI_Recv with EP"); 
    3928 
    4029    MPI_Request request; 
     
    4534  } 
    4635 
    47  
     36   
    4837 
    4938 
    5039  int MPI_Irecv(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request) 
    5140  { 
    52  
     41    if(!comm->is_ep) return MPI_Irecv_mpi(buf, count, datatype, src, tag, comm, request); 
     42     
    5343    Debug("MPI_Irecv with EP"); 
    5444    int dest_rank; 
    5545    MPI_Comm_rank(comm, &dest_rank); 
    5646     
     47    *request = new ep_request;    
     48    memcheck("new " << *request <<" : in ep_lib::MPI_Irecv, *request = new ep_request"); 
    5749 
    58     if(!comm.is_ep) 
     50    (*request)->mpi_request = new ::MPI_Request; 
     51    memcheck("new " << (*request)->mpi_request << " : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request"); 
     52     
     53    (*request)->buf = buf; 
     54    (*request)->comm = comm; 
     55    (*request)->type = 2; 
     56    (*request)->state = 0; 
     57     
     58 
     59    (*request)->ep_src = src; 
     60    (*request)->ep_tag = tag; 
     61    (*request)->ep_datatype = datatype; 
     62   
     63    if(EP_PendingRequests == 0 ) EP_PendingRequests = new std::list< MPI_Request* >; 
     64 
     65    EP_PendingRequests->push_back(request);   
     66     
     67    int world_rank; 
     68    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
     69    if(world_rank==2)  
    5970    { 
    60       ::MPI_Request mpi_request; 
    61       ::MPI_Irecv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm.mpi_comm), &mpi_request); 
     71      printf("ep %d inserted one pending request %p\n", world_rank, *request); 
     72    } 
     73     
     74    memcheck("EP_PendingRequests["<<ep_rank<<"]->size() = " << EP_PendingRequests->size());     
    6275 
    63       request->mpi_request = new ::MPI_Request(mpi_request); 
    64       request->ep_src = src; 
    65       request->ep_datatype = datatype; 
    66       request->ep_tag = tag; 
    67     } 
     76#ifdef _showinfo 
     77    if(comm->is_intercomm) 
     78    { 
     79      int ep_dest_loc  = comm->ep_rank_map->at(dest_rank).first; 
     80      int ep_src_loc = comm->ep_comm_ptr->intercomm->intercomm_rank_map->at(src).first; 
     81      int mpi_tag     = tag_combine(tag, ep_src_loc, ep_dest_loc); 
     82      int mpi_dest    = comm->ep_comm_ptr->intercomm->intercomm_rank_map->at(src).second.first; 
    6883 
    69     request->buf = buf; 
    70     request->comm = comm; 
    71     request->type = 2; 
     84      printf("Irecv : ep_src_loc = %d, ep_dest_loc = %d, mpi_src = %d, mpi_dest = %d, mpi_tag = %d\n", ep_src_loc, ep_dest_loc, comm->ep_comm_ptr->size_rank_info[2].first, mpi_dest, mpi_tag); 
     85    }                                                           
     86#endif                                       
    7287 
    73     request->ep_src = src; 
    74     request->ep_tag = tag; 
    75     request->ep_datatype = datatype; 
     88    return Request_Check(); 
     89  } 
     90   
     91  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status) 
     92  { 
     93    Debug("MPI_Mrecv with MPI/EP"); 
    7694 
     95    status->mpi_status = new ::MPI_Status; 
     96    memcheck("new " << status->mpi_status << " : in ep_lib::MPI_Mrecv, status->mpi_status = new ::MPI_Status"); 
     97     
     98    ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >((*message)->mpi_message), to_mpi_status_ptr(*status)); 
    7799 
     100     
     101    status->ep_src = (*message)->ep_src; 
     102    status->ep_datatype = datatype; 
     103    status->ep_tag = (*message)->ep_tag; 
    78104 
    79     /* With Improbe*/ 
    80     Message_Check(comm); 
     105    memcheck("delete " << (*message)->mpi_message << " : in ep_lib::MPI_Mrecv, delete (*message)->mpi_message"); 
     106    delete (*message)->mpi_message; 
    81107 
    82     if(EP_PendingRequests == 0 )  
    83     { 
    84       EP_PendingRequests = new std::list< MPI_Request* >; 
    85     } 
     108#ifdef _check_sum 
     109    check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 
     110#endif 
    86111 
     112    return Request_Check(); 
     113  } 
    87114 
    88     EP_PendingRequests->push_back(request); 
    89  
    90  
    91     Request_Check(); 
    92  
    93     return 0; 
    94   } 
    95115 
    96116  int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request) 
    97117  { 
    98     Debug("MPI_Imrecv"); 
     118    Debug("MPI_Imrecv with MPI/EP"); 
    99119 
    100     request->type = 3; 
     120    (*request)->type = 3; 
     121    (*request)->ep_datatype = datatype; 
     122    (*request)->ep_tag = (*message)->ep_tag; 
     123    (*request)->ep_src = (*message)->ep_src; 
     124     
     125    (*request)->state = 1; 
     126         
     127    ::MPI_Imrecv(buf, count, to_mpi_type(datatype), to_mpi_message_ptr(*message), to_mpi_request_ptr(*request));                 
     128     
     129    memcheck("delete " << (*message)->mpi_message << " : in ep_lib::MPI_Imrecv, delete (*message)->mpi_message"); 
     130    delete (*message)->mpi_message; 
    101131 
    102     ::MPI_Request mpi_request; 
    103     ::MPI_Imrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >(message->mpi_message), &mpi_request);          
     132#ifdef _check_sum 
     133    check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 
     134#endif 
    104135 
    105     request->mpi_request = new ::MPI_Request(mpi_request); 
    106     request->ep_datatype = datatype; 
    107     request->ep_tag = message->ep_tag; 
    108     request->ep_src = message->ep_src; 
    109136     
    110     delete message->mpi_message; 
    111  
    112     return 0; 
     137    return Request_Check(); 
    113138  } 
    114139 
    115140 
    116   int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status) 
     141   int MPI_Recv_mpi(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) 
    117142  { 
    118     Debug("EP Mrecv called\n"); 
     143    Debug("MPI_Recv with MPI"); 
     144    status->ep_src = src; 
     145    status->ep_tag = tag; 
     146    status->ep_datatype = datatype; 
     147     
     148    return ::MPI_Recv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm->mpi_comm), to_mpi_status_ptr(*status));  
     149  } 
     150   
     151  int MPI_Irecv_mpi(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request) 
     152  { 
     153    Debug("MPI_Irecv with MPI"); 
     154    int dest_rank; 
     155    MPI_Comm_rank(comm, &dest_rank); 
     156     
     157    *request = new ep_request; 
     158    memcheck("new "<< *request <<" : in ep_lib::MPI_Irecv, *request = new ep_request"); 
    119159 
    120     ::MPI_Status mpi_status; 
    121     ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >(message->mpi_message), &mpi_status); 
    122  
    123     status->mpi_status = new ::MPI_Status(mpi_status); 
    124     status->ep_src = message->ep_src; 
    125     status->ep_datatype = datatype; 
    126     status->ep_tag = message->ep_tag; 
    127  
    128     delete message->mpi_message; 
    129  
    130     //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 
    131  
    132     return 0; 
     160    (*request)->mpi_request = new ::MPI_Request; 
     161    memcheck("new "<< (*request)->mpi_request <<" : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request"); 
     162       
     163    (*request)->ep_src = src; 
     164    (*request)->ep_datatype = datatype; 
     165    (*request)->type = 2; 
     166    (*request)->ep_tag = tag; 
     167     
     168    return ::MPI_Irecv(buf, count, to_mpi_type(datatype), src<0? MPI_ANY_SOURCE : src, tag<0? MPI_ANY_TAG: tag, to_mpi_comm(comm->mpi_comm), to_mpi_request_ptr(*request)); 
    133169  } 
    134  
    135170} 
    136171 
Note: See TracChangeset for help on using the changeset viewer.