Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |  

This web mail archive is frozen.

This page is part of a frozen web archive of this mailing list.

You can still navigate around this archive, but know that no new mails have been added to it since July of 2016.

Click here to be taken to the new web archives of this list; it includes all the mails that are in this frozen archive plus all new mails that have been sent to the list since it was migrated to the new archives.

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