2005-03-14 23:57:21 +03:00
/*
2005-11-05 22:57:48 +03:00
* Copyright ( c ) 2004 - 2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation . All rights reserved .
* Copyright ( c ) 2004 - 2005 The University of Tennessee and The University
* of Tennessee Research Foundation . All rights
* reserved .
2005-03-14 23:57:21 +03:00
* Copyright ( c ) 2004 - 2005 High Performance Computing Center Stuttgart ,
* University of Stuttgart . All rights reserved .
2005-03-24 15:43:37 +03:00
* Copyright ( c ) 2004 - 2005 The Regents of the University of California .
* All rights reserved .
2006-07-05 00:12:35 +04:00
* Copyright ( c ) 2006 Cisco Systems , Inc . All rights reserved .
2005-03-14 23:57:21 +03:00
* $ COPYRIGHT $
*
* Additional copyrights may follow
*
* $ HEADER $
*/
# include "orte_config.h"
2006-02-12 04:33:29 +03:00
# include "orte/orte_constants.h"
2005-03-14 23:57:21 +03:00
2006-02-12 04:33:29 +03:00
# include "opal/mca/mca.h"
# include "opal/mca/base/base.h"
# include "opal/mca/base/mca_base_param.h"
2005-07-04 03:31:27 +04:00
# include "opal/util/output.h"
2005-03-14 23:57:21 +03:00
2006-10-03 21:40:00 +04:00
# include "orte/dss/dss.h"
# include "orte/mca/errmgr/errmgr.h"
2006-09-15 01:29:51 +04:00
# include "orte/mca/rmaps/base/rmaps_private.h"
2006-02-12 04:33:29 +03:00
# include "orte/mca/rmaps/base/base.h"
2005-03-14 23:57:21 +03:00
/*
* The following file was created by configure . It contains extern
* statements and the definition of an array of pointers to each
* component ' s public mca_base_component_t struct .
*/
2005-07-04 22:24:58 +04:00
# include "orte/mca/rmaps/base/static-components.h"
2005-03-14 23:57:21 +03:00
/*
2006-09-15 01:29:51 +04:00
* Global variables
2005-03-14 23:57:21 +03:00
*/
2006-09-15 01:29:51 +04:00
orte_rmaps_base_t orte_rmaps_base ;
2005-03-14 23:57:21 +03:00
/*
2006-09-15 01:29:51 +04:00
* Declare the RMAPS module to hold the API function pointers
2005-03-14 23:57:21 +03:00
*/
2006-09-15 01:29:51 +04:00
orte_rmaps_base_module_t orte_rmaps = {
orte_rmaps_base_map ,
orte_rmaps_base_finalize
} ;
2005-03-14 23:57:21 +03:00
2006-09-15 01:29:51 +04:00
orte_rmaps_base_module_t orte_rmaps_no_op = {
orte_rmaps_base_map_no_op ,
orte_rmaps_base_finalize
} ;
2005-03-14 23:57:21 +03:00
/**
* Function for finding and opening either all MCA components , or the one
* that was specifically requested via a MCA parameter .
*/
int orte_rmaps_base_open ( void )
{
2006-10-03 21:40:00 +04:00
int param , rc , value ;
2006-09-15 01:29:51 +04:00
char * policy , * requested ;
2006-10-03 21:40:00 +04:00
orte_data_type_t tmp ;
2005-03-14 23:57:21 +03:00
/* Debugging / verbose output */
2006-07-05 00:12:35 +04:00
param = mca_base_param_reg_int_name ( " rmaps " , " base_verbose " ,
2005-08-15 22:25:35 +04:00
" Verbosity level for the rmaps framework " ,
false , false , 0 , & value ) ;
2005-03-14 23:57:21 +03:00
if ( value ! = 0 ) {
2005-07-04 03:31:27 +04:00
orte_rmaps_base . rmaps_output = opal_output_open ( NULL ) ;
2005-03-14 23:57:21 +03:00
} else {
orte_rmaps_base . rmaps_output = - 1 ;
}
2005-10-08 02:24:52 +04:00
/* Are we scheduling by node or by slot? */
2006-07-05 00:12:35 +04:00
param = mca_base_param_reg_string_name ( " rmaps " , " base_schedule_policy " ,
2005-10-08 02:24:52 +04:00
" Scheduling Policy for RMAPS. [slot | node] " ,
false , false , " slot " , & policy ) ;
if ( 0 = = strcmp ( policy , " node " ) ) {
mca_base_param_set_string ( param , " node " ) ;
}
2006-07-05 00:12:35 +04:00
/* Should we schedule on the local node or not? */
mca_base_param_reg_int_name ( " rmaps " , " base_schedule_local " ,
" If nonzero, allow scheduling MPI applications on the same node as mpirun (default). If zero, do not schedule any MPI applications on the same node as mpirun " ,
false , false , 1 , & value ) ;
2006-07-10 18:10:21 +04:00
/* Should we oversubscribe or not? */
mca_base_param_reg_int_name ( " rmaps " , " base_no_oversubscribe " ,
" If nonzero, then do not allow oversubscription of nodes - mpirun will return an error if there aren't enough nodes to launch all processes without oversubscribing " ,
false , false , 0 , & value ) ;
2006-07-11 01:25:33 +04:00
if ( ( int ) false = = value ) {
orte_rmaps_base . oversubscribe = true ; /** default condition that allows oversubscription */
2006-07-10 18:10:21 +04:00
} else {
orte_rmaps_base . oversubscribe = false ;
}
2006-10-03 21:40:00 +04:00
/** register the base system types with the DSS */
tmp = ORTE_JOB_MAP ;
if ( ORTE_SUCCESS ! = ( rc = orte_dss . register_type ( orte_rmaps_base_pack_map ,
orte_rmaps_base_unpack_map ,
( orte_dss_copy_fn_t ) orte_rmaps_base_copy_map ,
( orte_dss_compare_fn_t ) orte_rmaps_base_compare_map ,
( orte_dss_size_fn_t ) orte_rmaps_base_size_map ,
( orte_dss_print_fn_t ) orte_rmaps_base_print_map ,
( orte_dss_release_fn_t ) orte_rmaps_base_std_obj_release ,
ORTE_DSS_STRUCTURED ,
" ORTE_JOB_MAP " , & tmp ) ) ) {
ORTE_ERROR_LOG ( rc ) ;
return rc ;
}
tmp = ORTE_MAPPED_PROC ;
if ( ORTE_SUCCESS ! = ( rc = orte_dss . register_type ( orte_rmaps_base_pack_mapped_proc ,
orte_rmaps_base_unpack_mapped_proc ,
( orte_dss_copy_fn_t ) orte_rmaps_base_copy_mapped_proc ,
( orte_dss_compare_fn_t ) orte_rmaps_base_compare_mapped_proc ,
( orte_dss_size_fn_t ) orte_rmaps_base_size_mapped_proc ,
( orte_dss_print_fn_t ) orte_rmaps_base_print_mapped_proc ,
( orte_dss_release_fn_t ) orte_rmaps_base_std_obj_release ,
ORTE_DSS_STRUCTURED ,
" ORTE_MAPPED_PROC " , & tmp ) ) ) {
ORTE_ERROR_LOG ( rc ) ;
return rc ;
}
tmp = ORTE_MAPPED_NODE ;
if ( ORTE_SUCCESS ! = ( rc = orte_dss . register_type ( orte_rmaps_base_pack_mapped_node ,
orte_rmaps_base_unpack_mapped_node ,
( orte_dss_copy_fn_t ) orte_rmaps_base_copy_mapped_node ,
( orte_dss_compare_fn_t ) orte_rmaps_base_compare_mapped_node ,
( orte_dss_size_fn_t ) orte_rmaps_base_size_mapped_node ,
( orte_dss_print_fn_t ) orte_rmaps_base_print_mapped_node ,
( orte_dss_release_fn_t ) orte_rmaps_base_std_obj_release ,
ORTE_DSS_STRUCTURED ,
" ORTE_MAPPED_NODE " , & tmp ) ) ) {
ORTE_ERROR_LOG ( rc ) ;
return rc ;
}
2006-07-10 18:10:21 +04:00
2006-09-15 01:29:51 +04:00
/* Some systems do not want any RMAPS support. In those cases,
* memory consumption is also an issue . For those systems , we
* avoid opening the RMAPS components by checking for a directive
* to use the " null " component .
*/
param = mca_base_param_reg_string_name ( " rmaps " , NULL , NULL ,
false , false , NULL , NULL ) ;
if ( ORTE_ERROR = = mca_base_param_lookup_string ( param , & requested ) ) {
return ORTE_ERROR ;
}
if ( NULL ! = requested & & 0 = = strcmp ( requested , " null " ) ) {
/* the user has specifically requested that we use the "null"
* component . In this case , that means we do NOT open any
* components , and we simply use the default module we have
* already defined above
*/
orte_rmaps_base . no_op_selected = true ;
orte_rmaps = orte_rmaps_no_op ; /* use the no_op module */
return ORTE_SUCCESS ;
}
orte_rmaps_base . no_op_selected = false ;
2005-03-14 23:57:21 +03:00
/* Open up all the components that we can find */
if ( ORTE_SUCCESS ! =
2005-08-15 22:25:35 +04:00
mca_base_components_open ( " rmaps " , orte_rmaps_base . rmaps_output ,
mca_rmaps_base_static_components ,
2005-04-13 07:19:48 +04:00
& orte_rmaps_base . rmaps_opened , true ) ) {
2005-03-14 23:57:21 +03:00
return ORTE_ERROR ;
}
/* All done */
return ORTE_SUCCESS ;
}