MPI函数说明及示例

MPI函数说明

(1)并行初始化函数:int MPI_Init(int *argc,char ***argv)

参数描述:argc为变量数目,argv为变量数组,两个参数均来自main函数的参数

(2)并行结束函数: int MPI_Finalize()

例如:hello.c

#include "./mpich2/include/mpi.h"

#include <stdio.h>

int main(int argc,char **argv){

MPI_Init(&argc,&argv);//并行部分开始

printf("hello parallel world!\n");

MPI_Finalize();

}

(3)获得当前进程标识函数:int MPI_Comm_rank(MPI_Comm comm,int *rank)

参数描述:comm为该进程所在的通信域句柄,rank为调用这一函数返回的进程在通信域中的标识号

(4)获取通信域包含的进程总数函数:int MPI_Comm_size(MPI_Comm comm,int *size)

参数描述:comm为通信域句柄,size为函数返回的通信域comm内包含的进程总数

(5)获得本进程的机器名函数:int MPI_Get_processor_name(char *name,int *resultlen)

参数描述:name为返回的机器名字符串,resultlen为返回的机器名长度

例如:who.c

#include "./mpich2/include/mpi.h"

#include <stdio.h>

int main(int argc,char **argv)

{

int myid,numprocs;

int namelen;

char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);//获得本进程的ID

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);//获得总的进程数目

MPI_Get_processor_name(processor_name,&namelen);//获得本进程的机器名

printf("hello World!Process %d of %d on %s \n",myid,numprocs,processor_name);

MPI_Finalize();

}

(6)消息发送函数:int MPI_Send(void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm)

参数描述:buf为发送缓冲区的起始地址,count为将发送的数据个数(以后面的数据类型进行计数),datatype为发送数据的数据类型,dest为目的进程标识号,tag为消息标识,comm为通信域

MPI_Send()将发送缓冲区buf中得count个datatype数据类型的数据发送到标识号为dest的目的进程,本次发送的消息标识是tag

(7)消息接收受函数:int MPI_Recv(void *buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm,MPI_Status *status)

参数描述:buf为接收缓冲区的起始地址,count为最多可接收的数据个数,datatype为接收数据的数据类型,source为接收数据的来源进程标识号,tag为消息标识,应与相应发送操作的标识相匹配,comm为本进程和发送进程所在的通信域,status为返回状态

例如:message.c

#include <stdio.h>

#include <string.h>

#include "./mpich2/include/mpi.h"

int main(int argc,char **argv)

{

int myid,numprocs,source;

MPI_Status status;

char message[100];

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD,&myid);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs);

if(myid != 0)

{

strcpy(message,"Hello World!");//为发送字符串赋值

//发送字符串时长度要加1,从而包括串结束标志

MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);

}

else

{

//除0进程的其他进程接收来自于0进程的字符串数据

for(source = 1;source < numprocs;source++)

{

MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);

printf("I am process %d.I receive string '%s' from process %d.\n",myid,message,source);

}

}

MPI_Finalize();

}

另附:MPI预定义数据类型与C语言数据类型的对应关系

MPI 数据类型

对应C 数据类型

MPI_CHAR

Signed char

MPI_SHORT

Signed short int

MPI_INT

Signed int

MPI_LONG

Signed long int

MPI_UNSIGNED_CHAR

Unsigned char

MPI_UNSIGNED_SHORT

Unsigned short int

MPI_UNSIGNED

Unsigned int

MPI_UNSIGNED_LONG

Unsigned long int

MPI_FLOAT

Float

MPI_DOUBLE

Double

MPI_LONG_DOUBLE

Long double

MPI_BYTE

无相应数据类型

MPI_PACKED

无相应数据类型

MPI_LONG_LONG_INT

Long long int

  • 15
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值