一、初始化:
1、函数原型:
int MPI_Init(int *argc, char ***argv);
2、调用格式:
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
return 0;
}
3、解释:
MPI_Init() 是MPI程序的第一个调用,它完成MPI程序所有的初始化工作,所有MPI程序的第一条可执行语句都是这条语句。MPI系统通过argc和argv得到命令行参数,并且将MPI系统专用的参数删除,留下用户的解释参数。
二、结束MPI:
1、函数原型:
int MPI_Finalize(void);
2、调用格式:
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
// ...
MPI_Finalize();
return 0;
}
3、解释:
结束MPI程序的运行。每个进程都必须调用,使用后不准再调用任何MPI函数。若不执行MPI_Finalize()函数,进程可能被悬挂。在调用该函数前,应确保非阻塞通讯结束。
三、获取通信域中的进程数:
1、函数原型:
int MPI_Comm_size(MPI_Comm comm, int *size);
2、调用格式:
int main(int argc, char *argv[])
{
int numprocs;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
// ...
MPI_Finalize();
return 0;
}
3、解释:
这一调用返回给定的通信域中所包括的进程的个数,不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行。与mpirun命令中选项 -np <进程数>有关,MPI_COMM_WORLD是MPI系统提供的缺省的通信器。
四、获取进程标识号:
1、函数原型:
int MPI_Comm_rank(MPI_Comm comm, int *rank);
2、调用格式:
int main(int argc, char *argv[])
{
int myid;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
// ...
MPI_Finalize();
return 0;
}
3、解释:
这一调用返回调用进程在给定的通信域中的进程标识号
五、发送数据:
1、函数原型:
int MPI_Send(void* buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm);
2、参数说明:
void *buf 待发送数据的首地址
int count 待发送的数据个数
MPI_Datatype datatype 待发送数据的数据类型
int dest 目标进程标识号
int tag 发送数据包的标签号
MPI_Comm comm 在指定通信域的进程组中发送数据
3、解释:
MPI_Send将发送缓冲区中的count个datatype数据类型的数据发送到目的进程,目的进程在通信域中的标识号是dest,本次发送的消息标志是tag,使用这一标志就可以把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来。
六、接收数据:
1、函数原型:
int MPI_Recv(void* buf,int count,MPI_Datatype datatype,int source,int tag,MPI_Comm comm,MPI_Status *status);
2、参数说明:
void *buf 存放所接收数据的首地址(需有足够空间)
int count 所接收的数据个数
MPI_Datatype datatype 所接收数据的数据类型
int source 根据发送数据的进程标识号接收
int tag 根据数据包的标签号接收
MPI_Comm comm 根据指定通信域接收
MPI_Status *status 执行本接收操作的状态
3、解释:
MPI_Recv从指定的进程source接收消息,并且该消息的数据类型和消息标识和本接收进程指定的datatype和tag相一致,接收到的消息所包含的数据元素的个数最多不能超过count,并将该过程的状态信息写入status中。MPI_Status有数据成员MPI_SOURCE, MPI_TAG, MPI_ERROR,分别表示发送数据的进程标识,发送数据使用tag标识和该接收操作返回的错误代码。