使用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:
从结果来看,至少我的猜测还是有一定正确的可能性的。