我必须在我的程序中使用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相关的问题?
提前致谢
答案 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()时,请记住您已发送了一个数组,并且您肯定可以使用矩阵。