void armci_call_data_server() { int usec_to_poll =0; char buf[_ELAN_SLOTSIZE]; if(DEBUG_){ printf("%d(server): waiting for request\n",armci_me); fflush(stdout); } while(1){ elan_queueWait(mq, buf, usec_to_poll ); armci_data_server(buf); armci_send_ack(); } if(DEBUG_) {printf("%d(server): done! closing\n",armci_me); fflush(stdout);} }
/*\ main routine for data server process in a cluster environment * the process is blocked (in select) until message arrives from * the clients and services the requests \*/ void armci_call_data_server() { int nready; int up=1; readylist = (int*)calloc(sizeof(int),armci_nproc); if(!readylist)armci_die("armci_data_server:could not allocate readylist",0); if(DEBUG_){ printf("%d server waiting for request\n",armci_me); fflush(stdout); sleep(1); } /* server main loop; wait for and service requests until QUIT requested */ for(;;){ int i, p; nready = armci_WaitSock(CLN_sock, armci_nproc, readylist); for(i = 0; i < armci_nproc; i++){ p = (up) ? i : armci_nproc -1 -i; if(!readylist[p])continue; armci_data_server(&p); nready--; if(nready==0) break; /* all sockets read */ } /* fairness attempt: each time process the list in a different direction*/ up = 1- up; /* switch directions for the next round */ if(nready) armci_die("armci_dataserv:readylist not consistent with nready",nready); } }
void armci_call_data_server() { int p=-1; MPI_Status status; armci_mpi2_server_debug(0, "armci_call_data_server(): Server main loop\n"); #if !defined(MULTIPLE_BUFS) /* server main loop; wait for and service requests until QUIT requested */ for(;;) { MPI_Check( MPI_Probe(MPI_ANY_SOURCE, ARMCI_MPI_SPAWN_TAG,MPI_COMM_SERVER2CLIENT, &status) ); p = status.MPI_SOURCE; armci_mpi2_server_debug(armci_server_me, "Processing message from client %d\n", p); armci_data_server(&p); } #else int i, tag, reqid, do_waitlist=0; /* server multiple bufs setup */ _req_waitlist_head = NULL; _req_waitlist_tail = NULL; /* Initialize "next tag" array, which manages flow control */ if( (_next_tag = (int*) malloc(armci_nproc*sizeof(int)) ) == NULL) armci_die("mpi2_server: _next_tag malloc failed", 0); for(i=0; i<armci_nproc; i++) _next_tag[i] = ARMCI_MPI_SPAWN_TAG_BEGIN; /* server posts multiple receive buffers in advance */ for(i=0; i<MPI2_MAX_BUFS; i++) { MPI_Check( MPI_Irecv(_mpi2_rcv_buf[i], MSG_BUFLEN, MPI_BYTE, MPI_ANY_SOURCE, ARMCI_MPI_SPAWN_TAG, MPI_COMM_SERVER2CLIENT, &_mpi_request[i]) ); } for(;;) { /* process wait-listed requests, if any */ do_waitlist = 0; if(_req_waitlist_head != NULL) { do_waitlist = wlist_get_req(&p, &tag, &reqid); } if(!do_waitlist) { /* process the first completed incoming request */ MPI_Check( MPI_Waitany(MPI2_MAX_BUFS, _mpi_request, &reqid, &status) ); p = status.MPI_SOURCE; /* tag = status.MPI_TAG; */ tag = ((request_header_t*) _mpi2_rcv_buf[reqid])->tag; /* check if it is in or out of order request */ if(tag == _next_tag[p]) { INCR_TAG(p); } else { /* out of order req - enforce ordering by waitlisting this req */ wlist_add_req(reqid, p, tag); continue; } } /* mark the request id that is ready to processed */ _reqid_ready = reqid; /* server process the incoming (or waitlisted) request */ armci_data_server(&p); /* After completing the request (which also frees a buffer), server * posts a receive using this buffer */ MPI_Check( MPI_Irecv(_mpi2_rcv_buf[reqid], MSG_BUFLEN, MPI_BYTE, MPI_ANY_SOURCE, ARMCI_MPI_SPAWN_TAG, MPI_COMM_SERVER2CLIENT, &_mpi_request[reqid]) ); } #endif }