performance fix: openib use memalign for malloc
This commit was SVN r26409.
Этот коммит содержится в:
родитель
3928a1ea42
Коммит
cd17fee9a8
@ -297,6 +297,11 @@ struct mca_btl_openib_component_t {
|
|||||||
#if BTL_OPENIB_FAILOVER_ENABLED
|
#if BTL_OPENIB_FAILOVER_ENABLED
|
||||||
int verbose_failover;
|
int verbose_failover;
|
||||||
#endif
|
#endif
|
||||||
|
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
|
||||||
|
int use_memalign;
|
||||||
|
size_t memalign_threshold;
|
||||||
|
void* (*previous_malloc_hook)(size_t __size, const void*);
|
||||||
|
#endif
|
||||||
}; typedef struct mca_btl_openib_component_t mca_btl_openib_component_t;
|
}; typedef struct mca_btl_openib_component_t mca_btl_openib_component_t;
|
||||||
|
|
||||||
OMPI_MODULE_DECLSPEC extern mca_btl_openib_component_t mca_btl_openib_component;
|
OMPI_MODULE_DECLSPEC extern mca_btl_openib_component_t mca_btl_openib_component;
|
||||||
|
@ -47,6 +47,9 @@ const char *ibv_get_sysfs_path(void);
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
|
||||||
|
#include <malloc.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "opal/mca/event/event.h"
|
#include "opal/mca/event/event.h"
|
||||||
#include "opal/align.h"
|
#include "opal/align.h"
|
||||||
@ -136,6 +139,26 @@ mca_btl_openib_component_t mca_btl_openib_component = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
|
||||||
|
/* This is a memory allocator hook. The purpose of this is to make
|
||||||
|
* every malloc aligned since this speeds up IB HCA work.
|
||||||
|
* There two basic cases here:
|
||||||
|
* 1. Memory manager for Open MPI is enabled. Then memalign below will be
|
||||||
|
* overridden by __memalign_hook which is set to opal_memory_linux_memalign_hook.
|
||||||
|
* Thus, _malloc_hook is going to use opal_memory_linux_memalign_hook.
|
||||||
|
* 2. No memory manager support. The memalign below is just regular glibc
|
||||||
|
* memalign which will be called through __malloc_hook instead of malloc.
|
||||||
|
*/
|
||||||
|
static void *btl_openib_malloc_hook(size_t sz, const void* caller)
|
||||||
|
{
|
||||||
|
if (sz < mca_btl_openib_component.memalign_threshold) {
|
||||||
|
return mca_btl_openib_component.previous_malloc_hook(sz, caller);
|
||||||
|
} else {
|
||||||
|
return memalign(mca_btl_openib_component.use_memalign, sz);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int btl_openib_component_register(void)
|
static int btl_openib_component_register(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -162,6 +185,13 @@ static int btl_openib_component_register(void)
|
|||||||
return OMPI_ERR_NOT_AVAILABLE;
|
return OMPI_ERR_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
|
||||||
|
mca_btl_openib_component.previous_malloc_hook = __malloc_hook;
|
||||||
|
if (mca_btl_openib_component.use_memalign > 0) {
|
||||||
|
__malloc_hook = btl_openib_malloc_hook;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,6 +208,7 @@ static int btl_openib_component_open(void)
|
|||||||
OBJ_CONSTRUCT(lock, opal_mutex_t);
|
OBJ_CONSTRUCT(lock, opal_mutex_t);
|
||||||
OBJ_CONSTRUCT(srq_addr_table, opal_hash_table_t);
|
OBJ_CONSTRUCT(srq_addr_table, opal_hash_table_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* initialize state */
|
/* initialize state */
|
||||||
mca_btl_openib_component.ib_num_btls = 0;
|
mca_btl_openib_component.ib_num_btls = 0;
|
||||||
mca_btl_openib_component.openib_btls = NULL;
|
mca_btl_openib_component.openib_btls = NULL;
|
||||||
@ -238,6 +269,11 @@ static int btl_openib_component_close(void)
|
|||||||
if (NULL != mca_btl_openib_component.default_recv_qps) {
|
if (NULL != mca_btl_openib_component.default_recv_qps) {
|
||||||
free(mca_btl_openib_component.default_recv_qps);
|
free(mca_btl_openib_component.default_recv_qps);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if BTL_OPENIB_MALLOC_HOOKS_ENABLED
|
||||||
|
__malloc_hook = mca_btl_openib_component.previous_malloc_hook;
|
||||||
|
#endif
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3829,3 +3865,4 @@ int mca_btl_openib_post_srr(mca_btl_openib_module_t* openib_btl, const int qp)
|
|||||||
OPAL_THREAD_UNLOCK(&openib_btl->ib_lock);
|
OPAL_THREAD_UNLOCK(&openib_btl->ib_lock);
|
||||||
return OMPI_ERROR;
|
return OMPI_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -608,6 +608,36 @@ int btl_openib_register_mca_params(void)
|
|||||||
0, &mca_btl_openib_component.gid_index,
|
0, &mca_btl_openib_component.gid_index,
|
||||||
REGINT_GE_ZERO));
|
REGINT_GE_ZERO));
|
||||||
|
|
||||||
|
#if OPENIB_MALLOC_HOOKS_ENABLED
|
||||||
|
CHECK(reg_int("memalign", NULL,
|
||||||
|
"[64 | 32 | 0] - Enable (64bit or 32bit)/Disable(0) memory"
|
||||||
|
"alignment for all malloc calls if btl openib is used.",
|
||||||
|
32, &mca_btl_openib_component.use_memalign,
|
||||||
|
REGINT_GE_ZERO));
|
||||||
|
|
||||||
|
if (mca_btl_openib_component.use_memalign != 32
|
||||||
|
&& mca_btl_openib_component.use_memalign != 64
|
||||||
|
&& mca_btl_openib_component.use_memalign != 0){
|
||||||
|
orte_show_help("help-mpi-btl-openib.txt", "invalid mca param value",
|
||||||
|
true, "Wrong btl_openib_memalign parameter value. Allowed values: 64, 32, 0.",
|
||||||
|
"btl_openib_memalign is reset to 32");
|
||||||
|
mca_btl_openib_component.use_memalign = 32;
|
||||||
|
}
|
||||||
|
reg_int("memalign_threshold", NULL,
|
||||||
|
"Allocating memory more than btl_openib_memalign_threshhold"
|
||||||
|
"bytes will automatically be algined to the value of btl_openib_memalign bytes."
|
||||||
|
"memalign_threshhold defaults to the same value as mca_btl_openib_eager_limit.",
|
||||||
|
mca_btl_openib_component.eager_limit,
|
||||||
|
&ival,
|
||||||
|
REGINT_GE_ZERO);
|
||||||
|
if (ival < 0){
|
||||||
|
orte_show_help("help-mpi-btl-openib.txt", "invalid mca param value",
|
||||||
|
true, "btl_openib_memalign_threshold must be positive",
|
||||||
|
"btl_openib_memalign_threshold is reset to btl_openib_eager_limit");
|
||||||
|
ival = mca_btl_openib_component.eager_limit;
|
||||||
|
}
|
||||||
|
mca_btl_openib_component.memalign_threshold = (size_t)ival;
|
||||||
|
#endif
|
||||||
/* Register any MCA params for the connect pseudo-components */
|
/* Register any MCA params for the connect pseudo-components */
|
||||||
if (OMPI_SUCCESS == ret) {
|
if (OMPI_SUCCESS == ret) {
|
||||||
ret = ompi_btl_openib_connect_base_register();
|
ret = ompi_btl_openib_connect_base_register();
|
||||||
|
@ -81,6 +81,7 @@ AC_DEFUN([MCA_ompi_btl_openib_CONFIG],[
|
|||||||
AC_MSG_RESULT([$cpcs])])
|
AC_MSG_RESULT([$cpcs])])
|
||||||
|
|
||||||
# Enable openib device failover. It is disabled by default.
|
# Enable openib device failover. It is disabled by default.
|
||||||
|
AC_MSG_CHECKING([whether openib failover is enabled])
|
||||||
AC_ARG_ENABLE([btl-openib-failover],
|
AC_ARG_ENABLE([btl-openib-failover],
|
||||||
[AC_HELP_STRING([--enable-btl-openib-failover],
|
[AC_HELP_STRING([--enable-btl-openib-failover],
|
||||||
[enable openib BTL failover (default: disabled)])])
|
[enable openib BTL failover (default: disabled)])])
|
||||||
@ -95,6 +96,29 @@ AC_DEFUN([MCA_ompi_btl_openib_CONFIG],[
|
|||||||
[enable openib BTL failover])
|
[enable openib BTL failover])
|
||||||
AM_CONDITIONAL([MCA_btl_openib_enable_failover], [test "x$btl_openib_failover_enabled" = "x1"])
|
AM_CONDITIONAL([MCA_btl_openib_enable_failover], [test "x$btl_openib_failover_enabled" = "x1"])
|
||||||
|
|
||||||
|
|
||||||
|
# Check for __malloc_hook availability
|
||||||
|
AC_ARG_ENABLE(btl-openib-malloc-alignment,
|
||||||
|
AC_HELP_STRING([--enable-btl-openib-malloc-alignment], [Enable support for allocated memory alignment. Default: enabled if supported, disabled otherwise.]))
|
||||||
|
|
||||||
|
btl_openib_malloc_hooks_enabled=0
|
||||||
|
AS_IF([test "$enable_btl_openib_malloc_alignment" != "no"],
|
||||||
|
[AC_CHECK_HEADER([malloc.h],
|
||||||
|
[AC_CHECK_FUNC([__malloc_hook],
|
||||||
|
[AC_CHECK_FUNC([__realloc_hook],
|
||||||
|
[AC_CHECK_FUNC([__free_hook],
|
||||||
|
[btl_openib_malloc_hooks_enabled=1])])])])])
|
||||||
|
|
||||||
|
AS_IF([test "$enable_btl_openib_malloc_alignment" = "yes" -a "$btl_openib_malloc_hooks_enabled" = "0"],
|
||||||
|
[AC_MSG_ERROR([openib malloc alignment is requested but __malloc_hook is not available])])
|
||||||
|
AC_MSG_CHECKING([whether the openib BTL will use malloc hooks])
|
||||||
|
AS_IF([test "$btl_openib_malloc_hooks_enabled" = "0"],
|
||||||
|
[AC_MSG_RESULT([no])],
|
||||||
|
[AC_MSG_RESULT([yes])])
|
||||||
|
|
||||||
|
AC_DEFINE_UNQUOTED(BTL_OPENIB_MALLOC_HOOKS_ENABLED, [$btl_openib_malloc_hooks_enabled],
|
||||||
|
[Whether the openib BTL malloc hooks are enabled])
|
||||||
|
|
||||||
# substitute in the things needed to build openib
|
# substitute in the things needed to build openib
|
||||||
AC_SUBST([btl_openib_CFLAGS])
|
AC_SUBST([btl_openib_CFLAGS])
|
||||||
AC_SUBST([btl_openib_CPPFLAGS])
|
AC_SUBST([btl_openib_CPPFLAGS])
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user