source: XIOS/dev/branch_yushan_merged/extern/src_ep_dev/ep_test.cpp @ 1185

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

save dev. recv_test OK

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_Request mpi_request = static_cast< ::MPI_Request >(request->mpi_request);
27      ::MPI_Status mpi_status;
28      ::MPI_Test(&mpi_request, flag, &mpi_status);
29     
30      if(*flag) 
31      {
32        status->mpi_status = new ::MPI_Status(mpi_status);
33        status->ep_src = request->ep_src;
34        status->ep_tag = request->ep_tag;
35        status->ep_datatype = request->ep_datatype;
36      }
37
38      return 0;
39    }
40
41    if(request->type == 2)   // irecv message not probed
42    {
43      Message_Check(request->comm);
44      #pragma omp flush
45      MPI_Message message;
46      MPI_Improbe(request->ep_src, request->ep_tag, request->comm, flag, &message, status);
47      if(*flag)
48      {
49       
50        int count;
51        MPI_Get_count(status, request->ep_datatype, &count);
52        MPI_Imrecv(request->buf, count, request->ep_datatype, &message, request);
53        printf("in ep_test, found message src = %d, tag = %d, type = %d\n", request->ep_src, request->ep_tag, request->type);
54        MPI_Test(request, flag, status);
55      }
56      return 0;
57    }
58
59    if(request->type == 3)  // imrecv
60    {
61      ::MPI_Request *mpi_request = static_cast< ::MPI_Request* >(&(request->mpi_request));
62      ::MPI_Status mpi_status;
63     
64      ::MPI_Errhandler_set(MPI_COMM_WORLD_STD, MPI_ERRORS_RETURN);
65      int error_code = ::MPI_Test(mpi_request, flag, &mpi_status);
66      if (error_code != MPI_SUCCESS) {
67     
68         char error_string[BUFSIZ];
69         int length_of_error_string, error_class;
70     
71         ::MPI_Error_class(error_code, &error_class);
72         ::MPI_Error_string(error_class, error_string, &length_of_error_string);
73         printf("%s\n", error_string);
74      }
75     
76      if(*flag)
77      {
78        status->mpi_status = new ::MPI_Status(mpi_status);
79        status->ep_src = request->ep_src;
80        status->ep_tag = request->ep_tag;
81        status->ep_datatype = request->ep_datatype;
82        //int count;
83        //MPI_Get_count(status, request->ep_datatype, &count);
84        //check_sum_recv(request->buf, count, request->ep_datatype, request->ep_src, request->ep_tag, request->comm, 2);
85      }
86
87      status->ep_src = request->ep_src;
88      status->ep_tag = request->ep_tag;
89      status->ep_datatype = request->ep_datatype;
90
91     
92
93      return 0;
94    }
95               
96  }
97
98
99  int MPI_Testall(int count, MPI_Request *array_of_requests, int *flag, MPI_Status *array_of_statuses)
100  {
101    Debug("MPI_Testall with EP");
102    *flag = true;
103    int i=0;
104    while(*flag && i<count )
105    {
106      MPI_Test(&array_of_requests[i], flag, &array_of_statuses[i]);
107      i++;
108    }
109  }
110
111
112}
Note: See TracBrowser for help on using the repository browser.