All of us will only, mpi_send will send data buffer application and management work for us, but if this work fails, then mpi_send will be permanently blocked. Of course, this situation is limited to mpich, and lam is not the same as this, which will be mentioned below.
This usually happens when the machine memory is in a hurry. At this time, we call mpi_send. He will apply for a buffer for us and then send it. If the buffer application fails, in mpich, mpi_send blocks. Especially in this case, it is more likely to happen: in a process, we use the for loop for many times mpi_send, and then, in another process, do the corresponding mpi_recv many times, this operation is a dangerous operation, because if there is a failed mpi_send in the for loop (for example, the request for buffer fails), the whole process will block. At the same time, the mpi_recv of another process cannot receive the send request and blocks it. This causes a deadlock! Moreover, there is no error message for such deadlocks.
The implementation of Lam is a little different from that of mpich. lam submits the request buffer sent by mpi_send to the local lamd process and then returns the result. Therefore, if the request fails, lam reports an error, mpich is a silent deadlock, which is better than mpich.