1

我在 MPI 上编写了一个程序,它会以某种环形方式绕过每个处理器 x 次(例如,如果我希望它围绕四个处理器的“环形”运行两次,它将进入 0、1、2 , 3, 0 ,1....3)。

一切都编译得很好,但是当我在我的 Ubuntu VM 上运行程序时,它永远不会输出任何东西。它甚至不会运行第一个输出。谁能解释发生了什么?

这是我的代码:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char **argv){
    int rank, size, tag, next, from, num;
    tag = 201;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    next = (rank + 1)/ size;
    from = (rank - 1)/size;
    if (rank == 0){
            printf("How many times around the ring? :: ");
        scanf ("%d", &num);
        MPI_Send(&num, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
    }
    do{
        MPI_Recv(&num, 1, MPI_INT, from, tag, MPI_COMM_WORLD, &status);
        printf("Process %d received %d from process %d\n", rank, num, status.MPI_SOURCE);
        if (rank == 0){
            num--;
            printf("Process 0 has decremented the number\n");
        }
        printf("Process %d sending %d to process %d\n", rank, num ,next);
        MPI_Send(&num, 1, MPI_INT, next, tag, MPI_COMM_WORLD);
    }while (num > 0);
    printf("Process %d has exited", rank);
    if (rank == 0){
        MPI_Recv(&num, 1, MPI_INT, size - 1, tag, MPI_COMM_WORLD, &status);
        printf("Process 0 has received the last round, exiting");
    }
    MPI_Finalize();
    return 0;
}
4

2 回答 2

3

你的邻居分配有问题。next如果我们在/from计算之后插入以下行

printf("Rank %d: from = %d, next = %d\n", rank, from, next);

我们得到:

$ mpirun -np 4 ./ring
Rank 0: from = 0, next = 0
Rank 1: from = 0, next = 0
Rank 2: from = 0, next = 0
Rank 3: from = 0, next = 1

你想要更多类似的东西

next = (rank + 1) % size;
from = (rank - 1 + size) % size;

这使

$ mpirun -np 4 ./ring
Rank 0: from = 3, next = 1
Rank 1: from = 0, next = 2
Rank 2: from = 1, next = 3
Rank 3: from = 2, next = 0

然后你的代码似乎工作。

于 2013-01-07T17:21:07.883 回答
0

不管你的代码好不好,你的第一个 printf 都应该被输出。

如果您根本没有打印任何消息,即使是“if(rank==)”块中的 printf,也可能是您的 VM 有问题。您确定在该 VM 上激活了任何网络接口吗?

如果答案是肯定的,通过查看OpenMPI FAQ over tcp questions来检查它与 MPI 的兼容性可能会很有用。第 7 节(如何告诉 Open MPI 使用哪些 TCP 网络?)和第 13 节(Open MPI 是否支持虚拟 IP 接口?)对于在虚拟机中运行 MPI 可能出现的任何问题似乎都很有趣。

于 2013-01-13T16:23:37.860 回答