Jump to content United States-English
HP.com Home Products and Services Support and Drivers Solutions How to Buy
» Contact HP
More options
HP.com home
HP-MPI User's Guide > Appendix A Example applications

thread_safe.c

» 

Technical documentation

Complete book in PDF
» Feedback
Content starts here

 » Table of Contents

 » Glossary

 » Index

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
Printable version
Privacy statement Using this site means you accept its terms Feedback to webmaster
© 1979-2007 Hewlett-Packard Development Company, L.P.