c - 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 任意数字
解决方案
如果你真的很想让每个 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
。
推荐阅读
- android - Android 旋转文本:我使用 dynamiclayout.draw(canvas) 但它不会沿路径设置动画,并且不能使用 canvas.drawTextOnPath(dynamiclayout)
- list - 将列表的第一项添加到其他列表 Python 的前面
- mongodb - mongodb 从属“身份验证失败”
- android - 从片段后台堆栈中的特定位置删除和导航片段
- android - Unity 2019.3 作业失败并出现异常:GooglePlayServices.JavaUtilities+ToolNotFoundException:找不到 jar
- python - groupby 后聚合列的组合
- debugging - Toad 调试器不进入程序
- python - 如何使用 subprocess 和 os 模块在终端(mac os)中运行命令?
- javascript - 是否有可能从函数本身内部获得异步函数的承诺?
- android - 扫描打开应用程序时如何在 Android 上使用 NFC 标签