使用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:
从结果来看,至少我的猜测还是有一定正确的可能性的。
分享到:
相关推荐
消息传递编程接口 MPI的语言绑定和实现
消息传递接口MPI作为全世界工业、科研机构以>及政符联合制定的一个标准,有力地促进了并行计算的发展。LAM/MPI和MPICH是目前使用最为广泛的免费MPI实现版本,它们都支持MPI 1标准 的全部内容,同时还支持部分MPI 2...
MPI消息传递详解
消息传递并行编程环境MPI,并行编程不错的介绍
简要介绍MPI,关于MPI的发展,MPI的编程模式,MPI的优点。
mpich3.0版本的开发文档,以及与以往版本的不同
消息传递接口标准(MPI)是基于MPI论坛共识的消息传递库标准,MPI论坛有40多个参与组织,其中包括供应商,研究人员,软件库开发人员和用户。消息传递接口的目标是为消息传递建立一种可移植,高效且灵活的标准,该...
本文概述了C程序员的MPI开发。
MPI是一种消息传递编程模型,并成为这种编程模型的代表。事实上,标准MPI虽然很庞大,但是它的最终目的是服务于进程间通信这一目标的;
消息传递编程接口MPI.ppt
消息传递并行编程环境MPI-LSEC.pdf
消息传递接口(MPI)的Chicken方案绑定。 文献资料 MPI( )是分布式内存并行编程的流行标准。 它提供点对点消息传递和组通信操作(广播,分散/聚集等)。 Open MPI( )是MPI标准的实现,该标准结合了其他几个...
消息传递并行编程环境 MPI 一、 进程与消息传递 二、 MPI 环境的应用现状 三、 MPI 并行程序设计入门(程序例 1) 四、 初步的 MPI 消息传递函数 五、 作业一 六、 先进的 MPI 函数 七、 MPI 并行程序示例 2(求解-...
MPI(消息传递接口标准)和 Lua 脚本语言之间的接口。 示例用法 local MPI = require 'MPI' local buffer = require 'buffer' local size = buffer.new_buffer(buffer.sizeof(buffer.int)) local rank = buffer.new...
并行计算的一些演示程序,基于MPI消息传递的演示程序。
MPI(Message Passing Interface),消息传递编程接口,是全球工业、科研和政府部联合建立的一个消息传递编程标准。是目前最为通用的并行编程方式。MPI标准中定了一组函数接口,用于进程间的消息传递。函数的具体...
QT和MPI、结合编程的配置过程。MPI是一个并行消息传递借口,QT用于实现界面编程。