Ignore:
Timestamp:
10/04/17 17:02:13 (4 years ago)
Author:
yushan
Message:

EP update part 2

File:
1 edited

Legend:

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

    r1287 r1289  
    5151  } 
    5252   
    53  
     53  int MPI_Bsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm) 
     54  { 
     55    if(!comm.is_ep) 
     56    { 
     57      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm); 
     58      ::MPI_Bsend(buf, count, static_cast< ::MPI_Datatype>(datatype), dest, tag, mpi_comm); 
     59      return 0; 
     60    } 
     61 
     62    MPI_Request request; 
     63    MPI_Status status; 
     64    //MPI_Ibsend(buf, count, datatype, dest, tag, comm, &request); 
     65    MPI_Wait(&request, &status); 
     66 
     67    //check_sum_send(buf, count, datatype, dest, tag, comm); 
     68 
     69    return 0; 
     70  } 
     71  
    5472 
    5573 
     
    169187  } 
    170188   
     189  int MPI_Ibsend(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) 
     190  { 
     191    Debug("\nMPI_Isend with EP\n"); 
     192    int src_rank; 
     193    MPI_Comm_rank(comm, &src_rank); 
     194 
     195   
     196 
     197    if(!comm.is_ep) 
     198    { 
     199      ::MPI_Request mpi_request; 
     200      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm); 
     201      ::MPI_Ibsend(buf, count, static_cast< ::MPI_Datatype> (datatype), dest, tag, mpi_comm, &mpi_request); 
     202 
     203      request->mpi_request = mpi_request; 
     204 
     205      request->ep_src = src_rank; 
     206      request->ep_tag = tag; 
     207      request->ep_datatype = datatype; 
     208      request->type = 1; 
     209      request->comm = comm; 
     210 
     211      return 0; 
     212    } 
     213 
     214    if(comm.is_intercomm) return 0;//MPI_Ibsend_intercomm(buf, count, datatype, dest, tag, comm, request); 
     215 
     216   // EP intracomm 
     217 
     218    //check_sum_send(buf, count, datatype, dest, tag, comm, 1); 
     219 
     220    int ep_src_loc = comm.ep_comm_ptr->size_rank_info[1].first; 
     221    int ep_dest_loc = comm.ep_comm_ptr->comm_list->rank_map->at(dest).first; 
     222    int mpi_tag                 = tag_combine(tag, ep_src_loc, ep_dest_loc); 
     223    int mpi_dest        = comm.ep_comm_ptr->comm_list->rank_map->at(dest).second; 
     224 
     225    request->ep_src  = src_rank; 
     226    request->ep_tag  = tag; 
     227    request->ep_datatype = datatype; 
     228 
     229    ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm> (comm.mpi_comm); 
     230    ::MPI_Request mpi_request; 
     231 
     232    ::MPI_Ibsend(buf, count, static_cast< ::MPI_Datatype>(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
     233 
     234    request->mpi_request = mpi_request; 
     235    request->type = 1;          // used in wait 
     236    request->comm = comm; 
     237    request->buf = const_cast<void*>(buf); 
     238 
     239    //Message_Check(comm); 
     240 
     241    return 0;   
     242  } 
    171243 
    172244 
     
    175247  { 
    176248    Debug("MPI_Isend with intercomm\n"); 
    177  
    178     //check_sum_send(buf, count, datatype, dest, tag, comm, 1); 
    179  
    180     int dest_remote_ep_rank    = comm.ep_comm_ptr->intercomm->remote_rank_map->at(dest).first; 
    181     int dest_remote_comm_label = comm.ep_comm_ptr->intercomm->remote_rank_map->at(dest).second; 
    182  
    183     int src_ep_rank    = comm.ep_comm_ptr->intercomm->size_rank_info[0].first; 
    184     int src_comm_label; 
    185  
    186     src_comm_label = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).second; 
    187  
    188  
    189      
    190  
    191     //Message_Check(comm); 
    192  
    193  
    194     if(dest_remote_comm_label == src_comm_label)       // mpi_dest differs 
    195     { 
    196       int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
    197       int ep_src_loc = comm.rank_map->at(inter_src).first; 
    198       int ep_dest_loc = comm.rank_map->at(dest_remote_ep_rank).first; 
    199       int mpi_dest    = comm.rank_map->at(dest_remote_ep_rank).second; 
    200       int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 
    201  
    202       ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm); 
    203       ::MPI_Request mpi_request; 
    204    
    205       ::MPI_Isend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
    206  
    207       request->mpi_request = mpi_request; 
    208       request->type = 1;                // used in wait 
    209       request->comm = comm; 
    210  
    211       request->ep_src = src_ep_rank; 
    212       request->ep_tag = tag; 
    213       request->ep_datatype = datatype; 
    214     } 
    215  
    216     else   // dest_remote_comm_label != src_comm_label 
    217     {  
    218       int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
    219       int ep_src_loc = comm.rank_map->at(inter_src).first; 
    220       int ep_dest_loc = comm.ep_comm_ptr->intercomm->intercomm_rank_map->at(dest_remote_ep_rank).first; 
    221       int mpi_dest    = comm.ep_comm_ptr->intercomm->intercomm_rank_map->at(dest_remote_ep_rank).second; 
    222       int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 
    223  
    224       ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm >(comm.ep_comm_ptr->intercomm->mpi_inter_comm); 
    225       ::MPI_Request mpi_request; 
    226  
    227       ::MPI_Isend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
    228  
    229       request->mpi_request = mpi_request; 
    230       request->type = 1;                // used in wait 
    231       request->comm = comm; 
    232     
    233       request->ep_src = src_ep_rank; 
    234       request->ep_tag = tag; 
    235       request->ep_datatype = datatype; 
    236     } 
    237  
    238     return 0; 
    239  
    240   } 
    241  
    242  
    243   int MPI_Issend_intercomm(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) 
    244   { 
    245     Debug("MPI_Issend with intercomm\n"); 
    246249 
    247250    //check_sum_send(buf, count, datatype, dest, tag, comm, 1); 
     
    265268 
    266269 
    267     if(dest_remote_comm_label == src_comm_label)       // dest rank (loc, mpi) differs 
     270    if(dest_remote_comm_label == src_comm_label)       // mpi_dest differs 
    268271    { 
    269272      int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
     
    276279      ::MPI_Request mpi_request; 
    277280   
    278       ::MPI_Issend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
     281      ::MPI_Isend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
    279282 
    280283      request->mpi_request = mpi_request; 
     
    298301      ::MPI_Request mpi_request; 
    299302 
     303      ::MPI_Isend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
     304 
     305      request->mpi_request = mpi_request; 
     306      request->type = 1;                // used in wait 
     307      request->comm = comm; 
     308    
     309      request->ep_src = src_ep_rank; 
     310      request->ep_tag = tag; 
     311      request->ep_datatype = datatype; 
     312    } 
     313 
     314    return 0; 
     315 
     316  } 
     317 
     318 
     319  int MPI_Issend_intercomm(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) 
     320  { 
     321    Debug("MPI_Issend with intercomm\n"); 
     322 
     323    //check_sum_send(buf, count, datatype, dest, tag, comm, 1); 
     324 
     325    int dest_remote_ep_rank    = comm.ep_comm_ptr->intercomm->remote_rank_map->at(dest).first; 
     326    int dest_remote_comm_label = comm.ep_comm_ptr->intercomm->remote_rank_map->at(dest).second; 
     327 
     328    int src_ep_rank    = comm.ep_comm_ptr->intercomm->size_rank_info[0].first; 
     329    int src_comm_label; 
     330 
     331    for(int i=0; i<comm.ep_comm_ptr->intercomm->local_rank_map->size(); i++) 
     332    { 
     333      if(comm.ep_comm_ptr->intercomm->local_rank_map->at(i).first == src_ep_rank) 
     334      { 
     335        src_comm_label = comm.ep_comm_ptr->intercomm->local_rank_map->at(i).second; 
     336        break; 
     337      } 
     338    } 
     339 
     340    //Message_Check(comm); 
     341 
     342 
     343    if(dest_remote_comm_label == src_comm_label)       // dest rank (loc, mpi) differs 
     344    { 
     345      int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
     346      int ep_src_loc = comm.rank_map->at(inter_src).first; 
     347      int ep_dest_loc = comm.rank_map->at(dest_remote_ep_rank).first; 
     348      int mpi_dest    = comm.rank_map->at(dest_remote_ep_rank).second; 
     349      int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 
     350 
     351      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm); 
     352      ::MPI_Request mpi_request; 
     353   
    300354      ::MPI_Issend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
    301355 
     
    303357      request->type = 1;                // used in wait 
    304358      request->comm = comm; 
     359 
     360      request->ep_src = src_ep_rank; 
     361      request->ep_tag = tag; 
     362      request->ep_datatype = datatype; 
     363    } 
     364 
     365    else   // dest_remote_comm_label != src_comm_label 
     366    {  
     367      int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
     368      int ep_src_loc = comm.rank_map->at(inter_src).first; 
     369      int ep_dest_loc = comm.ep_comm_ptr->intercomm->intercomm_rank_map->at(dest_remote_ep_rank).first; 
     370      int mpi_dest    = comm.ep_comm_ptr->intercomm->intercomm_rank_map->at(dest_remote_ep_rank).second; 
     371      int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 
     372 
     373      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm >(comm.ep_comm_ptr->intercomm->mpi_inter_comm); 
     374      ::MPI_Request mpi_request; 
     375 
     376      ::MPI_Issend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
     377 
     378      request->mpi_request = mpi_request; 
     379      request->type = 1;                // used in wait 
     380      request->comm = comm; 
    305381    
    306382      request->ep_src = src_ep_rank; 
     
    313389  } 
    314390   
     391  int MPI_Ibsend_intercomm(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm, MPI_Request *request) 
     392  { 
     393    printf("MPI_Ibsend with intercomm not yet implemented\n"); 
     394    MPI_Abort(comm, 0); 
     395    //check_sum_send(buf, count, datatype, dest, tag, comm, 1); 
     396 
     397    int dest_remote_ep_rank    = comm.ep_comm_ptr->intercomm->remote_rank_map->at(dest).first; 
     398    int dest_remote_comm_label = comm.ep_comm_ptr->intercomm->remote_rank_map->at(dest).second; 
     399 
     400    int src_ep_rank    = comm.ep_comm_ptr->intercomm->size_rank_info[0].first; 
     401    int src_comm_label; 
     402 
     403    for(int i=0; i<comm.ep_comm_ptr->intercomm->local_rank_map->size(); i++) 
     404    { 
     405      if(comm.ep_comm_ptr->intercomm->local_rank_map->at(i).first == src_ep_rank) 
     406      { 
     407        src_comm_label = comm.ep_comm_ptr->intercomm->local_rank_map->at(i).second; 
     408        break; 
     409      } 
     410    } 
     411 
     412    //Message_Check(comm); 
     413 
     414 
     415    if(dest_remote_comm_label == src_comm_label)       // mpi_dest differs 
     416    { 
     417      int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
     418      int ep_src_loc = comm.rank_map->at(inter_src).first; 
     419      int ep_dest_loc = comm.rank_map->at(dest_remote_ep_rank).first; 
     420      int mpi_dest    = comm.rank_map->at(dest_remote_ep_rank).second; 
     421      int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 
     422 
     423      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm > (comm.mpi_comm); 
     424      ::MPI_Request mpi_request; 
     425   
     426      ::MPI_Isend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
     427 
     428      request->mpi_request = mpi_request; 
     429      request->type = 1;                // used in wait 
     430      request->comm = comm; 
     431 
     432      request->ep_src = src_ep_rank; 
     433      request->ep_tag = tag; 
     434      request->ep_datatype = datatype; 
     435    } 
     436 
     437    else   // dest_remote_comm_label != src_comm_label 
     438    {  
     439      int inter_src = comm.ep_comm_ptr->intercomm->local_rank_map->at(src_ep_rank).first; 
     440      int ep_src_loc = comm.rank_map->at(inter_src).first; 
     441      int ep_dest_loc = comm.ep_comm_ptr->intercomm->intercomm_rank_map->at(dest_remote_ep_rank).first; 
     442      int mpi_dest    = comm.ep_comm_ptr->intercomm->intercomm_rank_map->at(dest_remote_ep_rank).second; 
     443      int mpi_tag = tag_combine(tag, ep_src_loc, ep_dest_loc); 
     444 
     445      ::MPI_Comm mpi_comm = static_cast< ::MPI_Comm >(comm.ep_comm_ptr->intercomm->mpi_inter_comm); 
     446      ::MPI_Request mpi_request; 
     447 
     448      ::MPI_Isend(buf, count, static_cast< ::MPI_Datatype >(datatype), mpi_dest, mpi_tag, mpi_comm, &mpi_request); 
     449 
     450      request->mpi_request = mpi_request; 
     451      request->type = 1;                // used in wait 
     452      request->comm = comm; 
     453    
     454      request->ep_src = src_ep_rank; 
     455      request->ep_tag = tag; 
     456      request->ep_datatype = datatype; 
     457    } 
     458 
     459    return 0; 
     460 
     461  } 
    315462} 
    316463 
Note: See TracChangeset for help on using the changeset viewer.