【问题标题】:Is there an issue in C with malloc and MPI?使用 malloc 和 MPI 在 C 中是否存在问题?
【发布时间】:2011-01-23 20:11:40
【问题描述】:

抱歉,我无法发布任何源代码...

我有一个运行 G.S. 求解器的主/从红黑算法的代码。在简单的情况下,矩阵被分成 4 个大小均匀的计算块。图像 1-3 执行它们的计算部分,并将带有结果的缓冲区发送回图像 0。问题是这样的:

我已经 malloc 了一个足够大的数组来容纳所有的部分,以便我可以将单个结果映射回单个网格。问题似乎是在图像 0 上,在 MPI_Recv 调用之后,该进程不再知道网格是 malloc'd 以容纳整个事物。每当我尝试在该网格中放置一些东西时,我都会遇到错误。我发现唯一可行的解​​决方法是在所有进程上执行 malloc,并在 MPI_Recv 之前对进程零再次执行 malloc。

任何想法为什么它似乎失去了对先前分配的内存的引用?

在伪代码中:

Malloc whole[][] Have to have this allocated
Malloc partial[]
Perform compute on whole[]

If(image!= 0) MPI_Send(whole[])
Else (if image==0) 
  Malloc whole[][] again!  and this allocated otherwise the problem happens
  Loop over other images
  MPI_Recv(partial)
  Put partial[] into whole[][] Here is where the problem occurs
Endif

提前感谢您的帮助

【问题讨论】:

  • 您确定这是 MPI 问题吗?您是否尝试过仅注释掉 MPI 位并尝试将某些内容从部分(填充虚拟数据)复制到整体?
  • 是的,你说的我已经试过了。串行操作时,它运行良好。 MPI_Send/recv 的某些内容导致指针被吹走。我不确定是什么。我在下面评论说,这可能与使用我定义的 MPI_Datatype 而不是 MPI_DOUBLE 的缓冲区有关。有什么想法吗?

标签: arrays malloc mpi


【解决方案1】:

这不太可能是库错误。 没有看过源代码几乎不可能找到问题。 我猜你没有正确分配或者你用一些垃圾覆盖了分配的指针。 为了测试它,在分配之后和 mpi 接收之前/之后打印指针值。

【讨论】:

  • 我试过你说的,在malloc之后打印出指针值,就在MPI_Recv之前和MPI_Recv之后。正如您所怀疑的那样,指针在接收后立即被吹走。这个特定的 Recv 仅在图像 0 上,并且正在接收我定义的称为矩阵的类型,我将其定义为保存 2D 数组。你认为这可能与它有关吗?发送 MPI_DOUBLE 的缓冲区与发送 MPI_Datatype 的缓冲区有什么区别吗?
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多