source: XIOS/dev/branch_openmp/extern/ep_dev/ep_free.cpp @ 1503

Last change on this file since 1503 was 1503, checked in by yushan, 3 years ago

rank_map is passed from vector to map, in order to have more flexibility in comm_split

File size: 4.3 KB
Line 
1#include "ep_lib.hpp"
2#include <mpi.h>
3#include "ep_declaration.hpp"
4#include "ep_mpi.hpp"
5
6namespace ep_lib
7{
8
9  int MPI_Comm_free(MPI_Comm *comm)
10  {
11    if(! (*comm)->is_ep)
12    {
13      if((*comm)->mpi_comm != static_cast< ::MPI_Comm*>(MPI_COMM_NULL->mpi_comm))
14      {
15        ::MPI_Comm mpi_comm = to_mpi_comm((*comm)->mpi_comm);
16
17        ::MPI_Comm_free(&mpi_comm);
18        Debug("comm is MPI, freed\n");
19      }
20      return 0;
21    }
22
23    else if((*comm)->is_intercomm)
24    {
25      return MPI_Comm_free_intercomm(comm);
26    }
27
28    else
29    {
30      int ep_rank_loc, num_ep;
31
32      ep_rank_loc = (*comm)->ep_comm_ptr->size_rank_info[1].first;
33      num_ep = (*comm)->ep_comm_ptr->size_rank_info[1].second;
34
35      MPI_Barrier(*comm);
36
37      if(ep_rank_loc == 0)
38      {
39        Debug("comm is EP, mpi_comm_ptr != NULL\n");
40
41        delete (*comm)->my_buffer;
42
43
44        if((*comm)->ep_barrier != NULL)
45        {
46          (*comm)->ep_barrier->~ep_barrier();
47          Debug("ep_barrier freed\n");
48        }
49
50
51        if( ! (*comm)->ep_rank_map->empty() )
52        {
53          (*comm)->ep_rank_map->clear();
54          delete (*comm)->ep_rank_map;
55          Debug("ep_rank_map emptied and freed\n");
56        }
57
58        for(int i=0; i<num_ep; i++)
59        {
60          (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->message_queue->clear();
61          delete (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->message_queue;
62          Debug("message queue freed\n");
63         
64
65          if((*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr != NULL)
66          {
67            delete (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr;
68            Debug("ep_comm_ptr freed\n");
69          }
70        }
71
72        if( to_mpi_comm((*comm)->mpi_comm) != *static_cast< ::MPI_Comm*>(MPI_COMM_NULL->mpi_comm) 
73          && to_mpi_comm((*comm)->mpi_comm) != *static_cast< ::MPI_Comm*>(MPI_COMM_WORLD->mpi_comm))
74        {
75          ::MPI_Comm mpi_comm = to_mpi_comm((*comm)->mpi_comm);
76          ::MPI_Comm_free(&mpi_comm);
77          Debug("mpi_comm freed\n");
78        }
79
80       //if(comm != NULL) {delete[] comm->ep_comm_ptr->comm_list; Debug("comm freed\n");}
81
82      }
83
84      return 0;
85    }
86
87
88
89  }
90
91  int MPI_Comm_free_intercomm(MPI_Comm *comm)
92  {
93    int ep_rank_loc, num_ep;
94
95    ep_rank_loc = (*comm)->ep_comm_ptr->size_rank_info[1].first;
96    num_ep = (*comm)->ep_comm_ptr->size_rank_info[1].second;
97
98    //MPI_Barrier(*comm);
99
100    if(ep_rank_loc == 0)
101    {
102      Debug("comm is EP, mpi_comm_ptr != NULL\n");
103
104
105      if((*comm)->ep_barrier != NULL)
106      {
107        (*comm)->ep_barrier->~ep_barrier();
108        Debug("ep_barrier freed\n");
109      }
110
111
112      if( ! (*comm)->ep_rank_map->empty() )
113      {
114        (*comm)->ep_rank_map->clear();
115        delete (*comm)->ep_rank_map;
116        Debug("ep_rank_map emptied and freed\n");
117      }
118
119      for(int i=0; i<num_ep; i++)
120      {
121        (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->message_queue->clear();
122        Debug("message queue freed\n");
123
124        #pragma omp critical (memory_free)
125        if((*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->intercomm != NULL)
126        {
127          (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->intercomm->local_rank_map->clear();
128          (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->intercomm->remote_rank_map->clear();
129          (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr->intercomm->intercomm_rank_map->clear();
130          Debug("intercomm local/remote/intercomm_rank_map emptied\n");
131        } 
132
133        if((*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr != NULL)
134        {
135          delete (*comm)->ep_comm_ptr->comm_list[i]->ep_comm_ptr;
136          Debug("ep_comm_ptr freed\n");
137        }
138      }
139
140      if((*comm)->mpi_comm != static_cast< ::MPI_Comm*>(MPI_COMM_NULL->mpi_comm))
141      {
142        ::MPI_Comm mpi_comm = to_mpi_comm((*comm)->mpi_comm);
143        ::MPI_Comm_free(&mpi_comm);
144        Debug("mpi_comm freed\n");
145      }
146
147      if((*comm)->ep_comm_ptr->intercomm->mpi_inter_comm != static_cast< ::MPI_Comm*>(MPI_COMM_NULL->mpi_comm))
148      {
149        ::MPI_Comm mpi_comm = to_mpi_comm((*comm)->ep_comm_ptr->comm_list[0]->ep_comm_ptr->intercomm->mpi_inter_comm);
150        ::MPI_Comm_free(&mpi_comm);
151        Debug("mpi_intercomm freed\n");
152      }
153
154     if(comm != NULL) {delete[] (*comm)->ep_comm_ptr->comm_list; Debug("comm freed\n");}
155
156    }
157
158   
159   
160    return 0;
161  }
162
163
164
165}
166
167
Note: See TracBrowser for help on using the repository browser.