/*\ blocking vector get \*/ void armcill_getv(int proc, int bytes, int count, void* src[], void* dst[]) { int _j, i, batch, issued=0; void *ps, *pd; #if 0 printf("%d: getv %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(get_dscr[cur_get])elan_wait(get_dscr[cur_get],100); else pending_get++; ps = src[issued]; pd = dst[issued]; get_dscr[cur_get]= elan_get(elan_base->state,ps, pd,(size_t)bytes,proc); issued++; cur_get++; if(cur_get>=max_pending)cur_get=0; } } if(issued != count) armci_die2("armci-elan getv:mismatch %d %d \n", count,issued); for(i=0; i<max_pending; i++) if(get_dscr[i]){ elan_wait(get_dscr[i],100); get_dscr[i]=(ELAN_EVENT*)0; } }
int elan_long_swap(long *target, long value, int vp) { long result; #ifdef _LP64 elan_wait(elan_atomic64(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); #else elan_wait(elan_atomic32(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); #endif return(result); }
int elan_long_fadd(long *target, long inc, int vp) { long result; #ifdef _LP64 elan_wait(elan_atomic64(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); #else elan_wait(elan_atomic32(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); #endif return(result); }
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); } }
int elan_int_swap(int *target, int value, int vp) { int result; elan_wait(elan_atomic32(a, ELAN_ATOMIC_SWAP, target, value, 0, vp, &result), elan_base->waitType); return(result); }
int elan_int_fadd(int *target, int inc, int vp) { int result; elan_wait(elan_atomic32(a, ELAN_ATOMIC_ADD, target, inc, 0, vp, &result), elan_base->waitType); return(result); }
void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride) { u_int acount[2]; acount[0]=bytes; acount[1]=count; elan_wait(elan_getss(_pgsstate,src_ptr,dst_ptr, &src_stride, &dst_stride, acount,1,proc),elan_base->waitType); }
void armcill_getv(int proc, int bytes, int count, void* src[], void* dst[]) { int _j, issued=0; #if 0 printf("%d: getv %d\n", armci_me, count); fflush(stdout); #endif for (_j = 0; _j < count; _j++ ){ _src[issued] = src[_j]; _dst[issued] = dst[_j]; issued++; if(issued == MAX_VECS){ elan_wait(elan_getv(_pgctrl,_src,_dst,bytes,issued,proc),elan_base->waitType); issued=0; } } if(issued)elan_wait(elan_getv(_pgctrl,_src,_dst,bytes,issued,proc),elan_base->waitType); }
void armcill_wait_put() { int i; if(!pending_put)return; else pending_put=0; for(i=0; i<max_pending; i++) if(put_dscr[i]){ elan_wait(put_dscr[i],100); put_dscr[i]=(ELAN_EVENT*)0; } }
void armcill_get2D(int proc, int bytes, int count, void* src_ptr,int src_stride, void* dst_ptr,int dst_stride) { int _j, issued=0; char *ps=src_ptr, *pd=dst_ptr; #if 0 printf("%d: getv %d\n", armci_me, count); fflush(stdout); #endif for (_j = 0; _j < count; _j++ ){ _src[issued] = ps; _dst[issued] = pd; ps += src_stride; pd += dst_stride; issued++; if(issued == MAX_VECS){ elan_wait(elan_getv(_pgctrl,_src,_dst,bytes,issued,proc),elan_base->waitType); issued=0; } } if(issued)elan_wait(elan_getv(_pgctrl,_src,_dst,bytes,issued,proc),elan_base->waitType); }
/*\ strided get, nonblocking \*/ void armcill_get2D(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 1 if(get_dscr[cur_get])elan_wait(get_dscr[cur_get],100); else pending_get++; get_dscr[cur_get]=elan_get(elan_base->state,ps,pd, (size_t)bytes, proc); #else elan_wait(elan_get(elan_base->state, ps, pd, (size_t)bytes, proc),elan_base->waitType); #endif issued++; ps += src_stride; pd += dst_stride; cur_get++; if(cur_get>=max_pending)cur_get=0; } } if(issued != count) armci_die2("armci-elan get:mismatch %d %d \n", count,issued); #else for (_j = 0; _j < count; _j++){ elan_wait(elan_get(elan_base->state, ps, pd, (size_t)bytes, proc),elan_base->waitType); ps += src_stride; pd += dst_stride; } #endif }
void armcill_putS(int proc, void* src_ptr, int src_stride_arr[], void* dst_ptr, int dst_stride_arr[], int count[], int stride_levels) { elan_wait(elan_putss(_pgsstate,src_ptr,dst_ptr, src_stride_arr, dst_stride_arr, count, stride_levels, proc),elan_base->waitType); }