1
1

Add a new framework for discovering local resource information such as cpu type/model, #cpus, available physical memory, etc. Two initial components (darwin and linux) are provided. This is needed to support bootstrap operations where daemons are started at node boot, and applications where initial knowledge of cpu identification is needed to guide framework component selection.

Add orte configuration option to control the use of the framework in the system. Although the code will build, it will not be active unless configured with --enable-bootstrap.

If bootstrap is enabled and the new opal_sysinfo framework can successfully determine the cpu model, pass that info to the application as an MCA param to support some work at Sun.

Also, have daemons report back the resources they find to guide process mapping in bootstrap operations (i.e., where the daemon starts at node boot as opposed to being launched at application start).

Adjust some platform files to enable these capabilities.

This commit was SVN r22244.
Этот коммит содержится в:
Ralph Castain 2009-11-30 23:11:25 +00:00
родитель fd39f466ce
Коммит a0d5c80ce0
39 изменённых файлов: 1531 добавлений и 2 удалений

Просмотреть файл

@ -1,4 +1,6 @@
enable_dlopen=no enable_dlopen=no
enable_multicast=yes
enable_bootstrap=yes
enable_mem_debug=no enable_mem_debug=no
enable_mem_profile=no enable_mem_profile=no
enable_memchecker=no enable_memchecker=no

Просмотреть файл

@ -1,4 +1,6 @@
enable_dlopen=no enable_dlopen=no
enable_multicast=yes
enable_bootstrap=yes
enable_mem_debug=no enable_mem_debug=no
enable_mem_profile=no enable_mem_profile=no
with_memory_manager=no with_memory_manager=no
@ -19,7 +21,6 @@ enable_cxx_exceptions=no
enable_ft_thread=no enable_ft_thread=no
enable_per_user_config_files=no enable_per_user_config_files=no
enable_script_wrapper_compilers=yes enable_script_wrapper_compilers=yes
enable_multicast=yes
enable_orterun_prefix_by_default=yes enable_orterun_prefix_by_default=yes
enable_io_romio=no enable_io_romio=no
#enable_mca_direct=ras-cm,rmaps-resilient,routed-cm #enable_mca_direct=ras-cm,rmaps-resilient,routed-cm

Просмотреть файл

@ -1,4 +1,6 @@
enable_dlopen=no enable_dlopen=no
enable_multicast=yes
enable_bootstrap=yes
enable_mem_debug=no enable_mem_debug=no
enable_mem_profile=no enable_mem_profile=no
enable_memchecker=no enable_memchecker=no

Просмотреть файл

@ -1,4 +1,5 @@
enable_multicast=yes enable_multicast=yes
enable_bootstrap=yes
with_memory_manager=no with_memory_manager=no
enable_mem_debug=yes enable_mem_debug=yes
enable_mem_profile=no enable_mem_profile=no

Просмотреть файл

@ -1,4 +1,5 @@
enable_multicast=yes enable_multicast=yes
enable_bootstrap=yes
with_memory_manager=no with_memory_manager=no
enable_mem_debug=no enable_mem_debug=no
enable_mem_profile=no enable_mem_profile=no

Просмотреть файл

@ -1,4 +1,5 @@
enable_multicast=yes enable_multicast=yes
enable_bootstrap=yes
with_memory_manager=no with_memory_manager=no
enable_mem_debug=yes enable_mem_debug=yes
enable_mem_profile=no enable_mem_profile=no

Просмотреть файл

@ -1,3 +1,5 @@
enable_multicast=yes
enable_bootstrap=yes
with_memory_manager=no with_memory_manager=no
enable_mem_debug=no enable_mem_debug=no
enable_mem_profile=no enable_mem_profile=no

34
opal/mca/sysinfo/Makefile.am Обычный файл
Просмотреть файл

@ -0,0 +1,34 @@
#
# Copyright (c) 2009 Cisco Systems, Inc
# All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# main library setup
noinst_LTLIBRARIES = libmca_sysinfo.la
libmca_sysinfo_la_SOURCES =
# header setup
nobase_opal_HEADERS =
# local files
headers = sysinfo.h \
sysinfo_types.h
libmca_sysinfo_la_SOURCES += $(headers)
# Conditionally install the header files
if WANT_INSTALL_HEADERS
nobase_opal_HEADERS += $(headers)
opaldir = $(includedir)/openmpi/opal/mca/sysinfo
else
opaldir = $(includedir)
endif
include base/Makefile.am
distclean-local:
rm -f base/static-components.h

17
opal/mca/sysinfo/base/Makefile.am Обычный файл
Просмотреть файл

@ -0,0 +1,17 @@
#
# Copyright (c) 2009 Cisco Systems, Inc.
# All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
headers += \
base/base.h
libmca_sysinfo_la_SOURCES += \
base/sysinfo_base_close.c \
base/sysinfo_base_select.c \
base/sysinfo_base_open.c

70
opal/mca/sysinfo/base/base.h Обычный файл
Просмотреть файл

@ -0,0 +1,70 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*
*/
#ifndef OPAL_SYSINFO_BASE_H
#define OPAL_SYSINFO_BASE_H
#include "opal_config.h"
#include "opal/mca/sysinfo/sysinfo.h"
/*
* Global functions for MCA overall sysinfo open and close
*/
BEGIN_C_DECLS
/**
* Initialize the sysinfo MCA framework
*
* @retval OPAL_SUCCESS Upon success
* @retval OPAL_ERROR Upon failure
*
* This must be the first function invoked in the sysinfo MCA
* framework. It initializes the sysinfo MCA framework, finds
* and opens sysinfo components, etc.
*
* This function is invoked during opal_init().
*/
OPAL_DECLSPEC int opal_sysinfo_base_open(void);
/**
* Close the sysinfo MCA framework
*
* @retval OPAL_SUCCESS Upon success
* @retval OPAL_ERROR Upon failure
*
* This must be the last function invoked in the sysinfo MCA
* framework.
*
* This function is invoked during opal_finalize().
*/
OPAL_DECLSPEC int opal_sysinfo_base_close(void);
/**
* Select all available components.
*
* @return OPAL_SUCCESS Upon success.
* @return OPAL_ERROR Upon other failure.
*
* At the end of this process, we'll have a list of all available
* components. If the list is empty, that is okay too. All
* available components will have their init function called.
*/
OPAL_DECLSPEC int opal_sysinfo_base_select(void);
OPAL_DECLSPEC extern int opal_sysinfo_base_output;
OPAL_DECLSPEC extern opal_list_t opal_sysinfo_base_components_opened;
OPAL_DECLSPEC extern opal_list_t opal_sysinfo_avail_modules;
END_C_DECLS
#endif /* OPAL_SYSINFO_BASE_H */

43
opal/mca/sysinfo/base/sysinfo_base_close.c Обычный файл
Просмотреть файл

