Open MPI logo

Open MPI User's Mailing List Archives

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

Subject: [OMPI users] MPI-Send for entire entire matrix when allocating memory dynamically
From: Natarajan CS (csnataraj_at_[hidden])
Date: 2009-10-28 23:17:54


Hello all,
        Firstly, My apologies for a duplicate post in LAM/MPI list I have
the following simple MPI code. I was wondering if there was a workaround for
sending a dynamically allocated 2-D matrix? Currently I can send the matrix
row-by-row, however, since rows are not contiguous I cannot send the entire
matrix at once. I realize one option is to change the malloc to act as one
contiguous block but can I keep the matrix definition as below and still
send the entire matrix in one go?

Code :-
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <math.h>

void alloc_matrix(double ***x, int r, int c)
{
   int i,j,n;

        if ( ( *x = (double **)malloc((r)*sizeof(**x)) ) == NULL ) {

  printf("memory not allocd\n"); exit(1);
        }

        for(n = 0; n < r; n++) {
                if ( ( (*x)[n] = (double *)malloc(c * sizeof(***x))) ==
NULL) {
                printf("memory not allocd");
                exit(1);
                }
        }
}

void clean(double ***x, int r)
{
 int n;
        for (n = 0; n < r; n++)
        {
                free((*x)[n]);
                (*x)[n] = NULL;
        }
        free(**x);
        **x = NULL;
}

int main (int argc, char **argv) {

  int myrank,i, j;
  FILE *f;
  char name[20];
  MPI_Status status;
  double **a, **b;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  if( myrank == 0 )
  {
        alloc_matrix(&a,3,3);
        for (i=0;i<3;i++) {
                for (j=0; j<3; j++)
                a[i][j]=i*0.01 + j*0.01;
                MPI_Send((a[i]), 3, MPI_DOUBLE, 1, 17, MPI_COMM_WORLD );
        }
  }
  else if( myrank == 1 )
  {
    alloc_matrix(&b,3,3);
        for (i=0;i<3;i++){
                for (j=0; j<3; j++)
                        b[i][j]=0;
                MPI_Recv((b[i]), 3 , MPI_DOUBLE, 0, 17, MPI_COMM_WORLD,
&status );
        }
  sprintf(name,"proc.%d",myrank);
  f = fopen(name,"w");
  if (myrank == 1)
  {
        for (i=0; i<3; i++)
                for (j=0; j<3; j++)
                {
                        fprintf(f,"%f\n", b[i][j]);
                }
        clean(&b,3);
   }
  else if( myrank == 0 ) {
        clean(&a,3);
   }
  fclose(f);
  MPI_Finalize();
}