MPI_Init
int MPI_Init(int* argc, char** argv[]);
MPI_Init(&argc, &argv); // argc, argv form main
告知MPI系统进行所有必要的初始化设置。例如,系统可能需要为消息缓冲区分配存储空间,为进程指定进程号等。在调用MPI_Init前不应该调用其他MPI函数。
MPI_Finalize
int MPI_Finalize();
告知MPI系统MPI已经所使用完毕,为MPI而分配的所有资源都可以释放。
MPI_Comm_size
int MPI_Comm_size (MPI_Comm comm ,int* size )
int numprocs;
MPI_Comm_size(MPI_COMM_WORLD, &numprocs); // get number of processes
获得进程个数 size。
指定一个通信子,也指定了一组共享该空间的进程, 这些进程组成该通信子的group(组)。
获得通信子comm中规定的group包含的进程的数量。
MPI_Comm_rank
int MPI_Comm_rank (MPI_Comm comm ,int* rank)
int myid;
MPI_Comm_rank(MPI_COMM_WORLD, &myid); // get current process id
得到本进程在通信空间中的rank值,即在组中的逻辑编号(该 rank值为0到p-1间的整数,相当于进程的ID。)
MPI_Send
int MPI_Send(
void *buff, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm
)
MPI_Send(message, strlen(message), MPI_CHAR, 1,99,MPI_COMM_WORLD);
void *buff:你要发送的变量。
int count:你发送的消息的个数(注意:不是长度,例如你要发送一个int整数,这里就填写1,如要是发送“hello”字符串,这里就填写6(C语言中字符串未有一个结束符,需要多一位))。
MPI_Datatype datatype:你要发送的数据类型,这里需要用MPI定义的数据类型,可在网上找到,在此不再罗列。
int dest:目的地进程号,你要发送给哪个进程,就填写目的进程的进程号。
int tag:消息标签,接收方需要有相同的消息标签才能接收该消息。
MPI_Comm comm:通讯域。表示你要向哪个组发送消息。
MPI_Recv
int MPI_Recv(
void *buff, int count, MPI_Datatype datatype,
int source, int tag, MPI_Comm comm, MPI_Status *status
)
MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
void buff:你接收到的消息要保存到哪个变量里。
int count:你接收消息的消息的个数(注意:不是长度,例如你要发送一个int整数,这里就填写1,如要是发送“hello”字符串,这里就填写6(C语言中字符串未有一个结束符,需要多一位))。它是接收数据长度的上界. 具体接收到的数据长度可通过调用MPI_Get_count 函数得到。
MPI_Datatype datatype:你要接收的数据类型,这里需要用MPI定义的数据类型,可在网上找到,在此不再罗列。
int dest:接收端进程号,你要需要哪个进程接收消息就填写接收进程的进程号。
int tag:消息标签,需要与发送方的tag值相同的消息标签才能接收该消息。
MPI_Comm comm:通讯域。
MPI_Status status:消息状态。接收函数返回时,将在这个参数指示的变量中存放实际接收消息的状态信息,包括消息的源进程标识,消息标签,包含的数据项个数等。
实例 – Send与Recv
#include "mpi.h"
main( argc, argv )
int argc; char **argv;
{
char message[20];
int myrank;
MPI_Status status;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
if (myrank == 0) /* 若是 0 进程*/
{
strcpy(message,"C:Hello, process 1");
MPI_Send(message, strlen(message), MPI_CHAR, 1,99,MPI_COMM_WORLD);
}
else if(myrank==1) /* 若是进程 1 */
{
MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
printf("received :%s:", message);
}
MPI_Finalize();
}
Comments | NOTHING