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_SOURCE
、status.MPI_TAG
、status.MPI_ERROR
等的引用,就可以得到返回状态中所包含的源进程标识,tag标识和本接收操作返回的错误代码
6、MPI程序的结束 MPI_Finalize
释放为MPI分配的资源
MPI_Finalize();