首页 > 解决方案 > openmpi:printf 不等待 scanf

问题描述

int main( int argc, char *argv[])
{
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    int x;
    printf("Rank: %d\n", rank);
    fflush(stdout);
    scanf("%d", &x);
    

    MPI_Finalize();
    
    return 0;
}

当我在 2+ 个任务上运行它时,它会打印所有内容,但最后使用了一次 scanf

(base) curer:hw4 user$ mpic++ -o a ./-.cpp 
(base) curer:hw4 user$ mpirun -oversubscribe -np 2 ./a
Rank: 0
Rank: 1
7

最后scanf,我输入了7

我想变成那样

(base) curer:hw4 user$ mpic++ -o a ./-.cpp 
(base) curer:hw4 user$ mpirun -oversubscribe -np 2 ./a
Rank: 0
8
Rank: 1
7

printf Rank i 然后 scanf 任意数字

标签: cmpi

解决方案


如果你真的很想让每个 MPI 任务一个接一个地做一个工作,那么你可以通过一系列的MPI_Send和来同步这些工作MPI_Recv

这是一个工作示例:

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


int read(int rank)
{
    int x;
    printf("Rank: %d\n", rank);
    fflush(stdout);
    scanf("%d", &x);
    return x;
}

int main( int argc, char *argv[])
{
    int rank, size, send, receive, x;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    send = 1;
    if (rank == 0)
    {
        x = read(rank);
        if (size > 1)
            MPI_Send(&send, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
    }
    else
    {
        MPI_Recv(&receive, 1, MPI_INT, rank - 1, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        x = read(rank);
        MPI_Send(&send, 1, MPI_INT, rank + 1, 0, MPI_COMM_WORLD);
    }
    

    MPI_Finalize();
    
    return 0;
}

在上面的代码中,每个任务都向下一个任务发送消息,并且(除了根)在执行工作之前等待来自前一个任务的消息。

MPI_Bcast但是,正如评论中所指出的,让任务(通常是根)执行输入作业,然后使用or在任务之间分配输入更为常见MPI_Scatter


推荐阅读