2015-10-13 42 views
2

我有我想填写读文件(并行,使用set_view等等)C结构的阵列添加填充到MPI结构

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

我的问题是,某些文件(TYPE1 )只会有typevalue(与案件速度成为留给O,以及其他一些文件(2型)都在我typevaluevelocity

因此,在我的文件中读取n块时,我(读取nx 9位(case1)或nx 17位((case2)我必须在良好的对抗中加入缓冲区。

我开始用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我还内置了mpi_cell_packed类型与代表9/17连续比特(UI二进制文件格式)。

我的问题是写入我的缓冲区,我试图建立一个矢量类型,其中包含几个mpi_cell_aligned。在情况2中,很容易,因为每种类型都紧挨着另一种类型,但在情况1中,我必须考虑我的类型之间的填充,这与我们的1倍长度相对应。

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

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

回答

3

您必须修改为MPI类型的程度的情况下,1

一种类型的程度是用来知道在哪里找到的SEND/RECV /写以下元素的尺寸/读取操作。

主要功能是MPI_Type_create_resized。在你的情况下,MPI类型的情况下,1程度必须是一样的MPI类型的情况下的程度2.

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

/* 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); 
+0

我使用sizeof(细胞)作为一个程度,我做了这份工作。谢谢 – Amxx