Пример #1
0
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);}
}
Пример #2
0
/*\ 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

}