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
bosilca
bwbarre
jsquyres

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

@ -199,7 +199,11 @@ int mca_btl_sm_add_procs_same_base_addr(
/* lookup shared memory pool */
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);
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 */
if (NULL == mca_btl_sm_component.sm_mpool) {

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

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

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

@ -13,6 +13,9 @@
*
* $HEADER$
*/
/**
* @file
*/
#ifndef MCA_COLL_SM_EXPORT_H
#define MCA_COLL_SM_EXPORT_H
@ -20,8 +23,9 @@
#include "ompi_config.h"
#include "mpi.h"
#include "mca/mca.h"
#include "mca/coll/coll.h"
#include "opal/mca/mca.h"
#include "ompi/mca/coll/coll.h"
#include "ompi/mca/mpool/mpool.h"
#if defined(c_plusplus) || defined(__cplusplus)
extern "C" {
@ -29,14 +33,33 @@ extern "C" {
#define PUB(foo) mca_coll_sm##foo
/* 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. */
/**
* Structure to hold the sm coll component. First it holds the
* base coll component, and then holds a bunch of
* sm-coll-component-specific stuff (e.g., current MCA param
* values).
*/
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 {
/* JMS fill in here */
@ -45,12 +68,10 @@ extern "C" {
} mca_coll_base_module_comm_t;
/*
* Globally exported variables
/**
* Global component instance
*/
extern const mca_coll_base_component_1_0_0_t mca_coll_sm_component;
extern int mca_coll_sm_param_priority;
extern mca_coll_sm_component_t mca_coll_sm_component;
/*
@ -157,7 +178,3 @@ extern "C" {
#endif
#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_close(void);
/*
@ -46,43 +47,56 @@ static int sm_open(void);
* 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
about the component itself */
/* First, fill in the super (mca_coll_base_component_1_0_0_t) */
{
/* Indicate that we are a coll v1.0.0 component (which also
implies a specific MCA version) */
/* First, the mca_component_t struct containing meta
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",
OMPI_MAJOR_VERSION,
OMPI_MINOR_VERSION,
OMPI_RELEASE_VERSION,
"sm",
OMPI_MAJOR_VERSION,
OMPI_MINOR_VERSION,
OMPI_RELEASE_VERSION,
/* Component open and close functions */
/* Component open and close functions */
sm_open,
NULL
sm_open,
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 */
{
/* Whether the component is checkpointable or not */
/* priority */
75,
true
},
/* Initialization / querying functions */
mca_coll_sm_init_query,
mca_coll_sm_comm_query,
mca_coll_sm_comm_unquery,
/* mpool name and instance */
"sm",
NULL
};
@ -91,11 +105,33 @@ const mca_coll_base_component_1_0_0_t mca_coll_sm_component = {
*/
static int sm_open(void)
{
int p, ival;
char *sval;
/* If we want to be selected (i.e., all procs on one node), then
we should have a high priority */
mca_coll_sm_param_priority =
mca_base_param_register_int("coll", "sm", "priority", NULL, 75);
p = 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;
}

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

@ -19,9 +19,11 @@
#include <stdio.h>
#include "mpi.h"
#include "communicator/communicator.h"
#include "mca/coll/coll.h"
#include "mca/coll/base/base.h"
#include "ompi/communicator/communicator.h"
#include "ompi/mca/coll/coll.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"
@ -55,8 +57,6 @@ static const mca_coll_base_module_1_0_0_t module = {
NULL
};
int mca_coll_sm_param_priority = -1;
/*
* 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 */
if (OMPI_SUCCESS !=
mca_base_param_lookup_int(mca_coll_sm_param_priority,
priority)) {
return NULL;
}
*priority = mca_coll_sm_component.sm_priority;
/* We only want to run if all the processes in the communicator
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;
#endif
}
@ -154,5 +158,3 @@ int mca_coll_sm_module_finalize(struct ompi_communicator_t *comm)
return OMPI_SUCCESS;
}

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

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

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

@ -62,13 +62,14 @@ mca_mpool_base_module_t* mca_mpool_base_module_create(
(mca_base_component_list_item_t *) item;
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;
}
}
if(NULL == component)
if (NULL == component) {
return NULL;
}
module = component->mpool_init(resources);
sm = OBJ_NEW(mca_mpool_base_selected_module_t);
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);
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
bbarrett
bwbarre
jsquyres

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

@ -203,8 +203,12 @@ int mca_ptl_sm_add_procs_same_base_addr(
/* lookup shared memory pool */
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);
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 */
if (NULL == mca_ptl_sm_component.sm_mpool) {
return_code = OMPI_ERR_OUT_OF_RESOURCE;