![George Bosilca](/assets/img/avatar_default.png)
- the registration array is now global instead of one by BTL. - each framework have to declare the entries in the registration array reserved. Then it have to define the internal way of sharing (or not) these entries between all components. As an example, the PML will not share as there is only one active PML at any moment, while the BTLs will have to. The tag is 8 bits long, the first 3 are reserved for the framework while the remaining 5 are use internally by each framework. - The registration function is optional. If a BTL do not provide such function, nothing happens. However, in the case where such function is provided in the BTL structure, it will be called by the BML, when a tag is registered. Now, it's time for the second step... Converting OB1 from a switch based PML to an active message one. This commit was SVN r17140.
96 строки
3.5 KiB
C
96 строки
3.5 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$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#ifndef MCA_BTL_MX_FRAG_H
|
|
#define MCA_BTL_MX_FRAG_H
|
|
|
|
|
|
#define MCA_BTL_MX_FRAG_ALIGN (8)
|
|
|
|
#include "ompi_config.h"
|
|
#include "opal/class/opal_list.h"
|
|
#include "ompi/class/ompi_free_list.h"
|
|
#include "btl_mx.h"
|
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define MCA_BTL_MX_SEND 0x01
|
|
#define MCA_BTL_MX_RECV 0x02
|
|
|
|
/**
|
|
* MX send framxent derived type.
|
|
*/
|
|
struct mca_btl_mx_frag_t {
|
|
mca_btl_base_descriptor_t base;
|
|
mca_btl_base_segment_t segment[2];
|
|
struct mca_btl_base_endpoint_t* endpoint;
|
|
uint8_t type;
|
|
mx_request_t mx_request;
|
|
size_t size;
|
|
ompi_free_list_t* mx_frag_list;
|
|
};
|
|
typedef struct mca_btl_mx_frag_t mca_btl_mx_frag_t;
|
|
OBJ_CLASS_DECLARATION(mca_btl_mx_frag_t);
|
|
|
|
typedef struct mca_btl_mx_frag_t mca_btl_mx_frag_eager_t;
|
|
|
|
OBJ_CLASS_DECLARATION(mca_btl_mx_frag_eager_t);
|
|
|
|
typedef struct mca_btl_mx_frag_t mca_btl_mx_frag_max_t;
|
|
|
|
OBJ_CLASS_DECLARATION(mca_btl_mx_frag_max_t);
|
|
|
|
typedef struct mca_btl_mx_frag_t mca_btl_mx_frag_user_t;
|
|
|
|
OBJ_CLASS_DECLARATION(mca_btl_mx_frag_user_t);
|
|
|
|
/*
|
|
* Macros to allocate/return descriptors from module specific
|
|
* free list(s).
|
|
*/
|
|
|
|
#define MCA_BTL_MX_FRAG_ALLOC_EAGER(btl, frag, rc) \
|
|
{ \
|
|
ompi_free_list_item_t *item; \
|
|
OMPI_FREE_LIST_WAIT( &mca_btl_mx_component.mx_send_eager_frags, item, rc); \
|
|
frag = (mca_btl_mx_frag_t*) item; \
|
|
frag->mx_frag_list = &(mca_btl_mx_component.mx_send_eager_frags); \
|
|
frag->segment[0].seg_addr.pval = (void*)(frag+1); \
|
|
}
|
|
|
|
#define MCA_BTL_MX_FRAG_ALLOC_USER(btl, frag, rc) \
|
|
{ \
|
|
ompi_free_list_item_t *item; \
|
|
OMPI_FREE_LIST_WAIT( &mca_btl_mx_component.mx_send_user_frags, item, rc); \
|
|
frag = (mca_btl_mx_frag_t*) item; \
|
|
frag->mx_frag_list = &(mca_btl_mx_component.mx_send_user_frags); \
|
|
}
|
|
|
|
#define MCA_BTL_MX_FRAG_RETURN(btl, frag) \
|
|
{ \
|
|
/*opal_output( 0, "return item to %p\n", frag->mx_frag_list );*/ \
|
|
OMPI_FREE_LIST_RETURN( frag->mx_frag_list, (ompi_free_list_item_t*)(frag)); \
|
|
}
|
|
|
|
#if defined(c_plusplus) || defined(__cplusplus)
|
|
}
|
|
#endif
|
|
#endif
|