为什么我的C ++ MPI代码冻结了我?

时间:2013-04-28 22:03:24

标签: c++ mpi

关于MPI,我是一个菜鸟,但这没有任何意义。所以我在这里有一段使用MPI_Recv和MPI_Send的代码,但是在告诉我我的网格尺寸之后,在第一个“我在这里制作它”之前的东西冰柜。被发送到屏幕。

我不明白为什么。第一个“我在这里制作”和输出到屏幕的最后一件事之间几乎没有任何关系。

这是代码片段

void initMesh(double* &phi, double &h, double &riptime, 
    double &deltat, int &x, int &y, int &xlength, int &ylength, int &tlength, int &ttasks, int &jtasks, int &itasks, int &tstart, int &jstart, int &istart, int &myrank, int &cores) {
    int tasksize, remains, tremains;
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
    MPI_Comm_size(MPI_COMM_WORLD, &cores);
        if (myrank == 0) {
        cout << "How large would you like the mesh"
        <<" to be in the x-direction?" << endl;
        cin >> x;
        cout << "How large would you like the mesh"
        << " to be in the y-direction?\n";
        cin >> y;
        cout << "What is the distance between each x/y spot h (equal distance)?\n";
        cin >> h;
        cout << "How much time would you like the program to run for?\n";
        cin >> riptime;
        cout << "What would you like the time-step for the analysis to be?\n";
        cin >> deltat;
        xlength = (int) (x/h);
        ylength = (int) (y/h);
        tlength = (int) (riptime/deltat);
        cout << "Mesh x-points = " << xlength << endl;
        cout << "Mesh y-points = " << ylength << endl;
        cout << "Mesh time points = " << tlength << endl;
        cout << "I made it here!";
        }

//GOOD UP TO HERE!!! Then it freezes when I run the thing with 3 or more processors


        for (int i=1; i < cores; i++) {
            if (myrank==0) {
            cout << "I made it here!";
            MPI_Send(&xlength, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
            }
            else {
            MPI_Recv(&xlength, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            cout << "I made it here!";
            }
        }
        for (int i=1; i < cores; i++) {
            if (myrank==0) {
            MPI_Send(&ylength, 1, MPI_INT, i, 1, MPI_COMM_WORLD);
            }
            else {
            MPI_Recv(&ylength, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            }
        }
        for (int i=1; i < cores; i++) {
            if (myrank==0) {
            MPI_Send(&tlength, 1, MPI_INT, i, 2, MPI_COMM_WORLD);
            }
            else {
            MPI_Recv(&tlength, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            }
        }
    cout << "I made it here!";

上面的部分代码就是现在的麻烦。

1 个答案:

答案 0 :(得分:2)

正如评论中所述,您没有看到"I made it here!",因为您错过了<< endl

至于MPI:在每个for循环中,等级0似乎向其他所有等级发送内容。但是,每个其他级别都希望为循环的每次迭代接收一条消息。你想要的是每个等级每个循环只接收一个。

实际上,由于您向每个等级发送相同的信息,因此有两个更好的选择:

  • 假设每个排名具有相同的例程输入,请在每个进程上冗余地计算x - ,y - 和tlength(比通信方式更快)。
  • 如果这不是一个选项,请使用排名为0的MPI_Broadcast作为来源。