MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

MathLink and MPI

  • To: mathgroup at smc.vnet.net
  • Subject: [mg29420] MathLink and MPI
  • From: Kashif Rasul <kashif at piglet.maths.monash.edu.au>
  • Date: Tue, 19 Jun 2001 05:35:37 -0400 (EDT)
  • Organization: Dept. of Maths. & Stats., Monash Uni., Clayton Aus.
  • Sender: owner-wri-mathgroup at wolfram.com

Hello,

I was wondering if anyone has tried using MathLink with MPI (message
passing interface), with this I mean, a program that say gets its input
from Mathematica via MathLink and does the calculation in parallel via
MPI and returns the answer back to Mathematica again via MathLink.

I was experimenting with such a program, and was curious to know what
the best/most elegant way of doing this would be? The problem I think is
that all the other processes need to know if MathLink is still up and
hence continue waiting for a message but only one process needs to be
running MathLink. What this does is that the other processes spend a lot
of cpu waiting when the program is doing nothing. My example is a
MathLink program to calculate pi:

:Begin:
:Function:       mlpi
:Pattern:        mlpi[n_Integer]
:Arguments:      {n}
:ArgumentTypes:  {Integer}
:Return:

#include <mathlink.h>
#include <mpi.h>

double mlpi( int n )
{
    int myid, numprocs, i, retval=0;
    double mypi, pi, h, sum, x;


    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myid);

    MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_COMM_WORLD);
    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);

    return pi;
}

int main( int argc, char *argv[] )
{
 int n, myid, numprocs, i, retval=0;
 double mypi, pi, h, sum, x;

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

 if (myid==0) {
  retval = MLMain(argc, argv);
  MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_COMM_WORLD);
 } else {
  while (1) {
   MPI_Bcast(&retval, 1, MPI_INT, 0, MPI_COMM_WORLD);
   if (!retval) {
    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);
           } else
    break;
  }
 }
 MPI_Finalize();
 return 0;
}

I start it say on two processors as

$ mpirun -np 2 mlpi -linkcreate
$ Link created on: 34715 at ...

and then l install and run it in Mathematica with:

link = Install[LinkConnect["34715 at ..."]]
mlpi[10]

However when the program is doing nothing, one of the mlpi program takes
a lot of cpu just waiting for me to call mlpi[...] again.

I would appreciate any comments on this.

Thanks in advance.

Kashif





  • Prev by Date: SIAM Short Course on Mathematical Software
  • Next by Date: RE: How to produce "thick" lines in 3D?
  • Previous by thread: SIAM Short Course on Mathematical Software
  • Next by thread: Re: MathLink and MPI