这两天把VASPy代码兼容了Python3,于是打算在IBM上用python3跑,结果发现IBM上没有python3,于是我就打算编译一下,本以为就几分钟的事,结果发生了奇怪的错误。。。最终找到原因,竟是自己坑了自己。
就第一步编译python.c
就直接报错了,我也是崩溃的
パ..パ
( °Д°)・・・
__(_っ / ̄ ̄ ̄ ̄ ̄/_
\/_____/
这两天把VASPy代码兼容了Python3,于是打算在IBM上用python3跑,结果发现IBM上没有python3,于是我就打算编译一下,本以为就几分钟的事,结果发生了奇怪的错误。。。最终找到原因,竟是自己坑了自己。
就第一步编译python.c
就直接报错了,我也是崩溃的
パ..パ
( °Д°)・・・
__(_っ / ̄ ̄ ̄ ̄ ̄/_
\/_____/
趁着代码量还不多,把VASPy进行了修改使其同时兼容Python 2.7.x 和 Python 3.x
今后新增功能都将以Python3语法优先并向下兼容Python2.7.x
项目GitHub链接: PytLab/VASPy: Manipulating VASP files with Python
MPI_Bsend()
, MPI_Isend()
, MPI_Ibsend()
三者均不发生阻塞,执行后都会立即返回,且后台有MPI环境实施消息传输。
MPI_Bsend()
之所以会立即返回,是因为用户已经定义了缓冲区,调用后会将数据复制到缓冲区中,所以不用等接收端接收便可以返回,但是在执行MPI_Buffer_detach()
时才最终确保消息清扫干净,完成传输,也就是说消息传输完毕之前,MPI_Buffer_detach()
不会返回。
MPI_Isend()
本身就是非阻塞通信,所以会立即返回,交给MPI环境后台来实施消息传递。但是标准非阻塞通信需要调用MPI_Wait()
等机制来等待传输完成。
MPI_Ibsend()
更像是前两者的结合体,但是要注意的是发送完成并不代表消息传递完成。
对于非阻塞通信的理解还是要理解他和阻塞通信的区别。这个区别书上扯了一大堆好像也没有用简单通俗的语言总结这两者之间的区别让人看着后面的例子一开始有点头晕。那其实区别很简单:
阻塞通信就是使用前面几篇博客里面的那些发送和接收函数,例如MPI_Send()
和MPI_Recv()
,这些函数有一个特点就是这些函数在通信完成之前是不会返回的,也就是阻塞。
那什么时候是通信完成呢?
就绪模式的发送方式与同步和标准发送完全一致,不一样的是就绪通信模式是:
仅当对方的接收操作启动并且准备就绪时,才可发生数据,并不是MPI会自动判断是否就绪(他没那么智能?)而是告诉MPI对方以准备就绪接收你发的消息,如果你骗了MPI,MPI会不爽,然后报错。
基于你告诉MPI的这个信息,就可以避免一些列的缓冲操作以及收发双方的握手操作,是的MPI环境可对通信做更细致的优化以提高通信效率。
需要注意的是:
缓冲通信模式主要用于解开阻塞通信的发送和接受之间的耦合。有了缓冲机制,即使在接收端没有启动相应的接收情况下,在完成消息数据到缓冲区的转移后发送端的阻塞发送函数也可以返回。
但缓冲方式带来了额外的内存到内存的复制开销,会导致一定的性能损失和资源占用。的确,每个进程都要在堆里分配内存然后注册成为缓冲区。
缓冲区的使用并不能改变发送和接受之间的语义关系,及不能改变程序的正确性。
与标准模式由于以来MPI环境提供的缓冲机制而受到远端进程状态左右不同,缓冲发送完成与否不会受远端匹配进程状态的影响。但当消息大小超过缓冲区容量时,会报错。