C语言MPI并行说明

1、一个简单的MPI程序

#define _CRT_SECURE_NO_WARNINGS 1
#  include <stdio.h>
#  include "mpi.h"
void main(int argc, char* argv[])
{
	int myid;	// 记录进程标识
	int numprocs;	// 进程标识
	int namelen;		// 进程个数

	// MPI预定义的宏,允许机器名字的最大长度,机器名放在processor_name中
	char processor_name[MPI_MAX_PROCESSOR_NAME];	 

	// MPI程序的初始化
	MPI_Init(&argc, &argv);

	// MPI_Comm_rank 得到当前进程的标识号,赋给变量myid
	MPI_Comm_rank(MPI_COMM_WORLD, &myid);

	// MPI_Comm_size 得到当前进程的个数,赋给变量 numprocs
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

	// MPI_Get_processor_name 得到本进程当前的运行的机器名称,结果放在processor_name中,该字符串的长度放在 namelen中
	MPI_Get_processor_name(processor_name, &namelen);

	printf("Hello World! Process %d of %ds on  %s\n", myid, numprocs, processor_name);
	
	// MPI程序的结束
	MPI_Finalize();

2、6个基本函数组成的MPI子集

1、MPI程序的初始 化 MPI_Init
// argc 为变量的数目, argv为变量的数组,两个参数都是来自于main函数的参数
MPI_Init(&argc, &argv); 
2、得到当前进程的标识号 MPI_Comm_rank

赋给变量myid(我是哪个进程?)

有了进程的标识号,不同的进程就可以互相区区分开,从而实现进程的并行与协作

MPI_Comm_rank(MPI_COMM_WORLD, &myid);
3、得到指定通信域中当前进程的个数 MPI_Comm_size

赋给变量 numprocs (任务有多少个进程?)

知道有多少个进程正在执行

MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
4、数据发送 MPI_Send
MPI_SEND(buf, count, datatype, dest, tag, comm)
	buf		发送缓冲区的起始地址				(可选类型)
	count	将发送的数据的起始地址				(非负整数)
	datatype	数据类型					(句柄)
	dest	目标进程标识号(消息发送给哪个进程)	(整型)
	tag		消息标志						(整型)
	comm	通信域							(句柄)
int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

从buf内存位置,获得count个datatype类型的数据作为消息内容,发送给comm通信域中的dest进程。

tag是本次发送的消息标志,消息数据在发送的缓冲区中连续存放

5、数据接收 MPI_Recv
MPI_RECV(buf, count, datatype, source, tag ,comm, status)
    buf			接收缓冲区的起始地址		(可选类型)
    count		最多接收的数据个数		 (整型)
    datatype	接收数据的类型			  (句柄)
    source		接收数据的进程标识号		(整型)
    tag			消息标识与				(整型)
    comm		本行程和发送进程所在的通信域	(句柄)
    status		返回状态				(状态类型)
int MPI_Recv(void*buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)

作用:从comm通信域中的source进程接收消息,该消息的数据类型datatype和数据标识tag,接收到的消息所包含的数据个数最多不超过count个。接收到的数据放在接收缓冲区,接收缓冲区由buf,count,datatype定义。

接收函数最后一个参数 status的定义:

typedef struct MPI_Status {
    int count;
    int concelled;
    int MPI_SOURCE;
    int MPI_TAG;
    int MPI_ERROR;
} MPI_Status

接收调用返回时将在 返回状态变量中 存访实际接收消息的状态信息,通过对 status.MPI_SOURCEstatus.MPI_TAGstatus.MPI_ERROR等的引用,就可以得到返回状态中所包含的源进程标识,tag标识和本接收操作返回的错误代码

6、MPI程序的结束 MPI_Finalize

释放为MPI分配的资源

MPI_Finalize();
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言并行程序MPI(Message Passing Interface),是一种用于并行计算的编程模型。MPI允许在多个计算机之间进行进程间通信,以实现并行计算任务的协同工作。 MPI程序主要由多个进程组成,每个进程在不同的计算机上运行,并可以在运行时相互通信。通信是通过消息传递的方式来实现的,每个进程可以发送和接收消息。 在MPI程序中,通常会有一个主进程(通常被称为rank 0),负责协调整个计算任务的执行和结果的收集。其他进程(rank 1, rank 2等)则负责执行具体的任务。主进程可以把任务分成若干子任务,然后将这些子任务分发给其他进程并协调它们的执行。子进程在执行完任务后,可以将结果返回给主进程或者将结果发送给其他进程。 MPI程序可以在单个机器上运行,也可以在多台机器组成的集群上运行。在集群上运行MPI程序时,需要在每台机器上安装MPI库,并通过网络连接进行进程间通信。 MPI程序可以应用于各种并行计算任务,如科学计算、图像处理、数据挖掘等。通过将任务分解成小的子任务,并在多个计算机上同时执行,可以大大加快计算速度,提高程序的执行效率。 总之,C语言并行程序MPI提供了一个强大的工具,可以将计算任务分布到多个计算机上并实现进程间通信。通过合理的任务划分和结果的收集,可以实现高效的并行计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值