This source file includes following definitions.
- ompi_datatype_create_vector
- ompi_datatype_create_hvector
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #include "ompi_config.h"
26
27 #include <stddef.h>
28
29 #include "ompi/datatype/ompi_datatype.h"
30
31 int32_t ompi_datatype_create_vector( int count, int bLength, int stride,
32 const ompi_datatype_t* oldType, ompi_datatype_t** newType )
33 {
34 ompi_datatype_t *pTempData, *pData;
35 ptrdiff_t extent = oldType->super.ub - oldType->super.lb;
36
37 if( (0 == count) || (0 == bLength) ) {
38 return ompi_datatype_duplicate( &ompi_mpi_datatype_null.dt, newType);
39 }
40
41 pData = ompi_datatype_create( oldType->super.desc.used + 2 );
42 if( (bLength == stride) || (1 >= count) ) {
43 ompi_datatype_add( pData, oldType, (size_t)count * bLength, 0, extent );
44 } else {
45 if( 1 == bLength ) {
46 ompi_datatype_add( pData, oldType, count, 0, extent * stride );
47 } else {
48 ompi_datatype_add( pData, oldType, bLength, 0, extent );
49 pTempData = pData;
50 pData = ompi_datatype_create( oldType->super.desc.used + 2 + 2 );
51 ompi_datatype_add( pData, pTempData, count, 0, extent * stride );
52 OBJ_RELEASE( pTempData );
53 }
54 }
55 *newType = pData;
56 return OMPI_SUCCESS;
57 }
58
59
60 int32_t ompi_datatype_create_hvector( int count, int bLength, ptrdiff_t stride,
61 const ompi_datatype_t* oldType, ompi_datatype_t** newType )
62 {
63 ompi_datatype_t *pTempData, *pData;
64 ptrdiff_t extent = oldType->super.ub - oldType->super.lb;
65
66 if( (0 == count) || (0 == bLength) ) {
67 return ompi_datatype_duplicate( &ompi_mpi_datatype_null.dt, newType);
68 }
69
70 pTempData = ompi_datatype_create( oldType->super.desc.used + 2 );
71 if( ((extent * bLength) == stride) || (1 >= count) ) {
72 pData = pTempData;
73 ompi_datatype_add( pData, oldType, count * bLength, 0, extent );
74 } else {
75 if( 1 == bLength ) {
76 pData = pTempData;
77 ompi_datatype_add( pData, oldType, count, 0, stride );
78 } else {
79 ompi_datatype_add( pTempData, oldType, bLength, 0, extent );
80 pData = ompi_datatype_create( oldType->super.desc.used + 2 + 2 );
81 ompi_datatype_add( pData, pTempData, count, 0, stride );
82 OBJ_RELEASE( pTempData );
83 }
84 }
85 *newType = pData;
86 return OMPI_SUCCESS;
87 }