1
1
openmpi/oshmem/mca/memheap/memheap.h
Yossi Itigin fc41c16134 OSHMEM: Add support for shmemx_malloc_with_hint()
- added multiple segments processing
- added shmemx_malloc_with_hint call + set of hints

(picked from master 94b5e91)

Signed-off-by: Sergey Oblomov <sergeyo@mellanox.com>
Signed-off-by: Yossi Itigin <yosefe@mellanox.com>
2019-05-12 11:42:59 +03:00

161 строка
4.8 KiB
C

/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* Copyright (c) 2015 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef MCA_MEMHEAP_H
#define MCA_MEMHEAP_H
#include "oshmem/mca/mca.h"
#include "oshmem/constants.h"
#include "oshmem/proc/proc.h"
#include "oshmem/mca/sshmem/sshmem.h"
#include "oshmem/mca/spml/spml.h"
BEGIN_C_DECLS
struct mca_memheap_base_module_t;
typedef struct memheap_context
{
void* user_base_addr;
void* private_base_addr;
size_t user_size;
size_t private_size;
} memheap_context_t;
/**
* Component initialize
*/
typedef int (*mca_memheap_base_component_init_fn_t)(memheap_context_t *);
/*
* Symmetric heap allocation. Malloc like interface
*/
typedef int (*mca_memheap_base_module_alloc_fn_t)(size_t, void**);
typedef int (*mca_memheap_base_module_memalign_fn_t)(size_t align,
size_t size,
void**);
typedef int (*mca_memheap_base_module_realloc_fn_t)(size_t newsize,
void *,
void **);
/*
* Symmetric heap free.
*/
typedef int (*mca_memheap_base_module_free_fn_t)(void*);
/**
* Service functions
*/
typedef sshmem_mkey_t * (*mca_memheap_base_module_get_local_mkey_fn_t)(void* va,
int transport_id);
/*
* Symmetric heap destructor.
*/
typedef int (*mca_memheap_base_module_finalize_fn_t)(void);
typedef int (*mca_memheap_base_is_memheap_addr_fn_t)(const void* va);
/* get mkeys from all ranks */
typedef void (*mca_memheap_base_mkey_exchange_fn_t)(void);
/*
* memheap component descriptor. Contains component version, information and
* init functions
*/
struct mca_memheap_base_component_2_0_0_t {
mca_base_component_t memheap_version; /**< version */
mca_base_component_data_t memheap_data; /**< metadata */
mca_memheap_base_component_init_fn_t memheap_init; /**<init function */
};
typedef struct mca_memheap_base_component_2_0_0_t mca_memheap_base_component_2_0_0_t;
typedef struct mca_memheap_base_component_2_0_0_t mca_memheap_base_component_t;
/**
* memheap module descriptor
*/
struct mca_memheap_base_module_t {
mca_memheap_base_component_t *memheap_component; /** Memory Heap Management Componenet */
mca_memheap_base_module_finalize_fn_t memheap_finalize;
mca_memheap_base_module_alloc_fn_t memheap_alloc;
mca_memheap_base_module_memalign_fn_t memheap_memalign;
mca_memheap_base_module_realloc_fn_t memheap_realloc;
mca_memheap_base_module_free_fn_t memheap_free;
/*
* alloc/free that should be used for internal allocation.
* Internal memory does not count towards
* symmetric heap memory
*/
mca_memheap_base_module_alloc_fn_t memheap_private_alloc;
mca_memheap_base_module_free_fn_t memheap_private_free;
mca_memheap_base_module_get_local_mkey_fn_t memheap_get_local_mkey;
mca_memheap_base_is_memheap_addr_fn_t memheap_is_symmetric_addr;
mca_memheap_base_mkey_exchange_fn_t memheap_get_all_mkeys;
/*
* Total size of user available memheap
*/
long memheap_size;
};
typedef struct mca_memheap_base_module_t mca_memheap_base_module_t;
/*
* Macro for use in components that are of type rcache
*/
#define MCA_MEMHEAP_BASE_VERSION_2_0_0 \
OSHMEM_MCA_BASE_VERSION_2_1_0("memheap", 2, 0, 0)
/*
* macro for doing direct call / call through struct
*/
#if MCA_oshmem_memheap_DIRECT_CALL
#include MCA_oshmem_memheap_DIRECT_CALL_HEADER
#define MCA_MEMHEAP_CALL_STAMP(a, b) mca_memheap_ ## a ## _ ## b
#define MCA_MEMHEAP_CALL_EXPANDER(a, b) MCA_MEMHEAP_CALL_STAMP(a,b)
#define MCA_MEMHEAP_CALL(a) MCA_MEMHEAP_CALL_EXPANDER(MCA_oshmem_memheap_DIRECT_CALL_COMPONENT, a)
#else
#define MCA_MEMHEAP_CALL(a) mca_memheap.memheap_ ## a
#endif
OSHMEM_DECLSPEC extern mca_memheap_base_module_t mca_memheap;
int mca_memheap_alloc_with_hint(size_t size, long hint, void**);
static inline int mca_memheap_base_mkey_is_shm(sshmem_mkey_t *mkey)
{
return (0 == mkey->len) && (MAP_SEGMENT_SHM_INVALID != (int)mkey->u.key);
}
/**
* check if memcpy() can be used to copy data to dst_addr
* must be memheap address and segment must be mapped
*/
static inline int mca_memheap_base_can_local_copy(sshmem_mkey_t *mkey, void *dst_addr) {
return mca_memheap.memheap_is_symmetric_addr(dst_addr) &&
mca_memheap_base_mkey_is_shm(mkey);
}
END_C_DECLS
#endif /* MCA_MEMHEAP_H */