输出没有排序,使用MPI进行并行编程

时间:2015-03-12 20:38:27

标签: c++ algorithm parallel-processing mpi

我写了这样的代码:

void main(int argc, char **argv ) {

char message[20];
int i, rank, size, type=99;

MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(rank == 0) {

    strcpy_s(message, "Hello, world");

    for (i=1; i<size; i++)
        MPI_Send(message, 13, MPI_CHAR, i, type, MPI_COMM_WORLD);

} else {
    MPI_Recv(message, 20, MPI_CHAR, 0, type, MPI_COMM_WORLD, &status);
}

printf( "Message from process =%d : %.13s\n", rank, message);

MPI_Finalize();
}

我的输出是随机排序的。例如:

Message from process = 4 : Hello, world
Message from process = 2 : Hello, world
Message from process = 0 : Hello, world
Message from process = 1 : Hello, world
Message from process = 3 : Hello, world

但我想这样做:

Message from process = 0 : Hello, world
Message from process = 1 : Hello, world
Message from process = 2 : Hello, world
Message from process = 3 : Hello, world
Message from process = 4 : Hello, world

我尝试了一些代码,但仍处理随机顺序。

我改变了我的代码。现在,每个进程都等待来自前任的消息。但仍然处理输出随机排序。我写了MPI_Wait,但它没有用。

if(rank == 0) {

    strcpy_s(message, "Hello, world");
    printf( "Message from process =%d : %.13s\n", rank, message);

    MPI_Isend(message, 13, MPI_CHAR, rank + 1, type, MPI_COMM_WORLD, &request);

    MPI_Wait(&request, &status);

} else {

    MPI_Recv(message, 20, MPI_CHAR, (rank - 1) % size, type, MPI_COMM_WORLD, &status);
    printf( "Message from process =%d : %.13s\n", rank, message);

    if(rank < (size - 1)){

        MPI_Isend(message, 13, MPI_CHAR, (rank + 1) % size, type, MPI_COMM_WORLD, &request);

        MPI_Wait(&request, &status);
    }
}

我希望有人帮助我。感谢。

2 个答案:

答案 0 :(得分:3)

默认情况下,printf语句将由首先遇到的处理器进行评估,而不是按等级顺序进行评估。如果您必须按排名顺序进行,那么您可以尝试以下方式:

for(i = 0; i < size; i++) {
    if(i == rank) {
        printf("Message from process =%d : %.13s\n", rank, message);
    }

    MPI_Barrier(MPI_COMM_WORLD);
}

这循环遍历每个等级并且仅允许打印当前等级,而其他所有人都命中MPI_Barrier并被迫等待。但请记住,这不是一种可扩展的方法。

答案 1 :(得分:1)

我很喜欢循环方式中的MPI_Barrier!另一种方法是传递令牌:

source = myrank -1;
dest = myrank + 1   
if (source < 0) source = MPI_PROC_NULL;
if (dest >= nprocs) dest = MPI_PROC_NULL;
MPI_Recv(NULL, 0, MPI_BYTE, source, 0, comm, MPI_STATUS_IGNORE);
printf("Message from process =%d : %.13s\n", rank, message);
MPI_Send(NULL, 0, MPI_BYTE, dest, 0, comm);

另一种方法(这应该是一个单独的答案?)是在行前加一个排名,然后排序。在MPICH中,这将是mpiexec -np 4 -prepend-rank ...