source: XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_wait.cpp @ 1196

Last change on this file since 1196 was 1196, checked in by yushan, 7 years ago

add request_check. test client and complete OK

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