The best input is OUTPUT.

2016-08-19
MPI集合通信:N → 1

MPI集合通信:N → 1

N -> 1的集合通信这里只总结收集操作和规约操作。

收集操作MPI_Gather

MPI_GatherMPI_Scatter的逆操作,根进程从其他进程收集不同的消息一次放入自己的接收缓冲区中,接收数据的存放顺序与进程号相同。

Read More

2016-08-18
MPI集合通信:1 → N

MPI集合通信:1 → N

之前的点到点通信是两个进程之间的相互通信,而集合通信则是在一个通信子内所有进程参与的通信。

广播操作MPI_Bcast

广播操作就是一个进程将相同的数据发送到同通信子中的其他进程中,它的一个重要通途就是将同一份输入数据发送给不同的进程方便进行进一步的并行计算。

Read More

2016-08-18
点到点通信总结

点到点通信总结

通信模式总结

理解各种通信过程的行为,关键是弄清楚各个模式对缓冲使用的方式。各个模式使用缓冲的特点总结:

  1. 标准MPI_Send实际利用了MPI环境提供的默认缓冲区。
  2. 缓冲通信MPI_Bsend相当于将MPI环境提供的buffer放在用户空间进行管理,相当于用户手动开辟空间作为通信的缓冲区。
  3. 就绪通信MPI_Rsend不需要缓冲区,但是发送动作默认接受早已就绪,发送不能提前等待,否则报错。
  4. 同步通信MPI_Ssend与就绪通信类似,同样不需要缓冲区,但是发送动作是可以等待的,接受没有就绪就继续等待,不会报错。

异步(非阻塞)通信的工作原理类似,只不过可以将其理解为MPI又单独启动了一个线程在后台进行真正的通信操作,通过MPI_WaitxxxMPI_Testxxx等来进行检测是否通信的线程完成通信。

Read More

2016-08-09
在VASPy中使用延迟初始化

在VASPy中使用延迟初始化

由于之前版本的VASPy是基于课题组修改过的VASP版本所写的,其中OUTCAR中的一些受力信息是标准VASP代码中不会输出的,但是当时为了省事我就直接拿课题组VASP输出的OUTCAR中的信息写了VASPy中的OutCar类。。。

为了能让VASPy具有更好的通用性,今天特地重构了OutCar这个类使其能够操作标准VASP的OUTCAR文件。

具体重构后的OutCar类代码的链接: VASPy/iter.py at master · PytLab/VASPy

由于OUTCAR是VASP所有输出的文件,自然会比较大,因此要操作这个文件就要特别的处理。

Read More

2016-08-04
MPI学习--可重复的非阻塞标准通信

MPI学习--可重复的非阻塞标准通信

今天开始学习可重复(persistent)的非阻塞通信。

实际计算环境中,常在一个内部循环中重复使用相同的数据结构来传递不同的数据,这时候将数据结构与发送/接受动作绑定可以提高程序的效率。

可重复通信大致是

  1. 先使用MPI_Send_init()MPI_Recv_init()接口注册发送和接受动作,实际并不执行
  2. 在进程的其他位置通过重复通信控制函数,如MPI_Start(),来控制真正执行的时机
  3. 使用MPI_Request_free()来释放与重复非阻塞通信相关的通信对象并注销注册的重复非阻塞通信。MPI_Request_free()可在注册之后的任何地点调用,但仅当没有处在消息传递状态时,才可实际释放通信对象。

可重复的非阻塞标准通信

本篇主要总结可重复的非阻塞标准通信。

Read More

2016-08-02
MPI学习-非阻塞通信之非重复的就绪通信和同步通信

MPI学习-非阻塞通信之非重复的就绪通信和同步通信

这里也没啥,就是通过两个例子来学习一下非阻塞通信中的就绪通信和同步通信。

非重复的就绪通信

这里的就绪通信同阻塞通信中的就绪通信一样,都是告诉MPI接收方已经准备就绪,如果检测到并没有准备就绪则MPI就会报错。其他地方就是非阻塞通信与阻塞通信之间的区别了。

下面我就写了个例子来看看MPI_Isend()MPI_Irecv()之间和MPI_Isend()MPI_Recv()之间的通信。
下面的例子是不同进程之间从左边的进程接收数据并将当前进程的数据发送到右边的进程,因此代码中不需要对进程号进行判断处理。

Read More