C++ MPI\u错误\u缓冲区:缓冲区指针无效

C++ MPI\u错误\u缓冲区:缓冲区指针无效,c++,parallel-processing,mpi,C++,Parallel Processing,Mpi,这个错误最常见的原因是什么 MPI_ERR_BUFFER: invalid buffer pointer MPI_Bsend()和MPI_Rcev()调用的结果是什么? 当并行进程的数量较少时,该程序工作正常(在我前面的评论中展开: MPI中的缓冲可以在各种情况下发生。消息可以由MPI库在内部进行缓冲,以隐藏网络延迟(通常仅对小于等于实现相关大小的小消息进行缓冲),或者用户可以使用任何缓冲发送操作来强制执行缓冲和MPI\u Ibsend()。用户缓冲不同于内部缓冲: 首先,通过MPI\u

这个错误最常见的原因是什么

 MPI_ERR_BUFFER: invalid buffer pointer
MPI_Bsend()和MPI_Rcev()调用的结果是什么?
当并行进程的数量较少时,该程序工作正常(在我前面的评论中展开:

MPI中的缓冲可以在各种情况下发生。消息可以由MPI库在内部进行缓冲,以隐藏网络延迟(通常仅对小于等于实现相关大小的小消息进行缓冲),或者用户可以使用任何缓冲发送操作来强制执行缓冲和
MPI\u Ibsend()
。用户缓冲不同于内部缓冲:

  • 首先,通过
    MPI\u Bsend()
    MPI\u Ibsend()
    发送的消息总是被缓冲的,这与内部缓冲的消息不同。后者可以被缓冲,也可以不被缓冲,这取决于它们的大小和内部缓冲空间的可用性
  • 其次,由于“始终缓冲”方面的原因,如果用户连接的缓冲区中没有可用的缓冲区空间,则会发生
    MPI\u ERR\u buffer
    错误
发送的消息使用缓冲区空间,直到目的地进程确实接收到它们。由于MPI不提供任何内置机制来确认消息的接收,因此必须设计另一种方法,例如从目的地进程向源进程发回确认消息

由于这个原因,你必须考虑所有未被明确确认为过境的消息,并且必须在缓冲器中分配足够的内存。这通常意味着缓冲器应该至少与你愿意传输的数据总量一样大,再加上等于<代码>号码>的消息信封开销。发送*MPI\u BSEND\u开销。这会给大型MPI作业带来很大的内存压力。必须牢记这一点,并在进程数发生变化时相应调整缓冲区空间

请注意,提供缓冲发送只是为了方便。它可以很容易地作为内存复制和非阻塞发送操作的组合来实现,例如,缓冲发送使您不必编写以下代码:

int data[];
int *shadow_data;
MPI_Request req;

...
<populate data>
...
shadow_data = (int *)malloc(sizeof(data));
memcpy(shadow_data, data, sizeof(data));
MPI_Isend(shadow_data, count, MPI_INT, destination, tag, MPI_COMM_WORLD, &req);
...
<reuse data as it is not used by MPI>
...
MPI_Wait(&req);
free(shadow_data);
int数据[];
int*shadow_数据;
MPI_请求请求;
...
...
shadow_data=(int*)malloc(sizeof(data));
memcpy(shadow_数据,data,sizeof(data));
MPI Isend(卷影数据、计数、MPI INT、目标、标记、MPI通信世界和请求);
...
...
MPI_等待(&req);
自由(影子数据);

如果内存不足,则应仅使用非阻塞发送。

缓冲区参数有问题。是否使用
MPI\u buffer\u attach
?我认为您必须发布一些代码以获得更多帮助。缓冲区是否有最大大小?我认为
MPI\u buffer\u attach
(除了
int
)的大小之外。上面说:“给定的大小应该是您打算拥有的所有未完成BSEND的大小之和,加上您所做的每个BSEND的MPI\u BSEND\u开销。为了计算大小,您应该使用MPI\u Pack\u大小。”您是否满足这些要求?由于要发送给您的进程越来越多,在发送之前会有更多的数据被缓冲,而您的缓冲区太小。请增大其大小,或者更好地使用非阻塞标准send
MPI_Isend()
@hristoilev I used MPI_Isend())问题解决了。您可以将其作为anwer发布,我将接受。谢谢Hirsto。现在使用MPI_Isend与MPI_Recv和MPI_Waitall结合使用,程序将停止(不会产生错误消息)当处理更多的进程时,同时增加缓冲区大小。不同进程发送的缓冲区大小差异很大。对于数量较少的进程,它仍然可以正常工作。您有什么建议吗?这可能是您的MPI实现的一些特殊行为吗?您使用的MPI库是什么g和什么硬件(主要是什么互连?)。可能是您的算法出了问题吗?如果您可以访问DDT或TotalView之类的并行调试器,可能会有所帮助。问题出在其他地方。谢谢!