MPIU_Memcpy(mv2_iscatter_thresholds_table, mv2_tmp_iscatter_thresholds_table, mv2_size_iscatter_tuning_table * sizeof (mv2_iscatter_tuning_table)); } else {
/*RI*/ mv2_size_iscatter_tuning_table = 5; mv2_iscatter_thresholds_table = MPIU_Malloc(mv2_size_iscatter_tuning_table * sizeof (mv2_iscatter_tuning_table)); mv2_iscatter_tuning_table mv2_tmp_iscatter_thresholds_table[] = { {8, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {16, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {32, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {64, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {128, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} } };
MPIU_Memcpy(mv2_iscatter_thresholds_table, mv2_tmp_iscatter_thresholds_table, mv2_size_iscatter_tuning_table * sizeof (mv2_iscatter_tuning_table)); } #else /* defined(CHANNEL_MRAIL) && !defined(CHANNEL_PSM) */
/*RI*/ mv2_size_iscatter_tuning_table = 5; mv2_iscatter_thresholds_table = MPIU_Malloc(mv2_size_iscatter_tuning_table * sizeof (mv2_iscatter_tuning_table)); mv2_iscatter_tuning_table mv2_tmp_iscatter_thresholds_table[] = { {8, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {16, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {32, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {64, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} }, {128, 8192, 4, 4, {0}, 1, {{0, -1, &MPIR_Iscatter_binomial, -1}}, 1, {{0, -1, NULL, -1}} } };
MPIU_Memcpy(mv2_iscatter_thresholds_table, mv2_tmp_iscatter_thresholds_table, mv2_size_iscatter_tuning_table * sizeof (mv2_iscatter_tuning_table)); #endif return MPI_SUCCESS; }
void MV2_cleanup_iscatter_tuning_table() { if (mv2_iscatter_thresholds_table != NULL) { MPIU_Free(mv2_iscatter_thresholds_table); }
}
/* Return the number of separator inside a string */ static int count_sep(char *string) { return *string == \0 ? 0 : (count_sep(string + 1) + (*string == ,)); }
int MV2_internode_Iscatter_is_define(char *mv2_user_iscatter_inter, char *mv2_user_iscatter_intra) {
int i; int nb_element = count_sep(mv2_user_iscatter_inter) + 1;
/* If one iscatter tuning table is already defined */ if (mv2_iscatter_thresholds_table != NULL) { MPIU_Free(mv2_iscatter_thresholds_table); }
mv2_iscatter_tuning_table mv2_tmp_iscatter_thresholds_table[1]; mv2_size_iscatter_tuning_table = 1;
/* We realloc the space for the new iscatter tuning table */ mv2_iscatter_thresholds_table = MPIU_Malloc(mv2_size_iscatter_tuning_table * sizeof (mv2_iscatter_tuning_table));
if (nb_element == 1) { //consider removing some fields underneath mv2_tmp_iscatter_thresholds_table[0].numproc = 1; mv2_tmp_iscatter_thresholds_table[0].iscatter_segment_size = iscatter_segment_size; mv2_tmp_iscatter_thresholds_table[0].inter_node_knomial_factor = mv2_inter_node_knomial_factor; mv2_tmp_iscatter_thresholds_table[0].intra_node_knomial_factor = mv2_intra_node_knomial_factor; mv2_tmp_iscatter_thresholds_table[0].is_two_level_iscatter[0] = 1; mv2_tmp_iscatter_thresholds_table[0].size_inter_table = 1; mv2_tmp_iscatter_thresholds_table[0].inter_leader[0].min = 0; mv2_tmp_iscatter_thresholds_table[0].inter_leader[0].max = -1; mv2_tmp_iscatter_thresholds_table[0].intra_node[0].min = 0; mv2_tmp_iscatter_thresholds_table[0].intra_node[0].max = -1; switch (atoi(mv2_user_iscatter_inter)) {
if (!(dup = MPIU_Strdup(mv2_user_iscatter_inter))) { fprintf(stderr, "failed to duplicate %s\n", mv2_user_iscatter_inter); return MPI_ERR_INTERN; }
if (regcomp(&preg, regexp, REG_EXTENDED)) { fprintf(stderr, "failed to compile regexp %s\n", mv2_user_iscatter_inter); MPIU_Free(dup); return MPI_ERR_INTERN; }
mv2_tmp_iscatter_thresholds_table[0].numproc = 1;
mv2_tmp_iscatter_thresholds_table[0].iscatter_segment_size = iscatter_segment_size;
mv2_tmp_iscatter_thresholds_table[0].inter_node_knomial_factor = mv2_inter_node_knomial_factor;
mv2_tmp_iscatter_thresholds_table[0].intra_node_knomial_factor = mv2_intra_node_knomial_factor;
mv2_tmp_iscatter_thresholds_table[0].size_inter_table = nb_element;
i = 0;
for (p = strtok_r(dup, ",", &save_p); p; p = strtok_r(NULL, ",", &save_p)) {
if (regexec(&preg, p, NMATCH, match, 0)) {
fprintf(stderr, "failed to match on %s\n", p);
regfree(&preg);
MPIU_Free(dup);
return 2;
}
/* given () start at 1 */
switch (atoi(p + match[1].rm_so)) {
case 1
mv2_tmp_iscatter_thresholds_table[0].inter_leader[0].MV2_pt_Iscatter_function =
&MPIR_Iscatter_binomial;
mv2_tmp_iscatter_thresholds_table[0].is_two_level_iscatter[0] = 0;
break;
default
mv2_tmp_iscatter_thresholds_table[0].inter_leader[0].MV2_pt_Iscatter_function =
&MPIR_Iscatter_binomial;
mv2_tmp_iscatter_thresholds_table[0].is_two_level_iscatter[0] = 0;
break;
}
mv2_tmp_iscatter_thresholds_table[0].inter_leader[i].min = atoi(p +
match[2].rm_so);
if (p[match[3].rm_so] == +) {
mv2_tmp_iscatter_thresholds_table[0].inter_leader[i].max = -1;
} else {
mv2_tmp_iscatter_thresholds_table[0].inter_leader[i].max =
atoi(p + match[3].rm_so);
}
i++; } MPIU_Free(dup); regfree(&preg); } mv2_tmp_iscatter_thresholds_table[0].size_intra_table = 1; if (mv2_user_iscatter_intra == NULL) { mv2_tmp_iscatter_thresholds_table[0].intra_node[0].MV2_pt_Iscatter_function = NULL; } else { mv2_tmp_iscatter_thresholds_table[0].intra_node[0].MV2_pt_Iscatter_function = NULL; } MPIU_Memcpy(mv2_iscatter_thresholds_table, mv2_tmp_iscatter_thresholds_table, sizeof (mv2_iscatter_tuning_table)); return MPI_SUCCESS; }
int MV2_intranode_Iscatter_is_define(char *mv2_user_iscatter_intra) {
int i, j; for (i = 0; i < mv2_size_iscatter_tuning_table; i++) { for (j = 0; j < mv2_iscatter_thresholds_table[i].size_intra_table; j++) { mv2_iscatter_thresholds_table[i].intra_node[j].MV2_pt_Iscatter_function = NULL; } } return MPI_SUCCESS; }