12 #if !defined(MCA_BTL_VADER_FBOX_H)
13 #define MCA_BTL_VADER_FBOX_H
24 enum {MCA_BTL_VADER_FBOX_FREE = 0xfe, MCA_BTL_VADER_FBOX_RESERVED = 0xff};
26 #define MCA_BTL_VADER_FBOX_OUT_PTR(peer_smp_rank, fbox) \
27 (mca_btl_vader_component.vader_fboxes_out[peer_smp_rank] + FBOX_SIZE * (fbox))
29 #define MCA_BTL_VADER_FBOX_IN_PTR(peer_smp_rank, fbox) \
30 (mca_btl_vader_component.vader_fboxes_in[peer_smp_rank] + FBOX_SIZE * (fbox))
32 static inline unsigned char *mca_btl_vader_reserve_fbox (
int peer_smp_rank,
size_t size)
35 unsigned char *fbox = MCA_BTL_VADER_FBOX_OUT_PTR(peer_smp_rank, next_fbox);
38 if (OPAL_UNLIKELY(size > MAX_MSG || fbox[0] != MCA_BTL_VADER_FBOX_FREE)) {
46 fbox[0] = MCA_BTL_VADER_FBOX_RESERVED;
51 static inline void mca_btl_vader_fbox_send (
unsigned char *fbox,
unsigned char tag,
size_t size)
62 void *header,
size_t header_size,
63 void *payload,
size_t payload_size)
67 fbox = mca_btl_vader_reserve_fbox(endpoint->
peer_smp_rank, header_size + payload_size);
68 if (OPAL_UNLIKELY(NULL == fbox)) {
72 memcpy (fbox, header, header_size);
73 if (OPAL_UNLIKELY(payload)) {
75 memcpy (fbox + header_size, payload, payload_size);
79 mca_btl_vader_fbox_send (fbox, tag, header_size + payload_size);
85 static inline void mca_btl_vader_check_fboxes (
void)
87 int my_smp_rank = mca_btl_vader_component.
my_smp_rank;
90 unsigned char size, tag;
93 for (i = 0 ; i < mca_btl_vader_component.
num_smp_procs ; ++i) {
95 unsigned char *fbox = MCA_BTL_VADER_FBOX_IN_PTR(i, next_fbox);
97 if (my_smp_rank == i) {
102 while (0xfe != ((size = fbox[0]) & 0xfe)) {
107 reg = mca_btl_base_active_message_trigger + tag;
109 frag.segment.
seg_addr.pval = fbox + 2;
112 frag.base.
des_dst = &frag.segment;
114 reg->cbfunc(&mca_btl_vader.
super, tag, &(frag.base), reg->cbdata);
116 fbox[0] = MCA_BTL_VADER_FBOX_FREE;
118 next_fbox = next_fbox == LAST_FBOX ? 0 : next_fbox + 1;
119 fbox = MCA_BTL_VADER_FBOX_IN_PTR(i, next_fbox);
size_t des_dst_cnt
number of destination segments
Definition: btl.h:280
void opal_atomic_rmb(void)
Read memory barrier.
int32_t num_smp_procs
current number of smp procs on this host
Definition: btl_vader.h:110
unsigned char * vader_next_fbox_out
indices of fast boxes to write
Definition: btl_vader.h:122
ompi_ptr_t seg_addr
Address of the memory.
Definition: btl.h:238
int peer_smp_rank
My peer's SMP process rank.
Definition: btl_sm_endpoint.h:34
unsigned char * vader_next_fbox_in
indices of fast boxes to poll
Definition: btl_vader.h:121
mca_btl_base_module_t super
base BTL interface
Definition: btl_vader.h:133
int32_t my_smp_rank
My SMP process rank.
Definition: btl_vader.h:111
uint32_t seg_len
Length in bytes.
Definition: btl.h:240
shared memory send fragment derived type.
Definition: btl_vader_frag.h:47
State of ELAN endpoint connection.
Definition: btl_elan_endpoint.h:33
void opal_atomic_wmb(void)
Write memory barrier.
mca_btl_base_segment_t * des_dst
destination segments
Definition: btl.h:279