MPI的使用小感

我在做基于VTK的分布式数据的并行显示的时候,由于每个节点可能其上的数据并不一定最后显示在这个节点对应的屏幕上面,所以我们需要在整个流水线的最后把画出来的图形再进行重新的分配,这个时候我就要用到MPI。

MPI是多点接口(Multi Point Interface)的简称。我谈谈我用它做了什么,我也没有用到什么复杂的功能,主要就是用它的数据传输的功能,主要用到以下几个函数:

MPI_Gatherv(Localinfo,ssize,MPI_DOUBLE,totalinfo,rcounts,displs,MPI_DOUBLE,root,MPI_COMM_WORLD);

这个函数是一个N->1的函数,主要用来某个节点要收集其他所有其他节点的信息,但是需要注意的是,得到的总数据中,它会包含自己本地的数据,由于我只在头结点用过这个函数,所以自己的数据会在数组的最前面,但是我不知道其他节点使用的情况下,本地数据是不是会按顺序放。

MPI_Bcast(info,size,MPI_DOUBLE,0,MPI_COMM_WORLD);

这个函数呢是用来1->N的,也就是某个节点要把一份数据发到所有的其他节点,供他们使用的时候用,我这里是头结点把其他节点的数据集合后,进行处理,然后发给其他节点使用。

MPI_Recv(&info,1,MPI_INT,send,tag,MPI_COMM_WORLD,&status);

MPI_Ssend(&info,1,MPI_INT,recv,tag,MPI_COMM_WORLD);

这两个函数是一对,1->1使用的,根据tag的值识别为一对,我这里使用的Ssend模式是同步通信模式,所谓同步通信模式,就是不论接收端是否启动了接受动作,发送端都可在任何时机启动发送操作。但发送端需等待接收端的接收动作发起并开始接收数据之后才可能结束。即发送动作的结束不仅意味着发送缓冲区已经可以用去其他用途,而且还表示接收端也可执行了一定程度的接收工作。对阻塞的同步通信模式而言,它实际上相当于提供了一个同步通信的约束,即双方进程到达一个确定的同步点之后,通信才可结束。

在函数上与普通的点对点不同在于要声明一个MPI_Status status;

还有一个模式就绪通信模式,这个模式需要接收端接收操作先启动,注意如果没有启动,就直接会报错。我开始就使用了这个模式,导致总是报错。

还有在使用MPI的时候,我们都要写一个状态文件:

int localProcess,nProcess;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&localProcess);
MPI_Comm_size(MPI_COMM_WORLD,&nProcess);

非常明显,它其实就是得到一共有多少节点,当前节点是第几个节点,

并且初始化

最后我们还需要:

MPI_Finalize();

一个程序中如果MPI_Finalize();,之后就不能再从新MPI_Init(&argc,&argv);了。所以在使用的时候一般放在main函数中,在最后结束。

你可能感兴趣的:(MPI的使用小感)