此错误的最常见原因是什么
MPI_ERR_BUFFER: invalid buffer pointer
是由MPI_Bsend()和MPI_Rcev()调用产生的? 当并行进程的数量很少(<14)时,程序工作正常,但是当我增加进程数时,我得到了这个错误。
答案 0 :(得分:8)
扩展我以前的评论:
MPI中的缓冲可以在各种场合发生。消息可以由MPI库在内部缓冲,以隐藏网络延迟(通常仅针对实现相关大小的小消息完成),或者用户可以通过使用任何缓冲的发送操作来强制执行缓冲{{1 }和MPI_Bsend()
。用户缓冲与内部缓冲不同:
MPI_Ibsend()
或MPI_Bsend()
发送的消息始终是缓冲的,而内部缓冲的消息则不是这种情况。后者可以是缓冲的,也可以不缓存,具体取决于它们的大小和内部缓冲区空间的可用性; MPI_Ibsend()
错误。已发送的消息使用缓冲区空间,直到它们被destionation进程收到。由于MPI没有提供任何内置机制来确认消息的接收,因此必须设计另一种方法来实现,例如,通过从目标进程发回确认消息到源代码。
因此,必须考虑所有未明确确认为传输的消息,并且必须在缓冲区中分配足够的内存。通常这意味着缓冲区应该至少与您愿意传输的数据总量以及等于MPI_ERR_BUFFER
的消息包络开销一样大。这可能会给大型MPI作业带来很大的内存压力。必须牢记这一点,并在进程数量发生变化时相应地调整缓冲区空间。
请注意,缓冲发送仅为方便起见而提供。它可以很容易地实现为存储器复制和非阻塞发送操作的组合,例如,缓冲发送使您无需编写如下代码:
number_of_sends * MPI_BSEND_OVERHEAD
如果内存不足,那么你应该只使用非阻塞发送。