我正在用 C 中的 MPI 编写 Fox 算法的实现。我已经将 global_matrix 细分为更小的块。所以每个进程都有一小块矩阵A和矩阵B。但是我很难理解如何实现Fox算法:在互联网上找到的很多代码都在执行以下操作。
我不明白的是:在最后一张幻灯片中,有应该实现该算法的 C 代码。但似乎临时数组从未正确初始化,因此在 MPI_Bcast() 和矩阵乘法中使用时会导致奇怪的行为。
我认为我的算法几乎可以工作,但我的结果值肯定是错误的。
(如果需要,我可以提供代码)
感谢您的回答!
虽然没有回答您的原始问题,但我可以评论一下,MPI_Bcast
并且matrixmult
两者都将其tmp
作为块中的第一个参数else
,也许将其用作存储变量的目的地。
如果不了解这两个功能是如何实现的,您将无法确定是否tmp
使用了单元化。
此外malloc
,分配的内存有时可以初始化为 0,尽管这不是我所依赖的行为。
最后,如果您要使用幻灯片中的代码,请不要将malloc
.
因此,在我提出问题后,我几乎找到了解决问题的方法。为了详尽无遗,我已将代码推送到 github。请记住,这是一个学校项目,它还没有完全完成和正确。评论也可能有点奇怪:我不是以英语为母语的人。 我在 github 上的代码
Nobilis 给出了答案:MPI_Bcast 不仅仅是一个发送数据的函数,也是一个接收数据的函数。每个应该接收数据的进程和发送者都应该调用 MPI_Bcast。那就是如果我写。
int* int_array = malloc(10*sizeof(int));
int root = 0;
if(my_rank == 0)
{
for(int i=0; i<10; ++i)
int_array[i] = i;
}
MPI_Bcast(int_array, 10, MPI_INT, root, MPI_COMM_WORLD);
此代码意味着:为 MPI 启动的每个进程分配 10 个 int。然后,仅对 rank 0 的进程,将一些有效数据放入先前分配的数组中。然后每个进程使用相同的参数调用 MPI_Bcast:应该写入数据的内存(或者在 my_rank == 0 的情况下应该从哪里发送数据)、数据的大小和类型(它是一个数组还是一个 int ?),您定义将数据发送到 MPI_COMM_WORLD 中的每个进程的根。
这就是为什么我们不在乎 int_array 在大多数进程中是否没有初始化(除了具有 my_rank == root 的进程)。
请注意,您可以使用 MPI_Datatype 以特定布局发送数据。如果是这样,您应该阅读以下内容:
希望可以帮助某人。