pastebin

Paste Search Dynamic
Recent pastes
MPI comm world
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <mpi.h>
  4. #include <math.h>
  5.  
  6. //the size of the mandelbrot set
  7. #define WIDTH 1000
  8. #define HEIGHT 1000
  9.  
  10. //the max number of iterations
  11. #define MAX_ITERATION 1000
  12.  
  13. //the value of the set
  14. #define MAX_VALUE 4
  15.  
  16. int main(int argc, char **argv)
  17. {
  18.     int rank, size, i, j, k;
  19.     double x, y, x0, y0, x_new, y_new;
  20.     int iterations;
  21.     double start, end;
  22.     int *data;
  23.  
  24.     MPI_Init(&argc, &argv);
  25.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  26.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  27.  
  28.     start = MPI_Wtime();
  29.    
  30.     //allocate memory for the data
  31.     data = (int *)malloc(WIDTH * HEIGHT * sizeof(int));
  32.     if (data == NULL)
  33.     {
  34.         printf("Error allocating memoryn");
  35.         MPI_Abort(MPI_COMM_WORLD, 1);
  36.     }
  37.  
  38.     //calculate the mandelbrot set
  39.     for (i = rank; i < WIDTH; i += size)
  40.     {
  41.         for (j = 0; j < HEIGHT; j++)
  42.         {
  43.             //calculate the initial values
  44.             x = 0;
  45.             y = 0;
  46.             x0 = -2.0 + (4.0 / WIDTH) * i;
  47.             y0 = -2.0 + (4.0 / HEIGHT) * j;
  48.  
  49.             //iterate until we reach the max number of iterations
  50.             for (iterations = 0; iterations < MAX_ITERATION; iterations++)
  51.             {
  52.                 x_new = x * x - y * y + x0;
  53.                 y_new = 2 * x * y + y0;
  54.                 x = x_new;
  55.                 y = y_new;
  56.                
  57.                 if (x * x + y * y > MAX_VALUE)
  58.                     break;
  59.             }
  60.  
  61.             //set the data
  62.             data[i * HEIGHT + j] = iterations;
  63.         }
  64.     }
  65.  
  66.     //gather the data from all the processes
  67.     MPI_Gather(data, WIDTH * HEIGHT / size, MPI_INT,
  68.                data, WIDTH * HEIGHT / size, MPI_INT,
  69.                0, MPI_COMM_WORLD);
  70.  
  71.     end = MPI_Wtime();
  72.    
  73.     //print the data
  74.     if (rank == 0)
  75.     {
  76.         for (i = 0; i < WIDTH; i++)
  77.         {
  78.             for (j = 0; j < HEIGHT; j++)
  79.             {
  80.                 printf("%d ", data[i * HEIGHT + j]);
  81.             }
  82.             printf("n");
  83.         }
  84.         printf("nTime: %fn", end - start);
  85.     }
  86.  
  87.     //free the memory
  88.     free(data);
  89.  
  90.     MPI_Finalize();
  91.     return 0;
  92. }
Parsed in 0.007 seconds