source: XIOS/dev/branch_openmp/extern/src_ep_dev/ep_test.cpp @ 1520

Last change on this file since 1520 was 1520, checked in by yushan, 3 years ago

save dev. TO DO : test with xios

File size: 3.0 KB
Line 
1/*!
2   \file ep_test.cpp
3   \since 2 may 2016
4
5   \brief Definitions of MPI test function: MPI_Test, MPI_Testsome, MPI_Testany, MPI_Testall
6 */
7
8#include "ep_lib.hpp"
9#include <mpi.h>
10#include "ep_declaration.hpp"
11
12using namespace std;
13
14
15namespace ep_lib {
16
17  int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status)
18  {
19    Debug("MPI_Test with EP");
20
21    *flag = false;
22   
23
24    if((*request)->type == 1)      // isend
25    {
26      ::MPI_Status mpi_status;
27      ::MPI_Test(static_cast< ::MPI_Request*>((*request)->mpi_request), flag, &mpi_status);
28     
29      if(*flag) 
30      {
31        status->mpi_status = new ::MPI_Status(mpi_status);
32        status->ep_src = (*request)->ep_src;
33        status->ep_tag = (*request)->ep_tag;
34        status->ep_datatype = (*request)->ep_datatype;
35        (*request)->state = 2;
36        delete (*request)->mpi_request;
37        delete *request;
38      }
39
40      return 0;
41    }
42
43    if((*request)->type == 2)   // irecv message not probed
44    {
45      Request_Check();
46     
47      #pragma omp flush
48     
49    }
50
51    if((*request)->type == 3)  // imrecv
52    {
53      if((*request)->state == 2)
54      {
55        return *flag = true;
56      }
57      ::MPI_Status mpi_status;
58     
59      ::MPI_Test(static_cast< ::MPI_Request*>((*request)->mpi_request), flag, &mpi_status);
60     
61     
62      if(*flag)
63      {
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;
68       
69        (*request)->state = 2;
70       
71        delete (*request)->mpi_request;
72        delete *request;
73        //int count;
74        //MPI_Get_count(status, request->ep_datatype, &count);
75        //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2);
76      } 
77
78      return Request_Check();
79    }
80
81  }
82
83
84  int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses)
85  {
86    Debug("MPI_Testall with EP");
87
88    ::MPI_Request* mpi_request = new ::MPI_Request[count];
89    ::MPI_Status* mpi_status = new ::MPI_Status[count];
90
91
92    for(int i=0; i<count; i++)
93    {
94      mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request);
95    }
96
97    ::MPI_Testall(count, mpi_request, flag, mpi_status);
98
99    if(*flag)
100    {
101      for(int i=0; i<count; i++)
102      {
103        array_of_statuses[i].mpi_status = &mpi_status[i];
104        array_of_statuses[i].ep_src = array_of_requests[i]->ep_src;
105        array_of_statuses[i].ep_tag = array_of_requests[i]->ep_tag;
106        array_of_statuses[i].ep_datatype = array_of_requests[i]->ep_datatype;
107       
108        array_of_requests[i]->state = 2;
109     
110        memcheck("delete "<< array_of_requests[i]->mpi_request <<" : in ep_lib::MPI_Waitall, array_of_requests["<<i<<"]->mpi_request");
111        delete array_of_requests[i]->mpi_request;
112        delete array_of_requests[i]; 
113      }
114     
115    }
116
117    return Request_Check();
118  }
119
120
121}
122
Note: See TracBrowser for help on using the repository browser.