@ -0,0 +1,43 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/constants.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"
#include "opal/mca/sysinfo/sysinfo.h"
#include "opal/mca/sysinfo/base/base.h"
int opal_sysinfo_base_close(void)
{
opal_list_item_t *item;
opal_sysinfo_module_t *mod;
/* call the finalize of all available modules */
while (NULL != (item = opal_list_remove_first(&opal_sysinfo_avail_modules))) {
mod = (opal_sysinfo_module_t*)item;
if (NULL != mod->module->finalize) {
mod->module->finalize();
}
}
OBJ_DESTRUCT(&opal_sysinfo_avail_modules);
/* Close all components that are still open (this should only
happen during ompi_info). */
mca_base_components_close(opal_sysinfo_base_output,
&opal_sysinfo_base_components_opened, NULL);
OBJ_DESTRUCT(&opal_sysinfo_base_components_opened);
/* All done */
return OPAL_SUCCESS;
}

110
opal/mca/sysinfo/base/sysinfo_base_open.c Обычный файл
Просмотреть файл

@ -0,0 +1,110 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/constants.h"
#include "opal/util/output.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"
#include "opal/mca/base/mca_base_param.h"
#include "opal/mca/sysinfo/sysinfo.h"
#include "opal/mca/sysinfo/base/base.h"
/*
* 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.
*/
#include "opal/mca/sysinfo/base/static-components.h"
/* unsupported functions */
static int opal_sysinfo_base_query(char **keys, opal_list_t *values);
/*
* Globals
*/
int opal_sysinfo_base_output = -1;
opal_list_t opal_sysinfo_base_components_opened;
opal_list_t opal_sysinfo_avail_modules;
opal_sysinfo_API_module_t opal_sysinfo = {
opal_sysinfo_base_query
};
/*
* Function for finding and opening either all MCA components, or the one
* that was specifically requested via a MCA parameter.
*/
int opal_sysinfo_base_open(void)
{
opal_sysinfo_base_output = opal_output_open(NULL);
/* init the list of available modules */
OBJ_CONSTRUCT(&opal_sysinfo_avail_modules, opal_list_t);
/* Open up all available components */
OBJ_CONSTRUCT( &opal_sysinfo_base_components_opened, opal_list_t );
if (OPAL_SUCCESS !=
mca_base_components_open("sysinfo", opal_sysinfo_base_output,
mca_sysinfo_base_static_components,
&opal_sysinfo_base_components_opened,
true)) {
return OPAL_ERROR;
}
/* All done */
return OPAL_SUCCESS;
}
static int opal_sysinfo_base_query(char **keys, opal_list_t *values)
{
opal_list_item_t *item;
opal_sysinfo_module_t *mod;
/* query all the available modules */
for (item = opal_list_get_first(&opal_sysinfo_avail_modules);
item != opal_list_get_end(&opal_sysinfo_avail_modules);
item = opal_list_get_next(item)) {
mod = (opal_sysinfo_module_t*)item;
if (NULL != mod->module->query) {
mod->module->query(keys, values);
}
}
return OPAL_SUCCESS;
}
/**** SETUP SYSINFO MODULE OBJECTS ****/
static void mod_constructor(opal_sysinfo_module_t *ptr)
{
ptr->module = NULL;
}
OBJ_CLASS_INSTANCE(opal_sysinfo_module_t,
opal_list_item_t,
mod_constructor, NULL);
static void val_constructor(opal_sysinfo_value_t *ptr)
{
ptr->key = NULL;
}
static void val_destructor(opal_sysinfo_value_t *ptr)
{
if (NULL != ptr->key) {
free(ptr->key);
}
}
OBJ_CLASS_INSTANCE(opal_sysinfo_value_t,
opal_list_item_t,
val_constructor, val_destructor);

67
opal/mca/sysinfo/base/sysinfo_base_select.c Обычный файл
Просмотреть файл

@ -0,0 +1,67 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/constants.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"
#include "opal/mca/base/mca_base_param.h"
#include "opal/mca/sysinfo/sysinfo.h"
#include "opal/mca/sysinfo/base/base.h"
/*
* Globals
*/
int opal_sysinfo_base_select(void)
{
int pri;
opal_sysinfo_module_t *module;
opal_sysinfo_base_module_t *sysmod;
mca_base_module_t *mod;
mca_base_component_list_item_t *cli;
mca_base_component_t *component;
opal_list_item_t *item;
/*
* Select all available components
*/
for (item = opal_list_get_first(&opal_sysinfo_base_components_opened);
item != opal_list_get_end(&opal_sysinfo_base_components_opened);
item = opal_list_get_next(item)) {
cli = (mca_base_component_list_item_t *) item;
component = (mca_base_component_t *) cli->cli_component;
if (NULL == component->mca_query_component) {
/* no way to get the module */
continue;
}
if (OPAL_SUCCESS != component->mca_query_component(&mod, &pri)) {
continue;
}
/* init the module */
sysmod = (opal_sysinfo_base_module_t*)mod;
if (NULL != sysmod->init) {
if (OPAL_SUCCESS != sysmod->init()) {
/* can't run */
continue;
}
}
module = OBJ_NEW(opal_sysinfo_module_t);
module->module = sysmod;
opal_list_append(&opal_sysinfo_avail_modules, &module->super);
}
return OPAL_SUCCESS;
}

13
opal/mca/sysinfo/configure.m4 Обычный файл
Просмотреть файл

@ -0,0 +1,13 @@
dnl -*- shell-script -*-
dnl
dnl Copyright (c) 2009 Cisco Systems, Inc
dnl All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
dnl
dnl $HEADER$
dnl
dnl we only want those at same priority
m4_define(MCA_sysinfo_CONFIGURE_MODE, STOP_AT_FIRST_PRIORITY)

35
opal/mca/sysinfo/darwin/Makefile.am Обычный файл
Просмотреть файл

@ -0,0 +1,35 @@
#
# Copyright (c) 20049 Cisco Systems, Inc.
# All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
sources = \
sysinfo_darwin.h \
sysinfo_darwin_component.c \
sysinfo_darwin_module.c
# Make the output library in this directory, and name it either
# mca_<type>_<name>.la (for DSO builds) or libmca_<type>_<name>.la
# (for static builds).
if OMPI_BUILD_sysinfo_darwin_DSO
component_noinst =
component_install = mca_sysinfo_darwin.la
else
component_noinst = libmca_sysinfo_darwin.la
component_install =
endif
mcacomponentdir = $(pkglibdir)
mcacomponent_LTLIBRARIES = $(component_install)
mca_sysinfo_darwin_la_SOURCES = $(sources)
mca_sysinfo_darwin_la_LDFLAGS = -module -avoid-version
noinst_LTLIBRARIES = $(component_noinst)
libmca_sysinfo_darwin_la_SOURCES =$(sources)
libmca_sysinfo_darwin_la_LDFLAGS = -module -avoid-version

