MPI_ERR_BUFFER:缓冲区指针无效

时间:2012-06-05 19:07:46

标签: c++ parallel-processing mpi

此错误的最常见原因是什么

 MPI_ERR_BUFFER: invalid buffer pointer

是由MPI_Bsend()和MPI_Rcev()调用产生的? 当并行进程的数量很少(<14)时,程序工作正常,但是当我增加进程数时,我得到了这个错误。

1 个答案:

答案 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

如果内存不足,那么你应该只使用非阻塞发送。