通过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进程情况(可根据需要自行设置):

 

posted @ 2024-04-30 16:06  棒打鲜橙不加冰  阅读(175)  评论(0编辑  收藏  举报