【问题标题】:MPI_Send proper way to send a matrixMPI_Send 发送矩阵的正确方法
【发布时间】:2016-02-01 01:35:59
【问题描述】:

我必须在我的程序中使用 MPI API 来发送/接收矩阵。要发送矩阵,我使用了以下语法:

MPI_Send(matrix, ...)  <- USE THIS

MPI_Send(&matrix, ...)

MPI_Send(&matrix[0][0], ...)

Similar to the last one, but untested: MPI_Send(&matrix[0],....

我在不同的例子中看到了上面的用法,我想知道它们之间是否存在差异,或者是否有任何一个会导致大数据错误?我问是因为我听一个懂一点HPC的人说只使用第一种语法(上面列举的),但我没有时间问他为什么,我在网上找不到原因,或者我不知道在哪里看。以上所有工作都只是在我编译的小例子中找到的,但我的处理器上只有 2 个内核,所以我可能看不到问题。

我的理解是这些示例指向相同的内存地址,那么会出现什么问题?是否存在与 MPI API 相关的问题?

提前致谢

【问题讨论】:

    标签: c multidimensional-array mpi hpc


    【解决方案1】:

    您的问题point to the same address 中的所有矩阵引用,尽管类型不同。 MPI_Send 接受void*,所以无论如何它都会丢失类型。所以所有的调用实际上都是等价的。

    如果矩阵的类型从二维数组变为指针,那么上面的就不再等价了。例如,如果矩阵是int*,则只有第一个和最后一个选项都编译并生成所需的地址。因此,我也建议使用第一个选项 - 如果矩阵类型发生变化,它会更安全。

    【讨论】:

    • 谢谢!真的帮了我。
    【解决方案2】:

    使用 MPI_Send() 您只需指定矩阵数据的指针。建议将矩阵存储为一维数组:

    int *data = (int*)calloc(cols*rows,sizeof(int));
    MPI_Send(data,cols*rows, ...);
    

    当您使用 MPI_Recv() 时,请记住您发送了一个数组,并且您可能肯定想要使用矩阵。

    【讨论】:

      猜你喜欢
      • 2013-04-22
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      相关资源
      最近更新 更多