This source file includes following definitions.
- ompi_group_calc_strided
- ompi_group_translate_ranks_strided
- ompi_group_translate_ranks_strided_reverse
- check_stride
- ompi_group_incl_strided
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include "ompi_config.h"
25 #include "ompi/group/group.h"
26 #include "ompi/constants.h"
27 #include "mpi.h"
28
29 static int check_stride(const int[],int);
30
31 int ompi_group_calc_strided ( int n , const int *ranks ) {
32 if(-1 == check_stride(ranks,n)) {
33 return -1;
34 }
35 else {
36 return (sizeof(int)*3);
37 }
38 }
39
40
41 int ompi_group_translate_ranks_strided (ompi_group_t *parent_group,
42 int n_ranks, const int *ranks1,
43 ompi_group_t *child_group,
44 int *ranks2)
45 {
46 int s,o,l,i;
47 s = child_group->sparse_data.grp_strided.grp_strided_stride;
48 o = child_group->sparse_data.grp_strided.grp_strided_offset;
49 l = child_group->sparse_data.grp_strided.grp_strided_last_element;
50 for (i = 0; i < n_ranks; i++) {
51 if ( MPI_PROC_NULL == ranks1[i]) {
52 ranks2[i] = MPI_PROC_NULL;
53 }
54 else {
55 ranks2[i] = MPI_UNDEFINED;
56
57 if ( (ranks1[i]-o) >= 0 && (ranks1[i]-o)%s == 0 && ranks1[i] <= l) {
58 ranks2[i] = (ranks1[i] - o)/s;
59 }
60 }
61 }
62 return OMPI_SUCCESS;
63 }
64
65
66 int ompi_group_translate_ranks_strided_reverse (ompi_group_t *child_group,
67 int n_ranks, const int *ranks1,
68 ompi_group_t *parent_group,
69 int *ranks2)
70 {
71 int s,o,i;
72 s = child_group->sparse_data.grp_strided.grp_strided_stride;
73 o = child_group->sparse_data.grp_strided.grp_strided_offset;
74 for (i = 0; i < n_ranks; i++) {
75 if ( MPI_PROC_NULL == ranks1[i]) {
76 ranks2[i] = MPI_PROC_NULL;
77 }
78 else {
79 ranks2[i] =s*ranks1[i] + o;
80 }
81 }
82 return OMPI_SUCCESS;
83 }
84
85 static int check_stride(const int incl[],int incllen) {
86 int s,i;
87 if (incllen > 1) {
88 s = incl[1] - incl[0];
89 }
90 else {
91 s = 1;
92 }
93 if( s < 0 ) {
94 return -1;
95 }
96 for(i=0 ; i < incllen-1 ; i++) {
97 if(incl[i+1] - incl[i] != s) {
98 return -1;
99 }
100 }
101 return s;
102 }
103
104 int ompi_group_incl_strided(ompi_group_t* group, int n, const int *ranks,
105 ompi_group_t **new_group)
106 {
107
108 int my_group_rank,stride;
109 ompi_group_t *group_pointer, *new_group_pointer;
110
111 group_pointer = (ompi_group_t *)group;
112
113 if ( 0 == n ) {
114 *new_group = MPI_GROUP_EMPTY;
115 OBJ_RETAIN(MPI_GROUP_EMPTY);
116 return OMPI_SUCCESS;
117 }
118
119 stride = check_stride(ranks,n);
120 new_group_pointer = ompi_group_allocate_strided();
121 if( NULL == new_group_pointer ) {
122 return MPI_ERR_GROUP;
123 }
124 new_group_pointer -> grp_parent_group_ptr = group_pointer;
125
126 OBJ_RETAIN(new_group_pointer -> grp_parent_group_ptr);
127 ompi_group_increment_proc_count(new_group_pointer -> grp_parent_group_ptr);
128
129 new_group_pointer -> sparse_data.grp_strided.grp_strided_stride = stride;
130 new_group_pointer -> sparse_data.grp_strided.grp_strided_offset = ranks[0];
131 new_group_pointer -> sparse_data.grp_strided.grp_strided_last_element = ranks[n-1];
132 new_group_pointer -> grp_proc_count = n;
133
134 ompi_group_increment_proc_count(new_group_pointer);
135 my_group_rank = group_pointer->grp_my_rank;
136 ompi_group_translate_ranks (new_group_pointer->grp_parent_group_ptr,1,&my_group_rank,
137 new_group_pointer,&new_group_pointer->grp_my_rank);
138
139 *new_group = (MPI_Group)new_group_pointer;
140
141 return OMPI_SUCCESS;
142 }