具有MPI的Fox算法

时间:2013-06-05 02:22:48

标签: c algorithm matrix parallel-processing mpi

我正在使用C中的MPI编写Fox算法的实现。 我已经将global_matrix细分为更小的块。所以每个过程都有一小块矩阵A和矩阵B. 但是我无法理解如何实现Fox算法:互联网上发现的很多代码正在执行以下操作。

Implementation for Fox Algorithm

我不明白:在最后的幻灯片中,有C代码应该实现该算法。但似乎temp数组从未正确初始化,因此在MPI_Bcast()和矩阵乘法中使用时会产生奇怪的行为。

我认为我的算法几乎可以工作,但我的结果值肯定是错误的。

(如果需要,我可以提供代码)

感谢您的回答!

2 个答案:

答案 0 :(得分:1)

虽然我没有回答您的原始问题,但我只是说MPI_Bcastmatrixmult都将tmp作为else块中的第一个参数,可能会将其用作目的地存储变量。

如果不了解这两个函数是如何实现的,您无法确定tmp是否被用于整体化。

同样malloc-allocated memory can sometimes be 0 initalised虽然这不是我依赖的行为。

最后,如果您要使用幻灯片don't cast the result of malloc中的代码。

答案 1 :(得分:1)

因此,在我提出问题后,我几乎找到了解决问题的方法。 为了详尽无遗,我已将代码推送到github。请记住,这是一个学校项目,并没有完全完成和正确。评论也可能有点奇怪:我不是母语为英语的人。 My code on 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启动的每个processus分配10个int。然后,仅对于等级0的进程,将一些有效数据放入先前分配的数组中。 然后每个processus使用相同的参数调用MPI_Bcast:应该写入数据的内存(或者在my_rank == 0的情况下应该从哪里发送),数据的大小和类型(是数组还是只有一个int) ?),您定义将数据发送到MPI_COMM_WORLD中找到的每个进程的根。

这就是为什么我们不关心int_array在大多数进程中是否未初始化(除了具有my_rank == root的进程)。

请注意,您可以使用MPI_Datatype以特定布局发送数据。 如果是这样,你应该阅读:

  • MPI_Type_create_subarray
  • MPI_Type_create_resized
  • MPI_Type_commit

希望可以帮助别人。