`
james23dier
  • 浏览: 526237 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mpi消息传递缓冲区乱码

阅读更多

使用openmpi1.4.3版本练习使用MPI编程,写了一个简单的消息传递和接收的小demo,结果输出接收到的信息的时候出现乱码,现象如下:

[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1Àa
                            #:
[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1`Hè:
[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1PbzÆ:
[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1 _™:
[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1À´Î8:

 由此可见,每次运行结果都不一样。

源代码如下:

#include "mpi.h"

int main(int argc, char* argv[])
{
        char message[20];
        int myrank;
        MPI_Status status;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
        if(0 == myrank)
        {
                strcpy(message, "Hello, process 1");
                MPI_Send(message, strlen(message), MPI_CHAR, 1, 99, MPI_COMM_WORLD);
        }else if(1 == myrank)
        {
                MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
                printf("received: %s:\n", message);
        }
        MPI_Finalize();
}

 初步猜测在于传递的字符串只有16个字符长度,而缓冲区message有20个字符长度。这样,缓冲区message多余的四个字符空间所存储的字符时没有意义的,所以打印的时候将多余四个字符空间的字符打印出来,导致乱码。针对此猜测,将缓冲区大小设置为刚好字符串的16个字符长度,代码如下:

#include "mpi.h"

int main(int argc, char* argv[])
{
        char message[16];
        int myrank;
        MPI_Status status;
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
        if(0 == myrank)
        {
                strcpy(message, "Hello, process 1");
                MPI_Send(message, strlen(message), MPI_CHAR, 1, 99, MPI_COMM_WORLD);
        }else if(1 == myrank)
        {
                MPI_Recv(message, 16, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
                printf("received: %s:\n", message);
        }
        MPI_Finalize();
}

 修改之后编译运行,结果如下:

[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1:
[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1:
[chengang@m910 mpi]$ mpirun -n 2 a.out
received: Hello, process 1:

 从结果来看,至少我的猜测还是有一定正确的可能性的。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics