Ignore:
Timestamp:
05/29/17 16:15:38 (7 years ago)
Author:
yushan
Message:

bug fixed in MPI_Gather(v)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_wait.cpp

    r1146 r1147  
    1414 
    1515 
    16 namespace ep_lib {       
     16namespace ep_lib  
     17{        
    1718 
    18     int MPI_Wait(MPI_Request *request, MPI_Status *status) 
     19  int MPI_Wait(MPI_Request *request, MPI_Status *status) 
     20  { 
     21 
     22    if(request->type == 1) 
    1923    { 
     24      ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
     25      ::MPI_Status mpi_status; 
     26      ::MPI_Wait(&mpi_request, &mpi_status); 
    2027 
    21         if(request->type == 1) 
    22         { 
    23             ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
    24             ::MPI_Status mpi_status; 
    25             ::MPI_Wait(&mpi_request, &mpi_status); 
     28      status->mpi_status = &mpi_status; 
     29      status->ep_src = request->ep_src; 
     30      status->ep_tag = request->ep_tag; 
     31      status->ep_datatype = request->ep_datatype; 
    2632 
     33      return 0; 
     34    } 
    2735 
     36    if(request->type == 2) 
     37    { 
     38      int flag = false; 
     39      MPI_Message message; 
    2840 
    29             status->mpi_status = &mpi_status; 
    30             status->ep_src = request->ep_src; 
    31             status->ep_tag = request->ep_tag; 
    32             status->ep_datatype = request->ep_datatype; 
     41      while(!flag) 
     42      { 
     43        Message_Check(request->comm); 
     44        #pragma omp flush 
     45        MPI_Improbe(request->ep_src, request->ep_tag, request->comm, &flag, &message, status); 
     46      } 
    3347 
    34             return 0; 
    35         } 
     48      int count; 
     49      MPI_Get_count(status, request->ep_datatype, &count); 
     50      MPI_Mrecv(request->buf, count, request->ep_datatype, &message, status); 
     51      status->ep_datatype = request->ep_datatype; 
    3652 
    37         if(request->type == 2) 
    38         { 
    39             int flag = false; 
    40             MPI_Message message; 
     53      //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
    4154 
    42             while(!flag) 
    43             { 
    44                 Message_Check(request->comm); 
    45 #pragma omp flush 
    46                 MPI_Improbe(request->ep_src, request->ep_tag, request->comm, &flag, &message, status); 
    47             } 
     55      return 0; 
     56    } 
    4857 
    49             int count; 
    50             MPI_Get_count(status, request->ep_datatype, &count); 
    51             MPI_Mrecv(request->buf, count, request->ep_datatype, &message, status); 
    52             status->ep_datatype = request->ep_datatype; 
     58    if(request->type == 3) 
     59    { 
     60      ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
     61      ::MPI_Status mpi_status; 
     62      ::MPI_Wait(&mpi_request, &mpi_status); 
    5363 
    54             //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
     64      status->mpi_status = new ::MPI_Status(mpi_status); 
     65      status->ep_src = request->ep_src; 
     66      status->ep_tag = request->ep_tag; 
     67      status->ep_datatype = request->ep_datatype; 
    5568 
    56             return 0; 
    57         } 
     69      //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
     70    } 
    5871 
    59         if(request->type == 3) 
    60         { 
    61             ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request); 
    62             ::MPI_Status mpi_status; 
    63             ::MPI_Wait(&mpi_request, &mpi_status); 
     72    return MPI_SUCCESS; 
    6473 
    65             status->mpi_status = new ::MPI_Status(mpi_status); 
    66             status->ep_src = request->ep_src; 
    67             status->ep_tag = request->ep_tag; 
    68             status->ep_datatype = request->ep_datatype; 
    69  
    70             //int count; 
    71             //MPI_Get_count(status, request->ep_datatype, &count); 
    72             //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2); 
    73         } 
    74         return MPI_SUCCESS; 
    75     } 
     74  }   /*end of mpi_wait*/ 
    7675 
    7776 
     
    8079 
    8180 
    82     int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses) 
     81  int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses) 
     82  { 
     83    int dest_rank; 
     84    MPI_Comm_rank(MPI_COMM_WORLD, &dest_rank); 
     85 
     86    int finished = 0; 
     87    int finished_index[count]; 
     88 
     89    for(int i=0; i<count; i++) 
    8390    { 
    84         int dest_rank; 
    85         MPI_Comm_rank(MPI_COMM_WORLD, &dest_rank); 
    86  
    87         int finished = 0; 
    88         int finished_index[count]; 
    89  
    90         for(int i=0; i<count; i++) 
    91         { 
    92             finished_index[i] = false; 
    93         } 
    94  
    95         while(finished < count) 
    96         { 
    97             for(int i=0; i<count; i++) 
    98             { 
    99                 //MPI_Test(&array_of_requests[i], &finished_index[i], &array_of_statuses[i]); 
    100                 if(finished_index[i] == false) // this request has not been tested. 
    101                 { 
    102                     if(array_of_requests[i].type != 2) // isend or imrecv 
    103                     {       
    104                         MPI_Wait(&array_of_requests[i], &array_of_statuses[i]); 
    105                         finished++; 
    106                         finished_index[i] = true; 
    107                     } 
    108                     else // irecv 
    109                     { 
    110                         int flag = false; 
    111                         MPI_Message message; 
    112  
    113                         MPI_Improbe(array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, &flag, &message, &array_of_statuses[i]); 
    114  
    115                         if(flag) 
    116                         { 
    117                             //printf("dest_rank = %d, Waiting one message with src = %d, tag = %d, buf = %p\n", dest_rank, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].buf); 
    118                             int recv_count; 
    119                             MPI_Get_count(&array_of_statuses[i], array_of_requests[i].ep_datatype, &recv_count); 
    120                             MPI_Mrecv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, &message, &array_of_statuses[i]); 
    121                             //check_sum_recv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, 2); 
    122  
    123                             finished++; 
    124                             finished_index[i] = true; 
    125                         } 
    126                     } 
    127                 } 
    128             }     
    129         } 
    130         return MPI_SUCCESS; 
     91      finished_index[i] = false; 
    13192    } 
    13293 
     94    while(finished < count) 
     95    { 
     96      for(int i=0; i<count; i++) 
     97      { 
     98        if(finished_index[i] == false) // this request has not been tested. 
     99        { 
     100          if(array_of_requests[i].type != 2) // isend or imrecv 
     101          {       
     102            MPI_Wait(&array_of_requests[i], &array_of_statuses[i]); 
     103            finished++; 
     104            finished_index[i] = true; 
     105          } 
     106          else // irecv 
     107          { 
     108            int flag = false; 
     109            MPI_Message message; 
    133110 
     111            MPI_Improbe(array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, &flag, &message, &array_of_statuses[i]); 
    134112 
     113            if(flag) 
     114            { 
     115              int recv_count; 
     116              MPI_Get_count(&array_of_statuses[i], array_of_requests[i].ep_datatype, &recv_count); 
     117              MPI_Mrecv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, &message, &array_of_statuses[i]); 
     118              //check_sum_recv(array_of_requests[i].buf, recv_count, array_of_requests[i].ep_datatype, array_of_requests[i].ep_src, array_of_requests[i].ep_tag, array_of_requests[i].comm, 2); 
     119 
     120              finished++; 
     121              finished_index[i] = true; 
     122            } 
     123          } 
     124        } 
     125      }     
     126    } 
     127    return MPI_SUCCESS; 
     128  }  /* end of mpi_waitall*/ 
    135129 
    136130 
Note: See TracChangeset for help on using the changeset viewer.