Mandelbrot使用MPICH设置。试图学习,但无法解决这个问题

时间:2017-11-17 12:04:43

标签: c mpich mandelbrot

我正在尝试实现主/从关系,它解决了mandelbrot集并将其打印到ppm文件中。这就是我到目前为止所做的:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <mpi/mpi.h>


    int calculateMan (double , double ); //calculateMandelbrotSet

    MPI_Status status;

    struct Number {
        double R;
        double i;
    } Z,C;

    const int color;
    int colorTemp; //color value
    const int max = 1000;  //max iteration value
    const int ResHeight = 800; //Resolution
    const int ResWidth  = 800;
    double CRMax = 1.5;
    double CIMax = 2.0;
    double CRMin = -2.5;
    double CIMin = -2.0; //Constant values
    double colorWidth;
    double colorHeight;


    int main (int argc, char** argv) {
        int rank, size = 0;
        int nodos, source, dest;
        double startTime, endTime;

         //Rank = current process ID
         //Size = amount of processes

          MPI_Init (&argc, &argv);      // starts MPI

          startTime = MPI_Wtime();

          MPI_Comm_size (MPI_COMM_WORLD, &size);   // get number of processes
          MPI_Comm_rank (MPI_COMM_WORLD, &rank);  // get current process

        nodos = size - 1;

        if (rank == 0) { // MASTER --------------------------------------

            colorHeight = (CIMax - CIMin) / ResHeight;
            colorWidth = (CRMax - CRMin) / ResWidth;
            FILE *fp;

            fp = fopen("Mandelbrot.ppm","w");

            fprintf(fp,"P3\n %d\n %d\n %d\n",ResWidth,ResHeight,255); //Magic Number & Header

            for (int row = 0; row < ResHeight; row++) {
                C.i= CIMin + row*colorHeight;
                for (int column = 0; column < ResWidth; column++) {
                    C.R = CRMin + column*colorWidth;

                    //data sends
                     for (dest = 1; dest <= nodos; dest++) {
                     MPI_Send(&C.R, sizeof(double), MPI_DOUBLE, dest, column, MPI_COMM_WORLD);
                     MPI_Send(&C.i, sizeof(double), MPI_DOUBLE, dest, column, MPI_COMM_WORLD);
                         }
                    }
                }

           for (int row = 0; row < ResHeight; row++) {
               for (int column = 0; column < ResWidth; column++) {
                //Recv and print
                    MPI_Recv(&colorTemp, sizeof(int), MPI_DOUBLE, source, 0, MPI_COMM_WORLD, &status);
                   fprintf(fp, "%d %d %d\n", colorTemp, 1,3);
                    }
               }
           fclose(fp);
           } //------------------------- END MASTER

             if (rank > 0) // START SLAVE --------------------------------------
                {
                    for (int row = 0; row < ResHeight; row++) {
                        for (int column = 0; column < ResWidth; column++) {
                          MPI_Recv(&C.R, sizeof(double), MPI_DOUBLE, 0, column, MPI_COMM_WORLD, &status);
                          MPI_Recv(&C.i, sizeof(double), MPI_DOUBLE, 0, column, MPI_COMM_WORLD, &status);

                            colorTemp = calculateMan(C.R, C.i);
                            MPI_Send(&colorTemp, sizeof(int), MPI_INT, 0, 0, MPI_COMM_WORLD);
                            }
                    }
                } // SLAVE END---------------------------------


            endTime = MPI_Wtime(); //stop timer
            MPI_Finalize(); //end MPI
            printf("Time: %.6f\n", endTime-startTime);
            exit(0); //end program

    }

    int calculateMan (double CReal, double CImaginary) {
        int i = 0;
        Z.R = 0.0;
        Z.i = 0.0;

        while (((i < max) && (Z.R*Z.R) + (Z.i * Z.i) < 4))
        {
            double temp = (Z.R * Z.R) - (Z.i * Z.i) + CReal;
            Z.i = 2.0 * Z.R * Z.i + CImaginary;
            Z.R = temp;
            i++;
        }

        if (i == max)
            return 0; //interior is black
        else
            return 255; //exterior white
    }

我正在尝试运行我的程序,但我无法弄清楚为什么RECV和print有无限次迭代。此外,任何人都可以查看代码并告诉我任何其他问题或我应该注意的事项,以供将来参考?

谢谢!

0 个答案:

没有答案