1
1

More mpool and bmi restructuring

misc compiler warning fixes. 

This commit was SVN r6173.
Этот коммит содержится в:
Galen Shipman 2005-06-24 21:12:38 +00:00
родитель e90941e004
Коммит 527d5e3498
33 изменённых файлов: 358 добавлений и 289 удалений

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

@ -75,7 +75,7 @@ int ompi_free_list_grow(ompi_free_list_t* flist, size_t num_elements)
unsigned char* ptr; unsigned char* ptr;
size_t i; size_t i;
size_t mod; size_t mod;
struct mca_mpool_base_registration_t* user_out; mca_mpool_base_registration_t* user_out;
if (flist->fl_max_to_alloc > 0 && flist->fl_num_allocated + num_elements > flist->fl_max_to_alloc) if (flist->fl_max_to_alloc > 0 && flist->fl_num_allocated + num_elements > flist->fl_max_to_alloc)
return OMPI_ERR_TEMP_OUT_OF_RESOURCE; return OMPI_ERR_TEMP_OUT_OF_RESOURCE;

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

@ -188,27 +188,6 @@ void * ompi_rb_tree_find(ompi_rb_tree_t *tree, void *key)
return(NULL); return(NULL);
} }
/* Finds the node in the tree based on the key */
void * ompi_rb_tree_find_with_cmp(ompi_rb_tree_t *tree,
void *key,
ompi_rb_tree_comp_fn_t* comp)
{
ompi_rb_tree_node_t * node;
int compvalue;
node = tree->root_ptr->left;
while (node != tree->nill) {
compvalue = (*comp)(key, node->key);
/* if the result of the comparison function is 0, we found it */
if (compvalue == 0) {
return(node->value);
}
/* else if it is less than 0, go left, else right */
(compvalue < 0) ? (node = node->left) : (node = node->right);
}
/* if we didn't find anything, return NULL */
return(NULL);
}
/* Finds the node in the tree based on the key and returns a pointer /* Finds the node in the tree based on the key and returns a pointer
* to the node. This is a bit a code duplication, but this has to be fast * to the node. This is a bit a code duplication, but this has to be fast
* so we go ahead with the duplication */ * so we go ahead with the duplication */

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

