【发布时间】: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 的缓冲区有关。有什么想法吗?