通过MPI_Comm_rank()、MPI_Comm_size()获取进程标志
认识三个MPI函数:
(1)获取当前进程标识函数:int MPI_Comm_rank(MPI_Comm comm,int *rank)
(2)获取通信域包含的进程总数函数:int MPI_Comm_size(MPI_Comm comm,int *size)
(3)获取本进程的机器名函数:int MPI_Get_processor_name(char *name,int *resultlen)
代码示例:
/*文件名:helloworld.c*/ #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); 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(); }
运行结果:
程序说明:
本实例程序启动后会在各个节点同时进行,各节点通过MPI_Comm_rank()函数取得自己的进程标识myid,不同的进程执行MPI_Comm_rank()函数后返回的结果不同,如节点0返回的myid值为0;通过MPI_Comm_size()函数获得MPI_COMM_WORLD通信域中的进程总数numprocs,通过MPI_Get_proccessor_name()函数获得本进程所在的机器名。各进程调用自己的打印语句将结果打印出来,一般MPI中对进程的标识是从0开始的。在本例中机器名分别为Node1,Node2,Node3共3个节点。这里需要强调的是,MPI并行程序中的变量是分布存储的,每个节点都有自己独立的存储地址空间,如myid、numprocs、namelen等变量在各个节点是独立的,相同的变量名他们的值时可以不同的。下图解释了本实例运行时的情况:每个节点都有独立的变量存储空间,程序的副本存在于所有节点并分别得到执行,各个节点计算时的地位是平行的。
6进程情况(可根据需要自行设置):