我有一个C结构数组,我想填写一个文件(并行,使用set_view等)
typedef struct
{
char type;
double value;
double velocity;
} Cell;
我的问题是某些文件(type1)只有type
和value
(在案例速度必须留给O,而在其他文件(type2)中我有{ {1}},type
和value
因此,当我在文件中读取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数组?
答案 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);