1

我想用来将MPI_Type_vector矩阵的子域分散到每个进程。例如,矩阵为 5x5,由 2x2 个子域分解。所以子域的维度是:

 _____________________
 |         |         |
 |    0    |    1    |
 |  (2,2)  |  (3,2)  |
 |         |         |
 |_________|_________|   5
 |         |         |
 |    2    |    3    |
 |  (2,3)  |  (3,3)  |
 |         |         |
 |_________|_________|

           5

MPI_Type_vector在每个具有自己维度的流程上定义了一个。我预计进程 0 和 1 上定义的向量的大小是不同的。但是它们的手柄是一样的。看起来 MPI 只使用了这些定义的向量之一。

谢谢!

PS:我已经通过手动打包和解包数据实现了这个功能,但是我想使用一些更方便的东西。

4

2 回答 2

2

MPI 句柄对于注册它们的进程是本地的,并且只应被视为不透明类型 - 您永远不应该根据句柄的实际值来决定任何事情,您应该只使用 MPI 的比较函数比较句柄后面的对象提供(例如MPI_Comm_compare)。例如,在 Open MPI 中,MPI_Datatype是指向ompi_datatype_tC 绑定的结构的指针和INTEGER用于 Fortran 绑定的指针表中的索引。

如果您的子域大小相同(例如全部都是2x2),那么使用调整大小的 MPI 数据类型的一个不错的 hack将允许您使用MPI_Scatterv/MPI_Gatherv来分散/收集它们。因为您的子域具有不同的大小,如果您想使用单个集体 MPI 调用来分散/收集它们,那么MPI_Alltoallw您需要仔细提供参数。您还可以使用它来实现聚集操作。

于 2012-09-24T10:58:07.957 回答
2

MPI_Datatype只是一个您可以传递的句柄,它不直接包含有关您制作的类型的任何信息。查看该句柄的值也不会告诉您类型。我见过的大多数实现都使用ints 作为这个句柄,对于每个用户定义的数据类型递增 1。因此,如果您的两个向量数据类型句柄在不同的内核上具有相同的值,我并不感到惊讶,如果它们都是在该内核上声明的第一个数据类型。

回到关于域分解的主要问题,如果内核之间使用不同声明的向量类型进行任何通信,那将失败——发送内核和接收内核将需要处理相同长度的向量。因此,发送核心需要使用与接收核心期望接收的数据量相对应的类型。

在干净的域分解方面,我建议使用这些函数(这里MPI_Cart有一个 Web 1.0 教程)。

于 2012-09-24T06:04:37.023 回答