MPI_Send 发送矩阵的正确方法

MPI_Send proper way to send a matrix

我必须在我的程序中对 send/receive 矩阵使用 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 相关的问题?

提前致谢

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

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

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

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

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