MPI基础

1.MPI可以是共享内存,也可以是非共享内存

2.MPI通过一组API(函数)进行调用

3.启动和终止MPI环境
     启动和终止分别通过如下API
     int MPI_Init(int *argc,char ***argv) 
     int MPI_Finalize()
     argc和argv是C程序中的命令行参数,MPI运行时,会在函数返回前从argv中移走MPI库应能处理的所有命令行参数,并相应地减少argc的数值
     两个函数的返回值是 MPI成功?MPI_SUCCESS:错误代码
    
     而在Fortran中,函数声明是
     MPI_Init(IERROR)
     MPI_Finalize(IERROR)
     唯一的参数是返回的错误代码
     
     头文件是mpi.h



4.获取信息
  • 关于通信域:df是一组相互通信的进程的集合。在MPI中,MPI_Comm型变量被称为通信器,作为参数用于所有的消息传递MPI函数中,并唯一标识参与消息传送操作的进程。同时,每个进程都可以属于不同的通信域。
  • MPI中定义了一个包含所有MPI进程的通信器MPI_COMM_WORLD
  • 确定进程数目以及调用进程的标号函数声明如下:
     int MPI_Comm_size(MPI_Comm comm,int *size)
     int MPI_Comm_rank(MPI_Comm,int *rank)
           第一个函数通过size返回属于通信器的进程数,函数返回值是错误代码
           第二个函数通过rank返回等级(阶),rank范围是0到comm-1,一般0是主进程
  • 在Fortran中的定义是类似的



5.发送和接收消息
  • 发送和接收消息的基本函数定义如下:
     int MPI_Send(void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Commm comm) //发送
     int MPI_Recv(void *buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm, MPI_Status *status) //接收 
  • 函数参数中的MPI_Datatype 这个参数,跟C对应一下就可以了,如C中是int 那这里就是MPI_INT C中是double,那这里就是MPI_DOUBLE,例子如下:
     MPI_Send(msg,size, MPI_INT,(my_rank+1)%comm_sz,0,comm);
     MPI_Recv(new_msg,size,MPI_INT,(my_rank+comm_sz-1)%comm_sz,0,comm, MPI_STATUS_IGNORE)
  • 还有两个没有对应的数据类型,分别是MPI_BYTE和MPI_PACKED,前者是一个字节,后者类似于struct,使用MPI_PACKED打包,并使用MPI_UNPACK解包,包内的数据可能并不相邻
  • tag是消息编号,接收时,如果来源处有多个消息标志相同,则会接收这些消息中的任意一个。
  • tag和source可以使用通配符,如果source被设置为MPI_ANY_SOURCE,则通信域中的任何一个进程都能成为消息源。如果tag设置为MPI_ANY_TAG,那么任何标志的消息都能被接收
  • 如果接收到的消息长度大于提供的缓冲区的长度,会返回MPI_ERR_TRUNCATE错误,表示溢出
  • MPI_Status定义如下:
     typedef struct MPI_Status{
          int MPI_SOURCE;
          int MPI_TAG;//上面两个一般是设置成MPI_ANY_SOUNRCE和MPI_ANY_TAG时比较有用
          int MPI_ERROR;//出错吗
     }
  • 获取接收消息的长度:
     int MPI_Get_Count(MPI_Status *status,MPI_Datatype datatype,int *count)
          count就是实际接收的数据项的数目了
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值