Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: [OMPI users] question to Datatype.Vector and MPI.COMM_WORLD.Scatter
From: Siegmar Gross (Siegmar.Gross_at_[hidden])
Date: 2012-10-09 10:55:37


Hi,

I have built openmpi-1.9a1r27380 with Java support and try some small
programs. When I try to scatter the columns of a matrix, I don't get
the expected results.

tyr java 106 mpijavac ColumnMain.java
tyr java 107 mpiexec -np 6 java ColumnMain

matrix:

      1.00 2.00 3.00 4.00 5.00 6.00
      7.00 8.00 9.00 10.00 11.00 12.00
     13.00 14.00 15.00 16.00 17.00 18.00
     19.00 20.00 21.00 22.00 23.00 24.00

Column of process 0

Column of process 4
      0.00 0.00 0.00 0.00

Column of process 1

Column of process 5
      0.00 0.00 0.00 0.00
      0.00 0.00 0.00 0.00

Column of process 3
      0.00 0.00 0.00 0.00

Column of process 2
       NaN NaN 0.00 0.00
       NaN 0.00 NaN 0.00

I use the following program.

import mpi.*;

public class ColumnMain
{
  static final int P = 4; /* # of rows */
  static final int Q = 6; /* # of columns */
  static final int NUM_ELEM_PER_LINE = 6; /* to print a vector */

  public static void main (String args[]) throws MPIException
  {
    int ntasks, /* number of parallel tasks */
             mytid, /* my task id */
             i, j, /* loop variables */
             tmp; /* temporary value */
    double matrix[][],
             column[];
    Datatype column_t; /* strided vector */

    MPI.Init (args);
    matrix = new double[P][Q];
    column = new double[P];
    mytid = MPI.COMM_WORLD.Rank ();
    ntasks = MPI.COMM_WORLD.Size ();
    /* check that we have the correct number of processes in our
     * universe
     */
    if (mytid == 0)
    {
      if (ntasks != Q)
      {
        System.err.println ("\n\nI need exactly " + Q +
                            " processes.\n\n" +
                            "Usage:\n" +
                            " mpiexec -np " + Q +
                            " java <program name>\n");
      }
    }
    if (ntasks != Q)
    {
      MPI.Finalize ();
      System.exit (0);
    }
    /* Build the new type for a strided vector. */
    column_t = Datatype.Vector (P, 1, Q, MPI.DOUBLE);
    column_t.Commit ();
    if (mytid == 0)
    {
      tmp = 1;
      for (i = 0; i < P; ++i) /* initialize matrix */
      {
        for (j = 0; j < Q; ++j)
        {
          matrix[i][j] = tmp++;
        }
      }
      System.out.println ("\nmatrix:\n"); /* print matrix */
      for (i = 0; i < P; ++i)
      {
        for (j = 0; j < Q; ++j)
        {
          System.out.printf ("%10.2f", matrix[i][j]);
        }
        System.out.println ();
      }
      System.out.println ();
    }
    MPI.COMM_WORLD.Scatter (matrix, 0, 1, column_t,
                            column, 0, P, MPI.DOUBLE, 0);
    /* Each process prints its column. The output will probably
     * intermingle on the screen so that you must use
     * "-output-filename" in Open MPI.
     */
    System.out.println ("\nColumn of process " + mytid + "\n");
    for (i = 0; i < P; ++i)
    {
      if (((i + 1) % NUM_ELEM_PER_LINE) == 0)
      {
        System.out.printf ("%10.2f\n", column[i]);
      }
      else
      {
        System.out.printf ("%10.2f", column[i]);
      }
    }
    System.out.println ();
    column_t.finalize ();
    MPI.Finalize();
  }
}

Does anybody know if something is wrong with my program or if I can't
use a strided vector in Java (even if it is available in the API) or
if it is a problem of openmpi-1.9a1r27380? Thank you very much for
any help in advance.

Kind regards

Siegmar