我们都只到,MPI_SEND会为我们作发送数据缓冲区申请和管理的工作,但是,如果这个工作失败了,那么,MPI_SEND就会永久阻塞。当然,这种情况只限于MPICH,LAM和这个不太一样,下面将提到。
这种情况一般都会发生在机器内存告急的时候,此时,我们调用MPI_SEND,他会先为我们申请一块buffer,然后发送,如果这个buffer申请失败,那么,在MPICH中,MPI_SEND就会block。特别是在这种情况下就更容易发生:我们在一个进程中,用for循环做很多次MPI_SEND,然后,在另外一个进程中,做很多次对应的MPI_RECV,这种操作,是一种危险的操作,因为如果此时for循环中有一次MPI_SEND失败了(比如申请buffer失败了),那么,整个进程就会block,同时,另一进程的MPI_RECV由于收不到SEND请求,也会block,这就造成了死锁!而且,这种死锁没有出错信息,可谓无声无息。
LAM的实现和MPICH有点不同,LAM是把MPI_SEND发出的申请buffer的请求交给本地的lamd进程,然后就会返回,所以,如果失败,LAM会报错,而MPICH则是无声无息的就死锁了,这点,LAM比MPICH强一些。
这种情况一般都会发生在机器内存告急的时候,此时,我们调用MPI_SEND,他会先为我们申请一块buffer,然后发送,如果这个buffer申请失败,那么,在MPICH中,MPI_SEND就会block。特别是在这种情况下就更容易发生:我们在一个进程中,用for循环做很多次MPI_SEND,然后,在另外一个进程中,做很多次对应的MPI_RECV,这种操作,是一种危险的操作,因为如果此时for循环中有一次MPI_SEND失败了(比如申请buffer失败了),那么,整个进程就会block,同时,另一进程的MPI_RECV由于收不到SEND请求,也会block,这就造成了死锁!而且,这种死锁没有出错信息,可谓无声无息。
LAM的实现和MPICH有点不同,LAM是把MPI_SEND发出的申请buffer的请求交给本地的lamd进程,然后就会返回,所以,如果失败,LAM会报错,而MPICH则是无声无息的就死锁了,这点,LAM比MPICH强一些。