CS计算机代考程序代写 #include

#include
#include
#include
#include
#include

#define PING 1
#define PONG 2

static void print_usage(void);
static void print_version(void);
static void print_help(void);

static char *progname;

#define PACKAGE “pingpong”
#define VERSION “1.0”

/* Command line options */
static struct option long_opts[] = {
{ “help”, 0, NULL, ‘h’ },
{ “version”, 0, NULL, ‘V’ },
{ “minsize”, 1, NULL, ‘m’ },
{ “maxsize”, 1, NULL, ‘n’ },
{ “count”, 1, NULL, ‘c’ },
{ 0, 0, 0, 0 }
};

#define GETOPTS “c:hm:n:V”

int main(int argc, char **argv)
{
int i, n, p, size;
int iters = 1000, minsize = 1, maxsize = 32768;
int show_help = 0, show_usage = 0, show_version = 0;
double start;

progname = argv[0];

int optc;
while ((optc = getopt_long(argc, argv, GETOPTS, long_opts, NULL)) != -1) {
switch (optc) {
case ‘h’:
show_help = 1;
break;
case ‘V’:
show_version = 1;
break;
case ‘m’:
minsize = atoi(optarg);
if (minsize < 1 || minsize > 65536) {
show_usage = 1;
}
break;
case ‘n’:
maxsize = atoi(optarg);
if (maxsize < 1 || maxsize > 65536) {
show_usage = 1;
}
break;
case ‘c’:
printf(“iters: %d\n”, iters);
if (iters < 1) { show_usage = 1; } break; default: show_usage = 1; } } if (show_version) { print_version(); if (!show_help) { return 0; } } if (show_help) { print_help(); return 0; } if (show_usage || optind < argc || maxsize < minsize) { print_usage(); return 1; } MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &n); MPI_Comm_rank(MPI_COMM_WORLD, &p); if (n != 2) { fprintf(stderr, "%s must be run on exactly 2 processors.\n", progname); MPI_Finalize(); return 1; } char *dummy; dummy = malloc(maxsize); for (size = minsize; size <= maxsize; size *= 2) { start = MPI_Wtime(); for (i = 0; i < iters; i++) { MPI_Status s; /* ping... */ if (p == 0) { MPI_Send(dummy, size, MPI_CHAR, 1, PING, MPI_COMM_WORLD); } else { MPI_Recv(dummy, size, MPI_CHAR, 0, PING, MPI_COMM_WORLD, &s); } /* pong... */ if (p == 1) { MPI_Send(dummy, size, MPI_CHAR, 0, PONG, MPI_COMM_WORLD); } else { MPI_Recv(dummy, size, MPI_CHAR, 1, PONG, MPI_COMM_WORLD, &s); } } if (p == 0) { printf("%d %d byte pingpongs took %f seconds.\n", iters, size, MPI_Wtime() - start); } } MPI_Finalize(); return 0; } static void print_usage(void) { fprintf(stderr, "Try '%s --help' for more information.\n", progname); } static void print_version(void) { fprintf(stderr, "%s %s\n", PACKAGE, VERSION); } static void print_help(void) { fprintf(stderr, "%s. A utility for benchmarking MPI communications.\n\n", PACKAGE); fprintf(stderr, "Usage %s [OPTIONS]\n\n", progname); fprintf(stderr, " -h, --help Print a summary of the options\n"); fprintf(stderr, " -V, --version Print the version number\n"); fprintf(stderr, " -m, --minsize The minimum packet size. Must be 1-65536\n"); fprintf(stderr, " -n, --maxsize The maximum packet size. Must be 1-65536\n"); fprintf(stderr, " -c, --count The number of pings to send for a given size\n"); }