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 }