 |
» |
|
|
 |
In this C example, N clients loop MAX_WORK times. As part of a single work item, a client
must request service from one of Nservers at random. Each server
keeps a count of the requests handled and prints a log of the requests
to stdout. Once all the clients are done working, the servers are shutdown.  |
#include <stdio.h> #include <mpi.h> #include <pthread.h> #define MAX_WORK 40 #define SERVER_TAG 88 #define CLIENT_TAG 99 #define REQ_SHUTDOWN -1 static int service_cnt = 0; int process_request(request) int request; { if (request != REQ_SHUTDOWN) service_cnt++; return request; } void* server(args) void *args; { int rank, request; MPI_Status status; rank = *((int*)args); while (1) { MPI_Recv(&request, 1, MPI_INT, MPI_ANY_SOURCE, SERVER_TAG, MPI_COMM_WORLD, &status); if (process_request(request) == REQ_SHUTDOWN) break; MPI_Send(&rank, 1, MPI_INT, status.MPI_SOURCE, CLIENT_TAG, MPI_COMM_WORLD); printf("server [%d]: processed request %d for client %d\n", rank, request, status.MPI_SOURCE); } printf("server [%d]: total service requests: %d\n", rank, service_cnt); return (void*) 0; } void client(rank, size) int rank; int size; { int w, server, ack; MPI_Status status; for (w = 0; w < MAX_WORK; w++) { server = rand()%size; MPI_Sendrecv(&rank, 1, MPI_INT, server, SERVER_TAG, &ack, 1,MPI_INT,server,CLIENT_TAG,MPI_COMM_WORLD, &status); if (ack != server) { printf("server failed to process my request\n"); MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OTHER); } } } void shutdown_servers(rank) int rank; { int request_shutdown = REQ_SHUTDOWN; MPI_Barrier(MPI_COMM_WORLD); MPI_Send(&request_shutdown, 1, MPI_INT, rank, SERVER_TAG, MPI_COMM_WORLD); } main(argc, argv) int argc; char *argv[]; { int rank, size, rtn; pthread_t mtid; MPI_Status status; int my_value, his_value; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &size); rtn = pthread_create(&mtid, 0, server, (void*)&rank); if (rtn != 0) { printf("pthread_create failed\n"); MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OTHER); } client(rank, size); shutdown_servers(rank); rtn = pthread_join(mtid, 0); if (rtn != 0) { printf("pthread_join failed\n"); MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OTHER); } MPI_Finalize(); exit(0); } |
 |
thread_safe
output |  |
The output from running the thread_safe executable is shown
below. The application was run with -np = 2.  |
server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [0]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [1]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [0]: processed request 0 for client 0 server [0]: processed request 1 for client 1 server [0]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 0 for client 0 server [0]: processed request 0 for client 0 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [1]: processed request 1 for client 1 server [0]: processed request 1 for client 1 server [0]: total service requests: 38 server [1]: total service requests: 42 |
 |
|