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, 6 years ago

save dev. TO DO : test with xios

File size: 3.0 KB
RevLine 
[1134]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
[1149]17  int MPI_Test(MPI_Request *request, int *flag, MPI_Status *status)
18  {
19    Debug("MPI_Test with EP");
[1134]20
21    *flag = false;
[1185]22   
[1134]23
[1520]24    if((*request)->type == 1)      // isend
[1134]25    {
26      ::MPI_Status mpi_status;
[1520]27      ::MPI_Test(static_cast< ::MPI_Request*>((*request)->mpi_request), flag, &mpi_status);
[1134]28     
29      if(*flag) 
30      {
31        status->mpi_status = new ::MPI_Status(mpi_status);
[1520]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;
[1134]38      }
39
40      return 0;
41    }
42
[1520]43    if((*request)->type == 2)   // irecv message not probed
[1134]44    {
[1220]45      Request_Check();
46     
[1134]47      #pragma omp flush
[1220]48     
[1134]49    }
50
[1520]51    if((*request)->type == 3)  // imrecv
[1134]52    {
[1520]53      if((*request)->state == 2)
54      {
55        return *flag = true;
56      }
[1134]57      ::MPI_Status mpi_status;
[1149]58     
[1520]59      ::MPI_Test(static_cast< ::MPI_Request*>((*request)->mpi_request), flag, &mpi_status);
[1149]60     
61     
[1134]62      if(*flag)
63      {
64        status->mpi_status = new ::MPI_Status(mpi_status);
[1520]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;
[1134]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);
[1220]76      } 
[1134]77
[1520]78      return Request_Check();
[1134]79    }
[1295]80
[1149]81  }
[1134]82
83
[1149]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");
[1520]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++)
[1134]93    {
[1520]94      mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request);
[1134]95    }
[1520]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();
[1149]118  }
[1134]119
120
121}
[1520]122
Note: See TracBrowser for help on using the repository browser.