22
opal/mca/sysinfo/darwin/configure.m4 Обычный файл
Просмотреть файл

@ -0,0 +1,22 @@
# -*- shell-script -*-
#
# Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# MCA_sysinfo_darwin_CONFIG([action-if-found], [action-if-not-found])
# -----------------------------------------------------------
AC_DEFUN([MCA_sysinfo_darwin_CONFIG],[
OMPI_VAR_SCOPE_PUSH([sysinfo_darwin_happy])
# check to see if we have <mach/mach_host.h>
# as this is a Darwin-specific thing
AC_CHECK_HEADER([mach/mach_host.h], [sysinfo_darwin_happy=yes], [sysinfo_darwin_happy=no])
AS_IF([test "$sysinfo_darwin_happy" = "yes"], [$1], [$2])
OMPI_VAR_SCOPE_POP
])dnl

17
opal/mca/sysinfo/darwin/configure.params Обычный файл
Просмотреть файл

@ -0,0 +1,17 @@
# -*- shell-script -*-
#
# Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
PARAM_CONFIG_FILES="Makefile"
#
# Set the config priority so that, if we can build,
# only this component will build
PARAM_CONFIG_PRIORITY=50

30
opal/mca/sysinfo/darwin/sysinfo_darwin.h Обычный файл
Просмотреть файл

@ -0,0 +1,30 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef MCA_SYSINFO_DARWIN_H
#define MCA_SYSINFO_DARWIN_H
#include "opal_config.h"
#include "opal/mca/mca.h"
#include "opal/mca/sysinfo/sysinfo.h"
BEGIN_C_DECLS
/*
* Globally exported variable
*/
OPAL_DECLSPEC extern const opal_sysinfo_base_component_t mca_sysinfo_darwin_component;
OPAL_DECLSPEC extern const opal_sysinfo_base_module_t opal_sysinfo_darwin_module;
END_C_DECLS
#endif /* MCA_SYSINFO_DARWIN_H */

Просмотреть файл

@ -0,0 +1,78 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*
* These symbols are in a file by themselves to provide nice linker
* semantics. Since linkers generally pull in symbols by object
* files, keeping these symbols as the only symbols in this file
* prevents utility programs such as "ompi_info" from having to import
* entire components just to query their version and parameters.
*/
#include "opal_config.h"
#include "opal/constants.h"
#include "opal/mca/sysinfo/sysinfo.h"
#include "sysinfo_darwin.h"
/*
* Public string showing the sysinfo ompi_darwin component version number
*/
const char *opal_sysinfo_darwin_component_version_string =
"OPAL darwin sysinfo MCA component version " OPAL_VERSION;
/*
* Local function
*/
static int sysinfo_darwin_component_query(mca_base_module_t **module, int *priority);
/*
* Instantiate the public struct with all of our public information
* and pointers to our public functions in it
*/
const opal_sysinfo_base_component_t mca_sysinfo_darwin_component = {
/* First, the mca_component_t struct containing meta information
about the component itself */
{
/* Indicate that we are a sysinfo v1.1.0 component (which also
implies a specific MCA version) */
OPAL_SYSINFO_BASE_VERSION_2_0_0,
/* Component name and version */
"darwin",
OPAL_MAJOR_VERSION,
OPAL_MINOR_VERSION,
OPAL_RELEASE_VERSION,
/* Component open and close functions */
NULL,
NULL,
sysinfo_darwin_component_query,
NULL
},
/* Next the MCA v1.0.0 component meta data */
{
/* The component is checkpoint ready */
MCA_BASE_METADATA_PARAM_CHECKPOINT
}
};
static int sysinfo_darwin_component_query(mca_base_module_t **module, int *priority)
{
*priority = 20;
*module = (mca_base_module_t *)&opal_sysinfo_darwin_module;
return OPAL_SUCCESS;
}

Просмотреть файл

@ -0,0 +1,120 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/constants.h"
/* This component will only be compiled on Mac OSX, where we are
guaranteed to have these headers */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdlib.h>
#include <sys/sysctl.h>
#include <assert.h>
#include <time.h>
#include <string.h>
#include "opal/mca/base/mca_base_param.h"
#include "opal/mca/sysinfo/sysinfo.h"
#include "opal/mca/sysinfo/base/base.h"
#include "sysinfo_darwin.h"
static int init(void);
static int query(char **keys, opal_list_t *values);
static int fini(void);
/*
* Darwin sysinfo module
*/
const opal_sysinfo_base_module_t opal_sysinfo_darwin_module = {
init,
query,
fini
};
static int init(void)
{
return OPAL_SUCCESS;
}
static int fini(void)
{
return OPAL_SUCCESS;
}
/* Mac OSX does things a little differently than Linux
* by providing process stats via an API. This means we
* don't have to parse files that could change!
*/
static int query(char **keys, opal_list_t *values)
{
int mib[2], i;
size_t len;
int64_t i64;
int iint;
opal_sysinfo_value_t *data;
char strval[128];
mib[0] = CTL_HW;
/* cycle through the requested keys */
for (i=0; NULL != keys[i]; i++) {
if (0 == strcmp(keys[i], OPAL_SYSINFO_CPU_TYPE)) {
mib[1] = HW_MACHINE;
len = 128;
sysctl(mib, 2, &strval, &len, NULL, 0);
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_CPU_TYPE);
data->type = OPAL_STRING;
data->data.str = strdup(strval);
opal_list_append(values, &data->super);
continue;
}
if (0 == strcmp(keys[i], OPAL_SYSINFO_CPU_MODEL)) {
mib[1] = HW_MODEL;
len = 128;
sysctl(mib, 2, &strval, &len, NULL, 0);
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_CPU_MODEL);
data->type = OPAL_STRING;
data->data.str = strdup(strval);
opal_list_append(values, &data->super);
continue;
}
if (0 == strcmp(keys[i], OPAL_SYSINFO_NUM_CPUS)) {
mib[1] = HW_NCPU;
len = sizeof(int);
sysctl(mib, 2, &iint, &len, NULL, 0);
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_NUM_CPUS);
data->type = OPAL_INT64;
data->data.i64 = (int64_t)iint;
opal_list_append(values, &data->super);
continue;
}
if (0 == strcmp(keys[i], OPAL_SYSINFO_MEM_SIZE)) {
mib[1] = HW_MEMSIZE;
len = sizeof(int64_t);
sysctl(mib, 2, &i64, &len, NULL, 0);
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_MEM_SIZE);
data->type = OPAL_INT64;
data->data.i64 = i64 / (1 << 20);
opal_list_append(values, &data->super);
continue;
}
}
return OPAL_SUCCESS;
}

