您的位置:首页 > 其它

MPI函数说明及示例

2011-09-19 22:57 127 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: