【问题标题】:Fox Algorithm with MPI带有 MPI 的 Fox 算法
【发布时间】:2013-05-31 14:24:24
【问题描述】:

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

Implementation for Fox Algorithm

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

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

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

感谢您的回答!

【问题讨论】:

    标签: c algorithm matrix parallel-processing mpi


    【解决方案1】:

    虽然没有回答您最初的问题,但我可以说MPI_Bcast 和matrixmult 都将tmp 作为else 块中的第一个参数,也许将其用作存储变量的目的地。

    如果没有看到这两个函数是如何实现的,你就无法确定tmp 是否被统一使用。

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

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

    【讨论】:

    • 非常感谢伙计。会努力让它发挥作用。如果我成功了(我怀疑:P),我会发布对我有帮助的东西。
    • 很高兴为您提供帮助,是的,当然,请在您完成某些工作后发布一些代码,如果我无法帮助其他人,我将能够:)
    【解决方案2】:

    所以我几乎在我提出问题后就找到了解决问题的方法。 为了详尽无遗,我已将代码推送到 github。请记住,这是一个学校项目,它还没有完全完成和正确。 cmets 也可能有点奇怪:我不是以英语为母语的人。 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 启动的进程分配 10 个 int。然后,仅对 rank 0 的进程,将一些有效数据放入先前分配的数组中。 然后每个进程使用相同的参数调用 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

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 1970-01-01
      • 2015-08-26
      • 2015-09-09
      • 1970-01-01
      • 2011-01-28
      • 2013-11-18
      • 2013-02-08
      • 2016-09-16
      相关资源
      最近更新 更多