35
opal/mca/sysinfo/linux/Makefile.am Обычный файл
Просмотреть файл

@ -0,0 +1,35 @@
#
# Copyright (c) 20049 Cisco Systems, Inc.
# All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
sources = \
sysinfo_linux.h \
sysinfo_linux_component.c \
sysinfo_linux_module.c
# Make the output library in this directory, and name it either
# mca_<type>_<name>.la (for DSO builds) or libmca_<type>_<name>.la
# (for static builds).
if OMPI_BUILD_sysinfo_linux_DSO
component_noinst =
component_install = mca_sysinfo_linux.la
else
component_noinst = libmca_sysinfo_linux.la
component_install =
endif
mcacomponentdir = $(pkglibdir)
mcacomponent_LTLIBRARIES = $(component_install)
mca_sysinfo_linux_la_SOURCES = $(sources)
mca_sysinfo_linux_la_LDFLAGS = -module -avoid-version
noinst_LTLIBRARIES = $(component_noinst)
libmca_sysinfo_linux_la_SOURCES =$(sources)
libmca_sysinfo_linux_la_LDFLAGS = -module -avoid-version

31
opal/mca/sysinfo/linux/configure.m4 Обычный файл
Просмотреть файл

@ -0,0 +1,31 @@
# -*- shell-script -*-
#
# Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
#
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
# MCA_sysinfo_linux_CONFIG(action-if-can-compile,
# [action-if-cant-compile])
# ------------------------------------------------
AC_DEFUN([MCA_sysinfo_linux_CONFIG],[
case "${host}" in
i?86-*|x86_64*|ia64-*|powerpc-*|powerpc64-*|sparc*-*)
AS_IF([test -r "/proc/cpuinfo"],
[sysinfo_linux_happy="yes"],
[sysinfo_linux_happy="no"])
;;
*)
sysinfo_linux_happy="no"
;;
esac
AS_IF([test "$sysinfo_linux_happy" = "yes"],
[$1],
[$2])
])

18
opal/mca/sysinfo/linux/configure.params Обычный файл
Просмотреть файл

@ -0,0 +1,18 @@
# -*- shell-script -*-
#
# Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
#
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
PARAM_CONFIG_FILES="Makefile"
#
# Set the config priority so that, if we can build,
# only this component will build
PARAM_CONFIG_PRIORITY=60

38
opal/mca/sysinfo/linux/sysinfo_linux.h Обычный файл
Просмотреть файл

@ -0,0 +1,38 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*
* System resource info for Posix systems.
*
*/
#ifndef MCA_SYSINFO_LINUX_H
#define MCA_SYSINFO_LINUX_H
#include "opal_config.h"
#include "opal/mca/mca.h"
#include "opal/mca/sysinfo/sysinfo.h"
BEGIN_C_DECLS
/**
* Globally exported variable
*/
OPAL_DECLSPEC extern const opal_sysinfo_base_component_t mca_sysinfo_linux_component;
OPAL_DECLSPEC extern const opal_sysinfo_base_module_t opal_sysinfo_linux_module;
END_C_DECLS
#endif /* MCA_SYSINFO_LINUX_H */

Просмотреть файл

@ -0,0 +1,73 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*
* These symbols are in a file by themselves to provide nice linker
* semantics. Since linkers generally pull in symbols by object
* files, keeping these symbols as the only symbols in this file
* prevents utility programs such as "ompi_info" from having to import
* entire components just to query their version and parameters.
*/
#include "opal_config.h"
#include "opal/constants.h"
#include "opal/mca/sysinfo/sysinfo.h"
#include "sysinfo_linux.h"
/*
* Public string showing the sysinfo ompi_linux component version number
*/
const char *opal_sysinfo_linux_component_version_string =
"OPAL linux sysinfo MCA component version " OPAL_VERSION;
/*
* Local function
*/
static int sysinfo_linux_component_query(mca_base_module_t **module, int *priority);
/*
* Instantiate the public struct with all of our public information
* and pointers to our public functions in it
*/
const opal_sysinfo_base_component_t mca_sysinfo_linux_component = {
/* First, the mca_component_t struct containing meta information
about the component itself */
{
OPAL_SYSINFO_BASE_VERSION_2_0_0,
/* Component name and version */
"linux",
OPAL_MAJOR_VERSION,
OPAL_MINOR_VERSION,
OPAL_RELEASE_VERSION,
/* Component open and close functions */
NULL,
NULL,
sysinfo_linux_component_query,
NULL,
},
{
/* The component is checkpoint ready */
MCA_BASE_METADATA_PARAM_CHECKPOINT
}
};
static int sysinfo_linux_component_query(mca_base_module_t **module, int *priority)
{
*priority = 20;
*module = (mca_base_module_t *)&opal_sysinfo_linux_module;
return OPAL_SUCCESS;
}

214
opal/mca/sysinfo/linux/sysinfo_linux_module.c Обычный файл
Просмотреть файл

