static int run_pp_c(int msize, int loops) { int cnt; assert(msize <= MAX_MSIZE); ELAN_EVENT *event = NULL; for (cnt = 0; cnt < loops; cnt++) { unsigned len = msize; s_buf->len = len; s_buf->mark = 1; r_buf->mark = 0; event = elan_put(base->state, s_buf->buf - len, remote_rbuf->buf - len, len + TAIL_SIZE, RANK_SERVER); elan_wait(event, base->waitType); while (r_buf->mark != 1) idle(); } return 0; }
static void run_pp_server(void) { ELAN_EVENT *event = NULL; while (1) { while (r_buf->mark != 1) idle(); unsigned len = r_buf->len; //memcpy(s_buf->buf - len, r_buf->buf - len, len); s_buf->len = len; s_buf->mark = 1; r_buf->mark = 0; event = elan_put(base->state, s_buf->buf - len, remote_rbuf->buf - len, len + TAIL_SIZE, RANK_CLIENT); elan_wait(event, base->waitType); } }
/*\ blocking vector put \*/ void armcill_putv(int proc, int bytes, int count, void* src[], void* dst[]) { int _j, i, batch, issued=0; void *ps, *pd; #if 0 printf("%d: putv %d\n", armci_me, count); fflush(stdout); #endif for (_j = 0; _j < count; ){ /* how big a batch of requests can we issue */ batch = (count - _j )<max_pending ? count - _j : max_pending; _j += batch; for(i=0; i< batch; i++){ if(put_dscr[cur_put])elan_wait(put_dscr[cur_put],100); else pending_put++; ps = src[issued]; pd = dst[issued]; put_dscr[cur_put]= elan_put(elan_base->state,ps, pd,(size_t)bytes,proc); issued++; cur_put++; if(cur_put>=max_pending)cur_put=0; } } if(issued != count) armci_die2("armci-elan putv:mismatch\n", count,issued); for(i=0; i<max_pending; i++) if(put_dscr[i]){ elan_wait(put_dscr[i],100); put_dscr[i]=(ELAN_EVENT*)0; } }
static inline void pselan_flush_sendbuf(pselan_con_info_t *ci, char *lmem /* ci->send_bufs.lmr_mem */, char *rmem, unsigned size) { ELAN_EVENT *event; event = elan_put(pselan_base_state, lmem, rmem, size, ci->remote_destvp); pselan_queue_event(ci, event); }
/*\ strided put, nonblocking \*/ void armcill_put2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride) { int _j, i, batch, issued=0; char *ps=src_ptr, *pd=dst_ptr; #if 1 for (_j = 0; _j < count; ){ /* how big a batch of requests can we issue */ batch = (count - _j )<max_pending ? count - _j : max_pending; _j += batch; for(i=0; i< batch; i++){ if(put_dscr[cur_put])elan_wait(put_dscr[cur_put],100); else pending_put++; #if 1 put_dscr[cur_put]= elan_put(elan_base->state,ps, pd,(size_t)bytes,proc); #else elan_wait(elan_put(elan_base->state, ps, pd, (size_t)bytes, proc),1000); #endif issued++; ps += src_stride; pd += dst_stride; cur_put++; if(cur_put>=max_pending)cur_put=0; } } if(issued != count) armci_die2("armci-elan put:mismatch %d %d \n", count,issued); #else for (_j = 0; _j < count; _j++){ elan_wait(elan_put(elan_base->state, ps, pd, (size_t)bytes, proc),1000); ps += src_stride; pd += dst_stride; } #endif }