MPI_Send发送矩阵的正确方法

时间:2015-10-31 20:13:37

标签: c multidimensional-array mpi hpc

我必须在我的程序中使用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相关的问题?

提前致谢

2 个答案:

答案 0 :(得分:3)

问题point to the same address中的所有矩阵引用,尽管类型不同。 MPI_Send需要void*,因此无论如何它都会丢失。所以所有的电话几乎都是等同的。

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

答案 1 :(得分:0)

使用MPI_Send()时,您仅可以指定矩阵数据的指针。建议将矩阵存储为一维数组:

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

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