OpenMPI 0.1.1

- Main Page
- Related Pages
- Modules
- Data Structures
- Files

- File List
- Globals

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
opal_datatype_t::flags
uint16_t flags
the flags
Definition: opal_datatype.h:105
opal_hash_table_t
Definition: opal_hash_table.h:42
ompi_datatype_t::args
void * args
Data description for the user.
Definition: ompi_datatype.h:76
ompi_win_t
Definition: win.h:53
mca_topo_base_comm_1_0_0_t
Definition: topo.h:110
ddt_elem_desc::extent
OPAL_PTRDIFF_TYPE extent
extent of each block (in bytes)
Definition: opal_datatype_internal.h:161
mca_base_component_2_0_0_t
Common type for all MCA components.
Definition: mca.h:250
opal_datatype_t::id
uint16_t id
data id, normally the index in the data array.
Definition: opal_datatype.h:106
dt_elem_desc
Definition: opal_datatype_internal.h:184
ompi_datatype_t
Definition: ompi_datatype.h:68
opal_datatype_t::bdt_used
uint32_t bdt_used
bitset of which basic datatypes are used in the data description
Definition: opal_datatype.h:107
ompi_errhandler_t
Back-end type for MPI_Errorhandler.
Definition: errhandler.h:108
ompi_peruse_handle_t
Definition: peruse-internal.h:30
dt_type_desc_t::length
opal_datatype_count_t length
the maximum number of elements in the description array
Definition: opal_datatype.h:93
mca_coll_base_component_2_0_0_t
Collective component interface.
Definition: coll.h:283
mca_pml_comm_t
Cached on ompi_communicator_t to hold queues/state used by the PML<->PTL interface for matching logic...
Definition: pml_bfo_comm.h:51
opal_datatype_t::desc
dt_type_desc_t desc
the data description
Definition: opal_datatype.h:121
ompi_communicator_t::c_topo_comm
struct mca_topo_base_comm_1_0_0_t * c_topo_comm
structure containing basic information about the topology
Definition: communicator.h:155
opal_datatype_t::lb
OPAL_PTRDIFF_TYPE lb
lower bound in memory
Definition: opal_datatype.h:112
opal_datatype_t::ub
OPAL_PTRDIFF_TYPE ub
upper bound in memory
Definition: opal_datatype.h:113
opal_object_t::obj_reference_count
volatile int32_t obj_reference_count
reference count
Definition: opal_object.h:189
ddt_elem_desc::common
ddt_elem_id_description common
basic data description and flags
Definition: opal_datatype_internal.h:158
opal_atomic_lock_t
Volatile lock object (with optional padding).
Definition: atomic.h:102
opal_convertor_t::pBaseBuf
unsigned char * pBaseBuf
initial buffer as supplied by the user
Definition: opal_convertor.h:101
opal_list_item_t
Definition: opal_list.h:98
opal_class_t
Class descriptor.
Definition: opal_object.h:152
ompi_communicator_t::c_topo
const struct mca_topo_base_module_1_0_0_t * c_topo
structure of function pointers
Definition: communicator.h:152
opal_convertor_t::pDesc
const opal_datatype_t * pDesc
the datatype description associated with the convertor
Definition: opal_convertor.h:96
request.h
Top-level description of requests.
ddt_elem_desc::count
uint32_t count
number of blocks
Definition: opal_datatype_internal.h:159
ompi_datatype_t::super
opal_datatype_t super
Base opal_datatype_t superclass.
Definition: ompi_datatype.h:69
ompi_file_t
Back-end structure for MPI_File.
Definition: file.h:42
opal_datatype_t::align
uint32_t align
data should be aligned to
Definition: opal_datatype.h:115
ompi_datatype_t::d_keyhash
struct opal_hash_table_t * d_keyhash
Attribute fields.
Definition: ompi_datatype.h:74
opal_datatype_t::size
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
ompi_datatype_t::packed_description
void * packed_description
Packed description of the datatype.
Definition: ompi_datatype.h:77
ompi_group_t
Group structure Currently we have four formats for storing the process pointers that are members of t...
Definition: group.h:79
ompi_datatype_t::name
char name[MPI_MAX_OBJECT_NAME]
Externally visible name.
Definition: ompi_datatype.h:79
opal_object_t
Base object.
Definition: opal_object.h:182
opal_convertor_t
Definition: opal_convertor.h:90
dt_type_desc_t::used
opal_datatype_count_t used
the number of used elements in the description array
Definition: opal_datatype.h:94
opal_convertor_t::use_desc
const dt_type_desc_t * use_desc
the version used by the convertor (normal or optimized)
Definition: opal_convertor.h:97
opal_list_t
Definition: opal_list.h:147
mca_topo_base_module_1_0_0_t
Definition: topo.h:255
ompi_communicator_t::c_topo_module
struct mca_topo_base_module_comm_t * c_topo_module
module specific data
Definition: communicator.h:158
ddt_elem_id_description::flags
uint16_t flags
flags for the record
Definition: opal_datatype_internal.h:149
ompi_status_public_t
Definition: mpi.h:337
ompi_datatype_t::d_f_to_c_index
int32_t d_f_to_c_index
Fortran index for this datatype.
Definition: ompi_datatype.h:73
opal_convertor_t::local_size
size_t local_size
overall length data on local machine, compared to bConverted
Definition: opal_convertor.h:94
opal_datatype_t::btypes
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
ompi_datatype_t::id
int32_t id
OMPI-layers unique id of the type.
Definition: ompi_datatype.h:72
group.h
Infrastructure for MPI group support.
opal_datatype_t::true_ub
OPAL_PTRDIFF_TYPE true_ub
the true ub of the data without user defined lb and ub
Definition: opal_datatype.h:111
request
Definition: evdns.c:158
opal_convertor_t::count
opal_datatype_count_t count
the total number of full datatype elements
Definition: opal_convertor.h:98
opal_datatype_t::opt_desc
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
opal_convertor_t::flags
uint32_t flags
the properties of this convertor
Definition: opal_convertor.h:93
opal_datatype_t::nbElems
uint32_t nbElems
total number of elements inside the datatype
Definition: opal_datatype.h:116
ompi_communicator_t
Definition: communicator.h:118
ompi_request_t
Main top-level request struct definition.
Definition: request.h:100
ompi_communicator_t::c_keyhash
struct opal_hash_table_t * c_keyhash
inscribing cube dimension
Definition: communicator.h:144
opal_datatype_t::true_lb
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
ompi_errhandler_type_t
Enum used to describe what kind MPI object an error handler is used for.
Definition: errhandler.h:84
opal_object_t::obj_class
opal_class_t * obj_class
class descriptor
Definition: opal_object.h:188
ddt_elem_desc::disp
OPAL_PTRDIFF_TYPE disp
displacement of the first block
Definition: opal_datatype_internal.h:162