使用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(Message Passing Interface)由MPI委员会在1992年至1994年的会议中制定,并在...
### MPI:消息传递接口标准3.0版 #### 核心知识点概述 1. **MPI标准的历史演变**:从最初的MPI-1.0版本到MPI-3.0版本的逐步发展。 2. **MPI标准的主要内容**:包括点对点通信、集体通信、组和通信器概念、进程拓扑...
### 消息传递并行编程环境MPI #### 进程与消息传递 在并行计算领域,进程(Process)指的是一个包含执行环境(如内存、寄存器、程序计数器等)的程序实例,它是操作系统中独立存在的可执行基本单元。在单个进程中...
### 消息传递编程接口MPI #### MPI简介与定义 **消息传递编程接口**(Message Passing Interface,简称MPI)是一种广泛应用于高性能计算领域的并行计算标准。它为编写分布式内存多处理器并行程序提供了一种统一的...
"消息传递并行编程环境MPI-LSEC.pdf" 以下是对标题和描述中所说的知识点的详细说明: 进程与消息传递 在操作系统中,进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在...
### MPI消息传递接口:LAM/MPI和MPICH安装与配置 随着信息技术的快速发展,高性能计算(High Performance Computing,HPC)技术已经成为科学研究和技术开发的关键工具之一。在并行计算领域,**消息传递接口...
MPI消息传递详解
**消息传递接口(MPI)简要介绍** 消息传递接口(Message Passing Interface,简称MPI)是一种标准,用于在并行计算环境中让多个处理器之间进行通信。它允许程序员编写跨平台的并行程序,适用于各种分布式内存系统...
1. **缓冲区管理**:由于消息可能在发送后立即到达,因此需要合理管理缓冲区,避免数据竞争。 2. **性能优化**:考虑通信开销,合理选择通信模式和数据类型,以及利用非阻塞通信和预发送(preload)技术提高效率。 ...
消息传递接口标准(MPI)是基于MPI论坛共识的消息传递库标准,MPI论坛有40多个参与组织,其中包括供应商,研究人员,软件库开发人员和用户。消息传递接口的目标是为消息传递建立一种可移植,高效且灵活的标准,该...
### 消息传递并行编程环境MPI知识点解析 #### 一、消息传递并行编程环境MPI简介 **消息传递并行编程环境**(Message Passing Interface, MPI)是一种广泛应用于高性能计算领域的标准并行编程模型。它定义了一组用于...
### 消息传递并行编程环境 MPI 知识点概览 #### 一、消息传递并行编程环境 MPI 概述 **MPI**(Message Passing Interface)是一种用于编写并行程序的标准接口,它允许程序员在分布式内存环境中进行进程间通信(IPC...
**MPI (Message Passing Interface)**是消息传递编程接口的缩写,是一种广泛应用于并行计算的标准,旨在提供一种高效、可扩展、统一的编程环境。MPI不是一种编程语言,而是一系列库函数,可供C和FORTRAN等编程语言...
* 锁定消息传递:使用消息缓冲区并在本地操作完成后就返回的例程称为锁定的。 * 非锁定消息传递:进程不必等相应接收,立即返回的例程称为非锁定的。 同步消息传递方式中,发送和接收操作过程中通常需要某种形式的...
并行模拟退火算法是一种基于消息传递接口(MPI)的分布式计算方法,用于解决优化问题,如图中的“roommate分配”。MPI(Message Passing Interface)是计算机科学中用于编写并行程序的标准库,它允许不同处理器间进行...
MPI的核心概念包括进程、通信、消息传递和集合操作。 1. **进程**:在MPI中,计算任务被分解成多个独立的进程,每个进程都有自己的内存空间和执行线程。 2. **通信**:MPI通过消息传递机制实现进程间通信。例如,`...
3. **缓冲区通信**:`MPI_Ssend`、`MPI_Rsend`和`MPI_Sendrecv`提供了不同类型的同步通信选项,优化了数据传输的效率。 **集体通信**: 1. **广播**(Broadcast):`MPI_Bcast`让一个进程的数据被所有进程接收到,...