@ -20,8 +20,8 @@
#ifndef MCA_ALLOCATOR_H #ifndef MCA_ALLOCATOR_H
#define MCA_ALLOCATOR_H #define MCA_ALLOCATOR_H
#include "mca/mca.h" #include "mca/mca.h"
#include "mca/mpool/mpool.h"
struct mca_mpool_base_registration_t;
struct mca_mpool_base_resources_t; struct mca_mpool_base_resources_t;
@ -38,7 +38,7 @@ typedef void* (*mca_allocator_base_module_alloc_fn_t)(
struct mca_allocator_base_module_t*, struct mca_allocator_base_module_t*,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* The realloc function typedef * The realloc function typedef
@ -46,7 +46,7 @@ typedef void* (*mca_allocator_base_module_alloc_fn_t)(
typedef void* (*mca_allocator_base_module_realloc_fn_t)( typedef void* (*mca_allocator_base_module_realloc_fn_t)(
struct mca_allocator_base_module_t*, struct mca_allocator_base_module_t*,
void*, size_t, void*, size_t,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* Free function typedef * Free function typedef
@ -103,7 +103,7 @@ typedef struct mca_allocator_base_module_t mca_allocator_base_module_t;
typedef void* (*mca_allocator_base_component_segment_alloc_fn_t)( typedef void* (*mca_allocator_base_component_segment_alloc_fn_t)(
struct mca_mpool_base_module_t* module, struct mca_mpool_base_module_t* module,
size_t* size, size_t* size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* A function to free memory from the control of the allocator framework * A function to free memory from the control of the allocator framework

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

@ -161,7 +161,7 @@ void *mca_allocator_basic_alloc(
mca_allocator_base_module_t * base, mca_allocator_base_module_t * base,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_allocator_basic_module_t* module = (mca_allocator_basic_module_t*)base; mca_allocator_basic_module_t* module = (mca_allocator_basic_module_t*)base;
mca_allocator_basic_segment_t* seg; mca_allocator_basic_segment_t* seg;
@ -241,7 +241,7 @@ void * mca_allocator_basic_realloc(
mca_allocator_base_module_t * base, mca_allocator_base_module_t * base,
void * ptr, void * ptr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
unsigned char* addr = ((unsigned char*)ptr) - sizeof(size_t); unsigned char* addr = ((unsigned char*)ptr) - sizeof(size_t);
size_t alloc_size = *(size_t*)addr; size_t alloc_size = *(size_t*)addr;

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

@ -92,7 +92,7 @@ mca_allocator_base_module_t* mca_allocator_basic_component_init(
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* Attempts to resize the passed region of memory into a larger or a smaller * Attempts to resize the passed region of memory into a larger or a smaller
@ -112,7 +112,7 @@ mca_allocator_base_module_t* mca_allocator_basic_component_init(
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
void * ptr, void * ptr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* Frees the passed region of memory * Frees the passed region of memory

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

@ -19,6 +19,7 @@
#include "include/constants.h" #include "include/constants.h"
#include "mca/base/mca_base_param.h" #include "mca/base/mca_base_param.h"
#include "mca/allocator/bucket/allocator_bucket_alloc.h" #include "mca/allocator/bucket/allocator_bucket_alloc.h"
#include "mca/mpool/mpool.h"
struct mca_allocator_base_module_t* mca_allocator_bucket_module_init( struct mca_allocator_base_module_t* mca_allocator_bucket_module_init(
bool enable_mpi_threads, bool enable_mpi_threads,
@ -34,7 +35,7 @@ int mca_allocator_bucket_module_close(void);
void * mca_allocator_bucket_alloc_wrapper( void * mca_allocator_bucket_alloc_wrapper(
struct mca_allocator_base_module_t* allocator, struct mca_allocator_base_module_t* allocator,
size_t size, size_t align, size_t size, size_t align,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
static int mca_allocator_num_buckets; static int mca_allocator_num_buckets;
@ -91,7 +92,7 @@ void * mca_allocator_bucket_alloc_wrapper(
struct mca_allocator_base_module_t* allocator, struct mca_allocator_base_module_t* allocator,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
if(0 == align){ if(0 == align){
return(mca_allocator_bucket_alloc(allocator, size, registration)); return(mca_allocator_bucket_alloc(allocator, size, registration));

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

@ -71,7 +71,7 @@ mca_allocator_bucket_t * mca_allocator_bucket_init(
void * mca_allocator_bucket_alloc( void * mca_allocator_bucket_alloc(
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_allocator_bucket_t * mem_options = (mca_allocator_bucket_t *) mem; mca_allocator_bucket_t * mem_options = (mca_allocator_bucket_t *) mem;
/* initialize for the later bit shifts */ /* initialize for the later bit shifts */
@ -154,7 +154,7 @@ void * mca_allocator_bucket_alloc_align(
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
size_t size, size_t size,
size_t alignment, size_t alignment,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_allocator_bucket_t * mem_options = (mca_allocator_bucket_t *) mem; mca_allocator_bucket_t * mem_options = (mca_allocator_bucket_t *) mem;
int bucket_num = 1; int bucket_num = 1;
@ -237,7 +237,7 @@ void * mca_allocator_bucket_realloc(
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
void * ptr, void * ptr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_allocator_bucket_t * mem_options = (mca_allocator_bucket_t *) mem; mca_allocator_bucket_t * mem_options = (mca_allocator_bucket_t *) mem;
/* initialize for later bit shifts */ /* initialize for later bit shifts */

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

@ -125,7 +125,7 @@ typedef struct mca_allocator_bucket_t mca_allocator_bucket_t;
void * mca_allocator_bucket_alloc( void * mca_allocator_bucket_alloc(
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* Accepts a request for memory in a specific region defined by the * Accepts a request for memory in a specific region defined by the
@ -146,7 +146,7 @@ typedef struct mca_allocator_bucket_t mca_allocator_bucket_t;
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
size_t size, size_t size,
size_t alignment, size_t alignment,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* Attempts to resize the passed region of memory into a larger or a smaller * Attempts to resize the passed region of memory into a larger or a smaller
@ -166,7 +166,7 @@ typedef struct mca_allocator_bucket_t mca_allocator_bucket_t;
mca_allocator_base_module_t * mem, mca_allocator_base_module_t * mem,
void * ptr, void * ptr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* Frees the passed region of memory * Frees the passed region of memory

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

@ -119,7 +119,6 @@
struct mca_bmi_base_module_t; struct mca_bmi_base_module_t;
struct mca_bmi_base_endpoint_t; struct mca_bmi_base_endpoint_t;
struct mca_bmi_base_descriptor_t; struct mca_bmi_base_descriptor_t;
struct mca_mpool_base_registration_t;
struct mca_mpool_base_resources_t; struct mca_mpool_base_resources_t;
@ -184,9 +183,8 @@ typedef struct mca_bmi_base_descriptor_t mca_bmi_base_descriptor_t;
OBJ_CLASS_DECLARATION(mca_bmi_base_descriptor_t); OBJ_CLASS_DECLARATION(mca_bmi_base_descriptor_t);
#define MCA_BMI_DES_FLAGS_PINNED 0x0001 #define MCA_BMI_DES_FLAGS_DEREGISTER 0x0001
#define MCA_BMI_DES_FLAGS_PRIORITY 0x0002 #define MCA_BMI_DES_FLAGS_PRIORITY 0x0002
#define MCA_BMI_DES_FLAGS_LEAVE_PINNED 0x003
/** /**
* Maximum number of allowed segments in src/dst fields of a descriptor. * Maximum number of allowed segments in src/dst fields of a descriptor.
@ -410,7 +408,7 @@ typedef int (*mca_bmi_base_module_free_fn_t)(
typedef struct mca_bmi_base_descriptor_t* (*mca_bmi_base_module_prepare_fn_t)( typedef struct mca_bmi_base_descriptor_t* (*mca_bmi_base_module_prepare_fn_t)(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size size_t* size

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

@ -29,7 +29,7 @@
#include "mca/common/vapi/vapi_mem_reg.h" #include "mca/common/vapi/vapi_mem_reg.h"
#include "mca/mpool/base/base.h" #include "mca/mpool/base/base.h"
#include "mca/mpool/mpool.h" #include "mca/mpool/mpool.h"
#include "mca/mpool/vapi/mpool_vapi.h"
mca_bmi_ib_module_t mca_bmi_ib_module = { mca_bmi_ib_module_t mca_bmi_ib_module = {
{ {
@ -192,7 +192,7 @@ int mca_bmi_ib_free(
/* we also need to unregister the associated memory iff /* we also need to unregister the associated memory iff
the memory wasn't allocated via MPI_Alloc_mem */ the memory wasn't allocated via MPI_Alloc_mem */
if(!(frag->base.des_flags && MCA_BMI_DES_FLAGS_PINNED)){ if(frag->base.des_flags & MCA_BMI_DES_FLAGS_DEREGISTER){
frag->ret = VAPI_deregister_mr( frag->ret = VAPI_deregister_mr(
ib_bmi->nic, ib_bmi->nic,
frag->mem_hndl frag->mem_hndl
@ -209,7 +209,7 @@ int mca_bmi_ib_free(
MCA_BMI_IB_FRAG_RETURN_EAGER(bmi, frag); MCA_BMI_IB_FRAG_RETURN_EAGER(bmi, frag);
} }
return frag->rc; return OMPI_SUCCESS;
} }
@ -223,7 +223,7 @@ int mca_bmi_ib_free(
mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src( mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size size_t* size
@ -231,6 +231,7 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
{ {
mca_bmi_ib_module_t* ib_bmi; mca_bmi_ib_module_t* ib_bmi;
mca_bmi_ib_frag_t* frag; mca_bmi_ib_frag_t* frag;
mca_mpool_vapi_registration_t * vapi_reg;
struct iovec iov; struct iovec iov;
int32_t iov_count = 1; int32_t iov_count = 1;
size_t max_data = *size; size_t max_data = *size;
@ -239,18 +240,127 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
ib_bmi = (mca_bmi_ib_module_t*) bmi; ib_bmi = (mca_bmi_ib_module_t*) bmi;
vapi_reg = (mca_mpool_vapi_registration_t*) registration;
/** if the data fits in the eager limit and we aren't told to pinn then we /** if the data fits in the eager limit and we aren't told to pinn then we
simply pack, if the data fits in the eager limit and the data is non contiguous simply pack, if the data fits in the eager limit and the data is non contiguous
then we pack **/ then we pack **/
if( (max_data+reserve <= bmi->bmi_eager_limit
&& NULL == registration if(NULL != vapi_reg && 0 == ompi_convertor_need_buffers(convertor)){
&& !mca_bmi_ib_component.leave_pinned)
|| MCA_BMI_IB_FRAG_ALLOC_FRAG(bmi, frag, rc);
(max_data+reserve <= bmi->bmi_eager_limit if(NULL == frag){
&& 1 == ompi_convertor_need_buffers( convertor ))) { return NULL;
}
iov.iov_len = max_data;
iov.iov_base = NULL;
ompi_convertor_pack(convertor, &iov, &iov_count, &max_data, &free_after);
/* first we will try to find this address in the memory tree (from MPI_Alloc_mem) */
frag->segment.seg_len = max_data;
frag->segment.seg_addr.pval = iov.iov_base;
size_t reg_len;
reg_len = (unsigned char*)vapi_reg->bound - (unsigned char*)iov.iov_base + 1;
if(frag->segment.seg_len > reg_len) {
mca_mpool_base_remove((void*) vapi_reg->base);
ompi_list_remove_item(&ib_bmi->reg_mru_list, (ompi_list_item_t*) vapi_reg);
ib_bmi->ib_pool->mpool_deregister(
ib_bmi->ib_pool,
vapi_reg->base,
0,
(mca_mpool_base_registration_t*) vapi_reg);
ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool,
vapi_reg->base,
vapi_reg->bound - vapi_reg->base + 1 + frag->segment.seg_len - reg_len,
(mca_mpool_base_registration_t**) &vapi_reg);
rc = mca_mpool_base_insert(iov.iov_base,
iov.iov_len,
ib_bmi->ib_pool,
(void*) (&ib_bmi->super),
(mca_mpool_base_registration_t*) vapi_reg);
if(rc != OMPI_SUCCESS)
return NULL;
ompi_list_append(&ib_bmi->reg_mru_list, (ompi_list_item_t*) vapi_reg);
}
frag->mem_hndl = vapi_reg->hndl;
frag->sg_entry.len = max_data;
frag->sg_entry.lkey = vapi_reg->l_key;
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) iov.iov_base;
frag->segment.seg_key.key32[0] = (uint32_t) vapi_reg->l_key;
frag->base.des_src = &frag->segment;
frag->base.des_src_cnt = 1;
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
frag->base.des_flags = 0;
return &frag->base;
} else if((mca_bmi_ib_component.leave_pinned || max_data > bmi->bmi_max_send_size) &&
ompi_convertor_need_buffers(convertor) == 0 &&
reserve == 0)
{
MCA_BMI_IB_FRAG_ALLOC_FRAG(bmi, frag, rc);
if(NULL == frag){
return NULL;
}
iov.iov_len = max_data;
iov.iov_base = NULL;
ompi_convertor_pack(convertor, &iov, &iov_count, &max_data, &free_after);
frag->segment.seg_len = max_data;
frag->segment.seg_addr.pval = iov.iov_base;
frag->base.des_flags = 0;
ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool,
iov.iov_base,
max_data,
(mca_mpool_base_registration_t**) &vapi_reg);
if(mca_bmi_ib_component.leave_pinned) {
rc = mca_mpool_base_insert(iov.iov_base,
iov.iov_len,
ib_bmi->ib_pool,
(void*) (&ib_bmi->super),
(mca_mpool_base_registration_t*) vapi_reg);
if(rc != OMPI_SUCCESS)
return NULL;
} else {
frag->base.des_flags |= MCA_BMI_DES_FLAGS_DEREGISTER;
}
frag->mem_hndl = vapi_reg->hndl;
frag->sg_entry.len = max_data;
frag->sg_entry.lkey = vapi_reg->l_key;
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) iov.iov_base;
frag->segment.seg_key.key32[0] = (uint32_t) vapi_reg->l_key;
frag->base.des_src = &frag->segment;
frag->base.des_src_cnt = 1;
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
return &frag->base;
} else if (max_data+reserve <= bmi->bmi_eager_limit) {
MCA_BMI_IB_FRAG_ALLOC_EAGER(bmi, frag, rc); MCA_BMI_IB_FRAG_ALLOC_EAGER(bmi, frag, rc);
if(NULL == frag) { if(NULL == frag) {
return NULL; return NULL;
@ -277,14 +387,11 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
return &frag->base; return &frag->base;
} }
/** if the data fits in the max limit and we aren't told to pinn then we /** if the data fits in the max limit and we aren't told to pinn then we
simply pack, if the data is non contiguous then we pack **/ simply pack, if the data is non contiguous then we pack **/
else if((max_data + reserve <= ib_bmi->super.bmi_max_send_size else if(max_data + reserve <= ib_bmi->super.bmi_max_send_size) {
&& NULL == registration
&& !mca_bmi_ib_component.leave_pinned)
|| 1 == ompi_convertor_need_buffers( convertor)){
MCA_BMI_IB_FRAG_ALLOC_MAX(bmi, frag, rc); MCA_BMI_IB_FRAG_ALLOC_MAX(bmi, frag, rc);
if(NULL == frag) { if(NULL == frag) {
return NULL; return NULL;
@ -312,94 +419,7 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
frag->base.des_flags=0; frag->base.des_flags=0;
return &frag->base; return &frag->base;
} else {
VAPI_mrw_t mr_in, mr_out;
mca_mpool_base_chunk_t * mpool_chunk;
memset(&mr_in, 0, sizeof(VAPI_mrw_t));
memset(&mr_out, 0, sizeof(VAPI_mrw_t));
mpool_chunk = NULL;
mr_in.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE;
mr_in.l_key = 0;
mr_in.r_key = 0;
mr_in.pd_hndl = ib_bmi->ptag;
mr_in.type = VAPI_MR;
MCA_BMI_IB_FRAG_ALLOC_FRAG(bmi, frag, rc);
if(NULL == frag){
return NULL;
}
iov.iov_len = max_data;
iov.iov_base = NULL;
ompi_convertor_pack(convertor, &iov, &iov_count, &max_data, &free_after);
/* first we will try to find this address in the memory tree (from MPI_Alloc_mem) */
frag->segment.seg_len = max_data;
frag->segment.seg_addr.pval = iov.iov_base;
if(NULL != registration) {
size_t reg_len;
reg_len = (unsigned char*)registration->bound - (unsigned char*)iov.iov_base + 1;
if(frag->segment.seg_len > reg_len) {
ib_bmi->ib_pool->mpool_deregister(
ib_bmi->ib_pool,
registration->base,
0,
registration);
mca_mpool_base_remove((void*) registration->base);
ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool,
registration->base,
registration->bound - registration->base + 1 + frag->segment.seg_len - reg_len,
&registration);
}
frag->base.des_flags |= MCA_BMI_DES_FLAGS_PINNED;
}
else {
ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool,
iov.iov_base,
max_data,
&registration);
if(mca_bmi_ib_component.leave_pinned) {
rc = mca_mpool_base_insert(iov.iov_base,
iov.iov_len,
ib_bmi->ib_pool,
(void*) (&ib_bmi->super),
registration);
if(rc != OMPI_SUCCESS)
return NULL;
frag->base.des_flags |= MCA_BMI_DES_FLAGS_PINNED;
}
}
frag->mem_hndl = registration->hndl;
frag->sg_entry.len = max_data;
frag->sg_entry.lkey = registration->l_key;
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) iov.iov_base;
frag->segment.seg_key.key32[0] = (uint32_t) registration->l_key;
frag->base.des_src = &frag->segment;
frag->base.des_src_cnt = 1;
frag->base.des_dst = NULL;
frag->base.des_dst_cnt = 0;
return &frag->base;
} }
return NULL; return NULL;
} }
@ -412,18 +432,20 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_dst( mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_dst(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size) size_t* size)
{ {
mca_bmi_ib_module_t* ib_bmi; mca_bmi_ib_module_t* ib_bmi;
mca_bmi_ib_frag_t* frag; mca_bmi_ib_frag_t* frag;
mca_mpool_vapi_registration_t * vapi_reg;
int rc; int rc;
size_t reg_len; size_t reg_len;
ib_bmi = (mca_bmi_ib_module_t*) bmi;
ib_bmi = (mca_bmi_ib_module_t*) bmi;
vapi_reg = (mca_mpool_vapi_registration_t*) registration;
MCA_BMI_IB_FRAG_ALLOC_FRAG(bmi, frag, rc); MCA_BMI_IB_FRAG_ALLOC_FRAG(bmi, frag, rc);
if(NULL == frag){ if(NULL == frag){
@ -433,51 +455,60 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_dst(
frag->segment.seg_len = *size; frag->segment.seg_len = *size;
frag->segment.seg_addr.pval = convertor->pBaseBuf + convertor->bConverted; frag->segment.seg_addr.pval = convertor->pBaseBuf + convertor->bConverted;
if(NULL!= registration){ frag->base.des_flags = 0;
reg_len = (unsigned char*)registration->bound - (unsigned char*)frag->segment.seg_addr.pval + 1;
if(NULL!= vapi_reg){
reg_len = (unsigned char*)vapi_reg->bound - (unsigned char*)frag->segment.seg_addr.pval + 1;
if(frag->segment.seg_len > reg_len) { if(frag->segment.seg_len > reg_len) {
ib_bmi->ib_pool->mpool_deregister( ib_bmi->ib_pool->mpool_deregister(
ib_bmi->ib_pool, ib_bmi->ib_pool,
registration->base, vapi_reg->base,
0, 0,
registration); (mca_mpool_base_registration_t*) vapi_reg);
mca_mpool_base_remove((void*) registration->base); mca_mpool_base_remove((void*) vapi_reg->base);
ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool, ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool,
registration->base, vapi_reg->base,
registration->bound - registration->base + 1 + frag->segment.seg_len - reg_len, vapi_reg->bound - vapi_reg->base + 1 + frag->segment.seg_len - reg_len,
&registration); (mca_mpool_base_registration_t**) &vapi_reg);
}
frag->base.des_flags |= MCA_BMI_DES_FLAGS_PINNED;
rc = mca_mpool_base_insert(frag->segment.seg_addr.pval,
frag->segment.seg_len,
ib_bmi->ib_pool,
(void*) (&ib_bmi->super),
(mca_mpool_base_registration_t*) vapi_reg);
}
} else { } else {
ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool, ib_bmi->ib_pool->mpool_register(ib_bmi->ib_pool,
frag->segment.seg_addr.pval, frag->segment.seg_addr.pval,
*size, *size,
&registration); (mca_mpool_base_registration_t**) &vapi_reg);
if(mca_bmi_ib_component.leave_pinned) { if(mca_bmi_ib_component.leave_pinned) {
rc = mca_mpool_base_insert(frag->segment.seg_addr.pval, rc = mca_mpool_base_insert(frag->segment.seg_addr.pval,
*size, *size,
ib_bmi->ib_pool, ib_bmi->ib_pool,
(void*) (&ib_bmi->super), (void*) (&ib_bmi->super),
(void*) registration); (mca_mpool_base_registration_t*) vapi_reg);
if(rc != OMPI_SUCCESS) if(rc != OMPI_SUCCESS)
return NULL; return NULL;
frag->base.des_flags |= MCA_BMI_DES_FLAGS_PINNED;
} }
else {
frag->base.des_flags |= MCA_BMI_DES_FLAGS_DEREGISTER;
}
} }
frag->mem_hndl = registration->hndl; frag->mem_hndl = vapi_reg->hndl;
frag->sg_entry.len = *size; frag->sg_entry.len = *size;
frag->sg_entry.lkey = registration->l_key; frag->sg_entry.lkey = vapi_reg->l_key;
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->segment.seg_addr.pval; frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->segment.seg_addr.pval;
frag->segment.seg_key.key32[0] = (uint32_t) registration->l_key; frag->segment.seg_key.key32[0] = (uint32_t) vapi_reg->l_key;
frag->base.des_dst = &frag->segment; frag->base.des_dst = &frag->segment;
frag->base.des_dst_cnt = 1; frag->base.des_dst_cnt = 1;

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

@ -93,7 +93,8 @@ struct mca_bmi_ib_component_t {
size_t max_send_size; size_t max_send_size;
uint32_t leave_pinned; uint32_t leave_pinned;
uint32_t reg_mru_len;
}; typedef struct mca_bmi_ib_component_t mca_bmi_ib_component_t; }; typedef struct mca_bmi_ib_component_t mca_bmi_ib_component_t;
@ -129,6 +130,8 @@ struct mca_bmi_ib_module_t {
ompi_free_list_t recv_free_eager; /**< High priority free list of buffer descriptors */ ompi_free_list_t recv_free_eager; /**< High priority free list of buffer descriptors */
ompi_free_list_t recv_free_max; /**< Low priority free list of buffer descriptors */ ompi_free_list_t recv_free_max; /**< Low priority free list of buffer descriptors */
ompi_list_t reg_mru_list; /**< a most recently used list of mca_mpool_vapi_registration_t
entries, this allows us to keep a working set of memory pinned */
ompi_list_t repost; /**< list of buffers to repost */ ompi_list_t repost; /**< list of buffers to repost */
ompi_mutex_t ib_lock; /**< module level lock */ ompi_mutex_t ib_lock; /**< module level lock */
@ -342,7 +345,7 @@ extern int mca_bmi_ib_free(
mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src( mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* peer, struct mca_bmi_base_endpoint_t* peer,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size size_t* size
@ -355,13 +358,12 @@ mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_src(
* @param peer (IN) BMI peer addressing * @param peer (IN) BMI peer addressing
*/ */
extern mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_dst( extern mca_bmi_base_descriptor_t* mca_bmi_ib_prepare_dst(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* peer, struct mca_bmi_base_endpoint_t* peer,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size); size_t* size);
/** /**
* Return a send fragment to the modules free list. * Return a send fragment to the modules free list.
* *

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

@ -36,6 +36,8 @@
#include <vapi.h> #include <vapi.h>
#include <vapi_common.h> #include <vapi_common.h>
#include "datatype/convertor.h" #include "datatype/convertor.h"
#include "mca/mpool/vapi/mpool_vapi.h"
mca_bmi_ib_component_t mca_bmi_ib_component = { mca_bmi_ib_component_t mca_bmi_ib_component = {
{ {
/* First, the mca_base_component_t struct containing meta information /* First, the mca_base_component_t struct containing meta information
@ -126,6 +128,9 @@ int mca_bmi_ib_component_open(void)
mca_bmi_ib_param_register_int("rr_buf_max", 16); mca_bmi_ib_param_register_int("rr_buf_max", 16);
mca_bmi_ib_component.ib_rr_buf_min = mca_bmi_ib_component.ib_rr_buf_min =
mca_bmi_ib_param_register_int("rr_buf_min", 8); mca_bmi_ib_param_register_int("rr_buf_min", 8);
mca_bmi_ib_component.reg_mru_len =
mca_bmi_ib_param_register_int("reg_mru_len", 16);
mca_bmi_ib_module.super.bmi_exclusivity = mca_bmi_ib_module.super.bmi_exclusivity =
mca_bmi_ib_param_register_int ("exclusivity", 0); mca_bmi_ib_param_register_int ("exclusivity", 0);
mca_bmi_ib_module.super.bmi_eager_limit = mca_bmi_ib_module.super.bmi_eager_limit =
@ -198,6 +203,7 @@ int mca_bmi_ib_component_open(void)
mca_bmi_ib_param_register_int("flags", mca_bmi_ib_param_register_int("flags",
MCA_BMI_FLAGS_RDMA); MCA_BMI_FLAGS_RDMA);
param = mca_base_param_find("mpi", NULL, "leave_pinned"); param = mca_base_param_find("mpi", NULL, "leave_pinned");
mca_base_param_lookup_int(param, &value); mca_base_param_lookup_int(param, &value);
mca_bmi_ib_component.leave_pinned = value; mca_bmi_ib_component.leave_pinned = value;
@ -244,7 +250,7 @@ mca_bmi_base_module_t** mca_bmi_ib_component_init(int *num_bmi_modules,
uint32_t num_hcas; uint32_t num_hcas;
mca_bmi_base_module_t** bmis; mca_bmi_base_module_t** bmis;
uint32_t i,j, length; uint32_t i,j, length;
mca_mpool_base_resources_t hca_pd; struct mca_mpool_base_resources_t hca_pd;
ompi_list_t bmi_list; ompi_list_t bmi_list;
mca_bmi_ib_module_t * ib_bmi; mca_bmi_ib_module_t * ib_bmi;
mca_bmi_base_selected_module_t* ib_selected; mca_bmi_base_selected_module_t* ib_selected;
@ -366,7 +372,7 @@ mca_bmi_base_module_t** mca_bmi_ib_component_init(int *num_bmi_modules,
OBJ_CONSTRUCT(&ib_bmi->repost, ompi_list_t); OBJ_CONSTRUCT(&ib_bmi->repost, ompi_list_t);
OBJ_CONSTRUCT(&ib_bmi->reg_mru_list, ompi_list_t);

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

@ -561,15 +561,6 @@ int mca_bmi_ib_endpoint_send(
rc = mca_bmi_ib_endpoint_post_send(ib_bmi, endpoint, frag); rc = mca_bmi_ib_endpoint_post_send(ib_bmi, endpoint, frag);
/* rc = mca_bmi_ib_post_send(endpoint->endpoint_bmi, endpoint, */
/* &frag->ib_buf, (void*) frag); */
/* while(NULL != (item = ompi_list_remove_first(&ib_bmi->repost))) { */
/* mca_bmi_ib_buffer_repost(ib_bmi->nic, item); */
/* } */
/* break; */
break; break;
} }

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

@ -1,12 +1,12 @@
#include "bmi_ib_frag.h" #include "bmi_ib_frag.h"
#include "mca/common/vapi/vapi_mem_reg.h" #include "mca/common/vapi/vapi_mem_reg.h"
#include "mca/mpool/vapi/mpool_vapi.h"
static void mca_bmi_ib_frag_common_constructor( mca_bmi_ib_frag_t* frag) static void mca_bmi_ib_frag_common_constructor( mca_bmi_ib_frag_t* frag)
{ {
mca_mpool_base_registration_t* mem_hndl = frag->base.super.user_data; mca_mpool_vapi_registration_t* mem_hndl = (mca_mpool_vapi_registration_t*) frag->base.super.user_data;
frag->hdr = (mca_bmi_ib_header_t*) (frag+1); /* initialize the bmi header to point to start at end of frag */ frag->hdr = (mca_bmi_ib_header_t*) (frag+1); /* initialize the bmi header to point to start at end of frag */
#if 0 #if 0
mod = (unsigned long) frag->hdr % MCA_BMI_IB_FRAG_ALIGN; mod = (unsigned long) frag->hdr % MCA_BMI_IB_FRAG_ALIGN;
@ -31,9 +31,6 @@ static void mca_bmi_ib_frag_common_constructor( mca_bmi_ib_frag_t* frag)
frag->sg_entry.lkey = mem_hndl->l_key; frag->sg_entry.lkey = mem_hndl->l_key;
frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->hdr; frag->sg_entry.addr = (VAPI_virt_addr_t) (MT_virt_addr_t) frag->hdr;
frag->base.des_flags = 0; frag->base.des_flags = 0;
if(mca_bmi_ib_component.leave_pinned == MCA_BMI_IB_LEAVE_PINNED) {
frag->base.des_flags |= MCA_BMI_DES_FLAGS_LEAVE_PINNED;
}
} }

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

@ -186,7 +186,7 @@ extern int mca_bmi_self_free(
struct mca_bmi_base_descriptor_t* mca_bmi_self_prepare_src( struct mca_bmi_base_descriptor_t* mca_bmi_self_prepare_src(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size) size_t* size)
@ -252,7 +252,7 @@ struct mca_bmi_base_descriptor_t* mca_bmi_self_prepare_src(
struct mca_bmi_base_descriptor_t* mca_bmi_self_prepare_dst( struct mca_bmi_base_descriptor_t* mca_bmi_self_prepare_dst(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size) size_t* size)

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

@ -776,7 +776,7 @@ extern int mca_bmi_sm_free(
struct mca_bmi_base_descriptor_t* mca_bmi_sm_prepare_src( struct mca_bmi_base_descriptor_t* mca_bmi_sm_prepare_src(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size) size_t* size)

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

@ -300,7 +300,7 @@ extern int mca_bmi_sm_free(
struct mca_bmi_base_descriptor_t* mca_bmi_sm_prepare_src( struct mca_bmi_base_descriptor_t* mca_bmi_sm_prepare_src(
struct mca_bmi_base_module_t* bmi, struct mca_bmi_base_module_t* bmi,
struct mca_bmi_base_endpoint_t* endpoint, struct mca_bmi_base_endpoint_t* endpoint,
struct mca_mpool_base_registration_t* registration, mca_mpool_base_registration_t* registration,
struct ompi_convertor_t* convertor, struct ompi_convertor_t* convertor,
size_t reserve, size_t reserve,
size_t* size size_t* size

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

@ -216,7 +216,7 @@ mca_common_sm_mmap_t* mca_common_sm_mmap_init(size_t size, char *file_name,
void* mca_common_sm_mmap_seg_alloc( void* mca_common_sm_mmap_seg_alloc(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
size_t* size, size_t* size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_common_sm_mmap_t* map = mca_common_sm_mmap; mca_common_sm_mmap_t* map = mca_common_sm_mmap;
mca_common_sm_file_header_t* seg = map->map_seg; mca_common_sm_file_header_t* seg = map->map_seg;

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

@ -22,12 +22,13 @@
#include "class/ompi_object.h" #include "class/ompi_object.h"
#include "class/ompi_list.h" #include "class/ompi_list.h"
#include "include/sys/atomic.h" #include "include/sys/atomic.h"
#include "mca/mpool/mpool.h"
#if defined(c_plusplus) || defined(__cplusplus) #if defined(c_plusplus) || defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
struct mca_mpool_base_module_t; struct mca_mpool_base_module_t;
struct mca_mpool_base_registration_t;
struct mca_common_sm_file_header_t { struct mca_common_sm_file_header_t {
@ -99,7 +100,7 @@ extern mca_common_sm_mmap_t* mca_common_sm_mmap_init(
extern void* mca_common_sm_mmap_seg_alloc( extern void* mca_common_sm_mmap_seg_alloc(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
size_t* size, size_t* size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/* /*
* Instance that is shared between components that use shared memory * Instance that is shared between components that use shared memory

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

@ -26,31 +26,6 @@
extern "C" { extern "C" {
#endif #endif
struct mca_mpool_base_resources_t {
VAPI_hca_hndl_t hca; /* the hca (nic) */
VAPI_pd_hndl_t pd_tag; /* the protection domain */
};
typedef struct mca_mpool_base_resources_t mca_mpool_base_resources_t;
struct mca_mpool_base_registration_t {
VAPI_mr_hndl_t hndl;
/* Memory region handle */
VAPI_lkey_t l_key;
/* Local key to registered memory, needed for
* posting send/recv requests */
VAPI_rkey_t r_key;
/* Remote key to registered memory, need to send this
* to remote processes for incoming RDMA ops */
void * base;
void * bound;
};
typedef struct mca_mpool_base_registration_t mca_mpool_base_registration_t;
#if defined(c_plusplus) || defined(__cplusplus) #if defined(c_plusplus) || defined(__cplusplus)
} }
#endif #endif

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

@ -69,7 +69,7 @@ struct mca_mpool_base_reg_mpool_t
{ {
mca_mpool_base_module_t * mpool; /**< the registered memory pool */ mca_mpool_base_module_t * mpool; /**< the registered memory pool */
void* user_data; /**< user data */ void* user_data; /**< user data */
struct mca_mpool_base_registration_t* mpool_registration; /**< mpool specific info associated w/ registration */ mca_mpool_base_registration_t* mpool_registration; /**< mpool specific info associated w/ registration */
}; };
typedef struct mca_mpool_base_reg_mpool_t mca_mpool_base_reg_mpool_t; typedef struct mca_mpool_base_reg_mpool_t mca_mpool_base_reg_mpool_t;

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

@ -29,6 +29,10 @@ ompi_rb_tree_t mca_mpool_base_tree;
ompi_free_list_t mca_mpool_base_mem_list; ompi_free_list_t mca_mpool_base_mem_list;
ompi_mutex_t mca_mpool_base_tree_lock; ompi_mutex_t mca_mpool_base_tree_lock;
OBJ_CLASS_INSTANCE(mca_mpool_base_registration_t,
ompi_list_item_t,
NULL,
NULL);
/** /**
* Function for the red black tree to compare 2 keys * Function for the red black tree to compare 2 keys
@ -59,9 +63,9 @@ int mca_mpool_base_tree_node_compare(void * key1, void * key2)
} }
int mca_mpool_base_insert(void * addr, size_t size, int mca_mpool_base_insert(void * addr, size_t size,
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void* user_data, void* user_data,
struct mca_mpool_base_registration_t* registration) mca_mpool_base_registration_t* registration)
{ {
ompi_list_item_t *item; ompi_list_item_t *item;
int rc; int rc;
@ -143,7 +147,7 @@ void * mca_mpool_base_alloc(size_t size, ompi_info_t * info)
mca_mpool_base_selected_module_t * no_reg_function = NULL; mca_mpool_base_selected_module_t * no_reg_function = NULL;
mca_mpool_base_selected_module_t ** has_reg_function = (mca_mpool_base_selected_module_t **) mca_mpool_base_selected_module_t ** has_reg_function = (mca_mpool_base_selected_module_t **)
malloc(num_modules * sizeof(mca_mpool_base_module_t *)); malloc(num_modules * sizeof(mca_mpool_base_module_t *));
struct mca_mpool_base_registration_t * registration; mca_mpool_base_registration_t * registration;
void * mem = NULL; void * mem = NULL;
char * key; char * key;
bool match_found; bool match_found;

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

@ -21,9 +21,16 @@
#define MCA_MPOOL_H #define MCA_MPOOL_H
#include "mca/mca.h" #include "mca/mca.h"
#include "info/info.h" #include "info/info.h"
#include "class/ompi_list.h"
struct mca_mpool_base_resources_t; struct mca_mpool_base_resources_t;
struct mca_mpool_base_registration_t;
struct mca_mpool_base_registration_t{
ompi_list_item_t super;
struct mca_mpool_base_module_t *mpool;
};
typedef struct mca_mpool_base_registration_t mca_mpool_base_registration_t;
OBJ_CLASS_DECLARATION(mca_mpool_base_registration_t);
/** /**
* component initialize * component initialize
@ -38,7 +45,7 @@ typedef void* (*mca_mpool_base_module_alloc_fn_t)(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* realloc function typedef * realloc function typedef
@ -47,7 +54,7 @@ typedef void* (*mca_mpool_base_module_realloc_fn_t)(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
void* addr, void* addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* free function typedef * free function typedef
@ -55,7 +62,7 @@ typedef void* (*mca_mpool_base_module_realloc_fn_t)(
typedef void (*mca_mpool_base_module_free_fn_t)( typedef void (*mca_mpool_base_module_free_fn_t)(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
void *addr, void *addr,
struct mca_mpool_base_registration_t* registration); mca_mpool_base_registration_t* registration);
/** /**
* register memory * register memory
@ -64,7 +71,7 @@ typedef int (*mca_mpool_base_module_register_fn_t)(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
void * addr, void * addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* deregister memory * deregister memory
@ -73,7 +80,7 @@ typedef int (*mca_mpool_base_module_deregister_fn_t)(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
void * addr, void * addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t* registration); mca_mpool_base_registration_t* registration);
/** /**
* if appropriate - returns base address of memory pool * if appropriate - returns base address of memory pool
@ -125,6 +132,7 @@ struct mca_mpool_base_module_t {
*/ */
typedef struct mca_mpool_base_module_t mca_mpool_base_module_t; typedef struct mca_mpool_base_module_t mca_mpool_base_module_t;
/** /**
* Function to allocate special memory according to what the user requests in * Function to allocate special memory according to what the user requests in
* the info object. * the info object.
@ -145,7 +153,7 @@ typedef struct mca_mpool_base_module_t mca_mpool_base_module_t;
* @retval pointer to the allocated memory * @retval pointer to the allocated memory
* @retval NULL on failure * @retval NULL on failure
*/ */
OMPI_DECLSPEC void * mca_mpool_base_alloc(size_t size, ompi_info_t * info); OMPI_DECLSPEC void * mca_mpool_base_alloc(size_t size, struct ompi_info_t * info);
/** /**
* Function to free memory previously allocated by mca_mpool_base_alloc * Function to free memory previously allocated by mca_mpool_base_alloc
@ -186,7 +194,7 @@ OMPI_DECLSPEC int mca_mpool_base_insert(
size_t size, size_t size,
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void* user_in, void* user_in,
struct mca_mpool_base_registration_t* registration); mca_mpool_base_registration_t* registration);
OMPI_DECLSPEC int mca_mpool_base_remove(void * base); OMPI_DECLSPEC int mca_mpool_base_remove(void * base);

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

@ -66,7 +66,7 @@ void* mca_mpool_sm_alloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* realloc function typedef * realloc function typedef
@ -75,7 +75,7 @@ void* mca_mpool_sm_realloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void* addr, void* addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* free function typedef * free function typedef
@ -83,7 +83,7 @@ void* mca_mpool_sm_realloc(
void mca_mpool_sm_free( void mca_mpool_sm_free(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void * addr, void * addr,
struct mca_mpool_base_registration_t* registration); mca_mpool_base_registration_t* registration);
#if defined(c_plusplus) || defined(__cplusplus) #if defined(c_plusplus) || defined(__cplusplus)

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

@ -52,7 +52,7 @@ void* mca_mpool_sm_alloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_mpool_sm_module_t* mpool_sm = (mca_mpool_sm_module_t*)mpool; mca_mpool_sm_module_t* mpool_sm = (mca_mpool_sm_module_t*)mpool;
return mpool_sm->sm_allocator->alc_alloc(mpool_sm->sm_allocator, size, align, registration); return mpool_sm->sm_allocator->alc_alloc(mpool_sm->sm_allocator, size, align, registration);
@ -65,7 +65,7 @@ void* mca_mpool_sm_realloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void* addr, void* addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_mpool_sm_module_t* mpool_sm = (mca_mpool_sm_module_t*)mpool; mca_mpool_sm_module_t* mpool_sm = (mca_mpool_sm_module_t*)mpool;
return mpool_sm->sm_allocator->alc_realloc(mpool_sm->sm_allocator, addr, size, registration); return mpool_sm->sm_allocator->alc_realloc(mpool_sm->sm_allocator, addr, size, registration);
@ -75,7 +75,7 @@ void* mca_mpool_sm_realloc(
* free function * free function
*/ */
void mca_mpool_sm_free(mca_mpool_base_module_t* mpool, void * addr, void mca_mpool_sm_free(mca_mpool_base_module_t* mpool, void * addr,
struct mca_mpool_base_registration_t* registration) mca_mpool_base_registration_t* registration)
{ {
mca_mpool_sm_module_t* mpool_sm = (mca_mpool_sm_module_t*)mpool; mca_mpool_sm_module_t* mpool_sm = (mca_mpool_sm_module_t*)mpool;
mpool_sm->sm_allocator->alc_free(mpool_sm->sm_allocator, addr); mpool_sm->sm_allocator->alc_free(mpool_sm->sm_allocator, addr);

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

@ -52,12 +52,45 @@ typedef struct mca_mpool_vapi_component_t mca_mpool_vapi_component_t;
OMPI_COMP_EXPORT extern mca_mpool_vapi_component_t mca_mpool_vapi_component; OMPI_COMP_EXPORT extern mca_mpool_vapi_component_t mca_mpool_vapi_component;
struct mca_mpool_base_resources_t {
VAPI_hca_hndl_t hca; /* the hca (nic) */
VAPI_pd_hndl_t pd_tag; /* the protection domain */
};
typedef struct mca_mpool_base_resources_t mca_mpool_base_resources_t;
struct mca_mpool_vapi_module_t { struct mca_mpool_vapi_module_t {
mca_mpool_base_module_t super; mca_mpool_base_module_t super;
mca_allocator_base_module_t * vapi_allocator; mca_allocator_base_module_t * vapi_allocator;
mca_mpool_base_resources_t hca_pd; struct mca_mpool_base_resources_t hca_pd;
}; typedef struct mca_mpool_vapi_module_t mca_mpool_vapi_module_t; }; typedef struct mca_mpool_vapi_module_t mca_mpool_vapi_module_t;
struct mca_mpool_vapi_registration_t {
mca_mpool_base_registration_t base_reg;
VAPI_mr_hndl_t hndl;
/* Memory region handle */
VAPI_lkey_t l_key;
/* Local key to registered memory, needed for
* posting send/recv requests */
VAPI_rkey_t r_key;
/* Remote key to registered memory, need to send this
* to remote processes for incoming RDMA ops */
void * base;
void * bound;
};
typedef struct mca_mpool_vapi_registration_t mca_mpool_vapi_registration_t;
OBJ_CLASS_DECLARATION(mca_mpool_vapi_registration_t);
/* /*
* Initializes the mpool module. * Initializes the mpool module.
*/ */
@ -76,7 +109,7 @@ void* mca_mpool_vapi_alloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* realloc function typedef * realloc function typedef
@ -85,7 +118,7 @@ void* mca_mpool_vapi_realloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void* addr, void* addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
/** /**
* register function typedef * register function typedef
@ -94,26 +127,26 @@ int mca_mpool_vapi_register(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void *addr, void *addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
int mca_mpool_vapi_deregister( int mca_mpool_vapi_deregister(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void *addr, void *addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t* ); mca_mpool_base_registration_t* );
/** /**
* free function typedef * free function typedef
*/ */
void mca_mpool_vapi_free(mca_mpool_base_module_t* mpool, void mca_mpool_vapi_free(mca_mpool_base_module_t* mpool,
void * addr, void * addr,
struct mca_mpool_base_registration_t* registration); mca_mpool_base_registration_t* registration);
void* mca_common_vapi_segment_alloc( void* mca_common_vapi_segment_alloc(
struct mca_mpool_base_module_t* module, struct mca_mpool_base_module_t* module,
size_t* size, size_t* size,
struct mca_mpool_base_registration_t** registration); mca_mpool_base_registration_t** registration);
#if defined(c_plusplus) || defined(__cplusplus) #if defined(c_plusplus) || defined(__cplusplus)
} }

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

@ -61,6 +61,38 @@ mca_mpool_vapi_component_t mca_mpool_vapi_component = {
} }
}; };
static void mca_mpool_vapi_registration_constructor( mca_mpool_vapi_registration_t * registration )
{
memset(registration, 0, sizeof(mca_mpool_base_registration_t));
}
static void mca_mpool_vapi_registration_destructor( mca_mpool_vapi_registration_t * registration )
{
mca_mpool_base_remove((void*) registration);
registration->base_reg.mpool->mpool_deregister(
registration->base_reg.mpool,
registration->base,
0,
(mca_mpool_base_registration_t*) registration);
registration->base = NULL;
registration->bound = NULL;
}
OBJ_CLASS_INSTANCE(
mca_mpool_vapi_registration_t,
mca_mpool_base_registration_t,
mca_mpool_vapi_registration_constructor,
mca_mpool_vapi_registration_destructor
);
static char* mca_mpool_vapi_param_register_string( static char* mca_mpool_vapi_param_register_string(
const char* param_name, const char* param_name,
const char* default_value) const char* default_value)
@ -91,7 +123,7 @@ static int mca_mpool_vapi_open(void)
void* mca_common_vapi_segment_alloc( void* mca_common_vapi_segment_alloc(
struct mca_mpool_base_module_t* mpool, struct mca_mpool_base_module_t* mpool,
size_t* size, size_t* size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
void* addr_malloc = (void*)malloc((*size) + mca_mpool_vapi_component.page_size); void* addr_malloc = (void*)malloc((*size) + mca_mpool_vapi_component.page_size);
void* addr = (void*) ALIGN_ADDR(addr_malloc, mca_mpool_vapi_component.page_size_log); void* addr = (void*) ALIGN_ADDR(addr_malloc, mca_mpool_vapi_component.page_size_log);

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

@ -44,7 +44,7 @@ void* mca_mpool_vapi_alloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
size_t size, size_t size,
size_t align, size_t align,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_mpool_vapi_module_t* mpool_vapi = (mca_mpool_vapi_module_t*)mpool; mca_mpool_vapi_module_t* mpool_vapi = (mca_mpool_vapi_module_t*)mpool;
return mpool_vapi->vapi_allocator->alc_alloc(mpool_vapi->vapi_allocator, size, align, registration); return mpool_vapi->vapi_allocator->alc_alloc(mpool_vapi->vapi_allocator, size, align, registration);
@ -54,22 +54,27 @@ void* mca_mpool_vapi_alloc(
/* /*
* register memory * register memory
*/ */
int mca_mpool_vapi_register(mca_mpool_base_module_t* mpool, void *addr, size_t size, int mca_mpool_vapi_register(mca_mpool_base_module_t* mpool,
struct mca_mpool_base_registration_t** registration){ void *addr,
size_t size,
mca_mpool_base_registration_t** registration){
mca_mpool_vapi_module_t * mpool_module = (mca_mpool_vapi_module_t*) mpool; mca_mpool_vapi_module_t * mpool_module = (mca_mpool_vapi_module_t*) mpool;
mca_mpool_vapi_registration_t * vapi_reg;
VAPI_mrw_t mr_in, mr_out; VAPI_mrw_t mr_in, mr_out;
VAPI_ret_t ret; VAPI_ret_t ret;
mca_mpool_base_registration_t* mem_hndl;
memset(&mr_in, 0, sizeof(VAPI_mrw_t)); memset(&mr_in, 0, sizeof(VAPI_mrw_t));
memset(&mr_out, 0, sizeof(VAPI_mrw_t)); memset(&mr_out, 0, sizeof(VAPI_mrw_t));
*registration = (mca_mpool_base_registration_t*) OBJ_NEW(mca_mpool_vapi_registration_t); /* (void*) malloc(sizeof(mca_mpool_base_registration_t)); */
*registration = (void*) malloc(sizeof(mca_mpool_base_registration_t)); vapi_reg = (mca_mpool_vapi_registration_t*) *registration;
mem_hndl = (mca_mpool_base_registration_t*) *registration; vapi_reg->base_reg.mpool = mpool;
memset(mem_hndl, 0, sizeof(mca_mpool_base_registration_t*));
mem_hndl->hndl = VAPI_INVAL_HNDL;
vapi_reg->hndl = VAPI_INVAL_HNDL;
mr_in.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE; mr_in.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE;
@ -84,7 +89,7 @@ int mca_mpool_vapi_register(mca_mpool_base_module_t* mpool, void *addr, size_t s
ret = VAPI_register_mr( ret = VAPI_register_mr(
mpool_module->hca_pd.hca, mpool_module->hca_pd.hca,
&mr_in, &mr_in,
&mem_hndl->hndl, &vapi_reg->hndl,
&mr_out &mr_out
); );
@ -93,10 +98,10 @@ int mca_mpool_vapi_register(mca_mpool_base_module_t* mpool, void *addr, size_t s
return OMPI_ERROR; return OMPI_ERROR;
} }
mem_hndl->l_key = mr_out.l_key; vapi_reg->l_key = mr_out.l_key;
mem_hndl->r_key = mr_out.r_key; vapi_reg->r_key = mr_out.r_key;
mem_hndl->base = addr; vapi_reg->base = addr;
mem_hndl->bound = (void*) ((char*) addr + size - 1); vapi_reg->bound = (void*) ((char*) addr + size - 1);
return OMPI_SUCCESS; return OMPI_SUCCESS;
} }
@ -106,14 +111,15 @@ int mca_mpool_vapi_register(mca_mpool_base_module_t* mpool, void *addr, size_t s
* deregister memory * deregister memory
*/ */
int mca_mpool_vapi_deregister(mca_mpool_base_module_t* mpool, void *addr, size_t size, int mca_mpool_vapi_deregister(mca_mpool_base_module_t* mpool, void *addr, size_t size,
struct mca_mpool_base_registration_t* registration){ mca_mpool_base_registration_t* registration){
VAPI_ret_t ret; VAPI_ret_t ret;
mca_mpool_vapi_module_t * mpool_vapi = (mca_mpool_vapi_module_t*) mpool; mca_mpool_vapi_module_t * mpool_vapi = (mca_mpool_vapi_module_t*) mpool;
mca_mpool_vapi_registration_t * vapi_reg;
vapi_reg = (mca_mpool_vapi_registration_t*) registration;
ret = VAPI_deregister_mr( ret = VAPI_deregister_mr(
mpool_vapi->hca_pd.hca, mpool_vapi->hca_pd.hca,
registration->hndl vapi_reg->hndl
); );
if(VAPI_OK != ret){ if(VAPI_OK != ret){
@ -131,7 +137,7 @@ void* mca_mpool_vapi_realloc(
mca_mpool_base_module_t* mpool, mca_mpool_base_module_t* mpool,
void* addr, void* addr,
size_t size, size_t size,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
mca_mpool_vapi_module_t* mpool_vapi = (mca_mpool_vapi_module_t*)mpool; mca_mpool_vapi_module_t* mpool_vapi = (mca_mpool_vapi_module_t*)mpool;
return mpool_vapi->vapi_allocator->alc_realloc( mpool_vapi->vapi_allocator, addr, size, registration); return mpool_vapi->vapi_allocator->alc_realloc( mpool_vapi->vapi_allocator, addr, size, registration);
@ -141,7 +147,7 @@ void* mca_mpool_vapi_realloc(
* free function * free function
*/ */
void mca_mpool_vapi_free(mca_mpool_base_module_t* mpool, void * addr, void mca_mpool_vapi_free(mca_mpool_base_module_t* mpool, void * addr,
struct mca_mpool_base_registration_t* registration) mca_mpool_base_registration_t* registration)
{ {
mca_mpool_vapi_module_t* mpool_vapi = (mca_mpool_vapi_module_t*)mpool; mca_mpool_vapi_module_t* mpool_vapi = (mca_mpool_vapi_module_t*)mpool;

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

@ -24,7 +24,9 @@
#include "mca/pml/base/pml_base_request.h" #include "mca/pml/base/pml_base_request.h"
#include "mca/pml/base/pml_base_sendreq.h" #include "mca/pml/base/pml_base_sendreq.h"
#include "mca/pml/base/pml_base_bsend.h" #include "mca/pml/base/pml_base_bsend.h"
#include "mca/mpool/mpool.h"
static ompi_mutex_t mca_pml_bsend_mutex; /* lock for thread safety */ static ompi_mutex_t mca_pml_bsend_mutex; /* lock for thread safety */
static ompi_condition_t mca_pml_bsend_condition; /* condition variable to block on detach */ static ompi_condition_t mca_pml_bsend_condition; /* condition variable to block on detach */
static mca_allocator_base_component_t* mca_pml_bsend_allocator_component; static mca_allocator_base_component_t* mca_pml_bsend_allocator_component;
@ -45,7 +47,7 @@ static int32_t mca_pml_bsend_init = 0;
static void* mca_pml_bsend_alloc_segment( static void* mca_pml_bsend_alloc_segment(
struct mca_mpool_base_module_t* module, struct mca_mpool_base_module_t* module,
size_t* size_inout, size_t* size_inout,
struct mca_mpool_base_registration_t** registration) mca_mpool_base_registration_t** registration)
{ {
void *addr; void *addr;
size_t size = *size_inout; size_t size = *size_inout;

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

@ -18,6 +18,7 @@
#include "mca/pml/pml.h" #include "mca/pml/pml.h"
#include "mca/bmi/bmi.h" #include "mca/bmi/bmi.h"
#include "mca/mpool/mpool.h"
#include "pml_ob1_comm.h" #include "pml_ob1_comm.h"
#include "pml_ob1_recvreq.h" #include "pml_ob1_recvreq.h"
#include "pml_ob1_recvfrag.h" #include "pml_ob1_recvfrag.h"
@ -388,7 +389,7 @@ void mca_pml_ob1_recv_request_schedule(mca_pml_ob1_recv_request_t* recvreq)
recvreq->pin2[recvreq->pin_index] = get_profiler_timestamp(); recvreq->pin2[recvreq->pin_index] = get_profiler_timestamp();
#endif #endif
} else { } else {
struct mca_mpool_base_registration_t * reg; mca_mpool_base_registration_t * reg;
size = bytes_remaining; size = bytes_remaining;
/* prepare a descriptor for RDMA */ /* prepare a descriptor for RDMA */

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

@ -23,6 +23,7 @@
#include "mca/pml/pml.h" #include "mca/pml/pml.h"
#include "mca/bmi/bmi.h" #include "mca/bmi/bmi.h"
#include "mca/errmgr/errmgr.h" #include "mca/errmgr/errmgr.h"
#include "mca/mpool/mpool.h"
#include "pml_ob1.h" #include "pml_ob1.h"
#include "pml_ob1_hdr.h" #include "pml_ob1_hdr.h"
#include "pml_ob1_proc.h" #include "pml_ob1_proc.h"
@ -593,7 +594,7 @@ void mca_pml_ob1_send_request_put(
{ {
mca_pml_ob1_proc_t* proc = sendreq->req_proc; mca_pml_ob1_proc_t* proc = sendreq->req_proc;
mca_pml_ob1_endpoint_t* ep = mca_pml_ob1_ep_array_find(&proc->bmi_rdma,bmi); mca_pml_ob1_endpoint_t* ep = mca_pml_ob1_ep_array_find(&proc->bmi_rdma,bmi);
struct mca_mpool_base_registration_t* reg = NULL; mca_mpool_base_registration_t* reg = NULL;
mca_bmi_base_descriptor_t* des; mca_bmi_base_descriptor_t* des;
mca_pml_ob1_rdma_frag_t* frag; mca_pml_ob1_rdma_frag_t* frag;
size_t offset = hdr->hdr_rdma_offset; size_t offset = hdr->hdr_rdma_offset;

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

@ -795,7 +795,8 @@ int mca_ptl_sm_send(
/* if needed, pack data in payload buffer */ /* if needed, pack data in payload buffer */
if( 0 < size ) { if( 0 < size ) {
ompi_convertor_t *convertor; ompi_convertor_t *convertor;
unsigned int iov_count, max_data; unsigned int iov_count;
size_t max_data;
int free_after=0; int free_after=0;
struct iovec address; struct iovec address;
@ -809,7 +810,7 @@ int mca_ptl_sm_send(
iov_count=1; iov_count=1;
max_data=address.iov_len; max_data=address.iov_len;
return_status=ompi_convertor_pack(convertor,&address,&iov_count, return_status=ompi_convertor_pack(convertor,&address,&iov_count,
&max_data, &free_after); &max_data, &free_after);
if( 0 > return_status ) { if( 0 > return_status ) {
return OMPI_ERROR; return OMPI_ERROR;
} }
@ -913,7 +914,8 @@ int mca_ptl_sm_send_continue(
mca_ptl_sm_second_frag_t *send_frag; mca_ptl_sm_second_frag_t *send_frag;
ompi_convertor_t *convertor; ompi_convertor_t *convertor;
struct iovec address; struct iovec address;
unsigned int max_data,iov_count; unsigned int iov_count;
size_t max_data;
/* cast to shared memory send descriptor */ /* cast to shared memory send descriptor */
sm_request=(mca_ptl_sm_send_request_t *)sendreq; sm_request=(mca_ptl_sm_send_request_t *)sendreq;

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

@ -71,9 +71,9 @@ void mca_ptl_sm_matched(
mca_ptl_sm_frag_t *sm_frag_desc; mca_ptl_sm_frag_t *sm_frag_desc;
struct iovec iov; struct iovec iov;
ompi_convertor_t frag_convertor; ompi_convertor_t frag_convertor;
ompi_proc_t *proc;
int free_after,my_local_smp_rank,peer_local_smp_rank, return_status; int free_after,my_local_smp_rank,peer_local_smp_rank, return_status;
unsigned int iov_count, max_data; unsigned int iov_count;
size_t max_data;
ompi_fifo_t *send_fifo; ompi_fifo_t *send_fifo;
/* copy data from shared memory buffer to user buffer */ /* copy data from shared memory buffer to user buffer */
@ -106,7 +106,6 @@ void mca_ptl_sm_matched(
iov_count = 1; iov_count = 1;
max_data = iov.iov_len; max_data = iov.iov_len;
ompi_convertor_unpack( &frag_convertor, &iov, &iov_count, &max_data, &free_after ); ompi_convertor_unpack( &frag_convertor, &iov, &iov_count, &max_data, &free_after );
OBJ_DESTRUCT(&frag_convertor);
} }
/* update receive request information */ /* update receive request information */