【问题标题】:Behavior of MPI_Send and MPI_RecvMPI_Send 和 MPI_Recv 的行为
【发布时间】:2017-10-25 07:58:57
【问题描述】:

为什么是这些代码行:

if(my_rank != 0) {
    sprintf(msg, "Hello from %d of %d...", my_rank, comm_sz);
    if(my_rank == 2) {
        sleep(2);
        sprintf(msg, "Hello from %d of %d, I have slept 2 seconds...", my_rank, comm_sz);
    }
    MPI_Send(msg, strlen(msg), MPI_CHAR, 0, 0, MPI_COMM_WORLD);
}
else {
    printf("Hello from the chosen Master %d\n", my_rank);
    for(i = 1; i < comm_sz; i++) {
        MPI_Recv(msg, MAX_STRING, MPI_CHAR, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        printf("%s\n", msg);
    }
}

给出这个结果?

Hello from the chosen Master 0  
Hello from 1 of 5...  
Hello from 2 of 5, I have slept 2 seconds...  
Hello from 3 of 5... have slept 2 seconds...  
Hello from 4 of 5... have slept 2 seconds...

不是每个进程都有自己的“msg”副本吗?

【问题讨论】:

  • 你期待什么?请注意,MPI 不适用于线程,而是进程。
  • @Zulan 我希望只有第二个进程会写 我已经睡了 2 秒...

标签: mpi


【解决方案1】:

strlen() 不包括空终止符,因此它不会被发送到主服务器。收到来自 rank 3 的消息不会覆盖字符串的后面部分,所以仍然显示。您应该使用strlen(msg) + 1 作为发送计数。

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 2014-04-17
    • 2011-01-24
    • 1970-01-01
    • 2016-04-22
    • 2015-05-14
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多