@ -0,0 +1,214 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/constants.h"
/* This component will only be compiled on Linux, where we are
guaranteed to have <unistd.h> and friends */
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/param.h> /* for HZ to convert jiffies to actual time */
#include "opal/mca/base/mca_base_param.h"
#include "opal/dss/dss_types.h"
#include "opal/util/printf.h"
#include "sysinfo_linux.h"
/*
* Module functions
*/
static int linux_module_init(void);
static int query(char **keys, opal_list_t *values);
static int linux_module_fini(void);
/*
* Linux sysinfo module
*/
const opal_sysinfo_base_module_t opal_sysinfo_linux_module = {
linux_module_init,
query,
linux_module_fini
};
/* Local functions */
static char *local_getline(FILE *fp);
static char *local_stripper(char *data);
/* Local data */
static char *cpu_type=NULL;
static char *cpu_model=NULL;
static int num_cpus=0;
static int64_t mem_size=0;
static char input[256];
static int linux_module_init(void)
{
FILE *fp;
char *data, *value, *ptr;
/* see if we can open the cpuinfo file */
if (NULL == (fp = fopen("/proc/cpuinfo", "r"))) {
/* can't access this file - most likely, this means we
* aren't really on a supported system, or the proc no
* longer exists. Just return an error
*/
return OPAL_ERR_NOT_SUPPORTED;
}
/* read the file one line at a time */
while (NULL != (data = local_getline(fp))) {
if (NULL == (value = local_stripper(data))) {
/* cannot process */
continue;
}
if (NULL == cpu_type && 0 == strcmp(data, "vendor_id")) {
cpu_type = strdup(value);
continue;
}
if (NULL == cpu_model && 0 == strcmp(data, "model name")) {
cpu_model = strdup(value);
}
if (0 == strcmp(data, "processor")) {
/* increment the num_cpus */
++num_cpus;
}
}
fclose(fp);
/* see if we can open the meminfo file */
if (NULL == (fp = fopen("/proc/meminfo", "r"))) {
/* ignore this */
return OPAL_SUCCESS;
}
/* read the file one line at a time */
while (NULL != (data = local_getline(fp))) {
if (NULL == (value = local_stripper(data))) {
/* cannot process */
continue;
}
if (0 == strcmp(data, "MemTotal")) {
/* find units */
ptr = &value[strlen(value)-2];
value[strlen(value)-3] = '\0';
/* compute base value */
mem_size = strtol(value, NULL, 10);
/* get the unit multiplier */
if (0 == strcmp(ptr, "kB")) {
mem_size = mem_size / 1024;
}
continue;
}
}
fclose(fp);
return OPAL_SUCCESS;
}
static int linux_module_fini(void)
{
return OPAL_SUCCESS;
}
static int query(char **keys, opal_list_t *values)
{
int i;
opal_sysinfo_value_t *data;
/* cycle through the requested keys */
for (i=0; NULL != keys[i]; i++) {
if (0 == strcmp(keys[i], OPAL_SYSINFO_CPU_TYPE) &&
NULL != cpu_type) {
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_CPU_TYPE);
data->type = OPAL_STRING;
data->data.str = strdup(cpu_type);
opal_list_append(values, &data->super);
continue;
}
if (0 == strcmp(keys[i], OPAL_SYSINFO_CPU_MODEL) &&
NULL != cpu_model) {
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_CPU_MODEL);
data->type = OPAL_STRING;
data->data.str = strdup(cpu_model);
opal_list_append(values, &data->super);
continue;
}
if (0 == strcmp(keys[i], OPAL_SYSINFO_NUM_CPUS) &&
num_cpus > 0) {
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_NUM_CPUS);
data->type = OPAL_INT64;
data->data.i64 = (int64_t)num_cpus;
opal_list_append(values, &data->super);
continue;
}
if (0 == strcmp(keys[i], OPAL_SYSINFO_MEM_SIZE) &&
mem_size > 0) {
data = OBJ_NEW(opal_sysinfo_value_t);
data->key = strdup(OPAL_SYSINFO_MEM_SIZE);
data->type = OPAL_INT64;
data->data.i64 = mem_size;
opal_list_append(values, &data->super);
continue;
}
}
return OPAL_SUCCESS;
}
static char *local_getline(FILE *fp)
{
char *ret;
ret = fgets(input, 256, fp);
if (NULL != ret) {
input[strlen(input)-1] = '\0'; /* remove newline */
return input;
}
return NULL;
}
static char *local_stripper(char *data)
{
char *ptr, *end, *enddata;
int len = strlen(data);
/* find the colon */
if (NULL == (end = strchr(data, ':'))) {
return NULL;
}
ptr = end;
--end;
/* working backwards, look for first non-whitespace */
while (end != data && !isalnum(*end)) {
--end;
}
++end;
*end = '\0';
/* now look for value */
ptr++;
enddata = &(data[len-1]);
while (ptr != enddata && !isalnum(*ptr)) {
++ptr;
}
return ptr;
}

101
opal/mca/sysinfo/sysinfo.h Обычный файл
Просмотреть файл

@ -0,0 +1,101 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*
* system resource info framework component interface.
*
* Intent
*
* self-discovery of available local resources.
*
*/
#ifndef OPAL_MCA_SYSINFO_H
#define OPAL_MCA_SYSINFO_H
#include "opal_config.h"
#include "opal/mca/mca.h"
#include "opal/mca/base/base.h"
#include "opal/class/opal_list.h"
#include "opal/mca/sysinfo/sysinfo_types.h"
BEGIN_C_DECLS
/**
* Module initialization function. Should return OPAL_SUCCESS.
*/
typedef int (*opal_sysinfo_base_module_init_fn_t)(void);
typedef int (*opal_sysinfo_base_module_query_fn_t)(char **keys, opal_list_t *values);
typedef int (*opal_sysinfo_base_module_fini_fn_t)(void);
/* Public API module */
struct opal_sysinfo_API_module_1_0_0_t {
opal_sysinfo_base_module_query_fn_t query;
};
typedef struct opal_sysinfo_API_module_1_0_0_t opal_sysinfo_API_module_t;
/**
* Structure for sysinfo components.
*/
struct opal_sysinfo_base_component_2_0_0_t {
/** MCA base component */
mca_base_component_t base_version;
/** MCA base data */
mca_base_component_data_t base_data;
};
/**
* Convenience typedef
*/
typedef struct opal_sysinfo_base_component_2_0_0_t opal_sysinfo_base_component_2_0_0_t;
typedef struct opal_sysinfo_base_component_2_0_0_t opal_sysinfo_base_component_t;
/**
* Structure for sysinfo modules
*/
struct opal_sysinfo_base_module_1_0_0_t {
opal_sysinfo_base_module_init_fn_t init;
opal_sysinfo_base_module_query_fn_t query;
opal_sysinfo_base_module_fini_fn_t finalize;
};
/**
* Convenience typedef
*/
typedef struct opal_sysinfo_base_module_1_0_0_t opal_sysinfo_base_module_1_0_0_t;
typedef struct opal_sysinfo_base_module_1_0_0_t opal_sysinfo_base_module_t;
typedef struct {
opal_list_item_t super;
opal_sysinfo_base_module_t *module;
} opal_sysinfo_module_t;
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_sysinfo_module_t);
/**
* Macro for use in components that are of type sysinfo
*/
#define OPAL_SYSINFO_BASE_VERSION_2_0_0 \
MCA_BASE_VERSION_2_0_0, \
"sysinfo", 2, 0, 0
/* Global structure for accessing sysinfo functions */
OPAL_DECLSPEC extern opal_sysinfo_API_module_t opal_sysinfo;
END_C_DECLS
#endif /* OPAL_MCA_SYSINFO_H */

50
opal/mca/sysinfo/sysinfo_types.h Обычный файл
Просмотреть файл

@ -0,0 +1,50 @@
/*
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
*
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
/**
* @file
*
* Resource flags
*
* Intent
*
* self-discovery of available local resources.
*
*/
#ifndef OPAL_MCA_SYSINFO_TYPE_H
#define OPAL_MCA_SYSINFO_TYPE_H
#include "opal_config.h"
#include "opal/class/opal_list.h"
#include "opal/dss/dss_types.h"
BEGIN_C_DECLS
#define OPAL_SYSINFO_CPU_TYPE "CPU_TYPE"
#define OPAL_SYSINFO_CPU_MODEL "CPU_MODEL"
#define OPAL_SYSINFO_NUM_CPUS "NUM_CPUS"
#define OPAL_SYSINFO_MEM_SIZE "MEMORY"
typedef struct {
opal_list_item_t super;
char *key;
opal_data_type_t type;
union {
int64_t i64;
char *str;
} data;
} opal_sysinfo_value_t;
OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_sysinfo_value_t);
END_C_DECLS
#endif /* OPAL_MCA_SYSINFO_TYPE_H */

