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() 时,请记住您发送了一个数组,并且您肯定想要使用矩阵。
我必须在我的程序中对 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() 时,请记住您发送了一个数组,并且您肯定想要使用矩阵。