Ask Your Question

michaelbminer's profile - activity

2015-11-29 22:50:30 -0600 asked a question Parallel Game of Life

I am parallelizing the game of life and have an issue displaying my final image after each iteration.

int main(int argc, char** argv)
{
  assert(argc == 4);

  //-----------------------
  // Convert Command Line
  //-----------------------

  int ny = atoi(argv[1]);
  int nx = atoi(argv[2]);
  int maxiter = atoi(argv[3]);

  assert(ny <= MAX_SIZE);
  assert(nx <= MAX_SIZE);

  //---------------------------------
  // Generate the initial image
  //---------------------------------
  srand(clock());
  cv::Mat population(ny, nx, CV_8UC1);
  for (unsigned int iy = 0; iy < ny; iy++)
  {
    for (unsigned int ix = 0; ix < nx; ix++)
    {
      //seed a 1/2 density of alive (just arbitrary really)
      int state = rand()%2;
      if (state == 0) population.at<uchar>(iy,ix) = DEAD; //dead
      else population.at<uchar>(iy,ix) = ALIVE;   //alive
    }  
  }

  cv::Mat newpopulation = population.clone();
  cv::namedWindow("Population", cv::WINDOW_AUTOSIZE );
  cv::Mat image_for_viewing(MAX_SIZE,MAX_SIZE,CV_8UC1);

  int rank, nproc;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD,&nproc);
  MPI_Comm_rank(MPI_COMM_WORLD,&rank);

  // do all the processing here
  std::vector<int> localstart(nproc), localstop(nproc), localcount(nproc);
  parallelRange(0, population.rows-1, rank, nproc, localstart[rank], localstop[rank], localcount[rank]);

  // calculate appropriate bounds for all processors.
  int start = std::max(0, localstart[rank]-1);
  int stop = std::min(population.rows-1, localstop[rank]+1);
  int rows_in_section = stop-start+1;

  for (int iter = 0; iter < maxiter; iter++)
  {    
    // make sure every processor has finished its work 
    MPI_Barrier(MPI_COMM_WORLD);

    // cut out the section we are processing and copy it into the known population
    cv::Mat image_on_proc = newpopulation(cv::Rect(0, start, population.cols, rows_in_section));
    image_on_proc.copyTo(population(cv::Rect(0, start, population.cols, rows_in_section)));

    // make sure all sections are copied
    MPI_Barrier(MPI_COMM_WORLD);

    // display the image
    if(rank == 0){
    cv::resize(population,image_for_viewing,image_for_viewing.size(),cv::INTER_LINEAR);
    cv::imshow("Population", image_for_viewing);
    cvWaitKey(10);
    }

    // play the game
      }
    } 
  }

  MPI_Finalize();

}

I am trying to display my final image on rank 0, however only the rank 0 section is showing any changes. I was hoping someone could tell my why my entire is not displaying all the changes each iteration. I will note that displaying a section on each processor shows all the appropriate changes.