示例#1
0
int
main(int argc, char *argv[])
{
    char input[MAX_FILENAME_SIZE];
    int c;
    int iterations = 1;
    int generate = 0;
    struct Grid *grid;
    struct Grid *tmp_grid;

    if (argc < 2) {
        help();
        return 0;
    }

    while ((c = getopt(argc, argv, "?hv:n:i:g")) != -1) {
        switch (c) {
            case 'h':
            case 'v':
                help();
                return 0;
            case 'n':
                iterations = atoi((char *) getopt);
                break;
            case 'i':
                strncpy(input, optarg, MAX_FILENAME_SIZE);
                break;
            case 'g':
                generate = 1;
                break;
            default:
                help();
                return 0;
        }
    } 

    if (argc != optind) {
        help();
        return 0;
    }

    grid = allocate_grid();
    tmp_grid = allocate_grid();
    if (!grid || !tmp_grid) {
        printf("error: out of memory\n");
        return -1;
    }
    if (generate) {
        generate_grid(grid);
    } else {
        read_grid(input, grid); 
    }
    for (c = 0; c < iterations; c++) {
        mean_filter(grid, tmp_grid);
        struct Grid *tmp = grid;
        grid = tmp_grid;
        tmp_grid = tmp;
    }
    write_grid(grid);
    cleanup_grid(grid);
    cleanup_grid(tmp_grid);

    return 0;
}
示例#2
0
int main ( int argc, char *argv[] )

/**********************************************************************/
/*
    Mean1.c: Perform a mean filter on a 2D array using just Send/Recv
*/
{
  int **image;
  int **filtered;
  int dest;
  int ierr;
  int i,j;
  int my_id;
  int n;
  int num_procs;
  int num_rows;
  int local_rows;
  int *start;
  int partition_size;
  MPI_Status status;
  MPI_Init ( &argc, &argv );

  MPI_Comm_rank ( MPI_COMM_WORLD, &my_id );
  MPI_Comm_size ( MPI_COMM_WORLD, &num_procs );
/* For now, hard code image size, and assume square */
	num_rows= 4;
/*Determine size of partition */
/*Assume everything divides right */
  local_rows = num_rows/num_procs;
  partition_size = (num_rows+2)*(local_rows+2);

/*
  The master process allocates and initializes image and filtered.
*/
  if ( my_id == 0 )
  {
    image = malloc ( (num_rows+2) * sizeof ( int* ) );
    image[0] = malloc ( (num_rows+2) * (num_rows+2) * sizeof ( int ) );
    for(i=1;i<num_rows+2;i++)
      image[i] = image[0] +i*(num_rows+2); 

    filtered = malloc ( (num_rows+2)* sizeof ( int* ) );
    filtered[0] = malloc ( (num_rows+2) * (num_rows+2) * sizeof ( int ) );
    for(i=1;i<num_rows+2;i++)
      filtered[i] = filtered[0] +i*(num_rows+2); 
  } else {
    image = malloc ( (local_rows+2) * sizeof ( int* ) );
    image[0] = malloc ( partition_size * sizeof ( int ) );
    for(i=1;i<local_rows+2;i++)
      image[i] = image[0] +i*(num_rows+2); 

    filtered = malloc (  (local_rows+2) * sizeof ( int ) );
    filtered[0] = malloc ( partition_size * sizeof ( int ) );
    for(i=1;i<local_rows+2;i++)
      filtered[i] = filtered[0] +i*(num_rows+2); 
  }

/* Initializa data */
/* NOTE INDICES -- Leave empty borders around the array; if reading file, make sure to skip row
/column zero and num_rows + 1 */
  if( my_id == 0 ) {
    for ( i = 1; i <= num_rows; i++ ) 
    {
      for ( j = 1; j <= num_rows; j++ )
      {
        image[i][j] = i*j;
      }
    }
  }

/* Send out partitions*/
/* Ghost Rows Algortihm... send everybody extra rows and columns */
  if ( my_id == 0 ) {
    for ( i = 1; i < num_procs; i++ ) {
      start = &image[(i*local_rows)][0];
      printf ( "\n Sending Data...  %d\n",partition_size );
      fflush(stdout);
      MPI_Send ( start, partition_size, MPI_INT, i, 1, MPI_COMM_WORLD );
    }
  } else {
    MPI_Recv(&image[0][0], partition_size,MPI_INT, 0, 1, MPI_COMM_WORLD, &status );
  printf ( "\n Received Data... \n" );
      fflush(stdout);
  }     

/* Fill in Ghost Columns on every processor */

  for(i=0;i<local_rows+2;i++) {
    image[i][0] = image[i][1];
    image[i][num_rows+1] = image[i][num_rows];
  }  

/* On rank 0, fix top row */
  if(my_id==0) {
    for(i=0;i<num_rows+2;i++) 
      image[0][i] = image[1][i];
  }
/* On rank n, fix bottom row */
  if(my_id==(num_procs-1)) {
    for(i=0;i<num_rows+2;i++) 
      image[local_rows+1][i] = image[local_rows][i];
  }

/*
  for(i=0;i<local_rows+2;i++) {
    for(j=0;j<local_rows+2;j++) {
        printf("\t   %d %d : %d", i,j,image[i][j]);
        fflush(stdout);
    }
   printf("\n %d::",my_id);
  }
*/
/* Mean Filter */
  for(i=1;i<local_rows+1;i++) {
    for(j=1;j<num_rows+1;j++) {
        filtered[i][j] = mean_filter(&image[0],i,j);
    }
  }
/* Re-assemble */ 
  partition_size = local_rows*(num_rows+2);
  if(my_id==0) {
   for ( i = 1; i < num_procs; i++ ) {
      start = &filtered[(i*local_rows)+1][0];
      MPI_Recv ( start, partition_size, MPI_INT, i, 1, MPI_COMM_WORLD, &status );
    }
  } else {
    MPI_Send(&filtered[1][0], partition_size,MPI_INT, 0, 1, MPI_COMM_WORLD);
  }  
/*  Print out the answer.  */
  if(my_id==0) {
    for(i=1;i<num_rows+1;i++) {
      for(j=1;j<num_rows+1;j++) 
          printf("\t   %d %d : %d", i,j,image[i][j]);
      printf("\n ");
      for(j=1;j<num_rows+1;j++) 
          printf("\t   %d %d : %d", i,j,filtered[i][j]);
      printf("\n ");
    }
  } 
  ierr = MPI_Finalize ( );
  return 0;
}