1
1

- Add new mpool base function: lookup by module name. This allows

multiple components to share a single mpool module (e.g., the
  ptl/btl and coll sm components).
- Re-tool the ptl, btl, and coll sm components to first look for the
  target mpool module, and if they don't find it, to create it.
- coll sm component now correctly identifies when it is supposed to
  run or not (i.e., if all the processes in the communicator are on
  the same host).  Now we just need to fill in some algorithms.  :-)

This commit was SVN r6530.
Этот коммит содержится в:
Jeff Squyres 2005-07-15 20:01:35 +00:00
родитель cbb62f4ba3
Коммит f41e4149fa
10 изменённых файлов: 156 добавлений и 69 удалений

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

@ -3,3 +3,4 @@ twoodall
gshipman gshipman
bosilca bosilca
bwbarre bwbarre
jsquyres

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

@ -199,7 +199,11 @@ int mca_btl_sm_add_procs_same_base_addr(
/* lookup shared memory pool */ /* lookup shared memory pool */
if(NULL == mca_btl_sm_component.sm_mpool) { if(NULL == mca_btl_sm_component.sm_mpool) {
mca_btl_sm_component.sm_mpool = mca_btl_sm_component.sm_mpool =
mca_mpool_base_module_create(mca_btl_sm_component.sm_mpool_name,btl,NULL); mca_mpool_base_module_lookup(mca_btl_sm_component.sm_mpool_name);
if (NULL == mca_btl_sm_component.sm_mpool) {
mca_btl_sm_component.sm_mpool =
mca_mpool_base_module_create(mca_btl_sm_component.sm_mpool_name,btl,NULL);
}
/* Sanity check to ensure that we found it */ /* Sanity check to ensure that we found it */
if (NULL == mca_btl_sm_component.sm_mpool) { if (NULL == mca_btl_sm_component.sm_mpool) {

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

@ -1 +1,2 @@
jsquyres@mauve.lanl.gov jsquyres@mauve.lanl.gov
jsquyres

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

@ -13,6 +13,9 @@
* *
* $HEADER$ * $HEADER$
*/ */
/**
* @file
*/
#ifndef MCA_COLL_SM_EXPORT_H #ifndef MCA_COLL_SM_EXPORT_H
#define MCA_COLL_SM_EXPORT_H #define MCA_COLL_SM_EXPORT_H
@ -20,8 +23,9 @@
#include "ompi_config.h" #include "ompi_config.h"
#include "mpi.h" #include "mpi.h"
#include "mca/mca.h" #include "opal/mca/mca.h"
#include "mca/coll/coll.h" #include "ompi/mca/coll/coll.h"
#include "ompi/mca/mpool/mpool.h"
#if defined(c_plusplus) || defined(__cplusplus) #if defined(c_plusplus) || defined(__cplusplus)
extern "C" { extern "C" {
@ -29,14 +33,33 @@ extern "C" {
#define PUB(foo) mca_coll_sm##foo #define PUB(foo) mca_coll_sm##foo
/* Structure for sm collective module, per communicator. The /**
structure mainly stores memory pointers to the specific * Structure to hold the sm coll component. First it holds the
poritions in the shared memory area. Each shared memory area is * base coll component, and then holds a bunch of
reserved for special functions. The shared memory is split * sm-coll-component-specific stuff (e.g., current MCA param
between two types of areas. One is control section that stores * values).
shared flags used during synchronization, while other section */
is purely used to pass messages from one process to other. */ typedef struct mca_coll_sm_component_t {
/** Base coll component */
mca_coll_base_component_1_0_0_t super;
/** Priority of this component */
int sm_priority;
/** Name of the mpool that this component will look for */
char *sm_mpool_name;
/** Mpool that will be used */
mca_mpool_base_module_t *sm_mpool;
} mca_coll_sm_component_t;
/**
* Structure for sm collective module, per communicator. The
* structure mainly stores memory pointers to the specific
* poritions in the shared memory area. Each shared memory area is
* reserved for special functions. The shared memory is split
* between two types of areas. One is control section that stores
* shared flags used during synchronization, while other section
* is purely used to pass messages from one process to other.
*/
typedef struct mca_coll_base_module_comm_t { typedef struct mca_coll_base_module_comm_t {
/* JMS fill in here */ /* JMS fill in here */
@ -45,12 +68,10 @@ extern "C" {
} mca_coll_base_module_comm_t; } mca_coll_base_module_comm_t;
/* /**
* Globally exported variables * Global component instance
*/ */
extern mca_coll_sm_component_t mca_coll_sm_component;
extern const mca_coll_base_component_1_0_0_t mca_coll_sm_component;
extern int mca_coll_sm_param_priority;
/* /*
@ -157,7 +178,3 @@ extern "C" {
#endif #endif
#endif /* MCA_COLL_SM_EXPORT_H */ #endif /* MCA_COLL_SM_EXPORT_H */

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

@ -39,6 +39,7 @@ const char *mca_coll_sm_component_version_string =
*/ */
static int sm_open(void); static int sm_open(void);
static int sm_close(void);
/* /*
@ -46,43 +47,56 @@ static int sm_open(void);
* and pointers to our public functions in it * and pointers to our public functions in it
*/ */
const mca_coll_base_component_1_0_0_t mca_coll_sm_component = { mca_coll_sm_component_t mca_coll_sm_component = {
/* First, the mca_component_t struct containing meta information /* First, fill in the super (mca_coll_base_component_1_0_0_t) */
about the component itself */
{ {
/* Indicate that we are a coll v1.0.0 component (which also /* First, the mca_component_t struct containing meta
implies a specific MCA version) */ information about the component itself */
{
/* Indicate that we are a coll v1.0.0 component (which
also implies a specific MCA version) */
MCA_COLL_BASE_VERSION_1_0_0, MCA_COLL_BASE_VERSION_1_0_0,
/* Component name and version */ /* Component name and version */
"sm", "sm",
OMPI_MAJOR_VERSION, OMPI_MAJOR_VERSION,
OMPI_MINOR_VERSION, OMPI_MINOR_VERSION,
OMPI_RELEASE_VERSION, OMPI_RELEASE_VERSION,
/* Component open and close functions */ /* Component open and close functions */
sm_open, sm_open,
NULL sm_close,
},
/* Next the MCA v1.0.0 component meta data */
{
/* Whether the component is checkpointable or not */
true
},
/* Initialization / querying functions */
mca_coll_sm_init_query,
mca_coll_sm_comm_query,
mca_coll_sm_comm_unquery,
}, },
/* Next the MCA v1.0.0 component meta data */ /* sm-component specifc information */
{ /* priority */
/* Whether the component is checkpointable or not */ 75,
true /* mpool name and instance */
}, "sm",
NULL
/* Initialization / querying functions */
mca_coll_sm_init_query,
mca_coll_sm_comm_query,
mca_coll_sm_comm_unquery,
}; };
@ -91,11 +105,33 @@ const mca_coll_base_component_1_0_0_t mca_coll_sm_component = {
*/ */
static int sm_open(void) static int sm_open(void)
{ {
int p, ival;
char *sval;
/* If we want to be selected (i.e., all procs on one node), then /* If we want to be selected (i.e., all procs on one node), then
we should have a high priority */ we should have a high priority */
mca_coll_sm_param_priority = p = mca_base_param_register_int("coll", "sm", "priority", NULL, 75);
mca_base_param_register_int("coll", "sm", "priority", NULL, 75); mca_base_param_lookup_int(p, &ival);
mca_coll_sm_component.sm_priority = ival;
p = mca_base_param_register_string("coll", "sm", "mpool", NULL, "sm");
mca_base_param_lookup_string(p, &sval);
mca_coll_sm_component.sm_mpool_name = sval;
return OMPI_SUCCESS;
}
/*
* Close the component
*/
static int sm_close(void)
{
if (NULL != mca_coll_sm_component.sm_mpool_name) {
free(mca_coll_sm_component.sm_mpool_name);
mca_coll_sm_component.sm_mpool_name = NULL;
}
return OMPI_SUCCESS; return OMPI_SUCCESS;
} }

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

@ -19,9 +19,11 @@
#include <stdio.h> #include <stdio.h>
#include "mpi.h" #include "mpi.h"
#include "communicator/communicator.h" #include "ompi/communicator/communicator.h"
#include "mca/coll/coll.h" #include "ompi/mca/coll/coll.h"
#include "mca/coll/base/base.h" #include "ompi/mca/coll/base/base.h"
#include "ompi/mca/mpool/mpool.h"
#include "ompi/mca/mpool/base/base.h"
#include "coll_sm.h" #include "coll_sm.h"
@ -55,8 +57,6 @@ static const mca_coll_base_module_1_0_0_t module = {
NULL NULL
}; };
int mca_coll_sm_param_priority = -1;
/* /*
* Initial query function that is invoked during MPI_INIT, allowing * Initial query function that is invoked during MPI_INIT, allowing
@ -92,11 +92,7 @@ mca_coll_sm_comm_query(struct ompi_communicator_t *comm, int *priority,
/* Get our priority */ /* Get our priority */
if (OMPI_SUCCESS != *priority = mca_coll_sm_component.sm_priority;
mca_base_param_lookup_int(mca_coll_sm_param_priority,
priority)) {
return NULL;
}
/* We only want to run if all the processes in the communicator /* We only want to run if all the processes in the communicator
are on the same node */ are on the same node */
@ -108,15 +104,23 @@ mca_coll_sm_comm_query(struct ompi_communicator_t *comm, int *priority,
} }
} }
/* Can we get an mpool allocation? */ /* Can we get an mpool allocation? See if there was one created
already. If not, try to make one. */
/* JMS ... */ mca_coll_sm_component.sm_mpool =
mca_mpool_base_module_lookup(mca_coll_sm_component.sm_mpool_name);
if (NULL == mca_coll_sm_component.sm_mpool) {
mca_coll_sm_component.sm_mpool =
mca_mpool_base_module_create(mca_coll_sm_component.sm_mpool_name,
NULL, NULL);
if (NULL == mca_coll_sm_component.sm_mpool) {
return NULL;
}
}
/* All is good -- return a module */
#if 1
return NULL;
#else
return &module; return &module;
#endif
} }
@ -154,5 +158,3 @@ int mca_coll_sm_module_finalize(struct ompi_communicator_t *comm)
return OMPI_SUCCESS; return OMPI_SUCCESS;
} }

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

@ -106,6 +106,7 @@ OMPI_DECLSPEC mca_mpool_base_module_t* mca_mpool_base_module_create(
const char* name, const char* name,
void* user_data, void* user_data,
struct mca_mpool_base_resources_t* mpool_resources); struct mca_mpool_base_resources_t* mpool_resources);
OMPI_DECLSPEC mca_mpool_base_module_t* mca_mpool_base_module_lookup(const char* name);
/* /*
* Globals * Globals

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

@ -62,13 +62,14 @@ mca_mpool_base_module_t* mca_mpool_base_module_create(
(mca_base_component_list_item_t *) item; (mca_base_component_list_item_t *) item;
component = component =
(mca_mpool_base_component_t *) cli->cli_component; (mca_mpool_base_component_t *) cli->cli_component;
if(strcmp(component->mpool_version.mca_component_name, name) == 0) { if(0 == strcmp(component->mpool_version.mca_component_name, name)) {
break; break;
} }
} }
if(NULL == component) if (NULL == component) {
return NULL; return NULL;
}
module = component->mpool_init(resources); module = component->mpool_init(resources);
sm = OBJ_NEW(mca_mpool_base_selected_module_t); sm = OBJ_NEW(mca_mpool_base_selected_module_t);
sm->mpool_component = component; sm->mpool_component = component;
@ -78,3 +79,22 @@ mca_mpool_base_module_t* mca_mpool_base_module_create(
opal_list_append(&mca_mpool_base_modules, (opal_list_item_t*) sm); opal_list_append(&mca_mpool_base_modules, (opal_list_item_t*) sm);
return module; return module;
} }
mca_mpool_base_module_t* mca_mpool_base_module_lookup(const char* name)
{
opal_list_item_t* item;
for (item = opal_list_get_first(&mca_mpool_base_modules);
item != opal_list_get_end(&mca_mpool_base_modules);
item = opal_list_get_next(item)) {
mca_mpool_base_selected_module_t *mli =
(mca_mpool_base_selected_module_t *) item;
if(0 == strcmp(mli->mpool_component->mpool_version.mca_component_name,
name)) {
return mli->mpool_module;
}
}
return NULL;
}

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

@ -5,3 +5,4 @@ bosilca
brbarret brbarret
bbarrett bbarrett
bwbarre bwbarre
jsquyres

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

@ -203,8 +203,12 @@ int mca_ptl_sm_add_procs_same_base_addr(
/* lookup shared memory pool */ /* lookup shared memory pool */
if(NULL == mca_ptl_sm_component.sm_mpool) { if(NULL == mca_ptl_sm_component.sm_mpool) {
mca_ptl_sm_component.sm_mpool = mca_ptl_sm_component.sm_mpool =
mca_mpool_base_module_create(mca_ptl_sm_component.sm_mpool_name,NULL,NULL); mca_mpool_base_module_lookup(mca_ptl_sm_component.sm_mpool_name);
if (NULL == mca_ptl_sm_component.sm_mpool) {
mca_ptl_sm_component.sm_mpool =
mca_mpool_base_module_create(mca_ptl_sm_component.sm_mpool_name,NULL,NULL);
}
/* Sanity check to ensure that we found it */ /* Sanity check to ensure that we found it */
if (NULL == mca_ptl_sm_component.sm_mpool) { if (NULL == mca_ptl_sm_component.sm_mpool) {
return_code = OMPI_ERR_OUT_OF_RESOURCE; return_code = OMPI_ERR_OUT_OF_RESOURCE;