2024年6月12日发(作者:)

MPICH&PBS使用指南

一、MPI编程................................................................................................................... 1

二、MPICH下编译和运行................................................................................................ 3

三、PBS环境下运行 ........................................................................................................ 4

一、MPI编程

1、MPI编程函数介绍

MPI实际上是一个提供并行程序消息传递机制的函数库,有40多个函数,常用的有6个基本函数。下

面以C语言为例简单介绍这些函数。

(1)MPI_Init函数

定义:int MPI_Init(int *argc, char ***argv)

功能:用命令行参数初始化MPI环境

输入:argc、argv—表示命令行参数,同C语言的main()函数参数格式,argv中包含欲并行运行的进程

输出:返回值—非零/零表示初始化是否成功

说明:该函数必须为程序中第一个调用的MPI函数

示例:MPI_Init(&argc, &argv); // argc、argv引用的是mian()函数的参数

(2)MPI_Finalize函数

定义:int MPI_Finalize (void)

功能:结束MPI程序的运行,指结束MPI环境的使用

输入:无

输出:返回值—非零/零表示结束MPI环境是否成功

说明:该函数必须为程序中最后一个调用的MPI函数

示例:MPI_ Finalize ();

(3)MPI_Comm_size函数

定义:int MPI_Comm_size(MPI_Comm comm, int *size)

功能:得到总进程数

输入:comm 通信域句柄(系统默认的为MPI_COMM_WORLD,也可自己定义)

输出:size,即通信域comm内包括的进程数整数

(4)MPI_Comm_rank函数

定义:int MPI_Comm_rank(MPI_Comm comm, int *rank)

1

功能:得到本进程的进程号

输入:comm,该进程所在的通信域句柄

输出:rank,调用进程在comm中的标识号

(5)MPI_Send函数

定义:int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

功能:发送消息给特定的进程

输入:buf 发送缓冲区的起始地址(可选类型)

count 将发送的数据的个数(非负整数)

datatype 发送数据的数据类型(句柄)

dest 目的进程标识号(整型)

tag 消息标志(整型)

comm 通信域(句柄)

输出:无

(6)MPI_Recv函数

定义:int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag,MPI_Comm comm,

MPI_Status *status)

功能:接受别的进程发过来的消息

输入:count 最多可接收的数据的个数(整型)

datatype 接收数据的数据类型(句柄)

source 接收数据的来源即发送数据的进程的进程标识号(整型)

tag 消息标识与相应的发送操作的表示相匹配相同(整型)

comm 本进程和发送进程所在的通信域(句柄)

输出:buf 接收缓冲区的起始地址(可选数据类型)

status 返回状态 (状态类型MPI_Status)

2、MPI程序示例

MPI程序中必须包含MPI库的头文件,C语言头文件名为mpi.h,FORTRAN语言头文件名为mpif.h。

/* helloworld.c程序清单*/

#include ―mpi.h‖

main(int argc, char **argv)

{

int numprocs,myrank,i,j,k;

MPI_Status status;

char msg[20];

MPI_Init(&argc,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&numprocs); //

MPI_Comm_rank(MPI_COMM_WORLD,&myrank);

if(myrank == 0)

{

2