source: XIOS/dev/branch_openmp/extern/src_ep_dev/ep_wait.cpp @ 2146

Last change on this file since 2146 was 1539, checked in by yushan, 6 years ago

update intercomm_merge and remove redundant files

File size: 2.8 KB
RevLine 
[1134]1/*!
[1138]2  \file ep_wait.cpp
3  \since 2 may 2016
[1134]4
[1138]5  \brief Definitions of MPI wait function: MPI_Wait, MPI_Waitall, MPI_Waitsome, MPI_Waitany
6  */
[1134]7
8#include "ep_lib.hpp"
9#include <mpi.h>
10#include "ep_declaration.hpp"
[1520]11#include "ep_mpi.hpp"
[1134]12
13using namespace std;
14
[1196]15extern std::list< ep_lib::MPI_Request* > * EP_PendingRequests;
16#pragma omp threadprivate(EP_PendingRequests)
[1134]17
18
[1196]19
[1147]20namespace ep_lib
[1295]21{
[1196]22 
[1147]23  int MPI_Wait(MPI_Request *request, MPI_Status *status)
24  {
[1520]25    if((*request)->type !=1 && (*request)->type !=2 && (*request)->type !=3) 
[1134]26    {
[1533]27      printf("MPI_Wait : Error in request type\n");
[1196]28      exit(1);
[1147]29    }
[1134]30
[1520]31    while((*request)->type == 2) Request_Check();
32   
[1533]33    ::MPI_Status mpi_status;
34   
35    ::MPI_Wait(to_mpi_request_ptr(*request), &mpi_status);
[1134]36
[1533]37    status->mpi_status = new ::MPI_Status(mpi_status);
[1520]38    status->ep_src = (*request)->ep_src;
39    status->ep_tag = (*request)->ep_tag;
40    status->ep_datatype = (*request)->ep_datatype;
41   
42    (*request)->state = 2;
[1134]43
[1520]44    memcheck("delete "<< (*request)->mpi_request << " : in ep_lib::MPI_Wait, delete (*request)->mpi_request");
[1533]45
[1520]46    delete (*request)->mpi_request;
47    delete *request;
[1533]48    *request=0;
[1362]49   
[1520]50    return Request_Check();
[1362]51
[1147]52  }   /*end of mpi_wait*/
[1138]53
[1134]54
55
56
57
58
[1147]59  int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses)
60  {
[1196]61    std::vector<int> finished(count, 0);
[1134]62
[1196]63    ::MPI_Request* mpi_request = new ::MPI_Request[count];
64    ::MPI_Status* mpi_status = new ::MPI_Status[count];
[1147]65
[1196]66    while(std::accumulate(finished.begin(), finished.end(), 0) < count)
[1134]67    {
[1187]68     
[1147]69      for(int i=0; i<count; i++)
70      {
[1520]71        if(array_of_requests[i]->type !=1 && array_of_requests[i]->type !=2 && array_of_requests[i]->type !=3) 
[1134]72        {
[1196]73          printf("Error in request type\n");
74 
75          exit(1);
76        }
77       
[1520]78        if(array_of_requests[i]->type == 2) Request_Check(); 
79        if(array_of_requests[i]->type != 2 && finished.at(i) == 0) 
[1196]80        {
81          finished.at(i) = 1;
[1520]82          mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request);
[1196]83        }
84      }   
85    }
[1185]86
[1196]87    ::MPI_Waitall(count, mpi_request, mpi_status);
[1138]88
[1196]89    for(int i=0; i<count; i++)
90    {
[1533]91      array_of_statuses[i].mpi_status = new ::MPI_Status(mpi_status[i]);
[1520]92      array_of_statuses[i].ep_src = array_of_requests[i]->ep_src;
93      array_of_statuses[i].ep_tag = array_of_requests[i]->ep_tag;
94      array_of_statuses[i].ep_datatype = array_of_requests[i]->ep_datatype;
95     
96      array_of_requests[i]->state = 2;
97     
98      memcheck("delete "<< array_of_requests[i]->mpi_request <<" : in ep_lib::MPI_Waitall, array_of_requests["<<i<<"]->mpi_request");
99      delete array_of_requests[i]->mpi_request;
100      delete array_of_requests[i];
[1533]101      array_of_requests[i] = 0;
[1196]102    }
[1147]103
[1196]104    delete[] mpi_request;
105    delete[] mpi_status;
[1295]106   
[1520]107    return Request_Check();
[1147]108  }  /* end of mpi_waitall*/
[1134]109
110
111}
[1196]112
Note: See TracBrowser for help on using the repository browser.