Bu Blogda Ara

7 Şubat 2010 Pazar

functions for handling pending messages -- for use in parallel tree search

/* queue.c -- functions for handling pending messages -- for use in
* parallel tree search
*
* See Chap 14, pp. 328 & ff, in PPMPI for a discussion of parallel tree
* search.
*/

#include "queue.h"
#include "mpi.h"
#include "node_stack.h"

extern int my_rank;

/*********************************************************************/
/* The only pending messages should be requests for work, rejects or */
/* solutions. Use stack as scratch area for receives. */
/* WARNING: WILL OVERWRITE CONTENTS OF STACK! */
void Clean_up_queues(
MPI_Comm comm /* in */) {
int done = FALSE;
int message_pending;
STACK_T stack;
MPI_Status status;

Get_local_stack(&stack);
while (!done) {
MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &message_pending,
&status);
if (message_pending) {
MPI_Recv(Stack_list(stack), Max_size(stack), MPI_INT,
MPI_ANY_SOURCE, MPI_ANY_TAG, comm, &status);
} else {
done = TRUE;
}
} /* while */
} /* Clean_up_queues */


/*********************************************************************/
int Work_requests_pending(
MPI_Comm comm /* in */) {
MPI_Status status;
int message_in_queue;

MPI_Iprobe(MPI_ANY_SOURCE, REQUEST_TAG, comm, &message_in_queue,
&status);

if (message_in_queue) {
return TRUE;
} else {
return FALSE;
}
} /* Work_requests_pending */


/*********************************************************************/
/* Only called when a message is pending */
int Get_dest(
MPI_Comm comm /* in */) {
int node_request;
MPI_Status status;

MPI_Recv(&node_request, 1, MPI_INT, MPI_ANY_SOURCE, REQUEST_TAG,
comm, &status);
return status.MPI_SOURCE;
} /* Get_dest */

Hiç yorum yok:

Yorum Gönder