【问题标题】:Simple message exchange using MPI使用 MPI 进行简单的消息交换
【发布时间】:2012-10-16 15:53:53
【问题描述】:

我有一个在两个处理器上运行的简单 MPI 程序。在我的示例中(或者可能只是在我的计算机上),我的控制台在发送消息之前输出接收消息。

我知道有一种使用 MPI 对接收进行排序的方法,但我坚持认为我的示例将等待处理器 0 发送数据,因此接收输出必然是秒。

发送消息后如何打印接收消息?

这是我的代码:

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

int main(int argc, char *argv[]){
        int np, myId;
        char send[100], recv[100];

        MPI_Init(&argc, &argv);

        MPI_Comm_size(MPI_COMM_WORLD, &np);
        MPI_Comm_rank(MPI_COMM_WORLD, &myId);

        MPI_Status stat;
        if(myId == 0){
                int length = sprintf(send, "hey!"); 

                for(int i = 1; i < np; i++){
                        printf("send %d => %d (%d)", myId, i, length);
                        MPI_Send(send, length, MPI_CHAR, i, 0, MPI_COMM_WORLD);
                }

        }else if (myId == 1){
                MPI_Recv(send, 41, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &stat); 
                printf("receive %d <= %d\n", myId, 0);
        }

        MPI_Finalize();
        return 0;
}

【问题讨论】:

  • 你有没有试过让接收消息的进程休眠或者fflush(stdout)?
  • 喜欢在 MPI_Recv 之前放置一个 fflush(send) 吗?
  • fflush(send) 没有意义...send 不是输出缓冲区。
  • 是的,我知道,fflush(stdout) 运行良好!谢谢

标签: c mpi


【解决方案1】:

当并行写入共享缓冲区时,如果不使用并行 i/o 库,则无法保证首先清除哪个缓冲区。如果您希望它们按顺序出现,您应该在打印命令之后刷新输出缓冲区,例如 fflush(stdout);,打印到每次自动刷新的缓冲区,例如 fprintf(stderr,...); 或使用 MPI_Barrier分开打印命令。不推荐使用最后一种,因为它可能会导致性能不佳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2018-05-25
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多