Add an example on how to handle topologies.
This commit was SVN r32337.
Этот коммит содержится в:
родитель
d674e22433
Коммит
78eae6108a
0
ompi/mca/topo/example/.ompi_ignore
Обычный файл
0
ompi/mca/topo/example/.ompi_ignore
Обычный файл
54
ompi/mca/topo/example/Makefile.am
Обычный файл
54
ompi/mca/topo/example/Makefile.am
Обычный файл
@ -0,0 +1,54 @@
|
||||
#
|
||||
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
# University Research and Technology
|
||||
# Corporation. All rights reserved.
|
||||
# Copyright (c) 2004-2013 The University of Tennessee and The University
|
||||
# of Tennessee Research Foundation. All rights
|
||||
# reserved.
|
||||
# Copyright (c) 2004-2009 High Performance Computing Center Stuttgart,
|
||||
# University of Stuttgart. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
|
||||
# Copyright (c) 2012-2013 Inria. All rights reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
|
||||
EXTRA_DIST = .windows
|
||||
|
||||
sources = \
|
||||
topo_example.h \
|
||||
topo_example_cart_map.c \
|
||||
topo_example_graph_map.c \
|
||||
topo_example_module.c \
|
||||
topo_example_component.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 MCA_BUILD_ompi_topo_example_DSO
|
||||
lib =
|
||||
lib_sources =
|
||||
component = mca_topo_example.la
|
||||
component_sources = $(sources)
|
||||
else
|
||||
lib = libmca_topo_example.la
|
||||
lib_sources = $(sources)
|
||||
component =
|
||||
component_sources =
|
||||
endif
|
||||
|
||||
mcacomponentdir = $(pkglibdir)
|
||||
mcacomponent_LTLIBRARIES = $(component)
|
||||
mca_topo_example_la_SOURCES = $(component_sources)
|
||||
mca_topo_example_la_LDFLAGS = -module -avoid-version
|
||||
|
||||
noinst_LTLIBRARIES = $(lib)
|
||||
libmca_topo_example_la_SOURCES = $(lib_sources)
|
||||
libmca_topo_example_la_LDFLAGS = -module -avoid-version
|
||||
|
25
ompi/mca/topo/example/configure.params
Обычный файл
25
ompi/mca/topo/example/configure.params
Обычный файл
@ -0,0 +1,25 @@
|
||||
# -*- shell-script -*-
|
||||
#
|
||||
# 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.
|
||||
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
# University of Stuttgart. All rights reserved.
|
||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
# All rights reserved.
|
||||
# Copyright (c) 2007 Los Alamos National Security, LLC. All rights
|
||||
# reserved.
|
||||
# $COPYRIGHT$
|
||||
#
|
||||
# Additional copyrights may follow
|
||||
#
|
||||
# $HEADER$
|
||||
#
|
||||
|
||||
# Specific to this module
|
||||
|
||||
PARAM_CONFIG_FILES="Makefile"
|
||||
|
86
ompi/mca/topo/example/topo_example.h
Обычный файл
86
ompi/mca/topo/example/topo_example.h
Обычный файл
@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2013 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Inria. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#ifndef MCA_TOPO_UNTIY_H
|
||||
#define MCA_TOPO_UNTIY_H
|
||||
|
||||
#include "ompi_config.h"
|
||||
#include "ompi/mca/topo/topo.h"
|
||||
|
||||
/*
|
||||
* ******************************************************************
|
||||
* ******** functions which provide MCA interface comppliance *******
|
||||
* ******************************************************************
|
||||
* These functions are:
|
||||
* - mca_topo_example_module_open
|
||||
* - mca_topo_example_module_close
|
||||
* - mca_topo_example_module_query
|
||||
* - mca_topo_example_module_finalize
|
||||
* These functions are always found on the mca_topo_example_module
|
||||
* structure. They are the "meta" functions to ensure smooth op.
|
||||
* ******************************************************************
|
||||
*/
|
||||
BEGIN_C_DECLS
|
||||
|
||||
/*
|
||||
* Public component instance
|
||||
*/
|
||||
OMPI_MODULE_DECLSPEC extern mca_topo_base_component_2_1_0_t
|
||||
mca_topo_example_component;
|
||||
|
||||
/*
|
||||
* A unique module class for the module so that we can both cache
|
||||
* module-specific information on the module and have a
|
||||
* module-specific constructor and destructor.
|
||||
*/
|
||||
typedef struct {
|
||||
mca_topo_base_module_t super;
|
||||
|
||||
/* Modules can add their own information here */
|
||||
int example_module_specific_data;
|
||||
} mca_topo_example_module_t;
|
||||
|
||||
OBJ_CLASS_DECLARATION(mca_topo_example_module_t);
|
||||
|
||||
|
||||
/*
|
||||
* Module functions
|
||||
*/
|
||||
|
||||
int mca_topo_example_cart_map(struct ompi_communicator_t *comm,
|
||||
int ndims,
|
||||
int *dims,
|
||||
int *periods,
|
||||
int *newrank);
|
||||
|
||||
int mca_topo_example_graph_map(struct ompi_communicator_t *comm,
|
||||
int nnodes,
|
||||
int *index,
|
||||
int *edges,
|
||||
int *newrank);
|
||||
/*
|
||||
* ******************************************************************
|
||||
* ************ functions implemented in this module end ************
|
||||
* ******************************************************************
|
||||
*/
|
||||
|
||||
END_C_DECLS
|
||||
|
||||
#endif /* MCA_TOPO_EXAMPLE_H */
|
79
ompi/mca/topo/example/topo_example_cart_map.c
Обычный файл
79
ompi/mca/topo/example/topo_example_cart_map.c
Обычный файл
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2013 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Inria. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#include "ompi_config.h"
|
||||
#include "ompi/mca/topo/example/topo_example.h"
|
||||
|
||||
#include "ompi/communicator/communicator.h"
|
||||
|
||||
/*
|
||||
* function - mca_topo_example_cart_map
|
||||
*
|
||||
* @param comm input communicator (handle)
|
||||
* @param ndims number of dimensions of cartesian structure (integer)
|
||||
* @param dims integer array of size 'ndims' specifying the number of
|
||||
* processes in each coordinate direction
|
||||
* @param periods logical array of size 'ndims' specifying the
|
||||
* periodicity specification in each coordinate direction
|
||||
* @param newrank reordered rank of the calling process; 'MPI_UNDEFINED'
|
||||
* if calling process does not belong to grid (integer)
|
||||
*
|
||||
* @retval MPI_SUCCESS
|
||||
* @retval MPI_ERR_DIMS
|
||||
*/
|
||||
|
||||
int mca_topo_example_cart_map (ompi_communicator_t* comm,
|
||||
int ndims,
|
||||
int *dims,
|
||||
int *periods,
|
||||
int *newrank)
|
||||
{
|
||||
int nprocs;
|
||||
int rank;
|
||||
int size;
|
||||
int i;
|
||||
int *p;
|
||||
|
||||
/*
|
||||
* Compute the # of processes in the grid.
|
||||
*/
|
||||
nprocs = 1;
|
||||
for (i = 0, p = dims; i < ndims; ++i, ++p) {
|
||||
if (*p <= 0) {
|
||||
return MPI_ERR_DIMS;
|
||||
}
|
||||
nprocs *= *p;
|
||||
}
|
||||
/*
|
||||
* Check that number of processes <= size of communicator.
|
||||
*/
|
||||
size = ompi_comm_size(comm);
|
||||
if (nprocs > size) {
|
||||
return MPI_ERR_DIMS;
|
||||
}
|
||||
/*
|
||||
* Compute my new rank. To be slightly different than the "unity"
|
||||
* component, start with a rank that is size-my_initial_rank.
|
||||
*/
|
||||
rank = ompi_comm_size(comm) - 1 - ompi_comm_rank(comm);
|
||||
*newrank = ((rank < 0) || (rank >= nprocs)) ? MPI_UNDEFINED : rank;
|
||||
|
||||
return MPI_SUCCESS;
|
||||
}
|
90
ompi/mca/topo/example/topo_example_component.c
Обычный файл
90
ompi/mca/topo/example/topo_example_component.c
Обычный файл
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2013 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Inria. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#include "ompi_config.h"
|
||||
#include "ompi/mca/topo/example/topo_example.h"
|
||||
|
||||
/*
|
||||
* Public string showing the topo example module version number
|
||||
*/
|
||||
const char *mca_topo_example_component_version_string =
|
||||
"Open MPI example topology MCA component version" OMPI_VERSION;
|
||||
|
||||
/*
|
||||
* Local funtions
|
||||
*/
|
||||
static int init_query(bool enable_progress_threads, bool enable_mpi_threads);
|
||||
static struct mca_topo_base_module_t *
|
||||
comm_query(const ompi_communicator_t *comm, int *priority, uint32_t type);
|
||||
|
||||
/*
|
||||
* Public component structure
|
||||
*/
|
||||
mca_topo_base_component_2_1_0_t mca_topo_example_component =
|
||||
{
|
||||
{
|
||||
MCA_TOPO_BASE_VERSION_2_1_0,
|
||||
|
||||
"example",
|
||||
OMPI_MAJOR_VERSION,
|
||||
OMPI_MINOR_VERSION,
|
||||
OMPI_RELEASE_VERSION,
|
||||
|
||||
/* NULLs for the rest of the function pointers */
|
||||
},
|
||||
|
||||
{
|
||||
/* The component is checkpoint ready */
|
||||
MCA_BASE_METADATA_PARAM_CHECKPOINT
|
||||
},
|
||||
|
||||
init_query,
|
||||
comm_query
|
||||
};
|
||||
|
||||
|
||||
static int init_query(bool enable_progress_threads, bool enable_mpi_threads)
|
||||
{
|
||||
/* Nothing to do */
|
||||
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
static struct mca_topo_base_module_t *
|
||||
comm_query(const ompi_communicator_t *comm, int *priority, uint32_t type)
|
||||
{
|
||||
mca_topo_example_module_t *example = OBJ_NEW(mca_topo_example_module_t);
|
||||
if (NULL == example) {
|
||||
return NULL;
|
||||
}
|
||||
if( OMPI_COMM_CART == type ) {
|
||||
example->super.topo.cart.cart_map = mca_topo_example_cart_map;
|
||||
} else if( OMPI_COMM_GRAPH == type ) {
|
||||
example->super.topo.graph.graph_map = mca_topo_example_graph_map;
|
||||
}
|
||||
|
||||
/* This component has very low priority -- it's an example, after all! */
|
||||
*priority = 0;
|
||||
example->super.type = type;
|
||||
return &(example->super);
|
||||
}
|
||||
|
||||
|
58
ompi/mca/topo/example/topo_example_graph_map.c
Обычный файл
58
ompi/mca/topo/example/topo_example_graph_map.c
Обычный файл
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2013 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2009 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Inria. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#include "ompi_config.h"
|
||||
#include "ompi/mca/topo/example/topo_example.h"
|
||||
|
||||
#include "ompi/communicator/communicator.h"
|
||||
|
||||
/*
|
||||
* function - mca_topo_example_graph_map
|
||||
*
|
||||
* @param comm input communicator (handle)
|
||||
* @param nnodes number of graph nodes (integer)
|
||||
* @param index integer array specifying the graph structure
|
||||
* @param edges integer array specifying the graph structure
|
||||
* @param newrank reordered rank of the calling process; 'MPI_UNDEFINED'
|
||||
* if the calling process does not belong to
|
||||
* graph (integer)
|
||||
*
|
||||
* @retval MPI_SUCCESS
|
||||
* @retval MPI_UNDEFINED
|
||||
*/
|
||||
|
||||
int mca_topo_example_graph_map (ompi_communicator_t* comm,
|
||||
int nnodes,
|
||||
int *index,
|
||||
int *edges,
|
||||
int *newrank)
|
||||
{
|
||||
int myrank;
|
||||
|
||||
/*
|
||||
* Compute my new rank. To be slightly different than the "unity"
|
||||
* component, start with a rank that is size-my_initial_rank.
|
||||
*/
|
||||
myrank = ompi_comm_size(comm) - 1 - ompi_comm_rank(comm);
|
||||
*newrank =
|
||||
((0 > myrank) || (myrank >= nnodes)) ? MPI_UNDEFINED : myrank;
|
||||
|
||||
return OMPI_SUCCESS;
|
||||
}
|
58
ompi/mca/topo/example/topo_example_module.c
Обычный файл
58
ompi/mca/topo/example/topo_example_module.c
Обычный файл
@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||
* University Research and Technology
|
||||
* Corporation. All rights reserved.
|
||||
* Copyright (c) 2004-2013 The University of Tennessee and The University
|
||||
* of Tennessee Research Foundation. All rights
|
||||
* reserved.
|
||||
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||
* University of Stuttgart. All rights reserved.
|
||||
* Copyright (c) 2004-2005 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 2008-2009 Cisco Systems, Inc. All rights reserved.
|
||||
* Copyright (c) 2012-2013 Inria. All rights reserved.
|
||||
* $COPYRIGHT$
|
||||
*
|
||||
* Additional copyrights may follow
|
||||
*
|
||||
* $HEADER$
|
||||
*/
|
||||
|
||||
#include "ompi_config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "mpi.h"
|
||||
#include "ompi/communicator/communicator.h"
|
||||
#include "ompi/mca/topo/topo.h"
|
||||
#include "ompi/mca/topo/base/base.h"
|
||||
#include "ompi/mca/topo/example/topo_example.h"
|
||||
|
||||
|
||||
/*
|
||||
* Local functions
|
||||
*/
|
||||
static void example_module_constructor(mca_topo_example_module_t *u);
|
||||
static void example_module_destructor(mca_topo_example_module_t *u);
|
||||
|
||||
OBJ_CLASS_INSTANCE(mca_topo_example_module_t, mca_topo_base_module_t,
|
||||
example_module_constructor, example_module_destructor);
|
||||
|
||||
|
||||
static void example_module_constructor(mca_topo_example_module_t *u)
|
||||
{
|
||||
mca_topo_base_module_t *m = &(u->super);
|
||||
|
||||
memset(&m->topo, 0, sizeof(m->topo));
|
||||
|
||||
/* Here we can fill in additional, module-specific data if
|
||||
necessary */
|
||||
u->example_module_specific_data = 17;
|
||||
}
|
||||
|
||||
|
||||
static void example_module_destructor(mca_topo_example_module_t *u)
|
||||
{
|
||||
/* Do whatever is necessary to clean up / destroy the module */
|
||||
}
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user