添加填充到MPI结构

时间:2015-10-13 13:20:56

标签: types io mpi memory-alignment

我有一个C结构数组,我想填写一个文件(并行,使用set_view等)

typedef struct
{
    char   type;
    double value;
    double velocity;
} Cell;

我的问题是某些文件(type1)只有typevalue(在案例速度必须留给O,而在其他文件(type2)中我有{ {1}},typevalue

因此,当我在文件中读取velocity块时,我要么读取nx 9位(case1)或nx 17位((case2),我必须放入具有良好对齐的缓冲区。< / p>

我开始使用n类型

mpi_cell_aligned

使用MPI_Datatype mpi_cell_aligned; int count[] = { 1, 1, 1 }; MPI_Aint displ[] = { offsetof(Cell, type), offsetof(Cell, value), offsetof(Cell, velocity) }; MPI_Datatype types[] = { MPI_CHAR, MPI_DOUBLE, MPI_DOUBLE }; switch(type) { case 1: MPI_Type_create_struct(2, count, displ, types, &mpi_cell_aligned); break; case 2: MPI_Type_create_struct(3, count, displ, types, &mpi_cell_aligned); break; } MPI_Type_commit(&mpi_cell_aligned); 我还构建了一个MPI_Type_contiguous类型,表示9/17连续位(ui是二进制文件中的格式)。

我的问题是写入我的缓冲区,我正在尝试构建一个包含多个mpi_cell_packed的向量类型。在第2种情况下,它很容易,因为每种类型都紧挨着另一种类型,但在案例1中,我必须考虑到我的类型之间的填充,这对应于1倍的长度。

不幸的是,给mpi_cell_aligned的步幅必须以结构数量来衡量,而不是以字节为单位。与此同时,我不能仅使用MPI_Type_Vector来描述我的向量,因为我的单元格结构未满(char和第一个double之间的对齐填充)。

如何构建相应的MPI数据类型,以便在案例1中正确表示Cell数组?

1 个答案:

答案 0 :(得分:4)

您必须在案例1中修改mpi类型的范围。

类型的范围是用于知道在send / recv / write / read操作中找到以下元素的位置的大小。

主要功能是MPI_Type_create_resized。在您的情况下,情况1中的mpi类型的范围必须与情况2中的mpi类型的范围相同。

所以你必须做那样的事情:

/* Temporary type */
MPI_Type_create_struct(2, count, displ, types, &mpi_cell_aligned_temp);
/* Compute new extent */
MPI_Type_size(mpi_cell_aligned_temp,&size_double);
extent = offsetof(Cell, velocity)+size_double;
/* Create new type with new extent */
MPI_Type_create_resized(mpi_cell_aligned_temp,0, extent,&mpi_cell_aligned_temp);