119 строки
4.2 KiB
C
119 строки
4.2 KiB
C
|
/*
|
||
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||
|
* University Research and Technology
|
||
|
* Corporation. All rights reserved.
|
||
|
* Copyright (c) 2004-2006 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) 2010 Oracle and/or its affiliates. All rights reserved.
|
||
|
* $COPYRIGHT$
|
||
|
*
|
||
|
* Additional copyrights may follow
|
||
|
*
|
||
|
* $HEADER$
|
||
|
*/
|
||
|
|
||
|
|
||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||
|
|
||
|
#include "ompi_config.h"
|
||
|
#include "ompi/constants.h"
|
||
|
#include "ompi/mca/pml/pml.h"
|
||
|
#include "ompi/mca/bml/bml.h"
|
||
|
#include "ompi/mca/mpool/mpool.h"
|
||
|
#include "pml_bfo.h"
|
||
|
#include "pml_bfo_rdma.h"
|
||
|
|
||
|
/* Use this registration if no registration needed for a BTL instead of NULL.
|
||
|
* This will help other code to distinguish case when memory is not registered
|
||
|
* from case when registration is not needed */
|
||
|
static mca_mpool_base_registration_t pml_bfo_dummy_reg;
|
||
|
|
||
|
/*
|
||
|
* Check to see if memory is registered or can be registered. Build a
|
||
|
* set of registrations on the request.
|
||
|
*/
|
||
|
|
||
|
size_t mca_pml_bfo_rdma_btls(
|
||
|
mca_bml_base_endpoint_t* bml_endpoint,
|
||
|
unsigned char* base,
|
||
|
size_t size,
|
||
|
mca_pml_bfo_com_btl_t* rdma_btls)
|
||
|
{
|
||
|
int num_btls = mca_bml_base_btl_array_get_size(&bml_endpoint->btl_rdma);
|
||
|
double weight_total = 0;
|
||
|
int num_btls_used = 0, n;
|
||
|
|
||
|
/* shortcut when there are no rdma capable btls */
|
||
|
if(num_btls == 0) {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/* check to see if memory is registered */
|
||
|
for(n = 0; n < num_btls && num_btls_used < mca_pml_bfo.max_rdma_per_request;
|
||
|
n++) {
|
||
|
mca_bml_base_btl_t* bml_btl =
|
||
|
mca_bml_base_btl_array_get_index(&bml_endpoint->btl_rdma,
|
||
|
(bml_endpoint->btl_rdma_index + n) % num_btls);
|
||
|
mca_mpool_base_registration_t* reg = &pml_bfo_dummy_reg;
|
||
|
mca_mpool_base_module_t *btl_mpool = bml_btl->btl->btl_mpool;
|
||
|
|
||
|
if( NULL != btl_mpool ) {
|
||
|
if(!mca_pml_bfo.leave_pinned) {
|
||
|
/* look through existing registrations */
|
||
|
btl_mpool->mpool_find(btl_mpool, base, size, ®);
|
||
|
} else {
|
||
|
/* register the memory */
|
||
|
btl_mpool->mpool_register(btl_mpool, base, size, 0, ®);
|
||
|
}
|
||
|
|
||
|
if(NULL == reg)
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
rdma_btls[num_btls_used].bml_btl = bml_btl;
|
||
|
rdma_btls[num_btls_used].btl_reg = reg;
|
||
|
weight_total += bml_btl->btl_weight;
|
||
|
num_btls_used++;
|
||
|
}
|
||
|
|
||
|
/* if we don't use leave_pinned and all BTLs that already have this memory
|
||
|
* registered amount to less then half of available bandwidth - fall back to
|
||
|
* pipeline protocol */
|
||
|
if(0 == num_btls_used || (!mca_pml_bfo.leave_pinned && weight_total < 0.5))
|
||
|
return 0;
|
||
|
|
||
|
mca_pml_bfo_calc_weighted_length(rdma_btls, num_btls_used, size,
|
||
|
weight_total);
|
||
|
|
||
|
bml_endpoint->btl_rdma_index = (bml_endpoint->btl_rdma_index + 1) % num_btls;
|
||
|
return num_btls_used;
|
||
|
}
|
||
|
|
||
|
size_t mca_pml_bfo_rdma_pipeline_btls( mca_bml_base_endpoint_t* bml_endpoint,
|
||
|
size_t size,
|
||
|
mca_pml_bfo_com_btl_t* rdma_btls )
|
||
|
{
|
||
|
int i, num_btls = mca_bml_base_btl_array_get_size(&bml_endpoint->btl_rdma);
|
||
|
double weight_total = 0;
|
||
|
|
||
|
for(i = 0; i < num_btls && i < mca_pml_bfo.max_rdma_per_request; i++) {
|
||
|
rdma_btls[i].bml_btl =
|
||
|
mca_bml_base_btl_array_get_next(&bml_endpoint->btl_rdma);
|
||
|
if(NULL != rdma_btls[i].bml_btl->btl->btl_mpool)
|
||
|
rdma_btls[i].btl_reg = NULL;
|
||
|
else
|
||
|
rdma_btls[i].btl_reg = &pml_bfo_dummy_reg;
|
||
|
|
||
|
weight_total += rdma_btls[i].bml_btl->btl_weight;
|
||
|
}
|
||
|
|
||
|
mca_pml_bfo_calc_weighted_length(rdma_btls, i, size, weight_total);
|
||
|
|
||
|
return i;
|
||
|
}
|