Просмотреть файл

@ -95,5 +95,23 @@ fi
AC_DEFINE_UNQUOTED([ORTE_ENABLE_MULTICAST], [$orte_want_multicast], AC_DEFINE_UNQUOTED([ORTE_ENABLE_MULTICAST], [$orte_want_multicast],
[Enable reliable multicast messaging]) [Enable reliable multicast messaging])
#
# Do we want bootstrap of daemons enabled?
#
AC_MSG_CHECKING([if want bootstrap])
AC_ARG_ENABLE([bootstrap],
[AC_HELP_STRING([--enable-bootstrap],
[Enable bootstrap of daemons at node startup (default: disabled)])])
if test "$enable_bootstrap" = "yes"; then
AC_MSG_RESULT([yes])
orte_want_bootstrap=1
else
AC_MSG_RESULT([no])
orte_want_bootstrap=0
fi
AC_DEFINE_UNQUOTED([ORTE_ENABLE_BOOTSTRAP], [$orte_want_bootstrap],
[Enable bootstrap of daemons at node startup])
])dnl ])dnl

Просмотреть файл

@ -36,6 +36,9 @@
#include "opal/runtime/opal_cr.h" #include "opal/runtime/opal_cr.h"
#include "opal/mca/pstat/base/base.h" #include "opal/mca/pstat/base/base.h"
#include "opal/mca/paffinity/base/base.h" #include "opal/mca/paffinity/base/base.h"
#if ORTE_ENABLE_BOOTSTRAP
#include "opal/mca/sysinfo/base/base.h"
#endif
#include "orte/mca/rml/base/base.h" #include "orte/mca/rml/base/base.h"
#include "orte/mca/routed/base/base.h" #include "orte/mca/routed/base/base.h"
@ -115,6 +118,20 @@ int orte_ess_base_orted_setup(char **hosts)
goto error; goto error;
} }
#if ORTE_ENABLE_BOOTSTRAP
/* open and setup the local resource discovery framework */
if (ORTE_SUCCESS != (ret = opal_sysinfo_base_open())) {
ORTE_ERROR_LOG(ret);
error = "opal_sysinfo_base_open";
goto error;
}
if (ORTE_SUCCESS != (ret = opal_sysinfo_base_select())) {
ORTE_ERROR_LOG(ret);
error = "opal_sysinfo_base_select";
goto error;
}
#endif
/* some environments allow remote launches - e.g., ssh - so /* some environments allow remote launches - e.g., ssh - so
* open the PLM and select something -only- if we are given * open the PLM and select something -only- if we are given
* a specific module to use * a specific module to use
@ -440,5 +457,11 @@ int orte_ess_base_orted_finalize(void)
/* cleanup any lingering session directories */ /* cleanup any lingering session directories */
orte_session_dir_cleanup(ORTE_JOBID_WILDCARD); orte_session_dir_cleanup(ORTE_JOBID_WILDCARD);
/* handle the orted-specific OPAL stuff */
#if ORTE_ENABLE_BOOTSTRAP
opal_sysinfo_base_close();
#endif
opal_pstat_base_close();
return ORTE_SUCCESS; return ORTE_SUCCESS;
} }

Просмотреть файл

@ -27,6 +27,9 @@
#include "opal/util/argv.h" #include "opal/util/argv.h"
#include "opal/util/if.h" #include "opal/util/if.h"
#include "opal/mca/paffinity/paffinity.h" #include "opal/mca/paffinity/paffinity.h"
#if ORTE_ENABLE_BOOTSTRAP
#include "opal/mca/sysinfo/sysinfo.h"
#endif
#include "orte/mca/rmcast/base/base.h" #include "orte/mca/rmcast/base/base.h"
#include "orte/mca/errmgr/errmgr.h" #include "orte/mca/errmgr/errmgr.h"
@ -452,6 +455,48 @@ static int cm_set_name(void)
/* always include our node name */ /* always include our node name */
opal_dss.pack(&buf, &orte_process_info.nodename, 1, OPAL_STRING); opal_dss.pack(&buf, &orte_process_info.nodename, 1, OPAL_STRING);
#if ORTE_ENABLE_BOOTSTRAP
{
/* get our local resources */
char *keys[] = {
OPAL_SYSINFO_CPU_TYPE,
OPAL_SYSINFO_CPU_MODEL,
OPAL_SYSINFO_NUM_CPUS,
OPAL_SYSINFO_MEM_SIZE,
NULL
};
opal_list_t resources;
opal_list_item_t *item;
opal_sysinfo_value_t *info;
int32_t num_values;
if (ORTE_PROC_IS_DAEMON) {
OBJ_CONSTRUCT(&resources, opal_list_t);
opal_sysinfo.query(keys, &resources);
/* add number of values to the buffer */
num_values = opal_list_get_size(&resources);
opal_dss.pack(&buf, &num_values, 1, OPAL_INT32);
/* add them to the buffer */
while (NULL != (item = opal_list_remove_first(&resources))) {
info = (opal_sysinfo_value_t*)item;
opal_dss.pack(&buf, &info, 1, OPAL_STRING);
opal_dss.pack(&buf, &info->type, 1, OPAL_DATA_TYPE_T);
if (OPAL_INT64 == info->type) {
opal_dss.pack(&buf, &(info->data.i64), 1, OPAL_INT64);
} else if (OPAL_STRING == info->type) {
opal_dss.pack(&buf, &(info->data.str), 1, OPAL_STRING);
}
/* if this is the cpu model, save it for later use */
if (0 == strcmp(info->key, OPAL_SYSINFO_CPU_MODEL)) {
orte_local_cpu_model = strdup(info->data.str);
}
OBJ_RELEASE(info);
}
OBJ_DESTRUCT(&resources);
}
}
#endif
/* set the recv to get the answer */ /* set the recv to get the answer */
if (ORTE_SUCCESS != (rc = orte_rmcast.recv_buffer_nb(ORTE_RMCAST_SYS_CHANNEL, if (ORTE_SUCCESS != (rc = orte_rmcast.recv_buffer_nb(ORTE_RMCAST_SYS_CHANNEL,
ORTE_RMCAST_TAG_BOOTSTRAP, ORTE_RMCAST_TAG_BOOTSTRAP,

Просмотреть файл

@ -39,6 +39,9 @@
#include "opal/util/basename.h" #include "opal/util/basename.h"
#include "opal/mca/pstat/base/base.h" #include "opal/mca/pstat/base/base.h"
#include "opal/mca/paffinity/base/base.h" #include "opal/mca/paffinity/base/base.h"
#if ORTE_ENABLE_BOOTSTRAP
#include "opal/mca/sysinfo/base/base.h"
#endif
#include "orte/util/show_help.h" #include "orte/util/show_help.h"
#include "orte/mca/rml/base/base.h" #include "orte/mca/rml/base/base.h"
@ -165,6 +168,20 @@ static int rte_init(void)
goto error; goto error;
} }
#if ORTE_ENABLE_BOOTSTRAP
/* open and setup the local resource discovery framework */
if (ORTE_SUCCESS != (ret = opal_sysinfo_base_open())) {
ORTE_ERROR_LOG(ret);
error = "opal_sysinfo_base_open";
goto error;
}
if (ORTE_SUCCESS != (ret = opal_sysinfo_base_select())) {
ORTE_ERROR_LOG(ret);
error = "opal_sysinfo_base_select";
goto error;
}
#endif
/* Since we are the HNP, then responsibility for /* Since we are the HNP, then responsibility for
* defining the name falls to the PLM component for our * defining the name falls to the PLM component for our
* respective environment - hence, we have to open the PLM * respective environment - hence, we have to open the PLM
@ -405,6 +422,33 @@ static int rte_init(void)
node = OBJ_NEW(orte_node_t); node = OBJ_NEW(orte_node_t);
node->name = strdup(orte_process_info.nodename); node->name = strdup(orte_process_info.nodename);
node->index = opal_pointer_array_add(orte_node_pool, node); node->index = opal_pointer_array_add(orte_node_pool, node);
#if ORTE_ENABLE_BOOTSTRAP
{
/* get and store our local resources */
char *keys[] = {
OPAL_SYSINFO_CPU_TYPE,
OPAL_SYSINFO_CPU_MODEL,
OPAL_SYSINFO_NUM_CPUS,
OPAL_SYSINFO_MEM_SIZE,
NULL
};
opal_list_item_t *item;
opal_sysinfo_value_t *info;
opal_sysinfo.query(keys, &node->resources);
/* find our cpu model and save it for later */
for (item = opal_list_get_first(&node->resources);
item != opal_list_get_end(&node->resources);
item = opal_list_get_next(item)) {
info = (opal_sysinfo_value_t*)item;
if (0 == strcmp(info->key, OPAL_SYSINFO_CPU_MODEL)) {
orte_local_cpu_model = strdup(info->data.str);
break;
}
}
}
#endif
/* create and store a proc object for us */ /* create and store a proc object for us */
proc = OBJ_NEW(orte_proc_t); proc = OBJ_NEW(orte_proc_t);
@ -658,6 +702,12 @@ static int rte_finalize(void)
} }
} }
/* handle the orted-specific OPAL stuff */
#if ORTE_ENABLE_BOOTSTRAP
opal_sysinfo_base_close();
#endif
opal_pstat_base_close();
return ORTE_SUCCESS; return ORTE_SUCCESS;
} }

