OpenMPI  0.1.1
memchecker.h
1 /*
2  * Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
3  * University of Stuttgart. All rights reserved.
4  * Copyright (c) 2010 The University of Tennessee and The University
5  * of Tennessee Research Foundation. All rights
6  * reserved.
7  * Copyright (c) 2009 Oak Ridge National Labs. All rights reserved.
8  *
9  * $COPYRIGHT$
10  *
11  * Additional copyrights may follow
12  *
13  * $HEADER$
14  */
15 
16 
17 #ifndef OMPI_MEMCHECKER_H
18 #define OMPI_MEMCHECKER_H
19 
20 #include "ompi_config.h"
21 
22 #include "opal/datatype/opal_convertor.h"
23 #include "opal/datatype/opal_datatype.h"
24 #include "opal/datatype/opal_datatype_internal.h"
25 
26 #include "ompi/communicator/communicator.h"
27 #include "ompi/group/group.h"
28 #include "ompi/datatype/ompi_datatype.h"
29 #include "ompi/request/request.h"
30 #include "opal/mca/memchecker/base/base.h"
31 
32 
33 #if OMPI_WANT_MEMCHECKER
34 # define MEMCHECKER(x) do { \
35  x; \
36  } while(0)
37 #else
38 # define MEMCHECKER(x)
39 #endif /* OMPI_WANT_MEMCHECKER */
40 
41 
42 static inline int memchecker_convertor_call (int (*f)(void *, size_t), opal_convertor_t* pConvertor)
43 {
44  if (!opal_memchecker_base_runindebugger() ||
45  (0 == pConvertor->count) ) {
46  return OMPI_SUCCESS;
47  }
48 
49  if( OPAL_LIKELY(pConvertor->flags & CONVERTOR_NO_OP) ) {
50  /* We have a contiguous type. */
51  f( (void *)pConvertor->pBaseBuf , pConvertor->local_size);
52  } else {
53  /* Now we got a noncontigous data. */
54  uint32_t elem_pos = 0, i;
55  ptrdiff_t stack_disp = 0;
56  dt_elem_desc_t* description = pConvertor->use_desc->desc;
57  dt_elem_desc_t* pElem = &(description[elem_pos]);
58  unsigned char *source_base = pConvertor->pBaseBuf;
59 
60  if ( NULL != pConvertor->pDesc )
61  stack_disp = pConvertor->pDesc->ub - pConvertor->pDesc->lb;
62 
63  for (i = 0; i < pConvertor->count; i++){
64  while ( OPAL_DATATYPE_LOOP == pElem->elem.common.flags ) {
65  elem_pos++;
66  pElem = &(description[elem_pos]);
67  }
68 
69  while( pElem->elem.common.flags & OPAL_DATATYPE_FLAG_DATA ) {
70  /* now here we have a basic datatype */
71  f( (void *)(source_base + pElem->elem.disp), pElem->elem.count*pElem->elem.extent );
72  elem_pos++; /* advance to the next data */
73  pElem = &(description[elem_pos]);
74  continue;
75  }
76 
77  elem_pos = 0;
78  pElem = &(description[elem_pos]);
79  /* starting address of next stack. */
80  source_base += stack_disp;
81  }
82  }
83 
84  return OMPI_SUCCESS;
85 }
86 
87 
88 /*
89  * Set the corresponding memory area of count elements of type ty
90  *
91  */
92 static inline int memchecker_call (int (*f)(void *, size_t), void * addr,
93  size_t count, struct ompi_datatype_t * datatype)
94 {
95  if (!opal_memchecker_base_runindebugger()) {
96  return OMPI_SUCCESS;
97  }
98 
99  if( datatype->super.size == (size_t) (datatype->super.true_ub - datatype->super.true_lb) ) {
100  /* We have a contiguous type. */
101  f( addr , datatype->super.size * count );
102  } else {
103  /* Now we got a noncontigous type. */
104  uint32_t elem_pos = 0, i;
105  ptrdiff_t stack_disp = 0;
106  dt_elem_desc_t* description = datatype->super.opt_desc.desc;
107  dt_elem_desc_t* pElem = &(description[elem_pos]);
108  unsigned char *source_base = (unsigned char *) addr;
109 
110  if ( NULL != datatype ) {
111  stack_disp = datatype->super.ub - datatype->super.lb;
112  }
113 
114  for (i = 0; i < count; i++) {
115  while ( OPAL_DATATYPE_LOOP == pElem->elem.common.flags ) {
116  elem_pos++;
117  pElem = &(description[elem_pos]);
118  }
119 
120  while( pElem->elem.common.flags & OPAL_DATATYPE_FLAG_DATA ) {
121  /* now here we have a basic datatype */
122  f( (void *)(source_base + pElem->elem.disp), pElem->elem.count*pElem->elem.extent );
123  elem_pos++; /* advance to the next data */
124  pElem = &(description[elem_pos]);
125  continue;
126  }
127 
128  elem_pos = 0;
129  pElem = &(description[elem_pos]);
130  /* starting address of next stack. */
131  source_base += stack_disp;
132  }
133  }
134 
135  return OMPI_SUCCESS;
136 }
137 
138 
139 
140 /*
141  * Flag: OMPI_WANT_MEMCHECKER_MPI_OBJECTS
142  *
143  * If set, definedness of Open MPI-internal objects is being checked.
144  * To handle alignment, only the used members of structures are
145  * being used -- therefore this depends on the corresponding
146  * configure-flags.
147  *
148  * This is off by default, as this is rather expensive (for each member
149  * the valgrind-magic is being inlined.
150  * Only turn on, if You want to debug ompi-internal datastructures.
151  */
152 /*#define OMPI_WANT_MEMCHECKER_MPI_OBJECTS*/
153 
154 
155 /*
156  * Check every member of the communicator, whether their memory areas are defined.
157  */
158 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
159 static inline int memchecker_comm(MPI_Comm comm)
160 {
161  if (!opal_memchecker_base_runindebugger()) {
162  return OMPI_SUCCESS;
163  }
164 
165  /*
166  * We should not check unterlying objects in this way -- either another opal/include/memchecker.h
167  * However, let us assume, that underlying objects are initialized correctly
168  */
169 #if 0
170  /* c_base */
171  opal_memchecker_base_isdefined (&comm->c_base.obj_class, sizeof(opal_class_t *));
172  opal_memchecker_base_isdefined ((void*)&comm->c_base.obj_reference_count, sizeof(volatile int32_t));
173 #if OPAL_ENABLE_DEBUG
174  opal_memchecker_base_isdefined (&comm->c_base.obj_magic_id, sizeof(opal_object_t));
175  opal_memchecker_base_isdefined (&comm->c_base.cls_init_file_name, sizeof(const char *));
176  opal_memchecker_base_isdefined (&comm->c_base.cls_init_lineno, sizeof(int));
177 #endif
178  /* c_lock */
179  opal_memchecker_base_isdefined (&comm->c_lock.super.obj_class, sizeof(opal_class_t *));
180  opal_memchecker_base_isdefined ((void*)&comm->c_lock.super.obj_reference_count, sizeof(volatile int32_t));
181 #if OPAL_ENABLE_DEBUG
182  opal_memchecker_base_isdefined (&comm->c_lock.super.obj_magic_id, sizeof(uint64_t));
183  opal_memchecker_base_isdefined (&comm->c_lock.super.cls_init_file_name, sizeof(const char *));
184  opal_memchecker_base_isdefined (&comm->c_lock.super.cls_init_lineno, sizeof(int));
185 #endif
186 #if OPAL_HAVE_POSIX_THREADS
187 /*
188  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_pthread.__m_reserved, sizeof(int));
189  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_pthread.__m_count, sizeof(int));
190  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_pthread.__m_owner, sizeof(_pthread_descr));
191  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_pthread.__m_kind, sizeof(int));
192  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_pthread.__m_lock.__status, sizeof(long int));
193  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_pthread.__m_lock.__spinlock, sizeof(int));
194 */
195 #endif
196 #if OPAL_HAVE_SOLARIS_THREADS
197  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_solaris, sizeof(mutex_t));
198 #endif
199  /*
200  * The storage of a union has the size of the initialized member.
201  * Here we check the whole union.
202  */
203  opal_memchecker_base_isdefined (&comm->c_lock.m_lock_atomic, sizeof(opal_atomic_lock_t));
204 #endif /* 0 */
205  opal_memchecker_base_isdefined (&comm->c_name, MPI_MAX_OBJECT_NAME);
206  opal_memchecker_base_isdefined (&comm->c_my_rank, sizeof(int));
207  opal_memchecker_base_isdefined (&comm->c_flags, sizeof(uint32_t));
208  opal_memchecker_base_isdefined (&comm->c_id_available, sizeof(int));
209  opal_memchecker_base_isdefined (&comm->c_id_start_index, sizeof(int));
210  opal_memchecker_base_isdefined (&comm->c_local_group, sizeof(ompi_group_t *));
211  opal_memchecker_base_isdefined (&comm->c_remote_group, sizeof(ompi_group_t *));
212  opal_memchecker_base_isdefined (&comm->c_keyhash, sizeof(struct opal_hash_table_t *));
213  opal_memchecker_base_isdefined (&comm->c_cube_dim, sizeof(int));
214  opal_memchecker_base_isdefined (&comm->c_topo_component, sizeof(mca_base_component_t *));
215  opal_memchecker_base_isdefined (&comm->c_topo, sizeof(const struct mca_topo_base_module_1_0_0_t *));
216  opal_memchecker_base_isdefined (&comm->c_topo_comm, sizeof(struct mca_topo_base_comm_1_0_0_t *));
217  opal_memchecker_base_isdefined (&comm->c_topo_module, sizeof(struct mca_topo_base_module_comm_t *));
218  opal_memchecker_base_isdefined (&comm->c_f_to_c_index, sizeof(int));
219 #ifdef OMPI_WANT_PERUSE
220  opal_memchecker_base_isdefined (&comm->c_peruse_handles, sizeof(struct ompi_peruse_handle_t **));
221 #endif
222  opal_memchecker_base_isdefined (&comm->error_handler, sizeof(ompi_errhandler_t *));
223  opal_memchecker_base_isdefined (&comm->errhandler_type, sizeof(ompi_errhandler_type_t));
224  opal_memchecker_base_isdefined (&comm->c_pml_comm, sizeof(struct mca_pml_comm_t *));
225  /* c_coll */
226  opal_memchecker_base_isdefined (&comm->c_coll.coll_module_init, sizeof(mca_coll_base_module_init_1_0_0_fn_t));
227  opal_memchecker_base_isdefined (&comm->c_coll.coll_module_finalize, sizeof(mca_coll_base_module_finalize_fn_t));
228  opal_memchecker_base_isdefined (&comm->c_coll.coll_allgather, sizeof(mca_coll_base_module_allgather_fn_t));
229  opal_memchecker_base_isdefined (&comm->c_coll.coll_allgatherv, sizeof(mca_coll_base_module_allgatherv_fn_t));
230  opal_memchecker_base_isdefined (&comm->c_coll.coll_allreduce, sizeof(mca_coll_base_module_allreduce_fn_t));
231  opal_memchecker_base_isdefined (&comm->c_coll.coll_alltoall, sizeof(mca_coll_base_module_alltoall_fn_t));
232  opal_memchecker_base_isdefined (&comm->c_coll.coll_alltoallv, sizeof(mca_coll_base_module_alltoallv_fn_t));
233  opal_memchecker_base_isdefined (&comm->c_coll.coll_alltoallw, sizeof(mca_coll_base_module_alltoallw_fn_t));
234  opal_memchecker_base_isdefined (&comm->c_coll.coll_barrier, sizeof(mca_coll_base_module_barrier_fn_t));
235  opal_memchecker_base_isdefined (&comm->c_coll.coll_bcast, sizeof(mca_coll_base_module_bcast_fn_t));
236  opal_memchecker_base_isdefined (&comm->c_coll.coll_exscan, sizeof(mca_coll_base_module_exscan_fn_t));
237  opal_memchecker_base_isdefined (&comm->c_coll.coll_gather, sizeof(mca_coll_base_module_gather_fn_t));
238  opal_memchecker_base_isdefined (&comm->c_coll.coll_gatherv, sizeof(mca_coll_base_module_gatherv_fn_t));
239  opal_memchecker_base_isdefined (&comm->c_coll.coll_reduce, sizeof(mca_coll_base_module_reduce_fn_t));
240  opal_memchecker_base_isdefined (&comm->c_coll.coll_reduce_scatter, sizeof(mca_coll_base_module_reduce_scatter_fn_t));
241  opal_memchecker_base_isdefined (&comm->c_coll.coll_scan, sizeof(mca_coll_base_module_scan_fn_t));
242  opal_memchecker_base_isdefined (&comm->c_coll.coll_scatter, sizeof(mca_coll_base_module_scatter_fn_t));
243  opal_memchecker_base_isdefined (&comm->c_coll.coll_scatterv, sizeof(mca_coll_base_module_scatterv_fn_t));
244 
245  opal_memchecker_base_isdefined (&comm->c_coll_selected_component, sizeof(const mca_coll_base_component_2_0_0_t *));
246  opal_memchecker_base_isdefined (&comm->c_coll_selected_module, sizeof(const mca_coll_base_module_1_0_0_t *));
247  /* Somehow, this often shows up in petsc with comm_dup'ed communicators*/
248  /* opal_memchecker_base_isdefined (&comm->c_coll_selected_data, sizeof(struct mca_coll_base_comm_t *)); */
249  opal_memchecker_base_isdefined (&comm->c_coll_basic_module, sizeof(const mca_coll_base_module_1_0_0_t *));
250  opal_memchecker_base_isdefined (&comm->c_coll_basic_data, sizeof(struct mca_coll_base_comm_t *));
251 
252  return OMPI_SUCCESS;
253 }
254 #else
255 #define memchecker_comm(comm)
256 #endif /* OMPI_WANT_MEMCHECKER_MPI_OBJECTS */
257 
258 
259 /*
260  * Check every member of the request, whether their memory areas are defined.
261  */
262 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
263 static inline int memchecker_request(MPI_Request *request)
264 {
265  if (!opal_memchecker_base_runindebugger()) {
266  return OMPI_SUCCESS;
267  }
268 
269 #if 0
270  opal_memchecker_base_isdefined (&(*request)->super.super.super.obj_class, sizeof(opal_class_t *));
271  opal_memchecker_base_isdefined ((void*)&(*request)->super.super.super.obj_reference_count, sizeof(volatile int32_t));
272 #if OPAL_ENABLE_DEBUG
273  opal_memchecker_base_isdefined (&(*request)->super.super.super.obj_magic_id, sizeof(uint64_t));
274  opal_memchecker_base_isdefined (&(*request)->super.super.super.cls_init_file_name, sizeof(const char *));
275  opal_memchecker_base_isdefined (&(*request)->super.super.super.cls_init_lineno, sizeof(int));
276 #endif
277 
278  opal_memchecker_base_isdefined ((void*)&(*request)->super.super.opal_list_next, sizeof(volatile struct opal_list_item_t *));
279  opal_memchecker_base_isdefined ((void*)&(*request)->super.super.opal_list_prev, sizeof(volatile struct opal_list_item_t *));
280 #if OPAL_ENABLE_DEBUG
281  opal_memchecker_base_isdefined ((void*)&(*request)->super.super.opal_list_item_refcount, sizeof(volatile int32_t));
282  opal_memchecker_base_isdefined ((void*)&(*request)->super.super.opal_list_item_belong_to, sizeof(volatile struct opal_list_t *));
283 #endif
284 /* opal_memchecker_base_isdefined (&(*request)->super.user_data, sizeof(void *)); */
285 #endif /* 0 */
286  opal_memchecker_base_isdefined (&(*request)->req_type, sizeof(ompi_request_type_t));
287  /* req_status */
288 #if 0
289  /* We do never initialize the req_status in the creation functions,
290  * they are just used to transport values back up....
291  */
292  opal_memchecker_base_isdefined (&(*request)->req_status.MPI_SOURCE, sizeof(int));
293  opal_memchecker_base_isdefined (&(*request)->req_status.MPI_TAG, sizeof(int));
294  opal_memchecker_base_isdefined (&(*request)->req_status.MPI_ERROR, sizeof(int));
295  opal_memchecker_base_isdefined (&(*request)->req_status._cancelled, sizeof(int));
296  opal_memchecker_base_isdefined (&(*request)->req_status._ucount, sizeof(size_t));
297 #endif
298 
299  opal_memchecker_base_isdefined ((void*)&(*request)->req_complete, sizeof(volatile _Bool));
300  opal_memchecker_base_isdefined ((void*)&(*request)->req_state, sizeof(volatile ompi_request_state_t));
301  opal_memchecker_base_isdefined (&(*request)->req_persistent, sizeof(_Bool));
302  opal_memchecker_base_isdefined (&(*request)->req_f_to_c_index, sizeof(int));
303  opal_memchecker_base_isdefined (&(*request)->req_free, sizeof(ompi_request_free_fn_t));
304  opal_memchecker_base_isdefined (&(*request)->req_cancel, sizeof(ompi_request_cancel_fn_t));
305  /* req_mpi_object */
306  opal_memchecker_base_isdefined (&(*request)->req_mpi_object.comm, sizeof(struct ompi_communicator_t *));
307  opal_memchecker_base_isdefined (&(*request)->req_mpi_object.file, sizeof(struct ompi_file_t *));
308  opal_memchecker_base_isdefined (&(*request)->req_mpi_object.win, sizeof(struct ompi_win_t *));
309 
310  return OMPI_SUCCESS;
311 }
312 #else
313 #define memchecker_request(request)
314 #endif /* OMPI_WANT_MEMCHECKER_MPI_OBJECTS */
315 
316 
317 /*
318  * Check every member of the status, whether their memory areas are defined.
319  */
320 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
321 static inline int memchecker_status(MPI_Status *status)
322 {
323  if (!opal_memchecker_base_runindebugger()) {
324  return OMPI_SUCCESS;
325  }
326 
327  opal_memchecker_base_isdefined (&status->MPI_SOURCE, sizeof(int));
328  opal_memchecker_base_isdefined (&status->MPI_TAG, sizeof(int));
329  opal_memchecker_base_isdefined (&status->MPI_ERROR, sizeof(int));
330  opal_memchecker_base_isdefined (&status->_cancelled, sizeof(int));
331  opal_memchecker_base_isdefined (&status->_ucount, sizeof(size_t));
332 
333  return OMPI_SUCCESS;
334 }
335 #else
336 #define memchecker_status(status)
337 #endif /* OMPI_WANT_MEMCHECKER_MPI_OBJECTS */
338 
339 
340 /*
341  * Check every member of the datatype, whether their memory areas are defined.
342  */
343 #ifdef OMPI_WANT_MEMCHECKER_MPI_OBJECTS
344 static inline int memchecker_datatype(MPI_Datatype type)
345 {
346  if (!opal_memchecker_base_runindebugger()) {
347  return OMPI_SUCCESS;
348  }
349 
350  /* the data description in the opal_datatype_t super class */
351  opal_memchecker_base_isdefined (&type->super.flags, sizeof(uint16_t));
352  opal_memchecker_base_isdefined (&type->super.id, sizeof(uint16_t));
353  opal_memchecker_base_isdefined (&type->super.bdt_used, sizeof(uint32_t));
354  opal_memchecker_base_isdefined (&type->super.size, sizeof(size_t));
355  opal_memchecker_base_isdefined (&type->super.true_lb, sizeof(OPAL_PTRDIFF_T));
356  opal_memchecker_base_isdefined (&type->super.true_ub, sizeof(OPAL_PTRDIFF_T));
357  opal_memchecker_base_isdefined (&type->super.lb, sizeof(OPAL_PTRDIFF_T));
358  opal_memchecker_base_isdefined (&type->super.ub, sizeof(OPAL_PTRDIFF_T));
359  opal_memchecker_base_isdefined (&type->super.align, sizeof(uint32_t));
360  opal_memchecker_base_isdefined (&type->super.nbElems, sizeof(uint32_t));
361  /* name... */
362  opal_memchecker_base_isdefined (&type->super.desc.length, sizeof(opal_datatype_count_t));
363  opal_memchecker_base_isdefined (&type->super.desc.used, sizeof(opal_datatype_count_t));
364  opal_memchecker_base_isdefined (&type->super.desc.desc, sizeof(dt_elem_desc_t *));
365  opal_memchecker_base_isdefined (&type->super.opt_desc.length, sizeof(opal_datatype_count_t));
366  opal_memchecker_base_isdefined (&type->super.opt_desc.used, sizeof(opal_datatype_count_t));
367  opal_memchecker_base_isdefined (&type->super.opt_desc.desc, sizeof(dt_elem_desc_t *));
368  opal_memchecker_base_isdefined (&type->super.btypes, OPAL_DATATYPE_MAX_PREDEFINED * sizeof(uint32_t));
369 
370  opal_memchecker_base_isdefined (&type->id, sizeof(int32_t));
371  opal_memchecker_base_isdefined (&type->d_f_to_c_index, sizeof(int32_t));
372  opal_memchecker_base_isdefined (&type->d_keyhash, sizeof(opal_hash_table_t *));
373  opal_memchecker_base_isdefined (&type->args, sizeof(void *));
374  opal_memchecker_base_isdefined (&type->packed_description, sizeof(void *));
375  opal_memchecker_base_isdefined (&type->name, MPI_MAX_OBJECT_NAME * sizeof(char));
376 
377  return OMPI_SUCCESS;
378 }
379 #else
380 #define memchecker_datatype(type)
381 #endif /* OMPI_WANT_MEMCHECKER_MPI_OBJECTS */
382 
383 #endif /* OMPI_MEMCHECKER_H */
384 
uint16_t flags
the flags
Definition: opal_datatype.h:105
Definition: opal_hash_table.h:42
void * args
Data description for the user.
Definition: ompi_datatype.h:76
Definition: win.h:53
Definition: topo.h:110
OPAL_PTRDIFF_TYPE extent
extent of each block (in bytes)
Definition: opal_datatype_internal.h:161
Common type for all MCA components.
Definition: mca.h:250
uint16_t id
data id, normally the index in the data array.
Definition: opal_datatype.h:106
Definition: opal_datatype_internal.h:184
Definition: ompi_datatype.h:68
uint32_t bdt_used
bitset of which basic datatypes are used in the data description
Definition: opal_datatype.h:107
Back-end type for MPI_Errorhandler.
Definition: errhandler.h:108
Definition: peruse-internal.h:30
opal_datatype_count_t length
the maximum number of elements in the description array
Definition: opal_datatype.h:93
Collective component interface.
Definition: coll.h:283
Cached on ompi_communicator_t to hold queues/state used by the PML<->PTL interface for matching logic...
Definition: pml_bfo_comm.h:51
dt_type_desc_t desc
the data description
Definition: opal_datatype.h:121
struct mca_topo_base_comm_1_0_0_t * c_topo_comm
structure containing basic information about the topology
Definition: communicator.h:155
OPAL_PTRDIFF_TYPE lb
lower bound in memory
Definition: opal_datatype.h:112
OPAL_PTRDIFF_TYPE ub
upper bound in memory
Definition: opal_datatype.h:113
volatile int32_t obj_reference_count
reference count
Definition: opal_object.h:189
ddt_elem_id_description common
basic data description and flags
Definition: opal_datatype_internal.h:158
Volatile lock object (with optional padding).
Definition: atomic.h:102
unsigned char * pBaseBuf
initial buffer as supplied by the user
Definition: opal_convertor.h:101
Definition: opal_list.h:98
Class descriptor.
Definition: opal_object.h:152
const struct mca_topo_base_module_1_0_0_t * c_topo
structure of function pointers
Definition: communicator.h:152
const opal_datatype_t * pDesc
the datatype description associated with the convertor
Definition: opal_convertor.h:96
Top-level description of requests.
uint32_t count
number of blocks
Definition: opal_datatype_internal.h:159
opal_datatype_t super
Base opal_datatype_t superclass.
Definition: ompi_datatype.h:69
Back-end structure for MPI_File.
Definition: file.h:42
uint32_t align
data should be aligned to
Definition: opal_datatype.h:115
struct opal_hash_table_t * d_keyhash
Attribute fields.
Definition: ompi_datatype.h:74
size_t size
total size in bytes of the memory used by the data if the data is put on a contiguous buffer ...
Definition: opal_datatype.h:108
void * packed_description
Packed description of the datatype.
Definition: ompi_datatype.h:77
Group structure Currently we have four formats for storing the process pointers that are members of t...
Definition: group.h:79
char name[MPI_MAX_OBJECT_NAME]
Externally visible name.
Definition: ompi_datatype.h:79
Base object.
Definition: opal_object.h:182
Definition: opal_convertor.h:90
opal_datatype_count_t used
the number of used elements in the description array
Definition: opal_datatype.h:94
const dt_type_desc_t * use_desc
the version used by the convertor (normal or optimized)
Definition: opal_convertor.h:97
Definition: opal_list.h:147
Definition: topo.h:255
struct mca_topo_base_module_comm_t * c_topo_module
module specific data
Definition: communicator.h:158
uint16_t flags
flags for the record
Definition: opal_datatype_internal.h:149
Definition: mpi.h:337
int32_t d_f_to_c_index
Fortran index for this datatype.
Definition: ompi_datatype.h:73
size_t local_size
overall length data on local machine, compared to bConverted
Definition: opal_convertor.h:94
uint32_t btypes[OPAL_DATATYPE_MAX_SUPPORTED]
basic elements count used to compute the size of the datatype for remote nodes.
Definition: opal_datatype.h:125
int32_t id
OMPI-layers unique id of the type.
Definition: ompi_datatype.h:72
Infrastructure for MPI group support.
OPAL_PTRDIFF_TYPE true_ub
the true ub of the data without user defined lb and ub
Definition: opal_datatype.h:111
Definition: evdns.c:158
opal_datatype_count_t count
the total number of full datatype elements
Definition: opal_convertor.h:98
dt_type_desc_t opt_desc
short description of the data used when conversion is useless or in the send case (without conversion...
Definition: opal_datatype.h:122
uint32_t flags
the properties of this convertor
Definition: opal_convertor.h:93
uint32_t nbElems
total number of elements inside the datatype
Definition: opal_datatype.h:116
Definition: communicator.h:118
Main top-level request struct definition.
Definition: request.h:100
struct opal_hash_table_t * c_keyhash
inscribing cube dimension
Definition: communicator.h:144
OPAL_PTRDIFF_TYPE true_lb
the true lb of the data without user defined lb and ub
Definition: opal_datatype.h:110
ompi_errhandler_type_t
Enum used to describe what kind MPI object an error handler is used for.
Definition: errhandler.h:84
opal_class_t * obj_class
class descriptor
Definition: opal_object.h:188
OPAL_PTRDIFF_TYPE disp
displacement of the first block
Definition: opal_datatype_internal.h:162