source: XIOS/trunk/extern/src_ep/ep_test.cpp @ 1034

Last change on this file since 1034 was 1034, checked in by yushan, 4 years ago

adding src_ep into extern folder

File size: 2.4 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    if(request->type == 1)      // isend
24    {
25      ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request);
26      ::MPI_Status mpi_status;
27      ::MPI_Test(&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      }
36
37      return 0;
38    }
39
40    if(request->type == 2)   // irecv message not probed
41    {
42      Message_Check(request->comm);
43      #pragma omp flush
44      MPI_Message message;
45      MPI_Improbe(request->ep_src, request->ep_tag, request->comm, flag, &message, status);
46      if(*flag)
47      {
48        int count;
49        MPI_Get_count(status, request->ep_datatype, &count);
50        MPI_Imrecv(request->buf, count, request->ep_datatype, &message, request);
51        MPI_Test(request, flag, status);
52      }
53      return 0;
54    }
55
56    if(request->type == 3)  // imrecv
57    {
58      ::MPI_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request);
59      ::MPI_Status mpi_status;
60      ::MPI_Test(&mpi_request, flag, &mpi_status);
61      if(*flag)
62      {
63        status->mpi_status = new ::MPI_Status(mpi_status);
64        status->ep_src = request->ep_src;
65      status->ep_tag = request->ep_tag;
66      status->ep_datatype = request->ep_datatype;
67        int count;
68        MPI_Get_count(status, request->ep_datatype, &count);
69        check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2);
70      }
71
72      status->ep_src = request->ep_src;
73      status->ep_tag = request->ep_tag;
74      status->ep_datatype = request->ep_datatype;
75
76     
77
78      return 0;
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    *flag = true;
88    int i=0;
89    while(*flag && i<count )
90    {
91      MPI_Test(&array_of_requests[i], flag, &array_of_statuses[i]);
92      i++;
93    }
94        }
95
96
97}
Note: See TracBrowser for help on using the repository browser.