diff --git a/ompi/mca/hook/comm_method/hook_comm_method_component.c b/ompi/mca/hook/comm_method/hook_comm_method_component.c index 025439b6045..3e5faa37408 100644 --- a/ompi/mca/hook/comm_method/hook_comm_method_component.c +++ b/ompi/mca/hook/comm_method/hook_comm_method_component.c @@ -66,14 +66,33 @@ const ompi_hook_base_component_1_0_0_t mca_hook_comm_method_component = { .hookm_mpi_finalize_bottom = NULL, }; +enum mca_hook_comm_method_mode_flags_t { + /* Default: Display nothing */ + OMPI_HOOK_COMM_METHOD_NONE = 0x01, + /* Display on MPI_INIT */ + OMPI_HOOK_COMM_METHOD_INIT = 0x02, + /* Display on MPI_FINALIZE */ + OMPI_HOOK_COMM_METHOD_FINALIZE = 0x04, +}; + int mca_hook_comm_method_verbose = 0; int mca_hook_comm_method_output = -1; bool mca_hook_comm_method_enable_mpi_init = false; bool mca_hook_comm_method_enable_mpi_finalize = false; +uint32_t mca_hook_comm_method_enabled_flags = OMPI_HOOK_COMM_METHOD_NONE; int mca_hook_comm_method_max = 12; int mca_hook_comm_method_brief = 0; char *mca_hook_comm_method_fakefile = NULL; +static mca_base_var_enum_value_flag_t mca_hook_comm_method_modes[] = { + {.flag = OMPI_HOOK_COMM_METHOD_NONE, .string = "none", + .conflicting_flag = OMPI_HOOK_COMM_METHOD_INIT | OMPI_HOOK_COMM_METHOD_FINALIZE}, + {.flag = OMPI_HOOK_COMM_METHOD_INIT, .string = "mpi_init"}, + {.flag = OMPI_HOOK_COMM_METHOD_FINALIZE, .string = "mpi_finalize"}, + {0, NULL, 0} +}; + + static int ompi_hook_comm_method_component_open(void) { // Nothing to do @@ -88,6 +107,8 @@ static int ompi_hook_comm_method_component_close(void) static int ompi_hook_comm_method_component_register(void) { + int ret; + mca_base_var_enum_flag_t *mca_hook_comm_method_flags = NULL; /* * Component verbosity level @@ -111,53 +132,43 @@ static int ompi_hook_comm_method_component_register(void) opal_output_set_verbosity(mca_hook_comm_method_output, mca_hook_comm_method_verbose); /* - * If the component is active for mpi_init / mpi_finalize + * If the component is active for mpi_init / mpi_finalize via 'ompi_comm_method' */ mca_hook_comm_method_enable_mpi_init = false; - (void) mca_base_component_var_register(&mca_hook_comm_method_component.hookm_version, "enable_mpi_init", - "Enable comm_method behavior on mpi_init", - MCA_BASE_VAR_TYPE_BOOL, NULL, - 0, 0, - OPAL_INFO_LVL_3, - MCA_BASE_VAR_SCOPE_READONLY, - &mca_hook_comm_method_enable_mpi_init); - mca_hook_comm_method_enable_mpi_finalize = false; - (void) mca_base_component_var_register(&mca_hook_comm_method_component.hookm_version, "enable_mpi_finalize", - "Enable comm_method behavior on mpi_finalize", - MCA_BASE_VAR_TYPE_BOOL, NULL, - 0, 0, - OPAL_INFO_LVL_3, - MCA_BASE_VAR_SCOPE_READONLY, - &mca_hook_comm_method_enable_mpi_finalize); - - // User can set the comm_method mca variable too - int hook_comm_method = -1; - (void) mca_base_var_register("ompi", NULL, NULL, "comm_method", - "Enable comm_method behavior (1) mpi_init or (2) mpi_finalize", - MCA_BASE_VAR_TYPE_INT, NULL, - 0, 0, - OPAL_INFO_LVL_3, - MCA_BASE_VAR_SCOPE_READONLY, - &hook_comm_method); - - if( 1 == hook_comm_method ) { - mca_hook_comm_method_enable_mpi_init = true; + mca_base_var_enum_create_flag("ompi_comm_method", mca_hook_comm_method_modes, &mca_hook_comm_method_flags); + + ret = mca_base_var_register("ompi", "ompi", NULL, "comm_method", + "Enable the communication protocol report: when MPI_INIT is invoked (using the 'mpi_init' value) and/or when MPI_FINALIZE is invoked (using the 'mpi_finalize' value).", + MCA_BASE_VAR_TYPE_UNSIGNED_INT, + &mca_hook_comm_method_flags->super, + 0, 0, + OPAL_INFO_LVL_3, + MCA_BASE_VAR_SCOPE_READONLY, + &mca_hook_comm_method_enabled_flags); + OBJ_RELEASE(mca_hook_comm_method_flags); + if(OPAL_ERR_VALUE_OUT_OF_BOUNDS == ret) { + opal_output(0, "hook:comm_method: Warning invalid comm_method specified."); } - else if( 2 == hook_comm_method ) { - mca_hook_comm_method_enable_mpi_finalize = true; + else { + if( mca_hook_comm_method_enabled_flags & OMPI_HOOK_COMM_METHOD_INIT ) { + mca_hook_comm_method_enable_mpi_init = true; + } + if( mca_hook_comm_method_enabled_flags & OMPI_HOOK_COMM_METHOD_FINALIZE ) { + mca_hook_comm_method_enable_mpi_finalize = true; + } } - // comm_method_max - (void) mca_base_var_register("ompi", NULL, NULL, "comm_method_max", + // hook_comm_method_max + (void) mca_base_component_var_register(&mca_hook_comm_method_component.hookm_version, "max", "Number of hosts for which to print unabbreviated 2d table of comm methods.", MCA_BASE_VAR_TYPE_INT, NULL, 0, 0, OPAL_INFO_LVL_3, MCA_BASE_VAR_SCOPE_READONLY, &mca_hook_comm_method_max); - // comm_method_brief - (void) mca_base_var_register("ompi", NULL, NULL, "comm_method_brief", + // hook_comm_method_brief + (void) mca_base_component_var_register(&mca_hook_comm_method_component.hookm_version, "brief", "Only print the comm method summary, skip the 2d table.", MCA_BASE_VAR_TYPE_INT, NULL, 0, 0, @@ -165,9 +176,9 @@ static int ompi_hook_comm_method_component_register(void) MCA_BASE_VAR_SCOPE_READONLY, &mca_hook_comm_method_brief); - // comm_method_fakefile is just for debugging, allows complete override of all the + // hook_comm_method_fakefile is just for debugging, allows complete override of all the // comm method in the table - (void) mca_base_var_register("ompi", NULL, NULL, "comm_method_fakefile", + (void) mca_base_component_var_register(&mca_hook_comm_method_component.hookm_version, "fakefile", "For debugging only: read comm methods from a file", MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0,