Example Program and Makefile for BG/Q

Program Example

Here's an example of compiling a simple MPI program on ALCF Blue Gene/Q systems:

> cat pi.c
#include "mpi.h"
#include <math.h>
#include <stdio.h>

int main(int argc, char** argv)
{
  int n, myid, numprocs, i;
  double PI25DT = 3.141592653589793238462643;
  double mypi, pi, h, sum, x;

  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
  MPI_Comm_rank(MPI_COMM_WORLD, &myid);

  /* Number of intervals */
  n = 25;

  MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  h = 1.0 / (double) n;
  sum = 0.0;
  for ( i = myid + 1; i <= n; i += numprocs )
  {
       x = h * ((double) i - 0.5);
       sum += ( 4.0 / (1.0 + x*x) );
  }
  mypi = h * sum;
  MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

  if (myid == 0)
  {
      printf("pi is approximately %.16f, Error is %.16f\n",
               pi, fabs(pi - PI25DT));
  }

  MPI_Finalize();
  return 0;
}
> mpicc pi.c
> ls -lh a.out
-rwxr-xr-x 1 bacon users 11M 2009-04-21 15:16 a.out

NOTE: The mpi compilers are cross-compilers. The executable is built for the Blue Gene compute nodes, and will not run on the login nodes. We recommend using the mpi-wrappers for whatever compiler you're using. You will find the list of predefined mpi-wrappers for GNU and XL compilers in the Overview of How to Compile and Link page. If you try to use gcc or cc directly, you will generate code for the login nodes.

Makefile Example

CC = mpixlc
CXX = mpixlcxx
FC = mpixlf90

OPTFLAGS = -O3
CFLAGS = $(OPTFLAGS) -g
CXXFLAGS = $(OPTFLAGS) -g
FFLAGS = $(OPTFLAGS) -g

all: helloworld-mpi-c helloworld-mpi-f helloworld-mpi-cpp

helloworld-mpi-c: helloworld-mpi.c
        $(CC) $(CFLAGS) -o helloworld-mpi-c helloworld-mpi.c

helloworld-mpi-f: helloworld-mpi.f90
        $(FC) $(FFLAGS) -o helloworld-mpi-f helloworld-mpi.f90

helloworld-mpi-cpp: helloworld-mpi.cpp
        $(CXX) $(CXXFLAGS) -o helloworld-mpi-cpp helloworld-mpi.cpp

clean:
        rm helloworld-mpi-*