/*\ client sends strided data + request to server \*/ void armci_send_strided(int proc, request_header_t *msginfo, char *bdata, void *ptr, int strides, int stride_arr[], int count[]) { armci_write_strided(ptr, strides, stride_arr, count, bdata); armci_send_req(proc,msginfo,msginfo->bytes + sizeof(request_header_t)); }
/*\ control message to the server, e.g.: ATTACH to shmem, return ptr etc. \*/ void armci_serv_attach_req(void *info, int ilen, long size, void* resp,int rlen) { char *buf; ARMCI_PR_DBG("enter",0); int bufsize = 2*sizeof(request_header_t)+ilen + sizeof(long)+sizeof(rlen); long *idlist=(long *)info; request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = ilen; msginfo->datalen = sizeof(long)+sizeof(int); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(info, msginfo +1, ilen); if(DEBUG_MEM){printf("\n%d:sending idlist+1 %d, size %d, idlist[0] %d, idlist[1] %d\n",armci_me,idlist+1,size,idlist[0],idlist[1]);} buf = ((char*)msginfo) + ilen + sizeof(request_header_t); *((long*)buf) =size; *(int*)(buf+ sizeof(long)) = rlen; armci_send_req(armci_master, msginfo, bufsize,0); if(rlen){ buf= armci_rcv_data(armci_master, msginfo,rlen); /* receive response */ bcopy(buf, resp, rlen); FREE_SEND_BUFFER(msginfo); if(DEBUG_MEM){printf("%d:client attaching got ptr=%p %d bytes\n",armci_me,buf,rlen); fflush(stdout); } } ARMCI_PR_DBG("exit",0); }
void * armci_server_ptr(int id){ char *buf; int bufsize = sizeof(int); request_header_t *msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,ATTACH,armci_me); bzero(msginfo,sizeof(request_header_t)); msginfo->from = armci_me; msginfo->to = SERVER_NODE(armci_clus_me); msginfo->dscrlen = 0; msginfo->datalen = sizeof(int); msginfo->operation = ATTACH; msginfo->bytes = msginfo->dscrlen+ msginfo->datalen; armci_copy(&id, msginfo +1, sizeof(int)); if(DEBUG_MEM){ printf("\n%d:attach req:sending id %d \n",armci_me,id);fflush(stdout); } armci_send_req(armci_master, msginfo, bufsize,0); buf= armci_rcv_data(armci_master,msginfo,sizeof(void *));/* receive response */ if(DEBUG_MEM){ printf("\n%d:attach req:got %p \n",armci_me,buf);fflush(stdout); } FREE_SEND_BUFFER(msginfo); ARMCI_PR_DBG("exit",0); return (void *)buf; }
/*\ send request to server to LOCK MUTEX \*/ void armci_rem_lock(int mutex, int proc, int *ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(int); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,LOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->datalen = sizeof(int); msginfo->dscrlen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = LOCK; msginfo->format = mutex; msginfo->bytes = msginfo->datalen + msginfo->dscrlen; ibuf = (int*)(msginfo+1); *ibuf = mutex; armci_send_req(proc, msginfo, bufsize, 0); /* receive ticket from server */ *ticket = *(int*)armci_rcv_data(proc,msginfo,0); FREE_SEND_BUFFER(msginfo); if(DEBUG_)fprintf(stderr,"%d receiving ticket %d\n",armci_me, *ticket); }
int armci_direct_vector(request_header_t *msginfo , armci_giov_t darr[], int len, int proc){ int bufsize=0,bytes=0,s; for(s=0; s<len; s++){ bytes += darr[s].ptr_array_len * darr[s].bytes;/* data */ bufsize += darr[s].ptr_array_len *sizeof(void*)+2*sizeof(int);/*descr*/ } bufsize += bytes + sizeof(long) +2*sizeof(double) +8; if(msginfo->operation==GET) bufsize = msginfo->dscrlen+sizeof(request_header_t); if(msginfo->operation==PUT){ msginfo->datalen=0; msginfo->bytes=msginfo->dscrlen; bufsize=msginfo->dscrlen+sizeof(request_header_t); } armci_send_req(proc, msginfo, bufsize); if(msginfo->operation==GET){ bytes=armci_RecvVectorFromSocket(SRV_sock[armci_clus_id(proc)],darr,len, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ); } if(msginfo->operation==PUT){ bytes=armci_SendVectorToSocket(SRV_sock[armci_clus_id(proc)],darr,len, (struct iovec *)((char*)(msginfo+1)+msginfo->dscrlen) ); } return(bytes); }
/*\ send request to server to UNLOCK MUTEX \*/ void armci_rem_unlock(int mutex, int proc, int ticket) { request_header_t *msginfo; int *ibuf; int bufsize = sizeof(request_header_t)+sizeof(ticket); msginfo = (request_header_t*)GET_SEND_BUFFER(bufsize,UNLOCK,proc); bzero(msginfo,sizeof(request_header_t)); msginfo->dscrlen = msginfo->bytes = sizeof(ticket); msginfo->datalen = 0; msginfo->from = armci_me; msginfo->to = proc; msginfo->operation = UNLOCK; msginfo->format = mutex; ibuf = (int*)(msginfo+1); *ibuf = ticket; if(DEBUG_)fprintf(stderr,"%d sending unlock\n",armci_me); armci_send_req(proc, msginfo, bufsize,0); }