From d311d8acf1e82e416b57b93a28b6926fc9910a39 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Wed, 5 Apr 2006 05:56:08 +0000 Subject: [PATCH] The memcpy framework. The base component is here, but right now no implementations. I dont want to overload the memcpy functions, therefore people interested in using the high performance memcpy should use directly opal_memcpy instead. Notice, that there are 2 other versions of memcpy available, which use a destination or a source described as iovecs. This commit was SVN r9532. --- opal/mca/memcpy/Makefile.am | 37 +++++++++++ opal/mca/memcpy/base/Makefile.am | 19 ++++++ opal/mca/memcpy/base/base.h | 74 ++++++++++++++++++++++ opal/mca/memcpy/base/memcpy_base_close.c | 30 +++++++++ opal/mca/memcpy/base/memcpy_base_default.h | 42 ++++++++++++ opal/mca/memcpy/base/memcpy_base_open.c | 55 ++++++++++++++++ opal/mca/memcpy/configure.m4 | 27 ++++++++ opal/mca/memcpy/memcpy.h | 50 +++++++++++++++ 8 files changed, 334 insertions(+) create mode 100644 opal/mca/memcpy/Makefile.am create mode 100644 opal/mca/memcpy/base/Makefile.am create mode 100644 opal/mca/memcpy/base/base.h create mode 100644 opal/mca/memcpy/base/memcpy_base_close.c create mode 100644 opal/mca/memcpy/base/memcpy_base_default.h create mode 100644 opal/mca/memcpy/base/memcpy_base_open.c create mode 100644 opal/mca/memcpy/configure.m4 create mode 100644 opal/mca/memcpy/memcpy.h diff --git a/opal/mca/memcpy/Makefile.am b/opal/mca/memcpy/Makefile.am new file mode 100644 index 0000000000..60c917a3e9 --- /dev/null +++ b/opal/mca/memcpy/Makefile.am @@ -0,0 +1,37 @@ +# +# Copyright (c) 2004-2006 The University of Tennessee and The University +# of Tennessee Research Foundation. All rights +# reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +# main library setup +noinst_LTLIBRARIES = libmca_memcpy.la +libmca_memcpy_la_SOURCES = + +# header setup +nobase_opal_HEADERS = +nobase_nodist_opal_HEADERS = + +# local files +headers = memcpy.h +nodist_headers = +libmca_memcpy_la_SOURCES += $(headers) + +# Conditionally install the header files +if WANT_INSTALL_HEADERS +nobase_opal_HEADERS += $(headers) +nobase_nodist_opal_HEADERS += $(nodist_headers) +opaldir = $(includedir)/openmpi/opal/mca/memcpy +else +opaldir = $(includedir) +endif + +include base/Makefile.am + +distclean-local: + rm -f base/static-components.h diff --git a/opal/mca/memcpy/base/Makefile.am b/opal/mca/memcpy/base/Makefile.am new file mode 100644 index 0000000000..0938408458 --- /dev/null +++ b/opal/mca/memcpy/base/Makefile.am @@ -0,0 +1,19 @@ +# +# Copyright (c) 2004-2005 The University of Tennessee and The University +# of Tennessee Research Foundation. All rights +# reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# + +headers += \ + base/base.h + +libmca_memcpy_la_SOURCES += \ + base/memcpy_base_close.c \ + base/memcpy_base_open.c + +nodist_headers += base/base_impl.h diff --git a/opal/mca/memcpy/base/base.h b/opal/mca/memcpy/base/base.h new file mode 100644 index 0000000000..4996f372bd --- /dev/null +++ b/opal/mca/memcpy/base/base.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2004-2005 The University of Tennessee and The University + * of Tennessee Research Foundation. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + * + */ + +#ifndef OPAL_MEMCPY_BASE_H +#define OPAL_MEMCPY_BASE_H + +#include "opal_config.h" + +#include "opal/mca/memcpy/memcpy.h" + + +/* + * Global functions for MCA overall memcpy open and close + */ + +#if defined(c_plusplus) || defined(__cplusplus) +extern "C" { +#endif + + /** + * Initialize the memcpy MCA framework + * + * @retval OPAL_SUCCESS Upon success + * @retval OPAL_ERROR Upon failure + * + * This must be the first function invoked in the memcpy MCA + * framework. It initializes the memcpy MCA framework, finds + * and opens memcpy components, etc. + * + * This function is invoked during opal_init() and during the + * initialization of the special case of the laminfo command. + * + * This function fills in the internal global variable + * opal_memcpy_base_components_opened, which is a list of all + * memcpy components that were successfully opened. This + * variable should \em only be used by other memcpy base + * functions -- it is not considered a public interface member -- + * and is only mentioned here for completeness. + */ + OMPI_DECLSPEC int opal_memcpy_base_open(void); + + + /** + * Shut down the memcpy MCA framework. + * + * @retval OPAL_SUCCESS Always + * + * This function shuts down everything in the memcpy MCA + * framework, and is called during opal_finalize() and the + * special case of the laminfo command. + * + * It must be the last function invoked on the memcpy MCA framework. + */ + OMPI_DECLSPEC int opal_memcpy_base_close(void); + + extern opal_list_t opal_memcpy_base_components_opened; + +#if defined(c_plusplus) || defined(__cplusplus) +} +#endif + +/* include implementation to call */ +#include "opal/mca/memcpy/base/base_impl.h" + +#endif /* OPAL_BASE_MEMCPY_H */ diff --git a/opal/mca/memcpy/base/memcpy_base_close.c b/opal/mca/memcpy/base/memcpy_base_close.c new file mode 100644 index 0000000000..321bbebf87 --- /dev/null +++ b/opal/mca/memcpy/base/memcpy_base_close.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2004-2005 The University of Tennessee and The University + * of Tennessee Research Foundation. 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/memcpy/memcpy.h" +#include "opal/mca/memcpy/base/base.h" + + +int opal_memcpy_base_close(void) +{ + /* Close all components that are still open (this should only + happen during laminfo). */ + mca_base_components_close(0, &opal_memcpy_base_components_opened, NULL); + OBJ_DESTRUCT(&opal_memcpy_base_components_opened); + + /* All done */ + return OPAL_SUCCESS; +} diff --git a/opal/mca/memcpy/base/memcpy_base_default.h b/opal/mca/memcpy/base/memcpy_base_default.h new file mode 100644 index 0000000000..07464466fb --- /dev/null +++ b/opal/mca/memcpy/base/memcpy_base_default.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2004-2006 The University of Tennessee and The University + * of Tennessee Research Foundation. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#ifndef OPAL_MCA_MEMCPY_BASE_MEMCPY_BASE_NULL_H +#define OPAL_MCA_MEMCPY_BASE_MEMCPY_BASE_NULL_H + +#define opal_memcpy( dst, src, length ) \ + memcpy( (dst), (src), (length) ); + +#define opal_memcpy_tov( dst_iov, src, count ) \ + do { \ + int _i; \ + char* _src = (char*)src; \ + \ + for( _i = 0; _i < count; _i++ ) { \ + opal_memcpy( dst_iov[_i].iov_base, _src, \ + dst_iov[_i].iov_len ); \ + _src += dst_iov[_i].iov_len; \ + } \ + } while (0) + +#define opal_memcpy_fromv( dst, src_iov, count ) \ + do { \ + int _i; \ + char* _dst = (char*)dst; \ + \ + for( _i = 0; _i < count; _i++ ) { \ + opal_memcpy( _dst, src_iov[_i].iov_base, \ + src_iov[_i].iov_len ); \ + _dst += src_iov[_i].iov_len; \ + } \ + } while (0) + +#endif diff --git a/opal/mca/memcpy/base/memcpy_base_open.c b/opal/mca/memcpy/base/memcpy_base_open.c new file mode 100644 index 0000000000..18b5f89570 --- /dev/null +++ b/opal/mca/memcpy/base/memcpy_base_open.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2004-2005 The University of Tennessee and The University + * of Tennessee Research Foundation. 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/memcpy/memcpy.h" +#include "opal/mca/memcpy/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/memcpy/base/static-components.h" + +/* + * Globals + */ +opal_list_t opal_memcpy_base_components_opened; + +/* + * Function for finding and opening either all MCA components, or the one + * that was specifically requested via a MCA parameter. + */ +int opal_memcpy_base_open(void) +{ + OBJ_CONSTRUCT( &opal_memcpy_base_components_opened, opal_list_t ); + + /* Open up all available components */ + if (OPAL_SUCCESS != + mca_base_components_open("memcpy", 0, + mca_memcpy_base_static_components, + &opal_memcpy_base_components_opened, + true)) { + return OPAL_ERROR; + } + + /* All done */ + return OPAL_SUCCESS; +} diff --git a/opal/mca/memcpy/configure.m4 b/opal/mca/memcpy/configure.m4 new file mode 100644 index 0000000000..5e3c98f1b8 --- /dev/null +++ b/opal/mca/memcpy/configure.m4 @@ -0,0 +1,27 @@ +dnl -*- shell-script -*- +dnl +dnl Copyright (c) 2004-2006 The University of Tennessee and The University +dnl of Tennessee Research Foundation. All rights +dnl reserved. +dnl $COPYRIGHT$ +dnl +dnl Additional copyrights may follow +dnl +dnl $HEADER$ +dnl + +m4_define(MCA_memcpy_CONFIGURE_MODE, STOP_AT_FIRST) + +AC_DEFUN([MCA_memcpy_CONFIG],[ + memcpy_base_include= + + # first, compile all the components + MCA_CONFIGURE_FRAMEWORK($1, $2) + + # someone should have set this... + if test "$memcpy_base_include" = "" ; then + memcpy_base_include="base/memcpy_base_default.h" + fi + + AC_CONFIG_LINKS([opal/mca/memcpy/base/base_impl.h:opal/mca/memcpy/$memcpy_base_include]) +]) diff --git a/opal/mca/memcpy/memcpy.h b/opal/mca/memcpy/memcpy.h new file mode 100644 index 0000000000..3534716239 --- /dev/null +++ b/opal/mca/memcpy/memcpy.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2004-2006 The University of Tennessee and The University + * of Tennessee Research Foundation. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +/** + * @file + * + */ + +#ifndef OPAL_MCA_MEMCPY_MEMCPY_H +#define OPAL_MCA_MEMCPY_MEMCPY_H + +#include "opal_config.h" + +#include "opal/mca/mca.h" +#include "opal/mca/base/base.h" + +/** + * Structure for memcpy v1.0.0 components. + * Chained to MCA v1.0.0 + */ +struct opal_memcpy_base_component_1_0_0_t { + /** MCA base component */ + mca_base_component_t memcpyc_version; + /** MCA base data */ + mca_base_component_data_1_0_0_t memcpyc_data; +}; + +/** + * Convenience typedef + */ +typedef struct opal_memcpy_base_component_1_0_0_t opal_memcpy_base_component_1_0_0_t; + +/* + * Macro for use in components that are of type memcpy v1.0.0 + */ +#define OPAL_MEMCPY_BASE_VERSION_1_0_0 \ + /* memcpy v1.0 is chained to MCA v1.0 */ \ + MCA_BASE_VERSION_1_0_0, \ + /* memcpy v1.0 */ \ + "memcpy", 1, 0, 0 + +#endif /* OPAL_MCA_MEMCPY_MEMCPY_H */