#!/usr/bin/perl -w use strict; use Config; use Cwd; my $file = "mpi_timing.pl"; local(*OUTF); open(OUTF, ">$file") or die "Cannot open $file for writing: $!\n"; print OUTF $Config{startperl}, "\n\n"; print OUTF "use lib qw(", Cwd::cwd, "/../../blib/arch ", Cwd::cwd, "/../../blib/lib);\n\n"; print "Writing $file\n"; while() { print OUTF $_ } close(OUTF); chmod(0755, $file); __END__ # /*************************************************************************** # * MPI Timing Program - Perl Version # * CONVERTED TO Perl: Josh Wilmes # ***************************************************************************/ $|=1; use Parallel::MPI qw(:all); $NUMBER_REPS = 200; $MESSAGE_SIZE = 128; MPI_Init(); $numtasks = MPI_Comm_size(MPI_COMM_WORLD); $taskid = MPI_Comm_rank(MPI_COMM_WORLD); die "Error; Run with num procs = 2\n" unless ($numtasks == 2); $reps = $NUMBER_REPS; $type = 1; $outmsg = "x" x $MESSAGE_SIZE; $inmsg = "x" x $MESSAGE_SIZE; if ($taskid == 0) { # round-trip timing test printf("Doing round trip test, minimal message size, %d reps.\n",$reps); $dest = 1; $source = 1; for $n (1..$reps) { MPI_Barrier(MPI_COMM_WORLD); $starttime = MPI_Wtime(); # send message to worker - message type set to 1. MPI_Send(\$outmsg, $MESSAGE_SIZE, MPI_CHAR, $dest, $type, MPI_COMM_WORLD); # Now wait to receive the echo reply from the worker MPI_Recv(\$inmsg, $MESSAGE_SIZE, MPI_CHAR, $source, $type, MPI_COMM_WORLD); # calculate round trip time and print $endtime = MPI_Wtime(); $dt1 = ($endtime - $starttime) * 1000000; printf("round trip# %2d uSec = %8d\n", $n, $dt1); $at1 += $dt1; } printf("\n*** Round Trip Avg uSec = %d\n", $at1 / $reps); } elsif ($taskid == 1) { $dest = 0; $source = 0; for $n (1..$reps) { MPI_Barrier(MPI_COMM_WORLD); MPI_Recv(\$inmsg, $MESSAGE_SIZE, MPI_CHAR, $source, $type, MPI_COMM_WORLD); MPI_Send(\$outmsg, $MESSAGE_SIZE, MPI_CHAR, $dest, $type, MPI_COMM_WORLD); } } MPI_Finalize(); exit(0);