N -> 1的集合通信这里只总结收集操作和规约操作。
收集操作MPI_Gather
MPI_Gather
是MPI_Scatter
的逆操作,根进程从其他进程收集不同的消息一次放入自己的接收缓冲区中,接收数据的存放顺序与进程号相同。
N -> 1的集合通信这里只总结收集操作和规约操作。
MPI_Gather
MPI_Gather
是MPI_Scatter
的逆操作,根进程从其他进程收集不同的消息一次放入自己的接收缓冲区中,接收数据的存放顺序与进程号相同。
之前的点到点通信是两个进程之间的相互通信,而集合通信则是在一个通信子内所有进程参与的通信。
MPI_Bcast
广播操作就是一个进程将相同的数据发送到同通信子中的其他进程中,它的一个重要通途就是将同一份输入数据发送给不同的进程方便进行进一步的并行计算。
理解各种通信过程的行为,关键是弄清楚各个模式对缓冲使用的方式。各个模式使用缓冲的特点总结:
MPI_Send
实际利用了MPI环境提供的默认缓冲区。MPI_Bsend
相当于将MPI环境提供的buffer放在用户空间进行管理,相当于用户手动开辟空间作为通信的缓冲区。MPI_Rsend
不需要缓冲区,但是发送动作默认接受早已就绪,发送不能提前等待,否则报错。MPI_Ssend
与就绪通信类似,同样不需要缓冲区,但是发送动作是可以等待的,接受没有就绪就继续等待,不会报错。异步(非阻塞)通信的工作原理类似,只不过可以将其理解为MPI又单独启动了一个线程在后台进行真正的通信操作,通过MPI_Waitxxx
和MPI_Testxxx
等来进行检测是否通信的线程完成通信。
由于之前版本的VASPy是基于课题组修改过的VASP版本所写的,其中OUTCAR中的一些受力信息是标准VASP代码中不会输出的,但是当时为了省事我就直接拿课题组VASP输出的OUTCAR中的信息写了VASPy中的OutCar
类。。。
为了能让VASPy具有更好的通用性,今天特地重构了OutCar
这个类使其能够操作标准VASP的OUTCAR文件。
具体重构后的OutCar类代码的链接: VASPy/iter.py at master · PytLab/VASPy
由于OUTCAR是VASP所有输出的文件,自然会比较大,因此要操作这个文件就要特别的处理。
今天开始学习可重复(persistent)的非阻塞通信。
实际计算环境中,常在一个内部循环中重复使用相同的数据结构来传递不同的数据,这时候将数据结构与发送/接受动作绑定可以提高程序的效率。
可重复通信大致是
MPI_Send_init()
和MPI_Recv_init()
接口注册发送和接受动作,实际并不执行MPI_Start()
,来控制真正执行的时机MPI_Request_free()
来释放与重复非阻塞通信相关的通信对象并注销注册的重复非阻塞通信。MPI_Request_free()
可在注册之后的任何地点调用,但仅当没有处在消息传递状态时,才可实际释放通信对象。本篇主要总结可重复的非阻塞标准通信。