From 238cccd5e8657fe9800eb6caad98b6c54b1c251d Mon Sep 17 00:00:00 2001 From: Albert Cheng Date: Thu, 5 Feb 1998 22:00:35 -0500 Subject: [svn-r224] Initial implementation of the upper levels of PHDF5. The MPIO lower interface layer (H5Fmpio.c) has been commited by Kim already. All PHDF5 codes are "bracket'ed" by #ifdef HAVE_PARALLEL macro. --- src/H5C.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++-- src/H5Cpublic.h | 4 +++ src/H5F.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++---------- src/H5Fmpio.c | 18 ++++++------ src/H5Fprivate.h | 26 +++++++++++------ src/H5Fpublic.h | 5 ++++ src/H5M.c | 17 ++++++++++++ src/H5private.h | 9 ++++++ src/H5public.h | 4 +++ 9 files changed, 207 insertions(+), 34 deletions(-) diff --git a/src/H5C.c b/src/H5C.c index 4c4f4fe..7a20114 100644 --- a/src/H5C.c +++ b/src/H5C.c @@ -141,13 +141,14 @@ H5Ccreate(H5C_class_t type) /* Allocate a new template and initialize it with default values */ switch (type) { case H5C_FILE_CREATE: - tmpl = H5MM_xmalloc(sizeof(H5F_create_t)); + tmpl = H5MM_xmalloc(sizeof(H5F_create_t)); memcpy(tmpl, &H5F_create_dflt, sizeof(H5F_create_t)); break; case H5C_FILE_ACCESS: - HRETURN_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, - "not implemented yet"); + tmpl = H5MM_xmalloc(sizeof(H5F_access_t)); + memcpy(tmpl, &H5F_access_dflt, sizeof(H5F_access_t)); + break; case H5C_DATASET_CREATE: tmpl = H5MM_xmalloc(sizeof(H5D_create_t)); @@ -233,6 +234,9 @@ H5Cclose(hid_t tid) if (NULL == (tmpl = H5A_remove(tid))) { HRETURN_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "unable to remove atom"); } +#ifdef LATER + /* this is for file access template too. Need to free the COMM and INFO objects too. */ +#endif H5MM_xfree(tmpl); FUNC_LEAVE(SUCCEED); @@ -853,6 +857,69 @@ H5Cget_chunk(hid_t tid, int max_ndims, size_t dim[] /*out */ ) FUNC_LEAVE(tmpl->chunk_ndims); } + +#ifdef HAVE_PARALLEL +/*------------------------------------------------------------------------- + * Function: H5Cset_mpi + * + * Purpose: Sets the access mode for MPIO call and store the user supplied + * communicator and info. + * + * Return: Success: SUCCEED + * + * Failure: FAIL + * + * Programmer: Albert Cheng + * Feb 3, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5Cset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode) +{ + int i; + H5F_access_t *tmpl = NULL; + MPI_Comm lcomm; + int mrc; /* MPI return code */ + + FUNC_ENTER(H5Cset_mpi, FAIL); + + /* Check arguments */ + if (H5C_FILE_ACCESS != H5Cget_class(tid) || + NULL == (tmpl = H5A_object(tid))) { + HRETURN_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, + "not a file access template"); + } + switch (access_mode){ + case H5ACC_INDEPENDENT: + /* fall through to next case */ + case H5ACC_COLLECTIVE: + tmpl->access_mode = access_mode; + break; + + default: + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "unknown access_mode"); + } + + /* store a duplicate copy of comm so that user may freely modify comm after this */ + /* call. */ +#ifdef LATER + /* need to verify comm and info contain sensible information */ + /* need to duplicate info too but don't know a quick way to do it now. */ +#endif + if ((mrc = MPI_Comm_dup(comm, &lcomm) != MPI_SUCCESS)) + HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "failure to duplicate communicator"); + tmpl->comm = comm; + tmpl->info = info; + + FUNC_LEAVE(SUCCEED); +} + +#endif /*HAVE_PARALLEL*/ /*-------------------------------------------------------------------------- NAME diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h index aca09d2..b3b5348 100644 --- a/src/H5Cpublic.h +++ b/src/H5Cpublic.h @@ -61,6 +61,10 @@ herr_t H5Cset_layout (hid_t tid, H5D_layout_t layout); H5D_layout_t H5Cget_layout (hid_t tid); herr_t H5Cset_chunk (hid_t tid, int ndims, const size_t dim[]); int H5Cget_chunk (hid_t tid, int max_ndims, size_t dim[]/*out*/); +#ifdef HAVE_PARALLEL +herr_t H5Cset_mpi (hid_t tid, MPI_Comm comm, MPI_Info info, uintn access_mode); +/* herr_t H5Cget_mpi (hid_t tid, int *ik); */ /* not defined yet */ +#endif #ifdef __cplusplus } diff --git a/src/H5F.c b/src/H5F.c index 1efc496..4b7d669 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -77,8 +77,8 @@ const H5F_create_t H5F_create_dflt = { 0, /* unused */ 0, /* unused */ }, - sizeof(size_t), /* Default offset size */ - sizeof(size_t), /* Default length size */ + 4, /* Default offset size */ + 4, /* Default length size */ HDF5_BOOTBLOCK_VERSION, /* Current Boot-Block version # */ HDF5_SMALLOBJECT_VERSION, /* Current Small-Object heap version # */ HDF5_FREESPACE_VERSION, /* Current Free-Space info version # */ @@ -86,6 +86,18 @@ const H5F_create_t H5F_create_dflt = { HDF5_SHAREDHEADER_VERSION, /* Current Shared-Header format version # */ }; +/* + * Define the default file access template. + */ +const H5F_access_t H5F_access_dflt = +{ + H5ACC_DEFAULT, /* Default file access mode */ +#ifdef HAVE_PARALLEL + MPI_COMM_NULL, /* Default is not using MPIO */ + MPI_INFO_NULL, /* Default no info */ +#endif +}; + /* Interface initialization */ static intn interface_initialize_g = FALSE; #define INTERFACE_INIT H5F_init_interface @@ -557,7 +569,7 @@ H5F_dest(H5F_t *f) */ H5F_t * H5F_open(const H5F_low_class_t *type, const char *name, uintn flags, - const H5F_create_t *create_parms) + const H5F_create_t *create_parms, const H5F_access_t *access_parms) { H5F_t *f = NULL; /*return value */ H5F_t *ret_value = NULL; /*a copy of `f' */ @@ -623,7 +635,7 @@ H5F_open(const H5F_low_class_t *type, const char *name, uintn flags, fprintf(stderr, "HDF5-DIAG: opening a split file\n"); #endif fullname[s - name] = '\0'; - f = H5F_open(H5F_LOW_SPLIT, fullname, flags, create_parms); + f = H5F_open(H5F_LOW_SPLIT, fullname, flags, create_parms, access_parms); HRETURN(f); } } @@ -984,6 +996,11 @@ H5Fcreate(const char *filename, uintn flags, hid_t create_temp, const H5F_create_t *create_parms; /* pointer to the parameters to * use when creating the file */ + const H5F_access_t *access_parms; /* pointer to the file access + * parameters to use when creating + * the file + */ + const H5F_low_class_t *type; /* File type */ hid_t ret_value = FAIL; FUNC_ENTER(H5Fcreate, FAIL); @@ -1001,19 +1018,35 @@ H5Fcreate(const char *filename, uintn flags, hid_t create_temp, } else if (NULL == (create_parms = H5A_object(create_temp))) { HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize template"); } -#ifdef LATER if (access_temp <= 0) { access_parms = &H5F_access_dflt; } else if (NULL == (access_parms = H5A_object(access_temp))) { - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't unatomize template */ + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize template"); } + /* figure out what kind of file I/O to use. */ + /* Currently, MPIO is the only alternative than default I/O */ + switch (access_parms->access_mode){ + case H5ACC_DEFAULT: + type = H5F_LOW_DFLT; + break; +#ifdef HAVE_PARALLEL + case H5ACC_INDEPENDENT: + type = H5F_LOW_MPIO; + break; + case H5ACC_COLLECTIVE: + /* not implemented yet */ + /* type = H5F_LOW_MPIO; */ + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid file access mode"); #endif - + default: + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid file access mode"); + } + /* * Create a new file or truncate an existing file. */ - if (NULL == (new_file = H5F_open(H5F_LOW_DFLT, filename, flags, - create_parms))) { + if (NULL == (new_file = H5F_open(type, filename, flags, + create_parms, access_parms))) { HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "can't create file"); } /* Get an atom for the file */ @@ -1076,6 +1109,11 @@ hid_t H5Fopen(const char *filename, uintn flags, hid_t access_temp) { H5F_t *new_file = NULL; /* file struct for new file */ + const H5F_access_t *access_parms; /* pointer to the file access + * parameters to use when creating + * the file + */ + const H5F_low_class_t *type; /* File type */ hid_t ret_value = FAIL; FUNC_ENTER(H5Fopen, FAIL); @@ -1085,15 +1123,32 @@ H5Fopen(const char *filename, uintn flags, hid_t access_temp) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid file name"); flags = flags & H5ACC_WRITE ? H5F_ACC_WRITE : 0; -#ifdef LATER - if (access_temp <= 0) - access_temp = H5CPget_default_atom(H5_TEMPLATE); - if (NULL == (f_access_parms = H5A_object(access_temp))) - HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL); /*can't unatomize template */ + if (access_temp <= 0) { + access_parms = &H5F_access_dflt; + } else if (NULL == (access_parms = H5A_object(access_temp))) { + HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't unatomize template"); + } + /* figure out what kind of file I/O to use. */ + /* Currently, MPIO is the only alternative than default I/O */ + switch (access_parms->access_mode){ + case H5ACC_DEFAULT: + type = H5F_LOW_DFLT; + break; +#ifdef HAVE_PARALLEL + case H5ACC_INDEPENDENT: + type = H5F_LOW_MPIO; + break; + case H5ACC_COLLECTIVE: + /* not implemented yet */ + /* type = H5F_LOW_MPIO; */ + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid file access mode"); #endif + default: + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid file access mode"); + } /* Open the file */ - if (NULL == (new_file = H5F_open(H5F_LOW_DFLT, filename, flags, NULL))) { + if (NULL == (new_file = H5F_open(type, filename, flags, NULL, access_parms))) { HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "cant open file"); } /* Get an atom for the file */ diff --git a/src/H5Fmpio.c b/src/H5Fmpio.c index 6db6bc8..b9f2238 100644 --- a/src/H5Fmpio.c +++ b/src/H5Fmpio.c @@ -127,7 +127,7 @@ ino_t mpio_inode_num = 0; /* fake "inode" number */ *------------------------------------------------------------------------- */ static hbool_t -H5F_mpio_access(char *name, int mode, H5F_search_t *key /*out */ ) +H5F_mpio_access(const char *name, int mode, H5F_search_t *key /*out */ ) { hbool_t ret_val = FALSE; MPI_File fh; @@ -150,24 +150,25 @@ H5F_mpio_access(char *name, int mode, H5F_search_t *key /*out */ ) break; case W_OK: mpi_mode = MPI_MODE_WRONLY; break; - default: HRETURN_ERROR(H5E_IO, H5E_ARGS, FAIL, + default: HRETURN_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid mode parameter"); } - mpierr = MPI_File_open( MPI_COMM_SELF, name, mpi_mode, MPI_INFO_NULL, &fh ); + /* (char*) name is okay since MPI_File_open will not change it. */ + mpierr = MPI_File_open( MPI_COMM_SELF, (char*) name, mpi_mode, MPI_INFO_NULL, &fh ); if (mpierr == MPI_SUCCESS) { mpierr = MPI_File_close( &fh ); if (mpierr != MPI_SUCCESS) - HRETURN_ERROR(H5E_IO, H5E_ARGS, FAIL, "MPI_File_open failed"); + HRETURN_ERROR(H5E_IO, H5E_CLOSEERROR, FAIL, "MPI_File_close failed"); ret_val = TRUE; } else if (mode == F_OK) { /* to see if it exists, this time try to open for write */ - mpierr = MPI_File_open( MPI_COMM_SELF, name, MPI_MODE_WRONLY, + mpierr = MPI_File_open( MPI_COMM_SELF, (char*)name, MPI_MODE_WRONLY, MPI_INFO_NULL, &fh ); if (mpierr == MPI_SUCCESS) { mpierr = MPI_File_close( &fh ); if (mpierr != MPI_SUCCESS) - HRETURN_ERROR(H5E_IO, H5E_INTERNAL, FAIL, "MPI_File_close failed"); + HRETURN_ERROR(H5E_IO, H5E_CLOSEERROR, FAIL, "MPI_File_close failed"); ret_val = TRUE; } } @@ -214,7 +215,7 @@ H5F_mpio_access(char *name, int mode, H5F_search_t *key /*out */ ) *------------------------------------------------------------------------- */ static H5F_low_t * -H5F_mpio_open(char *name, uintn flags, H5F_search_t *key /*out */ ) +H5F_mpio_open(const char *name, uintn flags, H5F_search_t *key /*out */ ) { H5F_low_t *lf = NULL; MPI_File fh; @@ -234,7 +235,7 @@ H5F_mpio_open(char *name, uintn flags, H5F_search_t *key /*out */ ) if (flags&H5F_ACC_CREAT) mpi_amode |= MPI_MODE_CREATE; if (flags&H5F_ACC_EXCL) mpi_amode |= MPI_MODE_EXCL; - mpierr = MPI_File_open(MPI_COMM_WORLD, name, mpi_amode, MPI_INFO_NULL, &fh); + mpierr = MPI_File_open(MPI_COMM_WORLD, (char*)name, mpi_amode, MPI_INFO_NULL, &fh); if (mpierr != MPI_SUCCESS) { MPI_Error_string( mpierr, mpierrmsg, &msglen ); HRETURN_ERROR(H5E_IO, H5E_CANTOPENFILE, NULL, mpierrmsg ); @@ -391,6 +392,7 @@ H5F_mpio_read(H5F_low_t *lf, const haddr_t *addr, size_t size, uint8 *buf) HRETURN_ERROR(H5E_IO, H5E_READERROR, FAIL, mpierrmsg ); } +#define MPI_KLUGE0202 #ifdef MPI_KLUGE0202 /* KLUGE rky 980202 MPI_Get_count incorrectly returns negative count; fake a complete read */ diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index 76ca1f6..3f71055 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -22,7 +22,7 @@ /* This is a near top-level header! Try not to include much! */ #include -#ifdef PHDF5 +#ifdef HAVE_PARALLEL #ifndef MPI_SUCCESS #include #include @@ -231,6 +231,17 @@ typedef struct H5F_create_t { } H5F_create_t; /* + * File-access template. + */ +typedef struct H5F_access_t { + uintn access_mode; /* file access mode */ +#ifdef HAVE_PARALLEL + MPI_Comm comm; /* communicator for file access */ + MPI_Info info; /* optional info for MPI-IO */ +#endif /*HAVE_PARALLEL*/ +} H5F_access_t; + +/* * These things make a file unique. */ typedef struct H5F_search_t { @@ -304,7 +315,7 @@ typedef struct H5F_low_t { size_t alloc; /* Current size of MEM buffer */ } core; -#ifdef PHDF5 +#ifdef HAVE_PARALLEL /* MPI-IO */ struct { MPI_File f; /* MPI-IO file handle */ @@ -323,10 +334,8 @@ extern const H5F_low_class_t H5F_LOW_STDIO[]; /* Posix stdio */ extern const H5F_low_class_t H5F_LOW_CORE[]; /* In-core temp file */ extern const H5F_low_class_t H5F_LOW_FAM[]; /* File family */ extern const H5F_low_class_t H5F_LOW_SPLIT[]; /* Split meta/raw data */ -#ifdef PHDF5 +#ifdef HAVE_PARALLEL extern const H5F_low_class_t H5F_LOW_MPIO[]; /* MPI-IO */ -# undef H5F_LOW_DFLT -# define H5F_LOW_DFLT H5F_LOW_MPIO /* The default type */ #endif /* @@ -346,8 +355,8 @@ typedef struct H5F_file_t { haddr_t hdf5_eof; /* Relative addr of end of all hdf5 data*/ struct H5AC_t *cache; /* The object cache */ H5F_create_t create_parms; /* File-creation template */ -#ifdef LATER - file_access_temp_t file_access_parms; /* File-access template */ +#ifdef HAVE_PARALLEL + H5F_access_t access_parms; /* File-access template */ #endif struct H5G_entry_t *root_ent; /* Root symbol table entry */ } H5F_file_t; @@ -414,11 +423,12 @@ struct H5O_layout_t; /*forward decl for prototype arguments */ /* library variables */ extern const H5F_create_t H5F_create_dflt; +extern const H5F_access_t H5F_access_dflt; /* Private functions, not part of the publicly documented API */ void H5F_encode_length_unusual(const H5F_t *f, uint8 **p, uint8 *l); H5F_t *H5F_open(const H5F_low_class_t *type, const char *name, uintn flags, - const H5F_create_t *create_parms); + const H5F_create_t *create_parms, const H5F_access_t *access_parms); herr_t H5F_close(H5F_t *f); herr_t H5F_debug(H5F_t *f, const haddr_t *addr, FILE * stream, intn indent, intn fwidth); diff --git a/src/H5Fpublic.h b/src/H5Fpublic.h index 885277d..538b07b 100644 --- a/src/H5Fpublic.h +++ b/src/H5Fpublic.h @@ -24,6 +24,11 @@ #define H5ACC_DEFAULT 0x0000/*use in H5Fopen & H5Fcreate to open a file with default access*/ #define H5ACC_WRITE 0x0001/*use in H5Fopen to open a file with write access*/ #define H5ACC_OVERWRITE 0x0002/*use in H5Fcreate truncate an existing file*/ +#ifdef HAVE_PARALLEL +#define H5ACC_INDEPENDENT 0x0010/*use in H5Cset_mpi for MPI independent access*/ +#define H5ACC_COLLECTIVE 0x0011/*use in H5Cset_mpi for MPI collective access*/ +#endif + #ifdef __cplusplus extern "C" { diff --git a/src/H5M.c b/src/H5M.c index 5466a1e..a9dc02b 100644 --- a/src/H5M.c +++ b/src/H5M.c @@ -76,6 +76,23 @@ static meta_func_t meta_func_arr[] = NULL, /* File-Creation Template GetFile */ H5Cclose /* File-Creation Template Release */ }, + { /* Template object meta-functions (defined in H5C.c) */ + H5_TEMPLATE_1, /* File-Access Template Type ID */ + NULL, /* File-Access Template Create */ + NULL, /* File-Access Template Access */ + H5Ccopy, /* File-Access Template Copy */ + NULL, /* File-Access Template FindName */ + NULL, /* File-Access Template NameLen */ + NULL, /* File-Access Template GetName */ + NULL, /* File-Access Template SetName */ + NULL, /* File-Access Template Search */ + NULL, /* File-Access Template Index */ + NULL, /* File-Access Template Flush */ + NULL, /* File-Access Template Delete */ + NULL, /* File-Access Template GetParent */ + NULL, /* File-Access Template GetFile */ + H5Cclose /* File-Access Template Release */ + }, { /* Datatype object meta-functions (defined in H5T.c) */ H5_DATATYPE, /* Datatype Type ID */ NULL, /* Datatype Create */ diff --git a/src/H5private.h b/src/H5private.h index 995b53d..a2d5d49 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -46,6 +46,15 @@ # include #endif +#ifdef HAVE_PARALLEL +/* + * MPIO headers + */ +# include +# include +#endif + + /* * Pablo support files. */ diff --git a/src/H5public.h b/src/H5public.h index 7436cc2..9d7eee8 100644 --- a/src/H5public.h +++ b/src/H5public.h @@ -18,6 +18,10 @@ #include /*from configure */ #include +#ifdef HAVE_PARALLEL +#include +#include +#endif /* * Data types -- cgit v0.12