Ignore:
Timestamp:
05/28/18 17:28:07 (6 years ago)
Author:
yushan
Message:

rank_map is passed from vector to map, in order to have more flexibility in comm_split

File:
1 edited

Legend:

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

    r1500 r1503  
    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     
    57  
    58     if(!comm->is_ep) 
    59     { 
    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); 
    62  
    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     } 
    68      
    69     *request = new ep_request; 
    70     printf("new %p : in ep_lib::MPI_Irecv, *request = new ep_request\n", (*request)); 
     47    *request = new ep_request;    
     48    memcheck("new " << *request <<" : in ep_lib::MPI_Irecv, *request = new ep_request"); 
    7149 
    7250    (*request)->mpi_request = new ::MPI_Request; 
    73     printf("new %p : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request\n", (*request)->mpi_request); 
     51    memcheck("new " << (*request)->mpi_request << " : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request"); 
    7452     
    7553    (*request)->buf = buf; 
     
    8260    (*request)->ep_tag = tag; 
    8361    (*request)->ep_datatype = datatype; 
    84      
    85      
    86     /* With Improbe*/ 
     62   
     63    if(EP_PendingRequests == 0 ) EP_PendingRequests = new std::list< MPI_Request* >; 
    8764 
    88     if(EP_PendingRequests == 0 )  
    89     { 
    90       EP_PendingRequests = new std::list< MPI_Request* >; 
    91     } 
    92  
    93     EP_PendingRequests->push_back(request);                                                                 
     65    EP_PendingRequests->push_back(request);   
     66    int ep_rank = comm->ep_comm_ptr->size_rank_info[0].first; 
     67    memcheck("EP_PendingRequests["<<ep_rank<<"]->size() = " << EP_PendingRequests->size());                                                               
    9468                                           
    95     Request_Check(); 
    96  
    97     return 0; 
     69    return Request_Check(); 
    9870  } 
    99  
    100   int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request) 
    101   { 
    102     Debug("MPI_Imrecv"); 
    103  
    104     (*request)->type = 3; 
    105          
    106     ::MPI_Imrecv(buf, count, to_mpi_type(datatype), to_mpi_message_ptr(*message), to_mpi_request_ptr(*request));                 
    107  
    108     (*request)->ep_datatype = datatype; 
    109     (*request)->ep_tag = (*message)->ep_tag; 
    110     (*request)->ep_src = (*message)->ep_src; 
    111      
    112      
    113     return 0; 
    114   } 
    115  
    116  
     71   
    11772  int MPI_Mrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Status *status) 
    11873  { 
    119     Debug("EP Mrecv called\n"); 
     74    Debug("MPI_Mrecv with MPI/EP"); 
    12075 
    121     ::MPI_Status mpi_status; 
    122     ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >((*message)->mpi_message), &mpi_status); 
     76    status->mpi_status = new ::MPI_Status; 
     77    memcheck("new " << status->mpi_status << " : in ep_lib::MPI_Mrecv, status->mpi_status = new ::MPI_Status"); 
     78     
     79    ::MPI_Mrecv(buf, count, to_mpi_type(datatype), static_cast< ::MPI_Message* >((*message)->mpi_message), to_mpi_status_ptr(*status)); 
    12380 
    124     status->mpi_status = new ::MPI_Status(mpi_status); 
     81     
    12582    status->ep_src = (*message)->ep_src; 
    12683    status->ep_datatype = datatype; 
    12784    status->ep_tag = (*message)->ep_tag; 
    12885 
     86    memcheck("delete " << (*message)->mpi_message << " : in ep_lib::MPI_Mrecv, delete (*message)->mpi_message"); 
    12987    delete (*message)->mpi_message; 
    13088 
    131     //check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 
     89#ifdef _check_sum 
     90    check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 
     91#endif 
    13292 
    133     return 0; 
     93    return Request_Check(); 
    13494  } 
    13595 
     96 
     97  int MPI_Imrecv(void *buf, int count, MPI_Datatype datatype, MPI_Message *message, MPI_Request *request) 
     98  { 
     99    Debug("MPI_Imrecv with MPI/EP"); 
     100 
     101    (*request)->type = 3; 
     102    (*request)->ep_datatype = datatype; 
     103    (*request)->ep_tag = (*message)->ep_tag; 
     104    (*request)->ep_src = (*message)->ep_src; 
     105         
     106    ::MPI_Imrecv(buf, count, to_mpi_type(datatype), to_mpi_message_ptr(*message), to_mpi_request_ptr(*request));                 
     107     
     108    memcheck("delete " << (*message)->mpi_message << " : in ep_lib::MPI_Imrecv, delete (*message)->mpi_message"); 
     109    delete (*message)->mpi_message; 
     110 
     111#ifdef _check_sum 
     112    check_sum_recv(buf, count, datatype, message->ep_src, message->ep_tag); 
     113#endif 
     114 
     115     
     116    return Request_Check(); 
     117  } 
     118 
     119 
     120   int MPI_Recv_mpi(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Status *status) 
     121  { 
     122    Debug("MPI_Recv with MPI"); 
     123    status->ep_src = src; 
     124    status->ep_tag = tag; 
     125    status->ep_datatype = datatype; 
     126     
     127    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));  
     128  } 
     129   
     130  int MPI_Irecv_mpi(void *buf, int count, MPI_Datatype datatype, int src, int tag, MPI_Comm comm, MPI_Request *request) 
     131  { 
     132    Debug("MPI_Irecv with MPI"); 
     133    int dest_rank; 
     134    MPI_Comm_rank(comm, &dest_rank); 
     135     
     136    *request = new ep_request; 
     137    memcheck("new "<< *request <<" : in ep_lib::MPI_Irecv, *request = new ep_request"); 
     138 
     139    (*request)->mpi_request = new ::MPI_Request; 
     140    memcheck("new "<< (*request)->mpi_request <<" : in ep_lib::MPI_Irecv, (*request)->mpi_request = new ::MPI_Request"); 
     141       
     142    (*request)->ep_src = src; 
     143    (*request)->ep_datatype = datatype; 
     144    (*request)->type = 2; 
     145    (*request)->ep_tag = tag; 
     146     
     147    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)); 
     148  } 
    136149} 
    137150 
Note: See TracChangeset for help on using the changeset viewer.