Просмотреть файл

@ -1096,6 +1096,16 @@ static int odls_base_default_setup_fork(orte_app_context_t *context,
free(param); free(param);
free(param2); free(param2);
/* pass a param telling the child what model of cpu we are on,
* if we know it
*/
if (NULL != orte_local_cpu_model) {
param = mca_base_param_environ_variable("cpu", NULL,"model");
/* do not overwrite what the user may have provided */
opal_setenv(param, orte_local_cpu_model, false, environ_copy);
free(param);
}
/* push data into environment - don't push any single proc /* push data into environment - don't push any single proc
* info, though. We are setting the environment up on a * info, though. We are setting the environment up on a
* per-context basis, and will add the individual proc * per-context basis, and will add the individual proc

Просмотреть файл

@ -58,6 +58,9 @@
#include "opal/mca/base/mca_base_param.h" #include "opal/mca/base/mca_base_param.h"
#include "opal/util/daemon_init.h" #include "opal/util/daemon_init.h"
#include "opal/dss/dss.h" #include "opal/dss/dss.h"
#if ORTE_ENABLE_BOOTSTRAP
#include "opal/mca/sysinfo/sysinfo.h"
#endif
#include "orte/constants.h" #include "orte/constants.h"
#include "orte/util/show_help.h" #include "orte/util/show_help.h"
@ -719,6 +722,52 @@ int orte_daemon(int argc, char *argv[])
goto DONE; goto DONE;
} }
} else if (orte_daemon_bootstrap) { } else if (orte_daemon_bootstrap) {
/* include our node name */
opal_dss.pack(buffer, &orte_process_info.nodename, 1, OPAL_STRING);
#if !ORTE_ENABLE_MULTICAST
/* if we have multicast, then this info was already sent */
#if ORTE_ENABLE_BOOTSTRAP
{
/* get our local resources */
char *keys[] = {
OPAL_SYSINFO_CPU_TYPE,
OPAL_SYSINFO_CPU_MODEL,
OPAL_SYSINFO_NUM_CPUS,
OPAL_SYSINFO_MEM_SIZE,
NULL
};
opal_list_t resources;
opal_list_item_t *item;
opal_sysinfo_value_t *info;
int32_t num_values;
OBJ_CONSTRUCT(&resources, opal_list_t);
opal_sysinfo.query(keys, &resources);
/* add number of values to the buffer */
num_values = opal_list_get_size(&resources);
opal_dss.pack(buffer, &num_values, 1, OPAL_INT32);
/* add them to the buffer */
while (NULL != (item = opal_list_remove_first(&resources))) {
info = (opal_sysinfo_value_t*)item;
opal_dss.pack(buffer, &info, 1, OPAL_STRING);
opal_dss.pack(buffer, &info->type, 1, OPAL_DATA_TYPE_T);
if (OPAL_INT64 == info->type) {
opal_dss.pack(buffer, &(info->data.i64), 1, OPAL_INT64);
} else if (OPAL_STRING == info->type) {
opal_dss.pack(buffer, &(info->data.str), 1, OPAL_STRING);
}
/* if this is the cpu model, save it for later use */
if (0 == strcmp(info->key, OPAL_SYSINFO_CPU_MODEL)) {
orte_local_cpu_model = strdup(info->data.str);
}
OBJ_RELEASE(info);
}
OBJ_DESTRUCT(&resources);
}
#endif
#endif
/* send to a different callback location as the /* send to a different callback location as the
* HNP didn't launch us and isn't waiting for a * HNP didn't launch us and isn't waiting for a
* callback * callback

Просмотреть файл

@ -22,6 +22,9 @@
#include <sys/types.h> #include <sys/types.h>
#include "opal/util/argv.h" #include "opal/util/argv.h"
#if ORTE_ENABLE_BOOTSTRAP
#include "opal/mca/sysinfo/sysinfo.h"
#endif
#include "orte/mca/errmgr/errmgr.h" #include "orte/mca/errmgr/errmgr.h"
#include "opal/dss/dss.h" #include "opal/dss/dss.h"
@ -393,6 +396,32 @@ int orte_dt_print_node(char **output, char *prefix, orte_node_t *src, opal_data_
free(tmp); free(tmp);
tmp = tmp2; tmp = tmp2;
#if ORTE_ENABLE_BOOTSTRAP
{
opal_list_item_t *item;
opal_sysinfo_value_t *info;
asprintf(&tmp2, "%s\n%s\tDetected Resources:", tmp, pfx2);
free(tmp);
tmp = tmp2;
for (item = opal_list_get_first(&src->resources);
item != opal_list_get_end(&src->resources);
item = opal_list_get_next(item)) {
info = (opal_sysinfo_value_t*)item;
if (OPAL_INT64 == info->type) {
asprintf(&tmp2, "%s\n%s\t\t%s: %ld", tmp, pfx2,
info->key, (long int)info->data.i64);
} else if (OPAL_STRING == info->type) {
asprintf(&tmp2, "%s\n%s\t\t%s: %s", tmp, pfx2,
info->key, info->data.str);
}
free(tmp);
tmp = tmp2;
}
}
#endif
asprintf(&tmp2, "%s\n%s\tNum procs: %ld\tNext node_rank: %ld", tmp, pfx2, asprintf(&tmp2, "%s\n%s\tNum procs: %ld\tNext node_rank: %ld", tmp, pfx2,
(long)src->num_procs, (long)src->next_node_rank); (long)src->num_procs, (long)src->next_node_rank);
free(tmp); free(tmp);

Просмотреть файл

@ -56,6 +56,7 @@ bool orte_leave_session_attached;
bool orte_do_not_launch = false; bool orte_do_not_launch = false;
bool orted_spin_flag = false; bool orted_spin_flag = false;
bool orte_daemon_bootstrap = false; bool orte_daemon_bootstrap = false;
char *orte_local_cpu_model = NULL;
/* ORTE OOB port flags */ /* ORTE OOB port flags */
bool orte_static_ports = false; bool orte_static_ports = false;
@ -708,11 +709,14 @@ static void orte_node_construct(orte_node_t* node)
} }
node->username = NULL; node->username = NULL;
OBJ_CONSTRUCT(&node->resources, opal_list_t);
} }
static void orte_node_destruct(orte_node_t* node) static void orte_node_destruct(orte_node_t* node)
{ {
int i; int i;
opal_list_item_t *item;
if (NULL != node->name) { if (NULL != node->name) {
free(node->name); free(node->name);
@ -747,6 +751,11 @@ static void orte_node_destruct(orte_node_t* node)
free(node->username); free(node->username);
node->username = NULL; node->username = NULL;
} }
while (NULL != (item = opal_list_remove_first(&node->resources))) {
OBJ_RELEASE(item);
}
OBJ_DESTRUCT(&node->resources);
} }

