e361bcb64c
1. The send path get shorter. The BTL is allowed to return > 0 to specify that the descriptor was pushed to the networks, and that the memory attached to it is available again for the upper layer. The MCA_BTL_DES_SEND_ALWAYS_CALLBACK flag can be used by the PML to force the BTL to always trigger the callback. Unmodified BTL will continue to work as expected, as they will return OMPI_SUCCESS which force the PML to have exactly the same behavior as before. Some BTLs have been modified: self, sm, tcp, mx. 2. Add send immediate interface to BTL. The idea is to have a mechanism of allowing the BTL to take advantage of send optimizations such as the ability to deliver data "inline". Some network APIs such as Portals allow data to be sent using a "thin" event without packing data into a memory descriptor. This interface change allows the BTL to use such capabilities and allows for other optimizations in the future. All existing BTLs except for Portals and sm have this interface set to NULL. This commit was SVN r18551.
70 строки
2.1 KiB
C
70 строки
2.1 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2005 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$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
#include "ompi_config.h"
|
|
#include "btl_sm_frag.h"
|
|
|
|
|
|
static inline void mca_btl_sm_frag_common_constructor(mca_btl_sm_frag_t* frag)
|
|
{
|
|
frag->hdr = (mca_btl_sm_hdr_t*)frag->base.super.ptr;
|
|
if(frag->hdr != NULL) {
|
|
frag->hdr->frag = (mca_btl_sm_frag_t*)((uintptr_t)frag |
|
|
MCA_BTL_SM_FRAG_ACK);
|
|
frag->segment.seg_addr.pval = ((char*)frag->hdr) +
|
|
sizeof(mca_btl_sm_hdr_t);
|
|
}
|
|
frag->segment.seg_len = frag->size;
|
|
frag->base.des_src = &frag->segment;
|
|
frag->base.des_src_cnt = 1;
|
|
frag->base.des_dst = &frag->segment;
|
|
frag->base.des_dst_cnt = 1;
|
|
frag->base.des_flags = 0;
|
|
}
|
|
|
|
static void mca_btl_sm_frag1_constructor(mca_btl_sm_frag_t* frag)
|
|
{
|
|
frag->size = mca_btl_sm_component.eager_limit;
|
|
frag->my_list = &mca_btl_sm_component.sm_frags_eager;
|
|
mca_btl_sm_frag_common_constructor(frag);
|
|
}
|
|
|
|
static void mca_btl_sm_frag2_constructor(mca_btl_sm_frag_t* frag)
|
|
{
|
|
frag->size = mca_btl_sm_component.max_frag_size;
|
|
frag->my_list = &mca_btl_sm_component.sm_frags_max;
|
|
mca_btl_sm_frag_common_constructor(frag);
|
|
}
|
|
|
|
static void mca_btl_sm_frag_destructor(mca_btl_sm_frag_t* frag)
|
|
{
|
|
}
|
|
|
|
|
|
OBJ_CLASS_INSTANCE(
|
|
mca_btl_sm_frag1_t,
|
|
mca_btl_base_descriptor_t,
|
|
mca_btl_sm_frag1_constructor,
|
|
mca_btl_sm_frag_destructor);
|
|
|
|
OBJ_CLASS_INSTANCE(
|
|
mca_btl_sm_frag2_t,
|
|
mca_btl_base_descriptor_t,
|
|
mca_btl_sm_frag2_constructor,
|
|
mca_btl_sm_frag_destructor);
|
|
|