MPI_Type_vector可以在不同的进程中具有不同的维度吗?

时间:2012-09-22 13:41:04

标签: mpi

我想使用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:我已经通过手动打包和解压缩数据来实现这个功能,但是我想用一些更方便的东西。

2 个答案:

答案 0 :(得分:2)

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

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

就清洁域分解而言,我建议使用MPI_Cart函数(有一个Web 1.0教程here)。

答案 1 :(得分:2)

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

如果您的子域名大小相同(例如,所有子域名均为2x2),则调整后的MPI数据类型的nice hack将允许您使用MPI_Scatterv / MPI_Gatherv进行分散/收集他们。因为您的子域具有不同的大小,如果您想使用单个集体MPI调用来分散/收集它们,那么MPI_Alltoallw使用精心提供的参数就是您需要的。您也可以使用它来实现收集操作。