我想使用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:我已经通过手动打包和解压缩数据来实现这个功能,但是我想用一些更方便的东西。
答案 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
使用精心提供的参数就是您需要的。您也可以使用它来实现收集操作。