Просмотреть файл

@ -264,6 +264,8 @@ typedef struct {
char *cpu_set; char *cpu_set;
/** Username on this node, if specified */ /** Username on this node, if specified */
char *username; char *username;
/* list of known system resources for this node */
opal_list_t resources;
} orte_node_t; } orte_node_t;
ORTE_DECLSPEC OBJ_CLASS_DECLARATION(orte_node_t); ORTE_DECLSPEC OBJ_CLASS_DECLARATION(orte_node_t);
@ -524,6 +526,7 @@ ORTE_DECLSPEC extern bool orte_leave_session_attached;
ORTE_DECLSPEC extern bool orte_do_not_launch; ORTE_DECLSPEC extern bool orte_do_not_launch;
ORTE_DECLSPEC extern bool orted_spin_flag; ORTE_DECLSPEC extern bool orted_spin_flag;
ORTE_DECLSPEC extern bool orte_daemon_bootstrap; ORTE_DECLSPEC extern bool orte_daemon_bootstrap;
ORTE_DECLSPEC extern char *orte_local_cpu_model;
/* ORTE OOB port flags */ /* ORTE OOB port flags */
ORTE_DECLSPEC extern bool orte_static_ports; ORTE_DECLSPEC extern bool orte_static_ports;

Просмотреть файл

@ -1,4 +1,4 @@
PROGS = no_op sigusr_trap spin orte_nodename orte_spawn orte_loop_spawn orte_loop_child orte_abort get_limits orte_ring spawn_child orte_tool orte_no_op binom oob_stress iof_stress iof_delay radix orte_barrier orte_mcast opal_interface mcast mcast_recv orte_spin segfault PROGS = no_op sigusr_trap spin orte_nodename orte_spawn orte_loop_spawn orte_loop_child orte_abort get_limits orte_ring spawn_child orte_tool orte_no_op binom oob_stress iof_stress iof_delay radix orte_barrier orte_mcast opal_interface mcast mcast_recv orte_spin segfault sysinfo
all: $(PROGS) all: $(PROGS)

67
orte/test/system/sysinfo.c Обычный файл
Просмотреть файл

@ -0,0 +1,67 @@
/* -*- C -*-
*
* $HEADER$
*
* The most basic of applications
*/
#include <stdio.h>
#include "orte/constants.h"
#include <sys/sysctl.h>
#include "opal/mca/sysinfo/sysinfo.h"
#include "opal/mca/sysinfo/base/base.h"
#include "orte/runtime/runtime.h"
int main(int argc, char* argv[])
{
char *keys[] = {
OPAL_SYSINFO_CPU_TYPE,
OPAL_SYSINFO_CPU_MODEL,
OPAL_SYSINFO_NUM_CPUS,
OPAL_SYSINFO_MEM_SIZE,
NULL
};
opal_list_t values;
opal_sysinfo_value_t *info;
opal_list_item_t *item;
char *model;
if (ORTE_SUCCESS != orte_init(ORTE_PROC_NON_MPI)) {
fprintf(stderr, "Failed orte_init\n");
exit(1);
}
OBJ_CONSTRUCT(&values, opal_list_t);
opal_sysinfo_base_open();
opal_sysinfo_base_select();
opal_sysinfo.query(keys, &values);
while (NULL != (item = opal_list_remove_first(&values))) {
info = (opal_sysinfo_value_t*)item;
fprintf(stderr, "Key: %s Value: ", info->key);
if (OPAL_INT64 == info->type) {
fprintf(stderr, "%ld\n", (long int)info->data.i64);
} else if (OPAL_STRING == info->type) {
fprintf(stderr, "%s\n", info->data.str);
}
OBJ_RELEASE(info);
}
OBJ_DESTRUCT(&values);
opal_sysinfo_base_close();
model = getenv("OMPI_MCA_cpu_model");
fprintf(stderr, "Envar cpu_model: %s\n", (NULL == model) ? "NULL" : model);
if (ORTE_SUCCESS != orte_finalize()) {
fprintf(stderr, "Failed orte_finalize\n");
exit(1);
}
return 0;
}