diff options
author | MuQun Yang <ymuqun@hdfgroup.org> | 2004-11-11 21:00:01 (GMT) |
---|---|---|
committer | MuQun Yang <ymuqun@hdfgroup.org> | 2004-11-11 21:00:01 (GMT) |
commit | 1702d75b3a49465b184362e088cf120b1b4817f3 (patch) | |
tree | 865452aa5fc02f1cad0b15f8e076c8049e56ad77 /src/H5Dmpio.c | |
parent | 091fbb49e048b8c89eecff2633068f4508b4d8ac (diff) | |
download | hdf5-1702d75b3a49465b184362e088cf120b1b4817f3.zip hdf5-1702d75b3a49465b184362e088cf120b1b4817f3.tar.gz hdf5-1702d75b3a49465b184362e088cf120b1b4817f3.tar.bz2 |
[svn-r9519] Purpose:
Adding codes for the general MPI derived datatype in order to
better incorporate new fixes of HDF5 library.
Description:
Note: These codes have not been tested for general use.
Don't call these functions in your developments of the HDF5 library.
Also these codes are stand-alone codes, they should not affect
other library codes.
Solution:
Platforms tested:
Heping(C and Parallel linux 2.4, mpich 1.2.6)
Arabica(C,C++,Fortran, Solaris 2.7)
Copper(C,c++,Fortran, AIX 5.1, NOTE: c++ FAILED, seems not due to the recent check-in)
Misc. update:
Diffstat (limited to 'src/H5Dmpio.c')
-rw-r--r-- | src/H5Dmpio.c | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c index 08c6a48..4dfb17b 100644 --- a/src/H5Dmpio.c +++ b/src/H5Dmpio.c @@ -45,6 +45,12 @@ H5D_mpio_spaces_xfer(H5D_io_info_t *io_info, size_t elmt_size, void *buf/*out*/, hbool_t do_write); + +static herr_t +H5D_mpio_spaces_span_xfer(H5D_io_info_t *io_info, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + void *buf/*out*/, + hbool_t do_write); /*------------------------------------------------------------------------- * Function: H5D_mpio_opt_possible @@ -364,6 +370,107 @@ done: FUNC_LEAVE_NOAPI(ret_value); } /* end H5D_mpio_spaces_xfer() */ + +/** The following function has been tested, don't call this + function until you don't see this line. Nov. 11,2004, KY**/ + +static herr_t +H5D_mpio_spaces_span_xfer(H5D_io_info_t *io_info, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + void *_buf /*out*/, hbool_t do_write ) +{ + haddr_t addr; /* Address of dataset (or selection) within file */ + size_t mpi_buf_count, mpi_file_count; /* Number of "objects" to transfer */ + hsize_t mpi_buf_offset, mpi_file_offset; /* Offset within dataset where selection (ie. MPI type) begins */ + MPI_Datatype mpi_buf_type, mpi_file_type; /* MPI types for buffer (memory) and file */ + hbool_t mbt_is_derived=0, /* Whether the buffer (memory) type is derived and needs to be free'd */ + mft_is_derived=0; /* Whether the file type is derived and needs to be free'd */ + hbool_t plist_is_setup=0; /* Whether the dxpl has been customized */ + uint8_t *buf=(uint8_t *)_buf; /* Alias for pointer arithmetic */ + int mpi_code; /* MPI return code */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5D_mpio_spaces_xfer); + + /* Check args */ + assert (io_info); + assert (io_info->dset); + assert (file_space); + assert (mem_space); + assert (buf); + assert (IS_H5FD_MPIO(io_info->dset->ent.file)); + /* Make certain we have the correct type of property list */ + assert(TRUE==H5P_isa_class(io_info->dxpl_id,H5P_DATASET_XFER)); + + /* create the MPI buffer type */ + if (H5S_mpio_space_span_type( mem_space, elmt_size, + /* out: */ + &mpi_buf_type, + &mpi_buf_count, + &mpi_buf_offset, + &mbt_is_derived )<0) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't create MPI buf type"); + + /* create the MPI file type */ + if ( H5S_mpio_space_span_type( file_space, elmt_size, + /* out: */ + &mpi_file_type, + &mpi_file_count, + &mpi_file_offset, + &mft_is_derived )<0) + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL,"couldn't create MPI file type"); + + /* Get the base address of the contiguous dataset or the chunk */ + if(io_info->dset->shared->layout.type == H5D_CONTIGUOUS) + addr = H5D_contig_get_addr(io_info->dset) + mpi_file_offset; + else { + haddr_t chunk_addr; /* for collective chunk IO */ + + assert(io_info->dset->shared->layout.type == H5D_CHUNKED); + chunk_addr=H5D_istore_get_addr(io_info,NULL); + addr = H5F_BASE_ADDR(io_info->dset->ent.file) + chunk_addr + mpi_file_offset; + } + + /* + * Pass buf type, file type to the file driver. Request an MPI type + * transfer (instead of an elementary byteblock transfer). + */ + if(H5FD_mpi_setup_collective(io_info->dxpl_id, mpi_buf_type, mpi_file_type)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI-I/O properties"); + plist_is_setup=1; + + /* Adjust the buffer pointer to the beginning of the selection */ + buf+=mpi_buf_offset; + + /* transfer the data */ + if (do_write) { + if (H5F_block_write(io_info->dset->ent.file, H5FD_MEM_DRAW, addr, mpi_buf_count, io_info->dxpl_id, buf) <0) + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL,"MPI write failed"); + } else { + if (H5F_block_read (io_info->dset->ent.file, H5FD_MEM_DRAW, addr, mpi_buf_count, io_info->dxpl_id, buf) <0) + HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL,"MPI read failed"); + } + +done: + /* Reset the dxpl settings */ + if(plist_is_setup) { + if(H5FD_mpi_teardown_collective(io_info->dxpl_id)<0) + HDONE_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "unable to reset dxpl values"); + } /* end if */ + + /* free the MPI buf and file types */ + if (mbt_is_derived) { + if (MPI_SUCCESS != (mpi_code= MPI_Type_free( &mpi_buf_type ))) + HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code); + } + if (mft_is_derived) { + if (MPI_SUCCESS != (mpi_code= MPI_Type_free( &mpi_file_type ))) + HMPI_DONE_ERROR(FAIL, "MPI_Type_free failed", mpi_code); + } + + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5D_mpio_spaces_span_xfer() */ + /*------------------------------------------------------------------------- * Function: H5D_mpio_spaces_read @@ -438,4 +545,86 @@ H5D_mpio_spaces_write(H5D_io_info_t *io_info, FUNC_LEAVE_NOAPI(ret_value); } /* end H5D_mpio_spaces_write() */ + + + +/*------------------------------------------------------------------------- + * Function: H5D_mpio_spaces_span_read + * + * Purpose: MPI-IO function to read directly from app buffer to file for + span-tree + * + * Return: non-negative on success, negative on failure. + * + * Programmer: KY + * Note : Don't call this routine + * until you don't see this line. 11/11/2004, KY + * + * Modifications: + * + * rky 980918 + * Added must_convert parameter to let caller know we can't optimize the xfer. + * + * QAK - 2002/04/02 + * Removed the must_convert parameter and move preconditions to + * H5S_mpio_opt_possible() routine + * + *------------------------------------------------------------------------- + */ +herr_t +H5D_mpio_spaces_span_read(H5D_io_info_t *io_info, + size_t UNUSED nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + void *buf/*out*/) +{ + herr_t ret_value; + + FUNC_ENTER_NOAPI_NOFUNC(H5D_mpio_spaces_read); + + ret_value = H5D_mpio_spaces_span_xfer(io_info, elmt_size, file_space, + mem_space, buf, 0/*read*/); + + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5D_mpio_spaces_read() */ + + +/*------------------------------------------------------------------------- + * Function: H5D_mpio_spaces_span_write + * + * Purpose: MPI-IO function to write directly from app buffer to file. + * + * Return: non-negative on success, negative on failure. + * + * Programmer: KY + * Note: Don't call this funtion until you don't see this line. + * KY, 11/11/04 + + * + * Modifications: + * + * rky 980918 + * Added must_convert parameter to let caller know we can't optimize the xfer. + * + * QAK - 2002/04/02 + * Removed the must_convert parameter and move preconditions to + * H5S_mpio_opt_possible() routine + * + *------------------------------------------------------------------------- + */ +herr_t +H5D_mpio_spaces_span_write(H5D_io_info_t *io_info, + size_t UNUSED nelmts, size_t elmt_size, + const H5S_t *file_space, const H5S_t *mem_space, + const void *buf) +{ + herr_t ret_value; + + FUNC_ENTER_NOAPI_NOFUNC(H5D_mpio_spaces_write); + + /*OKAY: CAST DISCARDS CONST QUALIFIER*/ + ret_value = H5D_mpio_spaces_span_xfer(io_info, elmt_size, file_space, + mem_space, (void*)buf, 1/*write*/); + + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5D_mpio_spaces_write() */ #endif /* H5_HAVE_PARALLEL */ |