+ smpi_bench_end(-1, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else {
+ for(i = 0; i < n; i++) {
+ index = smpi_group_index(group1, ranks1[i]);
+ ranks2[i] = smpi_group_rank(group2, index);
+ }
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_compare(MPI_Group group1, MPI_Group group2, int* result) {
+ int retval;
+
+ smpi_bench_end(-1, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(result == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ *result = smpi_group_compare(group1, group2);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_union(MPI_Group group1, MPI_Group group2, MPI_Group* newgroup) {
+ int retval, i, proc1, proc2, size, size2;
+
+ smpi_bench_end(-1, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ size = smpi_group_size(group1);
+ size2 = smpi_group_size(group2);
+ for(i = 0; i < size2; i++) {
+ proc2 = smpi_group_index(group2, i);
+ proc1 = smpi_group_rank(group1, proc2);
+ if(proc1 == MPI_UNDEFINED) {
+ size++;
+ }
+ }
+ if(size == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ *newgroup = smpi_group_new(size);
+ size2 = smpi_group_size(group1);
+ for(i = 0; i < size2; i++) {
+ proc1 = smpi_group_index(group1, i);
+ smpi_group_set_mapping(*newgroup, proc1, i);
+ }
+ for(i = size2; i < size; i++) {
+ proc2 = smpi_group_index(group2, i - size2);
+ smpi_group_set_mapping(*newgroup, proc2, i);
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_intersection(MPI_Group group1, MPI_Group group2, MPI_Group* newgroup) {
+ int retval, i, proc1, proc2, size, size2;
+
+ smpi_bench_end(-1, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ size = smpi_group_size(group1);
+ size2 = smpi_group_size(group2);
+ for(i = 0; i < size2; i++) {
+ proc2 = smpi_group_index(group2, i);
+ proc1 = smpi_group_rank(group1, proc2);
+ if(proc1 == MPI_UNDEFINED) {
+ size--;
+ }
+ }
+ if(size == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ *newgroup = smpi_group_new(size);
+ size2 = smpi_group_size(group1);
+ for(i = 0; i < size2; i++) {
+ proc1 = smpi_group_index(group1, i);
+ proc2 = smpi_group_rank(group2, proc1);
+ if(proc2 != MPI_UNDEFINED) {
+ smpi_group_set_mapping(*newgroup, proc1, i);
+ }
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group* newgroup) {
+ int retval, i, proc1, proc2, size, size2;
+
+ smpi_bench_end(-1, NULL);
+ if(group1 == MPI_GROUP_NULL || group2 == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ size = size2 = smpi_group_size(group1);
+ for(i = 0; i < size2; i++) {
+ proc1 = smpi_group_index(group1, i);
+ proc2 = smpi_group_rank(group2, proc1);
+ if(proc2 != MPI_UNDEFINED) {
+ size--;
+ }
+ }
+ if(size == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ *newgroup = smpi_group_new(size);
+ for(i = 0; i < size2; i++) {
+ proc1 = smpi_group_index(group1, i);
+ proc2 = smpi_group_rank(group2, proc1);
+ if(proc2 == MPI_UNDEFINED) {
+ smpi_group_set_mapping(*newgroup, proc1, i);
+ }
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_incl(MPI_Group group, int n, int* ranks, MPI_Group* newgroup) {
+ int retval, i, index;
+
+ smpi_bench_end(-1, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ if(n == 0) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else if(n == smpi_group_size(group)) {
+ *newgroup = group;
+ } else {
+ *newgroup = smpi_group_new(n);
+ for(i = 0; i < n; i++) {
+ index = smpi_group_index(group, ranks[i]);
+ smpi_group_set_mapping(*newgroup, index, i);
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}
+
+int MPI_Group_excl(MPI_Group group, int n, int* ranks, MPI_Group* newgroup) {
+ int retval, i, size, rank, index;
+
+ smpi_bench_end(-1, NULL);
+ if(group == MPI_GROUP_NULL) {
+ retval = MPI_ERR_GROUP;
+ } else if(newgroup == NULL) {
+ retval = MPI_ERR_ARG;
+ } else {
+ if(n == 0) {
+ *newgroup = group;
+ } else if(n == smpi_group_size(group)) {
+ *newgroup = MPI_GROUP_EMPTY;
+ } else {
+ size = smpi_group_size(group) - n;
+ *newgroup = smpi_group_new(size);
+ rank = 0;
+ while(rank < size) {
+ for(i = 0; i < n; i++) {
+ if(ranks[i] == rank) {
+ break;
+ }
+ }
+ if(i >= n) {
+ index = smpi_group_index(group, rank);
+ smpi_group_set_mapping(*newgroup, index, rank);
+ rank++;
+ }
+ }
+ }
+ smpi_group_use(*newgroup);
+ retval = MPI_SUCCESS;
+ }
+ smpi_bench_begin(-1, NULL);
+ return retval;
+}