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

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

save dev. TO DO : test with xios

File size: 2.7 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        delete (*request)->mpi_request;
36        delete request;
37      }
38
39      return 0;
40    }
41
42    if((*request)->type == 2)   // irecv message not probed
43    {
44      Request_Check();
45     
46      #pragma omp flush
47     
48    }
49
50    if((*request)->type == 3)  // imrecv
51    {
52      ::MPI_Status mpi_status;
53     
54      ::MPI_Test(static_cast< ::MPI_Request*>((*request)->mpi_request), flag, &mpi_status);
55     
56     
57      if(*flag)
58      {
59        status->mpi_status = new ::MPI_Status(mpi_status);
60        status->ep_src = (*request)->ep_src;
61        status->ep_tag = (*request)->ep_tag;
62        status->ep_datatype = (*request)->ep_datatype;
63        delete (*request)->mpi_request;
64        delete request;
65        //int count;
66        //MPI_Get_count(status, request->ep_datatype, &count);
67        //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2);
68      } 
69
70      return 0;
71    }
72
73  }
74
75
76  int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses)
77  {
78    Debug("MPI_Testall with EP");
79
80    ::MPI_Request* mpi_request = new ::MPI_Request[count];
81    ::MPI_Status* mpi_status = new ::MPI_Status[count];
82
83
84    for(int i=0; i<count; i++)
85    {
86      mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request);
87    }
88
89    ::MPI_Testall(count, mpi_request, flag, mpi_status);
90
91    if(flag)
92    {
93      for(int i=0; i<count; i++)
94      {
95        array_of_statuses[i].mpi_status = &mpi_status[i];
96        array_of_statuses[i].ep_src = array_of_requests[i]->ep_src;
97        array_of_statuses[i].ep_tag = array_of_requests[i]->ep_tag;
98        array_of_statuses[i].ep_datatype = array_of_requests[i]->ep_datatype;
99     
100        memcheck("delete "<< array_of_requests[i]->mpi_request <<" : in ep_lib::MPI_Waitall, array_of_requests["<<i<<"]->mpi_request");
101        delete array_of_requests[i]->mpi_request;
102        delete array_of_requests[i]; 
103      }
104     
105    }
106
107  }
108
109
110}
111
Note: See TracBrowser for help on using the repository browser.