Parallel processing 以HDF5格式从1D连续结构写入到3D的MPI并行文件

Parallel processing 以HDF5格式从1D连续结构写入到3D的MPI并行文件,parallel-processing,hdf5,mpich,Parallel Processing,Hdf5,Mpich,我试图使用复合数据类型并行编写一组变量(dep_var类的gridinfo对象)。我的系统总大小为NX NY x NZ,工作人员信息存储在工作人员(工作人员信息类的obj)中。函数“write_hdf(…)”仅由工作人员执行 现在,我的gridinfo是一个一维对象数组,形式为(i+offset_x)Ny*Nz+(k+offset_z)*Ny+(j+offset_y)。我在末端有填充物,由偏移量x、偏移量y和偏移量z指定。当我希望数据空间为3D数组时,我无法理解如何在memspace中为1D数组

我试图使用复合数据类型并行编写一组变量(dep_var类的gridinfo对象)。我的系统总大小为NX NY x NZ,工作人员信息存储在工作人员(工作人员信息类的obj)中。函数“write_hdf(…)”仅由工作人员执行

现在,我的gridinfo是一个一维对象数组,形式为(i+offset_x)Ny*Nz+(k+offset_z)*Ny+(j+offset_y)。我在末端有填充物,由偏移量x、偏移量y和偏移量z指定。当我希望数据空间为3D数组时,我无法理解如何在memspace中为1D数组指定此偏移量。请注意,主偏移量是数据空间上工作块的偏移量

通过使用hdf教程,我可以写这篇文章。如果你能给我一些关于如何前进的建议,我将不胜感激。提前谢谢

void write_hdf(MPI_Comm comm,MPI_Func *mpi_obj,int iter){
    stringstream hdf_fname;
    hdf_fname<<"Out_"<<iter<<".h5";
    string hdf_filename = hdf_fname.str();
    //Create a new file collectively and release property list identifier.
    hid_t fapl_id=H5Pcreate(H5P_FILE_ACCESS);
    H5Pset_fapl_mpio(fapl_id,comm,MPI_INFO_NULL);
    hid_t file_id=H5Fcreate(hdf_filename.c_str(),H5F_ACC_TRUNC,H5P_DEFAULT,fapl_id);
    H5Pclose(fapl_id);

    int RANK=3;
    hsize_t dims[RANK];
    herr_t status;
    dims[0]=NX;dims[1]=NY;dims[2]=NZ;
    //Create dataspace
    hid_t dataspace_id=H5Screate_simple(RANK,dims,NULL);

    //Create compound datatype
    hid_t cmpd_dtype_id=H5Tcreate(H5T_COMPOUND,sizeof(dep_var));        
    status=H5Tinsert(cmpd_dtype_id, "Temperature", HOFFSET(dep_var,Temp),H5T_NATIVE_DOUBLE);
    status=H5Tinsert(cmpd_dtype_id, "fs", HOFFSET(dep_var,fs),H5T_NATIVE_FLOAT);
    status = H5Tset_order(cmpd_dtype_id, H5T_ORDER_LE);

    //Create chunk dataset
    dims[0]=worker->Nx;dims[1]=worker->Ny;dims[2]=worker->Nz;
    hid_t plist_id = H5Pcreate(H5P_DATASET_CREATE);
    H5Pset_chunk(plist_id, RANK, dims);
    hid_t dataset_id=H5Dcreate(file_id,"All_VAR",cmpd_dtype_id,dataspace_id,H5P_DEFAULT,plist_id,H5P_DEFAULT);
    H5Pclose(plist_id);
    H5Sclose(dataspace_id);

    //create memspace for each worker
    hsize_t offset[RANK],block[RANK],stride[RANK],count[RANK];
    hid_t memspace_id=H5Screate_simple(RANK,dims,NULL);
    count[0] =worker->Nx;count[1] = worker->Ny ;count[2]=worker->Nz;
    stride[0] = 1;stride[1] = 1;stride[2]=1;
    block[0] = dims[0];block[1] = dims[1];block[2]=dims[2];
    offset[0]=worker->main_offset_x;
    offset[1]=worker->main_offset_y;
    offset[2]=worker->main_offset_z;

    dataspace_id = H5Dget_space(dataset_id);
    status = H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET, offset, stride, count, block);

    //Create property list for collective dataset write.
    hid_t xf_id=H5Pcreate(H5P_DATASET_XFER);
    H5Pset_dxpl_mpio(xf_id,H5FD_MPIO_COLLECTIVE);

    //Write File
    status = H5Dwrite(dataset_id, cmpd_dtype_id, memspace_id, dataspace_id,xf_id, &(gridinfo[0]));

    //Free
    H5Sclose(dataspace_id);
    H5Sclose(memspace_id);
    H5Dclose(dataset_id);
    H5Pclose(xf_id);
    H5Fclose(file_id);
}

class dep_var{
    public:
        double Temp;
        double fs;
};

class worker_info{
    public:
        int Nx,Ny,Nz;//Worker size
        int real_Nx,real_Ny,real_Nz;//Size with padding
        int offset_x,offset_y,offset_z; //Offsets for padding
        int main_offset_x,main_offset_y,main_offset_z; //offsets for this worker on dataspace
};
void write_hdf(MPI_Comm Comm,MPI_Func*MPI_obj,int iter){
stringstream hdf_fname;
hdf_Fnamez;
步幅[0]=1;步幅[1]=1;步幅[2]=1;
块[0]=尺寸[0];块[1]=尺寸[1];块[2]=尺寸[2];
偏移量[0]=辅助对象->主偏移量\u x;
偏移量[1]=辅助对象->主偏移量;
偏移量[2]=辅助对象->主偏移量;
数据空间_id=H5Dget_空间(数据集_id);
状态=H5S选择超实验室(数据空间id、H5S选择集、偏移、步幅、计数、块);
//为集合数据集写入创建属性列表。
hid_t xf_id=H5Pcreate(H5P_数据集_XFER);
H5Pset\u dxpl\u mpio(xf\u id,H5FD\u mpio\u集合);
//写入文件
status=H5Dwrite(数据集\u id、cmpd\u数据类型\u id、memspace\u id、数据空间\u id、xf\u id和(gridinfo[0]);
//免费的
H5Sclose(数据空间_id);
H5Sclose(memspace_id);
H5Dclose(数据集_id);
H5Pclose(xf_id);
H5Fclose(文件标识);
}
类dep_var{
公众:
双温;
双fs;
};
班主任信息{
公众:
int Nx,Ny,Nz;//工作区大小
int real\u Nx,real\u Ny,real\u Nz;//带填充的大小
int offset_x,offset_y,offset_z;//填充的偏移量
int main_offset_x,main_offset_y,main_offset_z;//数据空间上此辅助进程的偏移量
};

问候

It is all about indexing, we can regard 3D array as a "book" which has NZ pages with each page NX(column)*NY(row) words.  We now numbering words in this "book” row by row. 
Then the index of a word may be written as:
  index=NX*NY*z+y*NX+x;