source: XIOS/dev/dev_trunk_omp/extern/src_ep_dev2/ep_wait.cpp @ 1776

Last change on this file since 1776 was 1651, checked in by yushan, 5 years ago

dev on EP for tracing with itac. Tested on ADA with test_omp

File size: 4.3 KB
Line 
1#ifdef _usingEP
2/*!
3  \file ep_wait.cpp
4  \since 2 may 2016
5
6  \brief Definitions of MPI wait function: MPI_Wait, MPI_Waitall, MPI_Waitsome, MPI_Waitany
7  */
8
9#include "ep_lib.hpp"
10#include <mpi.h>
11#include "ep_declaration.hpp"
12#include "ep_mpi.hpp"
13
14using namespace std;
15
16extern std::list< ep_lib::MPI_Request* > * EP_PendingRequests;
17#pragma omp threadprivate(EP_PendingRequests)
18
19
20
21namespace ep_lib
22{
23 
24  int MPI_Wait(MPI_Request *request, MPI_Status *status)
25  {
26   
27    ::MPI_Status mpi_status;
28    ::MPI_Wait(to_mpi_request_ptr(*request), &mpi_status);
29
30    status->mpi_status=new ::MPI_Status(mpi_status);
31    //printf("MPI_Wait : delete (*request)->mpi_request => (*request)->mpi_request = %p\n", (*request)->mpi_request);
32    delete (*request)->mpi_request;
33    //printf("MPI_Wait : delete *request => *request = %p\n", *request);
34    delete *request;
35
36  }   /*end of mpi_wait*/
37
38
39  int MPI_Waitall(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses)
40  {
41    ::MPI_Request* mpi_request = new ::MPI_Request[count];
42    ::MPI_Status* mpi_status = new ::MPI_Status[count];
43
44    for(int i=0; i<count; i++)
45    {
46      mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request); 
47    }
48
49    ::MPI_Waitall(count, mpi_request, mpi_status);
50
51    for(int i=0; i<count; i++)
52    {
53      array_of_statuses[i].mpi_status = new ::MPI_Status(mpi_status[i]);
54     
55      //printf("MPI_Waitall : delete array_of_requests[%d]->mpi_request => array_of_requests[%d]->mpi_request = %p\n", i, i, array_of_requests[i]->mpi_request);
56      delete array_of_requests[i]->mpi_request;
57      //printf("MPI_Waitall : delete array_of_requests[%d] => array_of_requests[%d] = %p\n", i, i, array_of_requests[i]);
58      delete array_of_requests[i];
59    }
60
61    delete[] mpi_request;
62    delete[] mpi_status;
63   
64    return 0;
65  }  /* end of mpi_waitall*/
66
67
68
69    int MPI_Wait2(MPI_Request *request, MPI_Status *status)
70  {
71    if((*request)->type !=1 && (*request)->type !=2 && (*request)->type !=3) 
72    {
73      printf("MPI_Wait : Error in request type\n");
74      exit(1);
75    }
76
77    while((*request)->type == 2) Request_Check();
78   
79    ::MPI_Status mpi_status;
80   
81    ::MPI_Wait(to_mpi_request_ptr(*request), &mpi_status);
82
83    status->mpi_status = new ::MPI_Status(mpi_status);
84    status->ep_src = (*request)->ep_src;
85    status->ep_tag = (*request)->ep_tag;
86    status->ep_datatype = (*request)->ep_datatype;
87   
88    (*request)->state = 2;
89
90    memcheck("delete "<< (*request)->mpi_request << " : in ep_lib::MPI_Wait, delete (*request)->mpi_request");
91
92    delete (*request)->mpi_request;
93    delete *request;
94    *request=0;
95   
96    return Request_Check();
97
98  }   /*end of mpi_wait*/
99
100
101
102  int MPI_Waitall2(int count, MPI_Request *array_of_requests, MPI_Status *array_of_statuses)
103  {
104    std::vector<int> finished(count, 0);
105
106    ::MPI_Request* mpi_request = new ::MPI_Request[count];
107    ::MPI_Status* mpi_status = new ::MPI_Status[count];
108
109    while(std::accumulate(finished.begin(), finished.end(), 0) < count)
110    {
111     
112      for(int i=0; i<count; i++)
113      {
114        if(array_of_requests[i]->type !=1 && array_of_requests[i]->type !=2 && array_of_requests[i]->type !=3) 
115        {
116          printf("Error in request type\n");
117 
118          exit(1);
119        }
120       
121        if(array_of_requests[i]->type == 2) Request_Check(); 
122        if(array_of_requests[i]->type != 2 && finished.at(i) == 0) 
123        {
124          finished.at(i) = 1;
125          mpi_request[i] = *static_cast< ::MPI_Request*>(array_of_requests[i]->mpi_request);
126        }
127      }   
128    }
129
130    ::MPI_Waitall(count, mpi_request, mpi_status);
131
132    for(int i=0; i<count; i++)
133    {
134      array_of_statuses[i].mpi_status = new ::MPI_Status(mpi_status[i]);
135      array_of_statuses[i].ep_src = array_of_requests[i]->ep_src;
136      array_of_statuses[i].ep_tag = array_of_requests[i]->ep_tag;
137      array_of_statuses[i].ep_datatype = array_of_requests[i]->ep_datatype;
138     
139      array_of_requests[i]->state = 2;
140     
141      memcheck("delete "<< array_of_requests[i]->mpi_request <<" : in ep_lib::MPI_Waitall, array_of_requests["<<i<<"]->mpi_request");
142      delete array_of_requests[i]->mpi_request;
143      delete array_of_requests[i];
144      array_of_requests[i] = 0;
145    }
146
147    delete[] mpi_request;
148    delete[] mpi_status;
149   
150    return Request_Check();
151  }  /* end of mpi_waitall*/
152
153
154}
155
156#endif
Note: See TracBrowser for help on using the repository browser.