我已在main中声明了int值,并且所有进程都已将这个值初始化。所有这些都是存储值,我想在计算完成后在屏幕上写入。广播是解决方案吗?例如。如何实现呢?
int i;
int value;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
MPI_Comm_rank(MPI_COMM_WORLD;&myrank);
left = (myrank - 1); if (left < 0) left = numtasks-1;
right = (myrank + 1); if (right >= numtasks) right = 0;
if(myrank==0){
value=value+myrank;
MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
}
else if(myrank==(numtasks-1)){
MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
value=value+myrank;
MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
}
else{
MPI_Recv(value,MPI_INT,left,99,MPI_COMM_WORLD,&status);
value=value+myrank;
MPI_Send(value,MPI_INT,right,99,MPI_COMM_WORLD);
}
Theese应该做出逻辑循环。我做一个计算(所有等级的总和),在过程0我得到结果。这个结果(对于4个进程,它将是6)我希望在计算之后由每个进程打印。但是我没有看到如何准确地使用障碍和在哪里。
还有一件事,在所有N-1发送(其中N是进程数)之后,我应该在每个进程中拥有所有等级的总和。在我的代码中,我只将此总和纳入流程0 ......这可能是一个糟糕的方法: - (
答案 0 :(得分:1)
有关代码结构的更多详细信息会有所帮助,但听起来您可以使用MPI_Barrier。您的流程不需要交换任何数据,他们只需要等到每个人都到达您希望打印发生的代码点,这正是Barrier所做的。
编辑:在您发布的代码中,屏障将在最后(if
语句之后),然后是printf(value)
。
但是,您的代码不会计算所有节点中所有排名的总和,因为进程i
仅接收第一个i-1
进程的总和排名。如果您希望每个进程在最后都有总和,那么将Barrier替换为Broadcast确实是最佳选择。 (实际上,整个if
语句和广播可以被单个MPI_Reduce()
调用替换,但这并不能真正帮助你学习MPI。:))