Include syntax must be placed at the top of any program that calls Sun MPI routines.
For C, use
#include <mpi.h>
For C++, use
#include <mpi.h>
For Fortran, use
INCLUDE 'mpif.h'
These lines allow the program to access the Sun MPI version of the mpi header file, which contains the definitions, macros, and function prototypes required when compiling the program. Ensure that you are referencing the Sun MPI include file.
The include files are usually found in /opt/SUNWhpc/include/ or /opt/SUNWhpc/include/v9/. If the compiler cannot find them, check that they exist and are accessible from the machine on which you are compiling your code. The location of the include file is specified by a compiler option (see "Compiling and Linking").
/* * Test the connectivity between all processes. */ #pragma ident "@(#)connectivity.c 1.1 99/02/02" #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <unistd.h> #include <mpi.h> int main(int argc, char **argv) { MPI_Status status; int verbose = 0; int rank; int np; /* number of processes in job */ int peer; int i; int j; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Comm_size(MPI_COMM_WORLD, &np); if (argc>1 && strcmp(argv[1], "-v")==0) verbose = 1; for (i=0; i<np; i++) { if (rank==i) { /* rank i sends to and receives from each higher rank */ for(j=i+1; j<np; j++) { if (verbose) printf("checking connection %4d <-> %-4d\n", i, j); MPI_Send(&rank, 1, MPI_INT, j, rank, MPI_COMM_WORLD); MPI_Recv(&peer, 1, MPI_INT, j, j, MPI_COMM_WORLD, &status); } } else if (rank>i) { /* receive from and reply to rank i */ MPI_Recv(&peer, 1, MPI_INT, i, i, MPI_COMM_WORLD, &status); MPI_Send(&rank, 1, MPI_INT, i, rank, MPI_COMM_WORLD); } } MPI_Barrier(MPI_COMM_WORLD); if (rank==0) printf("Connectivity test on %d processes PASSED.\n", np); MPI_Finalize(); return 0; } |
! ! Estimate pi via Monte-Carlo method. ! ! Each process sums how many of samplesize random points generated ! in the square (-1,-1),(-1,1),(1,1),(1,-1) fall in the circle of ! radius 1 and center (0,0), and then estimates pi from the formula ! pi = (4 * sum) / samplesize. ! The final estimate of pi is calculated at rank 0 as the average of ! all the estimates. ! program monte include 'mpif.h' double precision drand external drand double precision x, y, pi, pisum integer*4 ierr, rank, np integer*4 incircle, samplesize parameter(samplesize=2000000) call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, np, ierr) ! seed random number generator x = drand(2 + 11*rank) incircle = 0 do i = 1, samplesize x = drand(0)*2.0d0 - 1.0d0 ! generate a random point y = drand(0)*2.0d0 - 1.0d0 if ((x*x + y*y) .lt. 1.0d0) then incircle = incircle+1 ! point is in the circle endif end do pi = 4.0d0 * DBLE(incircle) / DBLE(samplesize) ! sum estimates at rank 0 call MPI_REDUCE(pi, pisum, 1, MPI_DOUBLE_PRECISION, MPI_SUM, & 0 , MPI_COMM_WORLD, ierr) if (rank .eq. 0) then ! final estimate is the average pi = pisum / DBLE(np) print '(A,I4,A,F8.6,A)','Monte-Carlo estimate of pi by ',np, & ' processes is ',pi,'.' endif call MPI_FINALIZE(ierr) end |